Skip to content

Commit 9b938ad

Browse files
committed
#279 : ODPresentation Writer : Support for rotation for RichText
1 parent f16f996 commit 9b938ad

File tree

4 files changed

+80
-1
lines changed

4 files changed

+80
-1
lines changed

samples/Sample_11_Shape.php

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,26 @@ function fnSlideRichTextLineSpacing(PhpPresentation $objPHPPresentation): void
8181
$shape->createTextRun('Line Spacing 300');
8282
}
8383

84-
function fnSlideRichTextShadow(PhpPresentation $objPHPPresentation): void
84+
function fnSlideRichTextRotation(PhpPresentation $objPHPPresentation)
85+
{
86+
// Create templated slide
87+
echo date('H:i:s') . ' Create templated slide' . EOL;
88+
$currentSlide = createTemplatedSlide($objPHPPresentation);
89+
90+
// Create a shape (text)
91+
echo date('H:i:s') . ' Create a shape (rich text) with rotation' . EOL;
92+
$shape = $currentSlide->createRichTextShape();
93+
$shape->setHeight(100);
94+
$shape->setWidth(400);
95+
$shape->setOffsetX(100);
96+
$shape->setOffsetY(100);
97+
$shape->getActiveParagraph()->getAlignment()->setHorizontal(Alignment::HORIZONTAL_LEFT);
98+
$shape->setRotation(90);
99+
100+
$shape->createTextRun('RichText with rotation');
101+
}
102+
103+
function fnSlideRichTextShadow(PhpPresentation $objPHPPresentation)
85104
{
86105
// Create templated slide
87106
echo date('H:i:s') . ' Create templated slide' . EOL;
@@ -143,6 +162,7 @@ function fnSlideRichTextList(PhpPresentation $objPHPPresentation): void
143162

144163
fnSlideRichText($objPHPPresentation);
145164
fnSlideRichTextLineSpacing($objPHPPresentation);
165+
fnSlideRichTextRotation($objPHPPresentation);
146166
fnSlideRichTextShadow($objPHPPresentation);
147167
fnSlideRichTextList($objPHPPresentation);
148168

samples/Sample_Header.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
if (preg_match('/^Sample_\d+_/', $file)) {
9393
$name = str_replace('_', ' ', preg_replace('/(Sample_|\.php)/', '', $file));
9494
$group = substr($name, 0, 1);
95+
$id = substr($name, 0, 2);
9596
if (!isset($files[$group])) {
9697
$files[$group] = [];
9798
}

src/PhpPresentation/Writer/ODPresentation/Content.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,20 @@ protected function writeShapeTxt(XMLWriter $objWriter, RichText $shape): void
503503
$objWriter->writeAttribute('svg:height', Text::numberFormat(CommonDrawing::pixelsToCentimeters((int) $shape->getHeight()), 3) . 'cm');
504504
$objWriter->writeAttribute('svg:x', Text::numberFormat(CommonDrawing::pixelsToCentimeters((int) $shape->getOffsetX()), 3) . 'cm');
505505
$objWriter->writeAttribute('svg:y', Text::numberFormat(CommonDrawing::pixelsToCentimeters((int) $shape->getOffsetY()), 3) . 'cm');
506+
if ($shape->getRotation() != 0) {
507+
$rotRad = deg2rad($shape->getRotation());
508+
509+
$translateX = Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getWidth() / 2), 3). 'cm';
510+
$translateY = Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getOffsetX() / 2), 3). 'cm';
511+
$objWriter->writeAttribute(
512+
'draw:transform',
513+
'rotate (-'.$rotRad.')' .
514+
'translate (' .
515+
$translateX.
516+
'-' . $translateY
517+
.')'
518+
);
519+
}
506520
// draw:text-box
507521
$objWriter->startElement('draw:text-box');
508522

@@ -642,6 +656,38 @@ protected function writeShapeTxt(XMLWriter $objWriter, RichText $shape): void
642656
}
643657
}
644658

659+
if ($shape->getRotation() != 0) {
660+
$objWriter->startElement('draw:enhanced-geometry');
661+
$objWriter->writeAttribute('draw:mirror-horizontal', 'false');
662+
$objWriter->writeAttribute('draw:mirror-vertical', 'false');
663+
$objWriter->writeAttribute('svg:viewBox', '0 0 0 0');
664+
$objWriter->writeAttribute('draw:text-areas', '0 0 ?f3 ?f2');
665+
$objWriter->writeAttribute('draw:type', 'ooxml-rect');
666+
$objWriter->writeAttribute('draw:enhanced-path', 'M 0 0 L ?f3 0 ?f3 ?f2 0 ?f2 Z N');
667+
668+
$objWriter->startElement('draw:equation');
669+
$objWriter->writeAttribute('draw:name', 'f0');
670+
$objWriter->writeAttribute('draw:formula', 'logwidth/2');
671+
$objWriter->endElement();
672+
673+
$objWriter->startElement('draw:equation');
674+
$objWriter->writeAttribute('draw:name', 'f1');
675+
$objWriter->writeAttribute('draw:formula', 'logheight/2');
676+
$objWriter->endElement();
677+
678+
$objWriter->startElement('draw:equation');
679+
$objWriter->writeAttribute('draw:name', 'f2');
680+
$objWriter->writeAttribute('draw:formula', 'logheight');
681+
$objWriter->endElement();
682+
683+
$objWriter->startElement('draw:equation');
684+
$objWriter->writeAttribute('draw:name', 'f3');
685+
$objWriter->writeAttribute('draw:formula', 'logwidth');
686+
$objWriter->endElement();
687+
688+
$objWriter->endElement();
689+
}
690+
645691
// > draw:text-box
646692
$objWriter->endElement();
647693
// > draw:frame

tests/PhpPresentation/Tests/Writer/ODPresentation/ContentTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,18 @@ public function testRichTextBorder(): void
507507
$this->assertIsSchemaOpenDocumentValid('1.2');
508508
}
509509

510+
public function testRichTextRotation(): void
511+
{
512+
$expectedValue = rand(1, 360);
513+
$oRichText1 = $this->oPresentation->getActiveSlide()->createRichTextShape();
514+
$oRichText1->setRotation($expectedValue);
515+
516+
$element = '/office:document-content/office:body/office:presentation/draw:page/draw:frame';
517+
$this->assertZipXmlElementExists('content.xml', $element);
518+
$this->assertZipXmlAttributeExists('content.xml', $element, 'draw:transform');
519+
$this->assertZipXmlAttributeEquals('content.xml', $element, 'draw:transform', 'rotate ('.deg2rad(360 - $expectedValue).')');
520+
}
521+
510522
public function testRichTextShadow(): void
511523
{
512524
$randAlpha = mt_rand(0, 100);

0 commit comments

Comments
 (0)