如何在iText生成的PDF中将图像添加到我的标题?

Rob*_*ume 5 java itext

我正在使用iText生成PDF.我创建了一个自定义PdfPageEventHelper来为每个页面添加页眉(和页脚).

我的问题是我不知道如何添加图像,因此它显示在"标题框"中.我只知道如何将图像添加到文档内容本身(如果这有意义).

这是一些代码片段......

public static void main(String[] args) {
  Rectangle headerBox = new Rectangle(36, 54, 559, 788);
  /* ... */
  Document document = new Document(PageSize.A4, 36, 36, 154, 54);
  PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(FILENAME));
  HeaderFooter event = new HeaderFooter();
  writer.setBoxSize("headerBox", headerBox);
  writer.setPageEvent(event);
  document.open();
  addContent();
  document.close();
}

static class HeaderFooter extends PdfPageEventHelper {

  public void onEndPage(PdfWriter writer, Document document) {
    Rectangle rect = writer.getBoxSize("headerBox");
    // add header text
    ColumnText.showTextAligned(writer.getDirectContent(),
      Element.ALIGN_RIGHT, new Phrase("Hello", fontHeader1),
      rect.getLeft(), rect.getTop(), 0);

    // add header image
    try {
      Image img = Image.getInstance("c:/mylogo.PNG");
      img.scaleToFit(100,100);
      document.add(img);
    } catch (Exception x) {
      x.printStackTrace();
    }

  }

}
Run Code Online (Sandbox Code Playgroud)

关于将图像添加到标题的适当方式的任何建议都非常感谢!!

Bru*_*gie 12

你犯了两个重大错误.

  1. 您正在为每个新页面创建对象的新实例.这将导致臃肿的PDF,因为图像字节将被添加为与页面一样多的次数.请ImageonEndPage()方法外创建对象,然后重复使用它.这样,图像字节将仅添加到PDF一次.
  2. 如文档所述,作为参数Document传递给onEndPage()方法应该被视为只读参数.禁止向其添加内容.它与您创建的对象不同new Document(PageSize.A4, 36, 36, 154, 54).实际上,它是实例PdfDocument内部创建的类的PdfWriter实例.要添加图像,您需要PdfContentByte从编写器中获取图像,然后使用添加图像addImage().

阅读文档可以轻松避免这样的错误.通过阅读我的书iText in Action,您可以节省大量时间.


Den*_*hev 5

你能试一下吗

img.setAbsolutePosition(10, 10);
writer.getDirectContent().addImage(img);
Run Code Online (Sandbox Code Playgroud)

代替

document.add(img);
Run Code Online (Sandbox Code Playgroud)

在里面onPageEnd