如何使用 itext 从 html 源向 pdf 添加标题?
目前,我们已经扩展了 PdfPageEventHelper 并覆盖了这些方法。工作正常,但当我到达 2+ 页时它会抛出 RuntimeWorkerException。
@Override
void onStartPage(PdfWriter writer, Document document) {
InputStream is = new ByteArrayInputStream(header?.getBytes());
XMLWorkerHelper.getInstance().parseXHtml(writer, document, is);
}
@Override
void onEndPage(PdfWriter writer, Document document) {
InputStream is = new ByteArrayInputStream(footer?.getBytes());
XMLWorkerHelper.getInstance().parseXHtml(writer, document, is);
}
最佳答案
一般禁止在onStartPage()
事件中添加内容。 禁止在onEndPage()
中向document
对象添加内容。您应该使用 PdfWriter
在 onEndPage()
方法中添加页眉和页脚,不是 文档。另外:一遍又一遍地解析 HTML 会浪费大量 CPU。
请查看 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 更好的方法来描述页眉和页脚,但也许这是您的要求之一,所以我不会问您为什么不使用 the official documentation 中说明的任何方法.顺便说一句:解决问题所需的所有信息也可以在该 free ebook 中找到,因此您可能需要下载它...
我们将在页面事件中只读取一次这些 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);
}
}
}
您看到我们用来添加从 XML Worker 获取的 Element
对象的机制了吗?我们创建一个 ColumnText
对象,它将写入 writer
的直接内容(禁止使用 document
) .我们定义了一个 Rectangle
并使用 go()
来渲染元素。
结果显示在 html_header_footer.pdf 中。
关于java - 如何向页面添加 HTML 页眉和页脚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33394158/