diff --git a/openhtmltopdf-examples/src/main/resources/visualtest/expected/issue-484-data-image-svg-xml-base64.pdf b/openhtmltopdf-examples/src/main/resources/visualtest/expected/issue-484-data-image-svg-xml-base64.pdf new file mode 100644 index 000000000..58d8e4a89 Binary files /dev/null and b/openhtmltopdf-examples/src/main/resources/visualtest/expected/issue-484-data-image-svg-xml-base64.pdf differ diff --git a/openhtmltopdf-examples/src/main/resources/visualtest/html/issue-484-data-image-svg-xml-base64.html b/openhtmltopdf-examples/src/main/resources/visualtest/html/issue-484-data-image-svg-xml-base64.html new file mode 100644 index 000000000..4ef3e7c6d --- /dev/null +++ b/openhtmltopdf-examples/src/main/resources/visualtest/html/issue-484-data-image-svg-xml-base64.html @@ -0,0 +1,14 @@ + + + + + +
+ + \ No newline at end of file diff --git a/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/VisualRegressionTest.java b/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/VisualRegressionTest.java index bca218ad0..65c04c110 100644 --- a/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/VisualRegressionTest.java +++ b/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/VisualRegressionTest.java @@ -1110,6 +1110,14 @@ public void testCssFontFaceRuleGoogle() throws IOException { assertTrue(vt.runTest("css-font-face-rule-google")); } + /** + * Test that img with src="data:image/svg+xml;base64,...." work. + */ + @Test + public void testIssue484ImgSrcDataImageSvgBase64() throws IOException { + assertTrue(vt.runTest("issue-484-data-image-svg-xml-base64", TestSupport.WITH_SVG)); + } + // TODO: // + Elements that appear just on generated overflow pages. // + content property (page counters, etc) diff --git a/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfBoxReplacedElementFactory.java b/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfBoxReplacedElementFactory.java index b8263c266..344eb1246 100644 --- a/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfBoxReplacedElementFactory.java +++ b/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfBoxReplacedElementFactory.java @@ -22,10 +22,16 @@ import com.openhtmltopdf.extend.*; import com.openhtmltopdf.layout.LayoutContext; import com.openhtmltopdf.render.BlockBox; +import com.openhtmltopdf.resource.ImageResource; import com.openhtmltopdf.resource.XMLResource; +import com.openhtmltopdf.util.ImageUtil; import org.w3c.dom.Element; +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.StringReader; + public class PdfBoxReplacedElementFactory implements ReplacedElementFactory { private final SVGDrawer _svgImpl; private final SVGDrawer _mathmlImpl; @@ -56,10 +62,10 @@ public ReplacedElement createReplacedElement(LayoutContext c, BlockBox box, } else if (nodeName.equals("img")) { String srcAttr = e.getAttribute("src"); if (srcAttr != null && srcAttr.length() > 0) { - //handle the case of linked svg from img tag - if (srcAttr.endsWith(".svg") && _svgImpl != null) { - XMLResource xml = uac.getXMLResource(srcAttr); + boolean isDataImageSvg = false; + if (_svgImpl != null && (srcAttr.endsWith(".svg") || (isDataImageSvg = srcAttr.startsWith("data:image/svg+xml;base64,")))) { + XMLResource xml = isDataImageSvg ? XMLResource.load(new ByteArrayInputStream(ImageUtil.getEmbeddedBase64Image(srcAttr))) : uac.getXMLResource(srcAttr); if (xml != null) { return new PdfBoxSVGReplacedElement(xml.getDocument().getDocumentElement(), _svgImpl, cssWidth, cssHeight, box, c, c.getSharedContext());