/** */ public function testDegreesAngle() { $value = rand(1, 100); $this->assertEquals(0, Drawing::degreesToAngle()); $this->assertEquals((int) round($value * 60000), Drawing::degreesToAngle($value)); $this->assertEquals(0, Drawing::angleToDegrees()); $this->assertEquals(round($value / 60000), Drawing::angleToDegrees($value)); }
/** * Write Gradient Fill * * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer * @param \PhpOffice\PhpPresentation\Style\Fill $pFill Fill style * @throws \Exception */ protected function writeGradientFill(XMLWriter $objWriter, Fill $pFill) { // a:gradFill $objWriter->startElement('a:gradFill'); // a:gsLst $objWriter->startElement('a:gsLst'); // a:gs $objWriter->startElement('a:gs'); $objWriter->writeAttribute('pos', '0'); $this->writeColor($objWriter, $pFill->getStartColor()); $objWriter->endElement(); // a:gs $objWriter->startElement('a:gs'); $objWriter->writeAttribute('pos', '100000'); $this->writeColor($objWriter, $pFill->getEndColor()); $objWriter->endElement(); $objWriter->endElement(); // a:lin $objWriter->startElement('a:lin'); $objWriter->writeAttribute('ang', CommonDrawing::degreesToAngle($pFill->getRotation())); $objWriter->writeAttribute('scaled', '0'); $objWriter->endElement(); $objWriter->endElement(); }
/** * Write Shadow * @param XMLWriter $objWriter * @param Shadow $oShadow */ protected function writeShadow(XMLWriter $objWriter, Shadow $oShadow) { // a:effectLst $objWriter->startElement('a:effectLst'); // a:outerShdw $objWriter->startElement('a:outerShdw'); $objWriter->writeAttribute('blurRad', CommonDrawing::pixelsToEmu($oShadow->getBlurRadius())); $objWriter->writeAttribute('dist', CommonDrawing::pixelsToEmu($oShadow->getDistance())); $objWriter->writeAttribute('dir', CommonDrawing::degreesToAngle($oShadow->getDirection())); $objWriter->writeAttribute('algn', $oShadow->getAlignment()); $objWriter->writeAttribute('rotWithShape', '0'); // a:srgbClr $objWriter->startElement('a:srgbClr'); $objWriter->writeAttribute('val', $oShadow->getColor()->getRGB()); // a:alpha $objWriter->startElement('a:alpha'); $objWriter->writeAttribute('val', $oShadow->getAlpha() * 1000); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); }
/** * Write chart to XML format * * @param \PhpOffice\PhpPresentation\Shape\Chart $chart * @return string XML Output * @throws \Exception */ public function writeChart(Chart $chart) { // Create XML writer $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); // XML header $objWriter->startDocument('1.0', 'UTF-8', 'yes'); // c:chartSpace $objWriter->startElement('c:chartSpace'); $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart'); $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main'); $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); // c:date1904 $objWriter->startElement('c:date1904'); $objWriter->writeAttribute('val', '1'); $objWriter->endElement(); // c:lang $objWriter->startElement('c:lang'); $objWriter->writeAttribute('val', 'en-US'); $objWriter->endElement(); // c:chart $objWriter->startElement('c:chart'); // Title? if ($chart->getTitle()->isVisible()) { // Write title $this->writeTitle($objWriter, $chart->getTitle()); } // c:autoTitleDeleted $objWriter->startElement('c:autoTitleDeleted'); $objWriter->writeAttribute('val', $chart->getTitle()->isVisible() ? '0' : '1'); $objWriter->endElement(); // c:view3D $objWriter->startElement('c:view3D'); // c:rotX $objWriter->startElement('c:rotX'); $objWriter->writeAttribute('val', $chart->getView3D()->getRotationX()); $objWriter->endElement(); // c:hPercent $objWriter->startElement('c:hPercent'); $objWriter->writeAttribute('val', $chart->getView3D()->getHeightPercent()); $objWriter->endElement(); // c:rotY $objWriter->startElement('c:rotY'); $objWriter->writeAttribute('val', $chart->getView3D()->getRotationY()); $objWriter->endElement(); // c:depthPercent $objWriter->startElement('c:depthPercent'); $objWriter->writeAttribute('val', $chart->getView3D()->getDepthPercent()); $objWriter->endElement(); // c:rAngAx $objWriter->startElement('c:rAngAx'); $objWriter->writeAttribute('val', $chart->getView3D()->hasRightAngleAxes() ? '1' : '0'); $objWriter->endElement(); // c:perspective $objWriter->startElement('c:perspective'); $objWriter->writeAttribute('val', $chart->getView3D()->getPerspective()); $objWriter->endElement(); $objWriter->endElement(); // Write plot area $this->writePlotArea($objWriter, $chart->getPlotArea(), $chart); // Legend? if ($chart->getLegend()->isVisible()) { // Write legend $this->writeLegend($objWriter, $chart->getLegend()); } // c:plotVisOnly $objWriter->startElement('c:plotVisOnly'); $objWriter->writeAttribute('val', '1'); $objWriter->endElement(); $objWriter->endElement(); // c:spPr $objWriter->startElement('c:spPr'); // Fill $this->writeFill($objWriter, $chart->getFill()); // Border if ($chart->getBorder()->getLineStyle() != Border::LINE_NONE) { $this->writeBorder($objWriter, $chart->getBorder(), ''); } // Shadow if ($chart->getShadow()->isVisible()) { // a:effectLst $objWriter->startElement('a:effectLst'); // a:outerShdw $objWriter->startElement('a:outerShdw'); $objWriter->writeAttribute('blurRad', CommonDrawing::pixelsToEmu($chart->getShadow()->getBlurRadius())); $objWriter->writeAttribute('dist', CommonDrawing::pixelsToEmu($chart->getShadow()->getDistance())); $objWriter->writeAttribute('dir', CommonDrawing::degreesToAngle($chart->getShadow()->getDirection())); $objWriter->writeAttribute('algn', $chart->getShadow()->getAlignment()); $objWriter->writeAttribute('rotWithShape', '0'); // a:srgbClr $objWriter->startElement('a:srgbClr'); $objWriter->writeAttribute('val', $chart->getShadow()->getColor()->getRGB()); // a:alpha $objWriter->startElement('a:alpha'); $objWriter->writeAttribute('val', $chart->getShadow()->getAlpha() * 1000); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); $objWriter->endElement(); } $objWriter->endElement(); // External data? if ($chart->hasIncludedSpreadsheet()) { // c:externalData $objWriter->startElement('c:externalData'); $objWriter->writeAttribute('r:id', 'rId1'); // c:autoUpdate $objWriter->startElement('c:autoUpdate'); $objWriter->writeAttribute('val', '0'); $objWriter->endElement(); $objWriter->endElement(); } $objWriter->endElement(); // Return return $objWriter->getData(); }
/** * Write pic * * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer * @param \PhpOffice\PhpPresentation\Shape\AbstractGraphic $shape * @param int $shapeId * @throws \Exception */ protected function writeShapePic(XMLWriter $objWriter, AbstractGraphic $shape, $shapeId) { // 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()); // a:hlinkClick if ($shape->hasHyperlink()) { $this->writeHyperlink($objWriter, $shape); } $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->startElement('p:nvPr'); /** * @link : https://github.com/stefslon/exportToPPTX/blob/master/exportToPPTX.m#L2128 */ 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 $objWriter->startElement('p:blipFill'); // a:blip $objWriter->startElement('a:blip'); $objWriter->writeAttribute('r:embed', $shape->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->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation())); // a:off $objWriter->startElement('a:off'); $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX())); $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY())); $objWriter->endElement(); // a:ext $objWriter->startElement('a:ext'); $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth())); $objWriter->writeAttribute('cy', CommonDrawing::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->getBorder()->getLineStyle() != Border::LINE_NONE) { $this->writeBorder($objWriter, $shape->getBorder(), ''); } if ($shape->getShadow()->isVisible()) { $this->writeShadow($objWriter, $shape->getShadow()); } $objWriter->endElement(); $objWriter->endElement(); }
/** * Write txt * * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer * @param \PhpOffice\PhpPresentation\Shape\RichText $shape * @param int $shapeId * @throws \Exception */ protected function writeShapeText(XMLWriter $objWriter, RichText $shape, $shapeId) { // p:sp $objWriter->startElement('p:sp'); // p:sp/p:nvSpPr $objWriter->startElement('p:nvSpPr'); // p:sp/p:nvSpPr/p:cNvPr $objWriter->startElement('p:cNvPr'); $objWriter->writeAttribute('id', $shapeId); $objWriter->writeAttribute('name', ''); // Hyperlink if ($shape->hasHyperlink()) { $this->writeHyperlink($objWriter, $shape); } // > p:sp/p:nvSpPr $objWriter->endElement(); // p:sp/p:cNvSpPr $objWriter->startElement('p:cNvSpPr'); $objWriter->writeAttribute('txBox', '1'); $objWriter->endElement(); // p:sp/p:cNvSpPr/p:nvPr $objWriter->startElement('p:nvPr'); if ($shape->isPlaceholder()) { $objWriter->startElement('p:ph'); $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType()); $objWriter->endElement(); } $objWriter->endElement(); // > p:sp/p:cNvSpPr $objWriter->endElement(); // p:sp/p:spPr $objWriter->startElement('p:spPr'); if (!$shape->isPlaceholder()) { // p:sp/p:spPr\a:xfrm $objWriter->startElement('a:xfrm'); $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation())); // p:sp/p:spPr\a:xfrm\a:off $objWriter->startElement('a:off'); $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX())); $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY())); $objWriter->endElement(); // p:sp/p:spPr\a:xfrm\a:ext $objWriter->startElement('a:ext'); $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth())); $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight())); $objWriter->endElement(); // > p:sp/p:spPr\a:xfrm $objWriter->endElement(); // p:sp/p:spPr\a:prstGeom $objWriter->startElement('a:prstGeom'); $objWriter->writeAttribute('prst', 'rect'); $objWriter->endElement(); } $this->writeFill($objWriter, $shape->getFill()); $this->writeBorder($objWriter, $shape->getBorder(), ''); $this->writeShadow($objWriter, $shape->getShadow()); // > p:sp/p:spPr $objWriter->endElement(); // p:txBody $objWriter->startElement('p:txBody'); // a:bodyPr //@link :http://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.bodyproperties%28v=office.14%29.aspx $objWriter->startElement('a:bodyPr'); if (!$shape->isPlaceholder()) { $verticalAlign = $shape->getActiveParagraph()->getAlignment()->getVertical(); if ($verticalAlign != Alignment::VERTICAL_BASE && $verticalAlign != Alignment::VERTICAL_AUTO) { $objWriter->writeAttribute('anchor', $verticalAlign); } if ($shape->getWrap() != RichText::WRAP_SQUARE) { $objWriter->writeAttribute('wrap', $shape->getWrap()); } $objWriter->writeAttribute('rtlCol', '0'); if ($shape->getHorizontalOverflow() != RichText::OVERFLOW_OVERFLOW) { $objWriter->writeAttribute('horzOverflow', $shape->getHorizontalOverflow()); } if ($shape->getVerticalOverflow() != RichText::OVERFLOW_OVERFLOW) { $objWriter->writeAttribute('vertOverflow', $shape->getVerticalOverflow()); } if ($shape->isUpright()) { $objWriter->writeAttribute('upright', '1'); } if ($shape->isVertical()) { $objWriter->writeAttribute('vert', 'vert'); } $objWriter->writeAttribute('bIns', CommonDrawing::pixelsToEmu($shape->getInsetBottom())); $objWriter->writeAttribute('lIns', CommonDrawing::pixelsToEmu($shape->getInsetLeft())); $objWriter->writeAttribute('rIns', CommonDrawing::pixelsToEmu($shape->getInsetRight())); $objWriter->writeAttribute('tIns', CommonDrawing::pixelsToEmu($shape->getInsetTop())); if ($shape->getColumns() != 1) { $objWriter->writeAttribute('numCol', $shape->getColumns()); } // a:spAutoFit $objWriter->startElement('a:' . $shape->getAutoFit()); if ($shape->getAutoFit() == RichText::AUTOFIT_NORMAL) { if (!is_null($shape->getFontScale())) { $objWriter->writeAttribute('fontScale', (int) ($shape->getFontScale() * 1000)); } if (!is_null($shape->getLineSpaceReduction())) { $objWriter->writeAttribute('lnSpcReduction', (int) ($shape->getLineSpaceReduction() * 1000)); } } $objWriter->endElement(); } $objWriter->endElement(); // a:lstStyle $objWriter->startElement('a:lstStyle'); $objWriter->endElement(); // Write paragraphs $this->writeParagraphs($objWriter, $shape->getParagraphs(), $shape->isPlaceholder()); $objWriter->endElement(); $objWriter->endElement(); }