Itext 如何使用PageEvent将图像添加到页眉

Itext 如何使用PageEvent将图像添加到页眉,itext,Itext,我找不到一个如何将图像添加到每页页眉的示例 在itext In action第二版中,我发现: 如果水印是图像,则可以选择:可以将其与PdfContent一起添加- 方法,或者可以将其包装在ColumnText对象中,或者可以将其 在桌子的一个单元格内 所以我试着: public void onEndPage(PdfWriter writer, Document document) { try { PdfContentByte cb = writer.getDirectC

我找不到一个如何将图像添加到每页页眉的示例

在itext In action第二版中,我发现:

如果水印是图像,则可以选择:可以将其与PdfContent一起添加- 方法,或者可以将其包装在ColumnText对象中,或者可以将其 在桌子的一个单元格内

所以我试着:

public void onEndPage(PdfWriter writer, Document document) {
    try {
        PdfContentByte cb = writer.getDirectContent();
        cb.saveState();
        cb.beginText();
        cb.addImage(image);
        cb.addTemplate(total, document.right()/2, document.top() + 8);
        cb.restoreState();
        cb.endText();
    } catch (DocumentException ex) {
        Logger.getLogger(ImageHeader.class.getName()).log(Level.SEVERE, null, ex);
    }
}
但我得到了:

com.itextpdf.text.DocumentException:com.itextpdf.text.exceptions.illegalpdfsyntaxeexception:begin/end文本运算符不平衡

有人能给我举个简单的例子说明如何做到这一点吗

另外,我的itext版本是5.4,所以我不能使用HeaderFooter对象

编辑: 我无法通过PDFContentByte.addImage()实现我想要的,但我使用了一个表:

public void onEndPage(PdfWriter writer, Document document) {
    PdfPTable table = new PdfPTable(1);
    table.setTotalWidth(150f);
    table.setLockedWidth(true);
    table.addCell(new Celula.Builder(image).borda(0).build());
    table.writeSelectedRows(0, -1, (document.right() + document.rightMargin()) / 2 - logo.getScaledWidth(), document.top() + 70f, writer.getDirectContent());
}

代码片段中有几处错误。在代码片段之外,可能还有更多错误

在您的代码片段中:将
saveState()
/
restoreState()
beginText()
/
endText()
嵌套。将此更改为:

cb.saveState();
...
cb.beginText();
...
cb.endText();
...
cb.restoreState();
您正在创建一个文本对象(使用
beginText()
/
endText()
),但在此文本对象内使用非法运算符。如果不使用
setFontAndSize()
,文本对象无效,并且:未在文本块中添加任何文本(表单XObject不计算在内,因为它可能有自己的文本块)

addTemplate()
方法中的坐标错误:
cb.addTemplate(总计,document.right()/2,document.top()+8)

  • document.right()/2
    仅当
    document.left()
    等于0时才正确
  • document.top()+8
    将内容添加到页面可见区域之外(
    document.top()-8
    更好)
您使用
addImage()
添加图像,但我们不知道您是否为该图像定义了坐标


你引用了我写的那本书,但作为那本书的作者,我觉得你没有读我写的东西。

如果你去掉了所有的
cb.
东西,除了
addImage()
addTemplate()
?您没有执行文本操作,也没有修改堆栈,因此不需要执行这些操作。如果删除这些行,我仍然会收到相同的错误。谢谢Bruno。你说得对,虽然我在一两年前读了整本书,但我需要再读几章。我只是想我可以做到这一点,只阅读与页面事件相关的部分。再次阅读后,我发现了一些与模板大小和文档边距有关的错误。即使在那之后,我也无法通过PDFContentByte将图像添加到标题中。幸运的是,正如我在原帖中编辑的那样,我通过你书中引用的其他方法之一,成功地完成了我所需要的。