【发布时间】:2020-03-21 15:36:35
【问题描述】:
我正在尝试使用可缩放矢量图形 (.svg) 在 PDF 中添加背景。最初推荐的方法是将 SVG 转换为 Image 对象,然后使用 scaleToFit 将其调整到正确的大小,然后将其添加到文档中。这部分工作是因为它将小型且可扩展的 SVG 转换为位图。接下来,我制作了一个 PdfFormXObject,以便通过在每一页上绘制来恢复缩放比例。但是,现在它根本不显示任何内容。
ByteArrayInputStream inputStream = new ByteArrayInputStream(backgroundBytes);
PdfFormXObject svg = SvgConverter.convertToXObject(inputStream, pdf);
PdfCanvas canvas = new PdfCanvas(pdf.getFirstPage());
Rectangle rect = new Rectangle(PageSize.A4.getWidth(), PageSize.A4.getHeight());
canvas.addXObject(svg, rect);
我应该如何将 SVG 背景添加到 iText 7 PDF?首先可以正确完成吗?我一直没能找到好的代码示例。
更新:
这里是将 SVG 转换为适当缩放的图像的代码。这样做的问题是它适用于添加图像,但它会将其添加为一个元素,因此它将其他所有内容都向下推。
ByteArrayInputStream inputStream = new ByteArrayInputStream(svgAsBytes);
Image image = SvgConverter.convertToImage(inputStream, pdf);
image.scaleAbsolute(PageSize.A4.getWidth(), PageSize.A4.getHeight());
int totalPages = pdf.getNumberOfPages()+1;
for(int pageNumber = 1; pageNumber < totalPages; pageNumber++ ) {
document.add(image);
}
【问题讨论】:
-
嗨,添加图像作为背景实际上在不同的用例中可能意味着不同的东西。如果图像小于画布的空间,您是要平铺背景,还是要拉伸图像,还是根本不做任何事情而只是将图像放在画布上?请附上所需行为和您描述为“破坏缩放”的行为的屏幕截图。否则很难理解你真正想要实现的目标
-
我有一个覆盖 A4 大小页面的 SVG,我想在每一页上重复它作为背景。转换它时,我最初使用了 PageSize.A4 的宽度和高度,但这不起作用。然后我使用 scaleToFit 使其成为图像,但将其添加到页面会向下推所有其他元素。最好我根本不会将其转换为图像并将其保留为 SVG。
-
您是自己生成整个文档,还是修改现有文档并在其中添加背景图像?在您的代码示例中,您有
document实例,但重要的是要知道您如何创建它以及底层PdfDocument是使用读取器和写入器还是仅写入器创建的。 -
示例刚刚使用了新的 PdfDocument()。在此之前,我尝试了带有 html 模板的 iText 7 pdfHtml 模块,但这根本不起作用,因为 90% 的 css 被忽略了,所以我尝试了 iText 7。似乎它需要对 PDF 标准和 iText 7 本身有广泛的了解做简单的事情,所以它是不可维护的,因此不幸的是我的公司不是一个选择。我会留下这个问题,以防将来有人找到合理的答案。