Skip to content

Commit 10e4ec4

Browse files
committed
#279 : ODPresentation Writer : Support for rotation for RichText
1 parent 6c46ff2 commit 10e4ec4

File tree

4 files changed

+89
-3
lines changed

4 files changed

+89
-3
lines changed

samples/Sample_11_Shape.php

+20
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,25 @@ function fnSlideRichTextLineSpacing(PhpPresentation $objPHPPresentation)
8181
$shape->createTextRun('Line Spacing 300');
8282
}
8383

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+
84103
function fnSlideRichTextShadow(PhpPresentation $objPHPPresentation)
85104
{
86105
// Create templated slide
@@ -143,6 +162,7 @@ function fnSlideRichTextList(PhpPresentation $objPHPPresentation)
143162

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

samples/Sample_Header.php

+11-3
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,21 @@
8787
if (preg_match('/^Sample_\d+_/', $file)) {
8888
$name = str_replace('_', ' ', preg_replace('/(Sample_|\.php)/', '', $file));
8989
$group = substr($name, 0, 1);
90+
$id = substr($name, 0, 2);
9091
if (!isset($files[$group])) {
91-
$files[$group] = '';
92+
$files[$group] = array();
9293
}
93-
$files[$group] .= "<li><a href='{$file}'>{$name}</a></li>";
94+
if (!isset($files[$group][$id])) {
95+
$files[$group][$id] = '';
96+
}
97+
$files[$group][$id] .= "<li><a href='{$file}'>{$name}</a></li>";
98+
ksort($files[$group]);
9499
}
95100
}
96101
closedir($handle);
102+
foreach ($files as $keyGroup => $arrayGroup) {
103+
$files[$keyGroup] = implode('', $arrayGroup);
104+
}
97105
}
98106

99107
/**
@@ -183,7 +191,7 @@ function createTemplatedSlide(PhpOffice\PhpPresentation\PhpPresentation $objPHPP
183191
$shape = $slide->createDrawingShape();
184192
$shape->setName('PHPPresentation logo')
185193
->setDescription('PHPPresentation logo')
186-
->setPath('./resources/phppowerpoint_logo.gif')
194+
->setPath(__DIR__ . '/resources/phppowerpoint_logo.gif')
187195
->setHeight(36)
188196
->setOffsetX(10)
189197
->setOffsetY(10);

src/PhpPresentation/Writer/ODPresentation/Content.php

+46
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,20 @@ public function writeShapeTxt(XMLWriter $objWriter, RichText $shape): void
454454
$objWriter->writeAttribute('svg:height', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getHeight()), 3) . 'cm');
455455
$objWriter->writeAttribute('svg:x', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getOffsetX()), 3) . 'cm');
456456
$objWriter->writeAttribute('svg:y', Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getOffsetY()), 3) . 'cm');
457+
if ($shape->getRotation() != 0) {
458+
$rotRad = deg2rad($shape->getRotation());
459+
460+
$translateX = Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getWidth() / 2), 3). 'cm';
461+
$translateY = Text::numberFormat(CommonDrawing::pixelsToCentimeters($shape->getOffsetX() / 2), 3). 'cm';
462+
$objWriter->writeAttribute(
463+
'draw:transform',
464+
'rotate (-'.$rotRad.')' .
465+
'translate (' .
466+
$translateX.
467+
'-' . $translateY
468+
.')'
469+
);
470+
}
457471
// draw:text-box
458472
$objWriter->startElement('draw:text-box');
459473

@@ -593,6 +607,38 @@ public function writeShapeTxt(XMLWriter $objWriter, RichText $shape): void
593607
}
594608
}
595609

610+
if ($shape->getRotation() != 0) {
611+
$objWriter->startElement('draw:enhanced-geometry');
612+
$objWriter->writeAttribute('draw:mirror-horizontal', 'false');
613+
$objWriter->writeAttribute('draw:mirror-vertical', 'false');
614+
$objWriter->writeAttribute('svg:viewBox', '0 0 0 0');
615+
$objWriter->writeAttribute('draw:text-areas', '0 0 ?f3 ?f2');
616+
$objWriter->writeAttribute('draw:type', 'ooxml-rect');
617+
$objWriter->writeAttribute('draw:enhanced-path', 'M 0 0 L ?f3 0 ?f3 ?f2 0 ?f2 Z N');
618+
619+
$objWriter->startElement('draw:equation');
620+
$objWriter->writeAttribute('draw:name', 'f0');
621+
$objWriter->writeAttribute('draw:formula', 'logwidth/2');
622+
$objWriter->endElement();
623+
624+
$objWriter->startElement('draw:equation');
625+
$objWriter->writeAttribute('draw:name', 'f1');
626+
$objWriter->writeAttribute('draw:formula', 'logheight/2');
627+
$objWriter->endElement();
628+
629+
$objWriter->startElement('draw:equation');
630+
$objWriter->writeAttribute('draw:name', 'f2');
631+
$objWriter->writeAttribute('draw:formula', 'logheight');
632+
$objWriter->endElement();
633+
634+
$objWriter->startElement('draw:equation');
635+
$objWriter->writeAttribute('draw:name', 'f3');
636+
$objWriter->writeAttribute('draw:formula', 'logwidth');
637+
$objWriter->endElement();
638+
639+
$objWriter->endElement();
640+
}
641+
596642
// > draw:text-box
597643
$objWriter->endElement();
598644
// > draw:frame

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

+12
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,18 @@ public function testRichTextBorder(): void
418418
$this->assertIsSchemaOpenDocumentValid('1.2');
419419
}
420420

421+
public function testRichTextRotation(): void
422+
{
423+
$expectedValue = rand(1, 360);
424+
$oRichText1 = $this->oPresentation->getActiveSlide()->createRichTextShape();
425+
$oRichText1->setRotation($expectedValue);
426+
427+
$element = '/office:document-content/office:body/office:presentation/draw:page/draw:frame';
428+
$this->assertZipXmlElementExists('content.xml', $element);
429+
$this->assertZipXmlAttributeExists('content.xml', $element, 'draw:transform');
430+
$this->assertZipXmlAttributeEquals('content.xml', $element, 'draw:transform', 'rotate ('.deg2rad(360 - $expectedValue).')');
431+
}
432+
421433
public function testRichTextShadow(): void
422434
{
423435
$randAlpha = mt_rand(0, 100);

0 commit comments

Comments
 (0)