PHPWord
PHPWord copied to clipboard
SVG image type support
Is there any workaround to add this support? I really need it for adding some highcharts graphs.
any news regarding this feature request ? Thanks in advance
I briefly looked at this today together with a collegae.
We found out that:
- SVG data should be written to Word in a different way than a PNG or a JPEG:
- PNG and JPEG are written in \PhpOffice\PhpWord\Writer\Word2007\Element\Image and are using (among more) a XML tag called 'w:pict'.
- SVG needs to start with a XML tag called 'w:drawing'. This makes them closer related to
\PhpOffice\PhpWord\Writer\Word2007\Element\Chartthan to\PhpOffice\PhpWord\Writer\Word2007\Element\Image.
- SVG data shouldn't be written to the Word XML as is. Instead, in the Word XML a reference (r:id) needs to be used.
\PhpOffice\PhpWord\Element\Image::checkImage()uses PHP image functions that don't work for SVG images, likegetimagesizefromstring().image_type_to_mime_type(), used to determine the mime type of the image, has no listing for SVG, see https://www.php.net/image_type_to_mime_type.- The mimetype for SVG should be 'image/svg+xml'.
- In Word's openXML documentation we saw that we would at least need to use a XML tag called 'asvg:svgBlip'. See https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.linq.asvg.svgblip?view=openxml-3.0.1#documentformat-openxml-linq-asvg-svgblip
- We found a code example here for generating Word XML for SVG images: https://www.docx4java.org/forums/docx-java-f6/add-svg-to-document-t2927.html#p10155. It is in Java, but it does give an idea about which XML tags should be used to write the data.
- By calling the
getData()method on a \PhpOffice\PhpWord\Shared\XMLWriter object you can get an idea about what Word XML gets produced. I temporarily addedvar_dump($xmlWriter->getData());die();to\PhpOffice\PhpWord\Writer\Word2007\Element\Image::writeImage()to see what was getting outputted.
That's how far as we got today.
Todo:
- I think that in phpword/src/PhpWord/Writer/Word2007/Element we would need to add a new class called SvgImage. The code from
\PhpOffice\PhpWord\Writer\Word2007\Element\Chartcould probably be used as a starting point for this class. - Likewise, I think that we need to have a SvgImage class in phpword/src/PhpWord/Element so a svg image can be added by calling
$phpWord->addSvgImage().
Hi @simogeo @MegaChriz @echaconairlan , could you give me a sample file with a svg image, please ?
I found a few SVG images:
Hm, apparently GitHub transforms them. Try again: svgs.zip
Not a Svg file but a docx with a svg image embed.
I haven't one ready right now, because I don't have access to Word currently. Maybe in a few days.
Thanks 😊
docxs-with-svg.zip Here are a few docx-files with a SVG in them. There is one with a highchart graph in it, and two with a simpler looking SVG file.
Thanks to all of you. I also provide a doc sample with EPS image embedded. It should not be so different from SVG file and also interesting to implement.
thanks @Progi1984 and @MegaChriz