Skip to content

Commit

Permalink
PHPOffice#123 : Support for Video
Browse files Browse the repository at this point in the history
  • Loading branch information
Progi1984 committed Mar 7, 2016
1 parent 1b84fa8 commit 4696fda
Show file tree
Hide file tree
Showing 7 changed files with 132 additions and 18 deletions.
37 changes: 25 additions & 12 deletions samples/Sample_03_Image.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use PhpOffice\PhpPresentation\PhpPresentation;
use PhpOffice\PhpPresentation\Shape\Drawing;
use PhpOffice\PhpPresentation\Shape\Media;
use PhpOffice\PhpPresentation\Shape\MemoryDrawing;

// Create new PHPPresentation object
Expand All @@ -24,23 +25,35 @@
echo date('H:i:s') . ' Add a drawing to the slide'.EOL;
$shape = new MemoryDrawing();
$shape->setName('Sample image')
->setDescription('Sample image')
->setImageResource($gdImage)
->setRenderingFunction(MemoryDrawing::RENDERING_JPEG)
->setMimeType(MemoryDrawing::MIMETYPE_DEFAULT)
->setHeight(36)
->setOffsetX(10)
->setOffsetY(10);
->setDescription('Sample image')
->setImageResource($gdImage)
->setRenderingFunction(MemoryDrawing::RENDERING_JPEG)
->setMimeType(MemoryDrawing::MIMETYPE_DEFAULT)
->setHeight(36)
->setOffsetX(10)
->setOffsetY(10);
$currentSlide->addShape($shape);

// Add a file drawing (GIF) to the slide
$shape = new Drawing();
$shape->setName('PHPPresentation logo')
->setDescription('PHPPresentation logo')
->setPath('./resources/phppowerpoint_logo.gif')
->setHeight(36)
->setOffsetX(10)
->setOffsetY(100);
->setDescription('PHPPresentation logo')
->setPath('./resources/phppowerpoint_logo.gif')
->setHeight(36)
->setOffsetX(10)
->setOffsetY(100);
$currentSlide->addShape($shape);

// Add a video to the slide
$shape = new Media();
$shape->setName('Video')
->setDescription('Video')
->setPath(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' ? './resources/sintel_trailer-480p.mp4' : './resources/sintel_trailer-480p.ogv')
->setResizeProportional(false)
->setHeight(90)
->setWidth(90)
->setOffsetX(10)
->setOffsetY(200);
$currentSlide->addShape($shape);

// Save file
Expand Down
Binary file added samples/resources/sintel_trailer-480p.mp4
Binary file not shown.
Binary file added samples/resources/sintel_trailer-480p.ogv
Binary file not shown.
27 changes: 27 additions & 0 deletions src/PhpPresentation/Shape/Media.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php
/**
* This file is part of PHPPresentation - A pure PHP library for reading and writing
* presentations documents.
*
* PHPPresentation is free software distributed under the terms of the GNU Lesser
* General Public License version 3 as published by the Free Software Foundation.
*
* For the full copyright and license information, please read the LICENSE
* file that was distributed with this source code. For the full list of
* contributors, visit https://github.com/PHPOffice/PHPPresentation/contributors.
*
* @link https://github.com/PHPOffice/PHPPresentation
* @copyright 2009-2015 PHPPresentation contributors
* @license http://www.gnu.org/licenses/lgpl.txt LGPL version 3
*/

namespace PhpOffice\PhpPresentation\Shape;

use PhpOffice\PhpPresentation\ComparableInterface;

/**
* Media element
*/
class Media extends Drawing implements ComparableInterface
{
}
57 changes: 54 additions & 3 deletions src/PhpPresentation/Writer/ODPresentation/Content.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
use PhpOffice\Common\Text;
use PhpOffice\Common\XMLWriter;
use PhpOffice\PhpPresentation\Shape\Comment;
use PhpOffice\PhpPresentation\Shape\Media;
use PhpOffice\PhpPresentation\Slide;
use PhpOffice\PhpPresentation\PhpPresentation;
use PhpOffice\PhpPresentation\Shape\AbstractDrawing;
Expand Down Expand Up @@ -291,6 +292,8 @@ public function writePart(PhpPresentation $pPhpPresentation)
$this->writeShapeLine($objWriter, $shape);
} elseif ($shape instanceof Chart) {
$this->writeShapeChart($objWriter, $shape);
} elseif ($shape instanceof Media) {
$this->writeShapeMedia($objWriter, $shape);
} elseif ($shape instanceof AbstractDrawing) {
$this->writeShapePic($objWriter, $shape);
} elseif ($shape instanceof Group) {
Expand Down Expand Up @@ -325,6 +328,54 @@ public function writePart(PhpPresentation $pPhpPresentation)
return $objWriter->getData();
}

/**
* Write picture
*
* @param \PhpOffice\Common\XMLWriter $objWriter
* @param \PhpOffice\PhpPresentation\Shape\Media $shape
*/
public function writeShapeMedia(XMLWriter $objWriter, Media $shape)
{
// draw:frame
$objWriter->startElement('draw:frame');
$objWriter->writeAttribute('draw:name', $shape->getName());
$objWriter->writeAttribute('svg:width', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getWidth()), 3) . 'cm');
$objWriter->writeAttribute('svg:height', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getHeight()), 3) . 'cm');
$objWriter->writeAttribute('svg:x', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getOffsetX()), 3) . 'cm');
$objWriter->writeAttribute('svg:y', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getOffsetY()), 3) . 'cm');
$objWriter->writeAttribute('draw:style-name', 'gr' . $this->shapeId);
// draw:frame > draw:plugin
$objWriter->startElement('draw:plugin');
$objWriter->writeAttribute('xlink:href', 'Pictures/' . md5($shape->getPath()) . '.' . $shape->getExtension());
$objWriter->writeAttribute('xlink:type', 'simple');
$objWriter->writeAttribute('xlink:show', 'embed');
$objWriter->writeAttribute('xlink:actuate', 'onLoad');
$objWriter->writeAttribute('draw:mime-type', 'application/vnd.sun.star.media');

