我找不到如何将图像添加到每个页面的标题的示例。
在第二版的第二版中,我发现了这个:
如果您的水印是图片,您可以选择:您可以使用PdfContent-添加它 Byte.addImage()方法,或者你可以将它包装在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.IllegalPdfSyntaxException:不平衡的开始/结束文本运算符。
有人可以给我一个如何实现这个目标的简单例子吗?
P.S。我的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());
}
答案 0 :(得分:1)
您的代码段中有一些问题。在您的代码段之外可能有更多错误。
在您的代码段中:您将saveState()
/ restoreState()
与beginText()
/ endText()
嵌套。将其更改为:
cb.saveState();
...
cb.beginText();
...
cb.endText();
...
cb.restoreState();
您正在创建一个文本对象(使用beginText()
/ endText()
),但您在此文本对象中使用了非法运算符。如果不使用setFontAndSize()
,文本对象也无效,并且:您没有在文本块中添加任何文本(Form XObject不计算,因为它可能有自己的文本块)
addTemplate()
方法中的坐标错误:cb.addTemplate(total, document.right()/2, document.top() + 8);
document.right() / 2
仅在document.left()
等于0时才正确。document.top() + 8
在页面的可见区域之外添加内容(document.top() - 8
会更好)。您使用addImage()
添加图片,但我们不知道您是否为该图片定义了坐标。
你引用我写的那本书,但作为那本书的作者,我觉得你没有读过我写的东西。