java - 使用 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();
}
解决方案
问题是圆圈在 cx 和 cy 属性中包含百分比。itextpdf lib 中的 EllipseSvgNodeRenderer 类不支持百分比,仅支持像素。
因此,当您运行代码时,控制台中会出现以下错误:
ERROR [main] CssUtils - Unknown absolute metric length parsed "%".
“%”符号被忽略,而不是 40 和 30 像素 cx 和 cy 都得到 50px 值。
推荐阅读
- scala - scala如何在for循环中一次同时运行X个函数
- mongodb - Kotlin 中带有 spring-data-mongodb 的不可空 ID
- javascript - React - 遍历二维数组并将当前元素与相邻元素及其值进行比较
- android - Android Studio 模拟器上的 kvm 权限被拒绝
- c# - 如何使用 Entity Framework Core 进行全文搜索?
- assembly - 什么是 WebAssembly (Wasm) 模块?
- dialogflow-es - 来自 webhook 的 dialogflow 触发事件
- html - 使用引导程序的项目不会出现在新行上
- r - 在给定 X 的情况下提取 R 中的 Lowess 平滑
- java - Android 服务不会在 Android 8.1 上重新启动