Skip to content

Commit 74f924e

Browse files
committed
Use different method for writing images
This fixes an issue with alternative word processors such as AbiWord, which would have difficulties displaying images correctly.
1 parent 0beeb27 commit 74f924e

File tree

1 file changed

+87
-22
lines changed

1 file changed

+87
-22
lines changed

src/PhpWord/Writer/Word2007/Element/Image.php

Lines changed: 87 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use PhpOffice\Common\XMLWriter;
2121
use PhpOffice\PhpWord\Element\Image as ImageElement;
2222
use PhpOffice\PhpWord\Writer\Word2007\Style\Image as ImageStyleWriter;
23+
use \PhpOffice\PhpWord\Shared\Converter;
2324

2425
/**
2526
* Image element writer
@@ -41,11 +42,7 @@ public function write()
4142
return;
4243
}
4344

44-
if ($element->isWatermark()) {
45-
$this->writeWatermark($xmlWriter, $element);
46-
} else {
47-
$this->writeImage($xmlWriter, $element);
48-
}
45+
$this->writeImage($xmlWriter, $element);
4946
}
5047

5148
/**
@@ -57,31 +54,99 @@ private function writeImage(XMLWriter $xmlWriter, ImageElement $element)
5754
{
5855
$rId = $element->getRelationId() + ($element->isInSection() ? 6 : 0);
5956
$style = $element->getStyle();
57+
6058
$styleWriter = new ImageStyleWriter($xmlWriter, $style);
6159

62-
if (!$this->withoutP) {
63-
$xmlWriter->startElement('w:p');
60+
$cx = Converter::pixelToEmu($style->getWidth());
61+
$cy = Converter::pixelToEmu($style->getHeight());
62+
63+
$xmlWriter->startElement('w:p');
6464
$styleWriter->writeAlignment();
65-
}
66-
$this->writeCommentRangeStart();
65+
$xmlWriter->startElement('w:r');
66+
$xmlWriter->startElement('w:drawing');
67+
$xmlWriter->startElement('wp:inline');
68+
$xmlWriter->writeAttribute('distT', 0);
69+
$xmlWriter->writeAttribute('distB', 0);
70+
$xmlWriter->writeAttribute('distL', 114300);
71+
$xmlWriter->writeAttribute('distR', 114300);
6772

68-
$xmlWriter->startElement('w:r');
69-
$xmlWriter->startElement('w:pict');
70-
$xmlWriter->startElement('v:shape');
71-
$xmlWriter->writeAttribute('type', '#_x0000_t75');
73+
$xmlWriter->startElement('wp:extent');
74+
$xmlWriter->writeAttribute('cx', $cx);
75+
$xmlWriter->writeAttribute('cy', $cy);
76+
$xmlWriter->endElement(); //wp:extent
7277

73-
$styleWriter->write();
78+
$xmlWriter->startElement('wp:docPr');
79+
$xmlWriter->writeAttribute('id', $rId);
80+
$xmlWriter->writeAttribute('name', 'name');
81+
$xmlWriter->writeAttribute('descr', 'aa');
82+
$xmlWriter->endElement(); // wp:docPr
7483

75-
$xmlWriter->startElement('v:imagedata');
76-
$xmlWriter->writeAttribute('r:id', 'rId' . $rId);
77-
$xmlWriter->writeAttribute('o:title', '');
78-
$xmlWriter->endElement(); // v:imagedata
84+
$xmlWriter->startElement('wp:cNvGraphicFramePr');
85+
$xmlWriter->startElement('a:graphicFrameLocks');
86+
$xmlWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
87+
$xmlWriter->writeAttribute('noChangeAspect', 1);
88+
$xmlWriter->endElement(); //a:graphicFrameLocks
89+
$xmlWriter->endElement(); // wp:cNvGraphicFramePr
7990

80-
$xmlWriter->endElement(); // v:shape
81-
$xmlWriter->endElement(); // w:pict
82-
$xmlWriter->endElement(); // w:r
91+
$xmlWriter->startElement('a:graphic');
92+
$xmlWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
93+
$xmlWriter->startElement('a:graphicData');
94+
$xmlWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/picture');
95+
$xmlWriter->startElement('pic:pic');
96+
$xmlWriter->writeAttribute('xmlns:pic', 'http://schemas.openxmlformats.org/drawingml/2006/picture');
97+
98+
$xmlWriter->startElement('pic:nvPicPr');
99+
$xmlWriter->startElement('pic:cNvPr');
100+
$xmlWriter->writeAttribute('id', 3);
101+
$xmlWriter->writeAttribute('desc', 'aa');
102+
$xmlWriter->writeAttribute('name', 'name');
103+
$xmlWriter->endElement(); //pic:cNvPr
104+
105+
$xmlWriter->startElement('pic:cNvPicPr');
106+
$xmlWriter->startElement('a:picLocks');
107+
$xmlWriter->writeAttribute('noChangeAspect', '1');
108+
$xmlWriter->endElement(); //a:picLocks
109+
$xmlWriter->endElement(); //pic:cNvPicPr
110+
$xmlWriter->endElement(); //pic:nvPicPr
111+
112+
$xmlWriter->startElement('pic:blipFill');
113+
$xmlWriter->startElement('a:blip');
114+
$xmlWriter->writeAttribute('r:embed', 'rId' .$rId);
115+
$xmlWriter->endElement(); //a:blip
116+
117+
$xmlWriter->startElement('a:stretch');
118+
$xmlWriter->startElement('a:fillRect');
119+
$xmlWriter->endElement(); //a:fillRect
120+
$xmlWriter->endElement(); //a:stretch
121+
$xmlWriter->endElement(); //pic:blipFill
122+
123+
$xmlWriter->startElement('pic:spPr');
124+
$xmlWriter->startElement('a:xfrm');
125+
$xmlWriter->startElement('a:off');
126+
$xmlWriter->writeAttribute('x', 0);
127+
$xmlWriter->writeAttribute('y', 0);
128+
$xmlWriter->endElement(); //a:off
129+
130+
$xmlWriter->startElement('a:ext');
131+
$xmlWriter->writeAttribute('cx', $cx);
132+
$xmlWriter->writeAttribute('cy', $cy);
133+
$xmlWriter->endElement(); //a:ext
134+
$xmlWriter->endElement(); //a:xfrm
135+
136+
$xmlWriter->startElement('a:prstGeom');
137+
$xmlWriter->writeAttribute('prst', 'rect');
138+
$xmlWriter->startElement('a:avLst');
139+
$xmlWriter->endElement(); //a:avLst
140+
$xmlWriter->endElement(); //a:prstGeom
141+
$xmlWriter->endElement(); //pic:spPr
83142

84-
$this->endElementP();
143+
$xmlWriter->endElement(); //pic:pic
144+
$xmlWriter->endElement(); //a:graphicData
145+
$xmlWriter->endElement(); //a:graphic
146+
$xmlWriter->endElement(); //wp:inline
147+
$xmlWriter->endElement(); //w:drawing
148+
$xmlWriter->endElement(); //w:r
149+
$xmlWriter->endElement(); //w:p
85150
}
86151

87152
/**

0 commit comments

Comments
 (0)