Java iText 7 SVG作为背景
我正在尝试使用可缩放矢量图形(.svg)在PDF中添加背景。最初,推荐的方法是将SVG转换为图像对象,然后使用scaleToFit将其调整到正确的大小,然后将其添加到文档中。这在一定程度上起作用,因为它将小型可伸缩SVG转换为位图。接下来,我制作了一个PdfFormXObject,通过在每页上绘制它来恢复缩放。但是,现在它根本不显示任何内容Java iText 7 SVG作为背景,java,svg,itext7,Java,Svg,Itext7,我正在尝试使用可缩放矢量图形(.svg)在PDF中添加背景。最初,推荐的方法是将SVG转换为图像对象,然后使用scaleToFit将其调整到正确的大小,然后将其添加到文档中。这在一定程度上起作用,因为它将小型可伸缩SVG转换为位图。接下来,我制作了一个PdfFormXObject,通过在每页上绘制它来恢复缩放。但是,现在它根本不显示任何内容 ByteArrayInputStream inputStream = new ByteArrayInputStream(backgroundBytes);
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);
}
ByteArrayInputStream inputStream=newbytearrayinputstream(svgAsBytes);
Image Image=SvgConverter.convertToImage(inputStream,pdf);
scaleAbsolute(PageSize.A4.getWidth(),PageSize.A4.getHeight());
int totalPages=pdf.getNumberOfPages()+1;
对于(int pageNumber=1;pageNumber
嗨,我也有类似的问题。我试图添加一个SVG图像作为表格单元格背景。问题是我无法缩放图像。这是我的密码:
InputStream triangleSteam = this.getClass().getResourceAsStream("/AH-AddressTriangle.svg");
Image triangle = SvgConverter.convertToImage(triangleSteam, pdfDocument);
//triangle.setHeight(UnitValue.createPointValue(127.83f));
//triangle.setWidth(UnitValue.createPointValue(78.63f));
triangle.scaleAbsolute(78.63f, 127.83f);
Cell headerCell_12 = new Cell();
headerCell_12.setBorder(Border.NO_BORDER);
headerCell_12.setPadding(0f);
headerCell_12.setHeight(UnitValue.createPointValue(127.83f));
headerCell_12.setWidth(UnitValue.createPointValue(78.63f));
headerCell_12.setNextRenderer(new ImageBackgroundCellRenderer(headerCell_12, triangle));
headerTable.addCell(headerCell_12);
下面是我使用的背景:
protected class ImageBackgroundCellRenderer extends CellRenderer {
Image img;
public ImageBackgroundCellRenderer(Cell modelElement, Image img) {
super(modelElement);
this.img = img;
}
@Override
public IRenderer getNextRenderer() {
return new ImageBackgroundCellRenderer((Cell) modelElement, img);
}
@Override
public void draw(DrawContext drawContext) {
try {
img.scaleToFit(getOccupiedAreaBBox().getWidth(), getOccupiedAreaBBox().getHeight());
drawContext.getCanvas().addXObject(img.getXObject(), getOccupiedAreaBBox());
super.draw(drawContext);
} catch(Exception e) {
e.printStackTrace();
}
}
}
添加了背景,但图像没有缩放(见图)
SVG变得比实际更大
谢谢大家! 嗨,在不同的用例中,添加图像作为背景实际上意味着不同的事情。如果图像小于画布的空间,是否要平铺背景,是否要拉伸图像,还是完全不做任何事情,只将图像放置在画布上?请附上所需行为和您描述为“破坏缩放”的行为的屏幕截图。否则很难理解您真正想要实现的是什么我有一个SVG,它覆盖一个A4大小的页面,我想在每个页面上重复它作为背景。转换时,我最初使用了PageSize.A4的宽度和高度,但这不起作用。然后我使用scaleToFit使它成为一个图像,但将它添加到页面会向下推所有其他元素。最好我不会将其转换为图像,而将其保留为SVG。您是自己生成整个文档,还是修改现有文档并在其中添加背景图像?在代码示例中,您有
document
实例,但重要的是要知道如何创建它,以及基础PdfDocument
是仅使用reader and writer还是writer创建的。示例仅使用了new PdfDocument()。在此之前,我尝试了带有html模板的iText 7 pdfHtml模块,但根本不起作用,因为90%的css被忽略,所以我尝试了iText 7。似乎它需要对PDF标准和iText 7本身有广泛的了解,才能完成简单的工作,因此它不可维护,因此不幸的是,我的公司不能选择它。如果将来有人能找到一个合理的答案,我会把这个问题留待讨论。