2020-08-14 13:36:36 +02:00

521 lines
18 KiB
PHP

<?php
/**
* PHPPowerPoint
*
* Copyright (c) 2009 - 2010 PHPPowerPoint
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPPowerPoint
* @package PHPPowerPoint_Writer_PowerPoint2007
* @copyright Copyright (c) 2009 - 2010 PHPPowerPoint (http://www.codeplex.com/PHPPowerPoint)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 0.1.0, 2009-04-27
*/
/** PHPPowerPoint_Writer_PowerPoint2007 */
require_once 'PHPPowerPoint/Writer/PowerPoint2007.php';
/** PHPPowerPoint_Writer_PowerPoint2007_WriterPart */
require_once 'PHPPowerPoint/Writer/PowerPoint2007/WriterPart.php';
/** PHPPowerPoint_Slide */
require_once 'PHPPowerPoint/Slide.php';
/** PHPPowerPoint_Shape */
require_once 'PHPPowerPoint/Shape.php';
/** PHPPowerPoint_Shape_RichText */
require_once 'PHPPowerPoint/Shape/RichText.php';
/** PHPPowerPoint_Shape_BaseDrawing */
require_once 'PHPPowerPoint/Shape/BaseDrawing.php';
/** PHPPowerPoint_Shape_Drawing */
require_once 'PHPPowerPoint/Shape/Drawing.php';
/** PHPPowerPoint_Shape_MemoryDrawing */
require_once 'PHPPowerPoint/Shape/MemoryDrawing.php';
/** PHPPowerPoint_Shared_Font */
require_once 'PHPPowerPoint/Shared/Font.php';
/** PHPPowerPoint_Shared_String */
require_once 'PHPPowerPoint/Shared/String.php';
/** PHPPowerPoint_Shared_XMLWriter */
require_once 'PHPPowerPoint/Shared/XMLWriter.php';
/**
* PHPPowerPoint_Writer_PowerPoint2007_Slide
*
* @category PHPPowerPoint
* @package PHPPowerPoint_Writer_PowerPoint2007
* @copyright Copyright (c) 2006 - 2009 PHPPowerPoint (http://www.codeplex.com/PHPPowerPoint)
*/
class PHPPowerPoint_Writer_PowerPoint2007_Slide extends PHPPowerPoint_Writer_PowerPoint2007_WriterPart
{
/**
* Write slide to XML format
*
* @param PHPPowerPoint_Slide $pSlide
* @return string XML Output
* @throws Exception
*/
public function writeSlide(PHPPowerPoint_Slide $pSlide = null)
{
// Check slide
if (is_null($pSlide))
throw new Exception("Invalid PHPPowerPoint_Slide object passed.");
// Create XML writer
$objWriter = null;
if ($this->getParentWriter()->getUseDiskCaching()) {
$objWriter = new PHPPowerPoint_Shared_XMLWriter(PHPPowerPoint_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
} else {
$objWriter = new PHPPowerPoint_Shared_XMLWriter(PHPPowerPoint_Shared_XMLWriter::STORAGE_MEMORY);
}
// XML header
$objWriter->startDocument('1.0','UTF-8','yes');
// p:sld
$objWriter->startElement('p:sld');
$objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
$objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
$objWriter->writeAttribute('xmlns:p', 'http://schemas.openxmlformats.org/presentationml/2006/main');
// p:cSld
$objWriter->startElement('p:cSld');
// p:spTree
$objWriter->startElement('p:spTree');
// p:nvGrpSpPr
$objWriter->startElement('p:nvGrpSpPr');
// p:cNvPr
$objWriter->startElement('p:cNvPr');
$objWriter->writeAttribute('id', '1');
$objWriter->writeAttribute('name', '');
$objWriter->endElement();
// p:cNvGrpSpPr
$objWriter->writeElement('p:cNvGrpSpPr', null);
// p:nvPr
$objWriter->writeElement('p:nvPr', null);
$objWriter->endElement();
// p:grpSpPr
$objWriter->startElement('p:grpSpPr');
// a:xfrm
$objWriter->startElement('a:xfrm');
// a:off
$objWriter->startElement('a:off');
$objWriter->writeAttribute('x', '0');
$objWriter->writeAttribute('y', '0');
$objWriter->endElement();
// a:ext
$objWriter->startElement('a:ext');
$objWriter->writeAttribute('cx', '0');
$objWriter->writeAttribute('cy', '0');
$objWriter->endElement();
// a:chOff
$objWriter->startElement('a:chOff');
$objWriter->writeAttribute('x', '0');
$objWriter->writeAttribute('y', '0');
$objWriter->endElement();
// a:chExt
$objWriter->startElement('a:chExt');
$objWriter->writeAttribute('cx', '0');
$objWriter->writeAttribute('cy', '0');
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
// Loop shapes
$shapeId = 0;
$relationId = 1;
$shapes = $pSlide->getShapeCollection();
foreach ($shapes as $shape)
{
// Increment $shapeId
++$shapeId;
// Check type
if ($shape instanceof PHPPowerPoint_Shape_BaseDrawing)
{
// Picture --> $relationId
++$relationId;
$this->_writePic($objWriter, $shape, $shapeId, $relationId);
}
else if ($shape instanceof PHPPowerPoint_Shape_RichText)
{
$this->_writeTxt($objWriter, $shape, $shapeId);
}
}
$objWriter->endElement();
$objWriter->endElement();
// p:clrMapOvr
$objWriter->startElement('p:clrMapOvr');
// a:masterClrMapping
$objWriter->writeElement('a:masterClrMapping', '');
$objWriter->endElement();
$objWriter->endElement();
// Return
return $objWriter->getData();
}
/**
* Write pic
*
* @param PHPPowerPoint_Shared_XMLWriter $objWriter XML Writer
* @param PHPPowerPoint_Shape_BaseDrawing $shape
* @param int $shapeId
* @param int $relationId
* @throws Exception
*/
private function _writePic(PHPPowerPoint_Shared_XMLWriter $objWriter = null, PHPPowerPoint_Shape_BaseDrawing $shape = null, $shapeId, $relationId)
{
// p:pic
$objWriter->startElement('p:pic');
// p:nvPicPr
$objWriter->startElement('p:nvPicPr');
// p:cNvPr
$objWriter->startElement('p:cNvPr');
$objWriter->writeAttribute('id', $shapeId);
$objWriter->writeAttribute('name', $shape->getName());
$objWriter->writeAttribute('descr', $shape->getDescription());
$objWriter->endElement();
// p:cNvPicPr
$objWriter->startElement('p:cNvPicPr');
// a:picLocks
$objWriter->startElement('a:picLocks');
$objWriter->writeAttribute('noChangeAspect', '1');
$objWriter->endElement();
$objWriter->endElement();
// p:nvPr
$objWriter->writeElement('p:nvPr', null);
$objWriter->endElement();
// p:blipFill
$objWriter->startElement('p:blipFill');
// a:blip
$objWriter->startElement('a:blip');
$objWriter->writeAttribute('r:embed', 'rId' . $relationId);
$objWriter->endElement();
// a:stretch
$objWriter->startElement('a:stretch');
$objWriter->writeElement('a:fillRect', null);
$objWriter->endElement();
$objWriter->endElement();
// p:spPr
$objWriter->startElement('p:spPr');
// a:xfrm
$objWriter->startElement('a:xfrm');
$objWriter->writeAttribute('rot', PHPPowerPoint_Shared_Drawing::degreesToAngle($shape->getRotation()));
// a:off
$objWriter->startElement('a:off');
$objWriter->writeAttribute('x', PHPPowerPoint_Shared_Drawing::pixelsToEMU($shape->getOffsetX()));
$objWriter->writeAttribute('y', PHPPowerPoint_Shared_Drawing::pixelsToEMU($shape->getOffsetY()));
$objWriter->endElement();
// a:ext
$objWriter->startElement('a:ext');
$objWriter->writeAttribute('cx', PHPPowerPoint_Shared_Drawing::pixelsToEMU($shape->getWidth()));
$objWriter->writeAttribute('cy', PHPPowerPoint_Shared_Drawing::pixelsToEMU($shape->getHeight()));
$objWriter->endElement();
$objWriter->endElement();
// a:prstGeom
$objWriter->startElement('a:prstGeom');
$objWriter->writeAttribute('prst', 'rect');
// a:avLst
$objWriter->writeElement('a:avLst', null);
$objWriter->endElement();
if ($shape->getShadow()->getVisible()) {
// a:effectLst
$objWriter->startElement('a:effectLst');
// a:outerShdw
$objWriter->startElement('a:outerShdw');
$objWriter->writeAttribute('blurRad', PHPPowerPoint_Shared_Drawing::pixelsToEMU($shape->getShadow()->getBlurRadius()));
$objWriter->writeAttribute('dist', PHPPowerPoint_Shared_Drawing::pixelsToEMU($shape->getShadow()->getDistance()));
$objWriter->writeAttribute('dir', PHPPowerPoint_Shared_Drawing::degreesToAngle($shape->getShadow()->getDirection()));
$objWriter->writeAttribute('algn', $shape->getShadow()->getAlignment());
$objWriter->writeAttribute('rotWithShape', '0');
// a:srgbClr
$objWriter->startElement('a:srgbClr');
$objWriter->writeAttribute('val', $shape->getShadow()->getColor()->getRGB());
// a:alpha
$objWriter->startElement('a:alpha');
$objWriter->writeAttribute('val', $shape->getShadow()->getAlpha() * 1000);
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
}
$objWriter->endElement();
$objWriter->endElement();
}
/**
* Write txt
*
* @param PHPPowerPoint_Shared_XMLWriter $objWriter XML Writer
* @param PHPPowerPoint_Shape_RichText $shape
* @param int $shapeId
* @throws Exception
*/
private function _writeTxt(PHPPowerPoint_Shared_XMLWriter $objWriter = null, PHPPowerPoint_Shape_RichText $shape = null, $shapeId)
{
// p:sp
$objWriter->startElement('p:sp');
// p:nvSpPr
$objWriter->startElement('p:nvSpPr');
// p:cNvPr
$objWriter->startElement('p:cNvPr');
$objWriter->writeAttribute('id', $shapeId);
$objWriter->writeAttribute('name', '');
$objWriter->endElement();
// p:cNvSpPr
$objWriter->startElement('p:cNvSpPr');
$objWriter->writeAttribute('txBox', '1');
$objWriter->endElement();
// p:nvPr
$objWriter->writeElement('p:nvPr', null);
$objWriter->endElement();
// p:spPr
$objWriter->startElement('p:spPr');
// a:xfrm
$objWriter->startElement('a:xfrm');
$objWriter->writeAttribute('rot', PHPPowerPoint_Shared_Drawing::degreesToAngle($shape->getRotation()));
// a:off
$objWriter->startElement('a:off');
$objWriter->writeAttribute('x', PHPPowerPoint_Shared_Drawing::pixelsToEMU($shape->getOffsetX()));
$objWriter->writeAttribute('y', PHPPowerPoint_Shared_Drawing::pixelsToEMU($shape->getOffsetY()));
$objWriter->endElement();
// a:ext
$objWriter->startElement('a:ext');
$objWriter->writeAttribute('cx', PHPPowerPoint_Shared_Drawing::pixelsToEMU($shape->getWidth()));
$objWriter->writeAttribute('cy', PHPPowerPoint_Shared_Drawing::pixelsToEMU($shape->getHeight()));
$objWriter->endElement();
$objWriter->endElement();
// a:prstGeom
$objWriter->startElement('a:prstGeom');
$objWriter->writeAttribute('prst', 'rect');
$objWriter->endElement();
// a:noFill
$objWriter->writeElement('a:noFill', null);
if ($shape->getShadow()->getVisible()) {
// a:effectLst
$objWriter->startElement('a:effectLst');
// a:outerShdw
$objWriter->startElement('a:outerShdw');
$objWriter->writeAttribute('blurRad', PHPPowerPoint_Shared_Drawing::pixelsToEMU($shape->getShadow()->getBlurRadius()));
$objWriter->writeAttribute('dist', PHPPowerPoint_Shared_Drawing::pixelsToEMU($shape->getShadow()->getDistance()));
$objWriter->writeAttribute('dir', PHPPowerPoint_Shared_Drawing::degreesToAngle($shape->getShadow()->getDirection()));
$objWriter->writeAttribute('algn', $shape->getShadow()->getAlignment());
$objWriter->writeAttribute('rotWithShape', '0');
// a:srgbClr
$objWriter->startElement('a:srgbClr');
$objWriter->writeAttribute('val', $shape->getShadow()->getColor()->getRGB());
// a:alpha
$objWriter->startElement('a:alpha');
$objWriter->writeAttribute('val', $shape->getShadow()->getAlpha() * 1000);
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
$objWriter->endElement();
}
$objWriter->endElement();
// p:txBody
$objWriter->startElement('p:txBody');
// a:bodyPr
$objWriter->startElement('a:bodyPr');
$objWriter->writeAttribute('wrap', 'square');
$objWriter->writeAttribute('rtlCol', '0');
// a:spAutoFit
$objWriter->writeElement('a:spAutoFit', null);
$objWriter->endElement();
// a:lstStyle
$objWriter->writeElement('a:lstStyle', null);
// a:p
$objWriter->startElement('a:p');
// a:pPr
$objWriter->startElement('a:pPr');
$objWriter->writeAttribute('algn', $shape->getAlignment()->getHorizontal());
$objWriter->writeAttribute('fontAlgn', $shape->getAlignment()->getVertical());
$objWriter->writeAttribute('indent', $shape->getAlignment()->getIndent());
$objWriter->writeAttribute('lvl', $shape->getAlignment()->getLevel());
$objWriter->endElement();
// Loop trough rich text elements
$elements = $shape->getRichTextElements();
foreach ($elements as $element) {
if ($element instanceof PHPPowerPoint_Shape_RichText_Break) {
// a:br
$objWriter->writeElement('a:br', null);
}
elseif ($element instanceof PHPPowerPoint_Shape_RichText_Run
|| $element instanceof PHPPowerPoint_Shape_RichText_TextElement)
{
// a:r
$objWriter->startElement('a:r');
// a:rPr
if ($element instanceof PHPPowerPoint_Shape_RichText_Run) {
// a:rPr
$objWriter->startElement('a:rPr');
// Bold
$objWriter->writeAttribute('b', ($element->getFont()->getBold() ? 'true' : 'false'));
// Italic
$objWriter->writeAttribute('i', ($element->getFont()->getItalic() ? 'true' : 'false'));
// Strikethrough
$objWriter->writeAttribute('strike', ($element->getFont()->getStrikethrough() ? 'sngStrike' : 'noStrike'));
// Size
$objWriter->writeAttribute('sz', ($element->getFont()->getSize() * 100));
// Underline
$objWriter->writeAttribute('u', $element->getFont()->getUnderline());
// Superscript / subscript
if ($element->getFont()->getSuperScript() || $element->getFont()->getSubScript()) {
if ($element->getFont()->getSuperScript()) {
$objWriter->writeAttribute('baseline', '30000');
} else if ($element->getFont()->getSubScript()) {
$objWriter->writeAttribute('baseline', '-25000');
}
}
// Color - a:solidFill
$objWriter->startElement('a:solidFill');
// a:srgbClr
$objWriter->startElement('a:srgbClr');
$objWriter->writeAttribute('val', $element->getFont()->getColor()->getRGB());
$objWriter->endElement();
$objWriter->endElement();
// Font - a:latin
$objWriter->startElement('a:latin');
$objWriter->writeAttribute('typeface', $element->getFont()->getName());
$objWriter->endElement();
$objWriter->endElement();
}
// t
$objWriter->startElement('a:t');
$objWriter->writeRaw(PHPPowerPoint_Shared_String::ControlCharacterPHP2OOXML( htmlspecialchars($element->getText()) ));
$objWriter->endElement();
$objWriter->endElement();
}
}
$objWriter->endElement();
$objWriter->endElement();
/*
<a:r>
<a:rPr lang="en-US" dirty="0" err="1" smtClean="0" />
</a:r>
*/
$objWriter->endElement();
}
}