$objWriter->startElement('draw:param');
$objWriter->writeAttribute('draw:name', 'Loop');
$objWriter->writeAttribute('draw:value', 'false');
$objWriter->endElement();
$objWriter->startElement('draw:param');
$objWriter->writeAttribute('draw:name', 'Mute');
$objWriter->writeAttribute('draw:value', 'false');
$objWriter->endElement();
$objWriter->startElement('draw:param');
$objWriter->writeAttribute('draw:name', 'VolumeDB');
$objWriter->writeAttribute('draw:value', 0);
$objWriter->endElement();
$objWriter->startElement('draw:param');
$objWriter->writeAttribute('draw:name', 'Zoom');
$objWriter->writeAttribute('draw:value', 'fit');
$objWriter->endElement();

// draw:frame > ## draw:plugin
$objWriter->endElement();

// ## draw:frame
$objWriter->endElement();
}

/**
* Write picture
*
Expand Down Expand Up @@ -353,7 +404,7 @@ public function writeShapePic(XMLWriter $objWriter, AbstractDrawing $shape)
$objWriter->writeAttribute('xlink:actuate', 'onLoad');
$objWriter->writeElement('text:p');
$objWriter->endElement();

if ($shape->hasHyperlink()) {
// office:event-listeners
$objWriter->startElement('office:event-listeners');
Expand All @@ -370,7 +421,7 @@ public function writeShapePic(XMLWriter $objWriter, AbstractDrawing $shape)
// > office:event-listeners
$objWriter->endElement();
}

$objWriter->endElement();
}

Expand Down Expand Up @@ -539,7 +590,7 @@ public function writeShapeTxt(XMLWriter $objWriter, RichText $shape)
/**
* Write Comment
* @param XMLWriter $objWriter
* @param Comment $shape
* @param Comment $oShape
*/
public function writeShapeComment(XMLWriter $objWriter, Comment $oShape)
{
Expand Down
2 changes: 1 addition & 1 deletion src/PhpPresentation/Writer/PowerPoint2007/PptMedia.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public function render()
{
for ($i = 0; $i < $this->getDrawingHashTable()->count(); ++$i) {
$shape = $this->getDrawingHashTable()->getByIndex($i);
if ($shape instanceof Drawing) {
if ($shape instanceof Drawing || $shape instanceof Media) {
$imagePath = $shape->getPath();
if (strpos($imagePath, 'zip://') !== false) {
$imagePath = substr($imagePath, 6);
Expand Down
27 changes: 25 additions & 2 deletions src/PhpPresentation/Writer/PowerPoint2007/PptSlides.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use PhpOffice\PhpPresentation\Shape\Drawing as ShapeDrawing;
use PhpOffice\PhpPresentation\Shape\Group;
use PhpOffice\PhpPresentation\Shape\Line;
use PhpOffice\PhpPresentation\Shape\Media;
use PhpOffice\PhpPresentation\Shape\MemoryDrawing as MemoryDrawing;
use PhpOffice\PhpPresentation\Shape\RichText;
use PhpOffice\PhpPresentation\Shape\RichText\BreakElement;
Expand Down Expand Up @@ -716,7 +717,30 @@ private function writeShapePic(XMLWriter $objWriter, AbstractDrawing $shape, $sh
$objWriter->endElement();

// p:nvPr
$objWriter->writeElement('p:nvPr', null);
$objWriter->startElement('p:nvPr');
if ($shape instanceof Media) {
// p:nvPr > a:videoFile
$objWriter->startElement('a:videoFile');
$objWriter->writeAttribute('r:link', $shape->relationId);
$objWriter->endElement();
// p:nvPr > p:extLst
$objWriter->startElement('p:extLst');
// p:nvPr > p:extLst > p:ext
$objWriter->startElement('p:ext');
$objWriter->writeAttribute('uri', '{DAA4B4D4-6D71-4841-9C94-3DE7FCFB9230}');
// p:nvPr > p:extLst > p:ext > p14:media
$objWriter->startElement('p14:media');
$objWriter->writeAttribute('r:embed', $shape->relationId);
$objWriter->writeAttribute('xmlns:p14', 'http://schemas.microsoft.com/office/powerpoint/2010/main');
// p:nvPr > p:extLst > p:ext > ##p14:media
$objWriter->endElement();
// p:nvPr > p:extLst > ##p:ext
$objWriter->endElement();
// p:nvPr > ##p:extLst
$objWriter->endElement();
}
// ##p:nvPr
$objWriter->endElement();
$objWriter->endElement();

// p:blipFill
Expand All @@ -736,7 +760,6 @@ private function writeShapePic(XMLWriter $objWriter, AbstractDrawing $shape, $sh

// p:spPr
$objWriter->startElement('p:spPr');

// a:xfrm
$objWriter->startElement('a:xfrm');
$objWriter->writeAttribute('rot', CommonDrawing::degreesToAngle($shape->getRotation()));
Expand Down

0 comments on commit 4696fda

Please sign in to comment.