代码之家  ›  专栏  ›  技术社区  ›  Wael Awada

在使用iText时,能否将背景图像设置为PdfPTable

  •  2
  • Wael Awada  · 技术社区  · 15 年前

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

    PDF页面的页眉是一个图像,图像上动态添加了一些文本,例如date generated。。

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

    谢谢

    2 回复  |  直到 15 年前
        1
  •  4
  •   Prabhat    14 年前

    我知道现在很晚了,但可能会帮助别人。下面是方法。

    创建一个类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是需要背景图像的单元格。

        2
  •  0
  •   Mark Storer    14 年前

    普拉巴特的技术有一两个缺陷。

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

    PdfPTableEvent . 请注意,如果您的表跨越多个页面,则会为每个表调用一次事件处理程序。这个 heights widths 参数有点古怪。每个值中的第一个值是绝对起始位置。其余的值实际上是高度和宽度。很方便,但是变量名有点误导。

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