2

我正在使用 iText 为数据库中的数据生成 Pdf 报告...

pdf页面的标题是一个图像,图像上的一些文本是动态添加的,例如生成日期。

任何人都知道我们是否可以在 itext 中将背景图像设置为 PdfPTable 类型的表格。

谢谢

4

2 回答 2

4

我知道它很晚,但可能会帮助某人。这是执行此操作的方法。

创建一个 BGClass 类,实现 PdfPCellEvent 并输入以下方法。

@Override
    public void cellLayout(PdfPCell arg0, Rectangle arg1, PdfContentByte[] arg2) {
        try {
            PdfContentByte pdfContentByte = arg2[PdfPTable.BACKGROUNDCANVAS];
            Image bgImage = Image.getInstance("URL_TO_YOUR_IMAGE");
            pdfContentByte.addImage(bgImage, arg1.getWidth(), 0, 0, arg1
                    .getHeight(), arg1.getLeft(), arg1.getBottom());

        } catch (BadElementException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

在您创建 PDF 的主类中, pdfpCell.setCellEvent(new BGClass()); 其中 pdfpCell 是您想要背景图像的单元格。

于 2010-07-15T09:59:30.910 回答
0

Prabhat 的技术有一两个缺陷。

  1. 图像的副本将添加到每个单元格的 PDF 中。在 cellLayout 调用之间存储返回的图像,这样您就只有一份副本。如果您有一个 10x10 的表格和一个 10kb 的图像,那么您在 PDF 中占用了 1mb 而不是 10kb。哎哟。它实际上比所有这些额外对象的额外开销更糟糕(不是更糟,但可以测量)。
  2. 它必须平铺图像,每个单元格一个。

你最好用PdfPTableEvent. 请注意,如果您的表格跨越多个页面,您的事件处理程序将为每个表格调用一次。和参数有点时髦heightswidths每个中的第一个值是绝对起始位置。其余的值实际上是高度和宽度。方便,但变量名称有点误导。

请记住,图像的每个实例都意味着 PDF 中该图像的另一个副本。尽可能保存并重复使用它们。

于 2010-11-02T18:00:29.373 回答