首页 > 解决方案 > 使用 iText 将 SVG 转换为 PDF,SVG 未在 PDF 中完全显示

问题描述

我正在将 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();
}

标签: javasvgitextitext7

解决方案


问题是圆圈在 cx 和 cy 属性中包含百分比。itextpdf lib 中的 EllipseSvgNodeRenderer 类不支持百分比,仅支持像素。

https://git.itextsupport.com/projects/I7J/repos/itextcore/browse/svg/src/main/java/com/itextpdf/svg/renderers/impl/EllipseSvgNodeRenderer.java#64

因此,当您运行代码时,控制台中会出现以下错误:

ERROR [main] CssUtils - Unknown absolute metric length parsed "%".

“%”符号被忽略,而不是 40 和 30 像素 cx 和 cy 都得到 50px 值。


推荐阅读