如何使用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,is); }
解决方法
一般来说,禁止在onStartPage()事件中添加内容.禁止在onEndPage()中向文档对象添加内容.您应该使用PdfWriter,NOT文档在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,32)); for (Element e : footer) { ct.addElement(e); } ct.go(); } catch (DocumentException de) { throw new ExceptionConverter(de); } } }
您是否看到我们用于添加从XML Worker获取的Element对象的机制?我们创建一个ColumnText对象,该对象将写入编写器的直接内容(禁止使用该文档).我们定义一个Rectangle,我们使用go()来渲染元素.