It is 禁止的添加内容onStartPage()
事件一般。这是禁止的将内容添加到document
对象在onEndPage()
。您应该在中添加页眉和页脚onEndPage()
方法使用PdfWriter
, NOT文档。另外:一遍又一遍地解析 HTML 会浪费大量的 CPU。
请看一下Html页眉页脚 http://itextpdf.com/events/HtmlHeaderFooter例子。
它有两个 HTML 片段,一个用于页眉,一个用于页脚。
public static final String HEADER =
"<table width=\"100%\" border=\"0\"><tr><td>Header</td><td align=\"right\">Some title</td></tr></table>";
public static final String FOOTER =
"<table width=\"100%\" border=\"0\"><tr><td>Footer</td><td align=\"right\">Some title</td></tr></table>";
请注意,有比使用 HTML 更好的方法来描述页眉和页脚,但也许这是您的要求之一,所以我不会问您为什么不使用中解释的任何方法官方文档 http://pages.itextpdf.com/ebook-stackoverflow-questions.html。顺便说一下:解决问题所需的所有信息也可以在其中找到免费电子书 http://pages.itextpdf.com/ebook-stackoverflow-questions.html所以你可能想下载它......
我们将在页面事件中仅读取这些 HTML 片段一次,然后我们将在每个页面上一遍又一遍地渲染这些元素:
public class HeaderFooter extends PdfPageEventHelper {
protected ElementList header;
protected ElementList footer;
public HeaderFooter() throws IOException {
header = XMLWorkerHelper.parseToElementList(HEADER, null);
footer = XMLWorkerHelper.parseToElementList(FOOTER, null);
}
@Override
public void onEndPage(PdfWriter writer, Document document) {
try {
ColumnText ct = new ColumnText(writer.getDirectContent());
ct.setSimpleColumn(new Rectangle(36, 832, 559, 810));
for (Element e : header) {
ct.addElement(e);
}
ct.go();
ct.setSimpleColumn(new Rectangle(36, 10, 559, 32));
for (Element e : footer) {
ct.addElement(e);
}
ct.go();
} catch (DocumentException de) {
throw new ExceptionConverter(de);
}
}
}
你看到我们用来添加的机制了吗?Element
从 XML Worker 获取对象?我们创建一个ColumnText
将写入的对象直接内容 of the writer
(使用document
是禁止的)。我们定义一个Rectangle
我们使用go()
来渲染元素。
结果显示在html_header_footer.pdf http://itextpdf.com/sites/default/files/html_header_footer.pdf.