我正在将svg图像添加到pdf页面。
首先,我尝试了svgconverter.createpdf来检查itext是否可以与svg一起工作。
一些SVG很好。遗憾的是,以下svg(使用百分比位置)在pdf中没有正确显示/定位。
我的转换代码
String svgImage = resourceFile("svg/circle-sRGB-rgb.svg");
String destination = targetFile("svg-itext_SVG2PDF.pdf");
try(InputStream svgStream = new FileInputStream(new File(svgImage))) {
try(OutputStream pdfStream = new FileOutputStream(new File(destination))) {
SvgConverter.createPdf(svgStream, pdfStream);
}
}
svg文件
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 80 60">
<circle cx="50%" cy="50%" r="30" fill="rgb(10, 200, 200)"/>
</svg>
svg预览
生成的pdf预览
如果我将svg中的位置(cx,cy)改为绝对值,输出似乎很好。
我还尝试将svg转换为xobject,但也没有用。
private void addSvgImageToPdfPage(PdfPage page, String svgContent, float x, float y, float w, float h) {
// convert svg to xObject
PdfFormXObject xObject = SvgConverter.convertToXObject(svgContent, page.getDocument());
// create page canvas
PdfCanvas pdfCanvas = new PdfCanvas(page);
// create AT
AffineTransform at = AffineTransform.getTranslateInstance(x, y);
at.concatenate(AffineTransform.getScaleInstance(w / xObject.getWidth(), h / xObject.getHeight()));
float[] matrix = new float[6];
at.getMatrix(matrix);
// add svg xObject to canvas
pdfCanvas.addXObjectWithTransformationMatrix(xObject, matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
pdfCanvas.release();
}
2条答案
按热度按时间ejk8hzay1#
问题是圆包含cx和cy属性中的百分比。itextpdf lib中的ellipsesvgnoderender类不支持百分比,仅支持像素。
https://git.itextsupport.com/projects/i7j/repos/itextcore/browse/svg/src/main/java/com/itextpdf/svg/renderers/impl/ellipsesvgnoderenderer.java#64
因此,当您运行代码时,控制台中会出现以下错误:
忽略“%”符号,而不是40和30像素cx和cy都获得50px值。
dgtucam12#
正如@a.alexander正确提到的,itext开箱即用不支持circle元素的相关参数。但是,您可以为能够处理百分比的circle标记(而不是circlesvgnoderender)注册自己的渲染器。
abstractsvgnoderender中的parseabsolutelength方法对此非常有用。
自定义渲染器。
然后需要自定义DefaultsVgnoderEnderFactory。
每当svgconverter渲染一个圆时,新工厂必须创建customCircleSVGNodeRender的示例。例如
强制svgconverter使用CustomRenderFactory
您应该将此工厂添加到converterproperties示例,然后使用svgconverter中具有isvgconverterproperties类型参数的方法。