【问题标题】:iText 7 SVG as a backgroundiText 7 SVG 作为背景
【发布时间】: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 本身有广泛的了解做简单的事情,所以它是不可维护的,因此不幸的是我的公司不是一个选择。我会留下这个问题,以防将来有人找到合理的答案。

标签: java svg itext7


【解决方案1】:

您好,我也有类似的问题。我正在尝试将 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);

这是我正在使用的 BackgroundCellRenderer:

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();
        }
    }
}

添加了背景,但图像未缩放(见图)

Screenshot from Adobe Illustrator

SVG 变得比实际更大!

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 2012-02-29
    • 2021-11-29
    • 2011-01-17
    • 2019-01-04
    • 2017-12-05
    相关资源
    最近更新 更多