【发布时间】:2016-08-09 15:07:31
【问题描述】:
我正在使用 iText7 创建一个包含多个部分的文档。有些部分要正常格式化,但有些要格式化为列。我可以通过使用 ColumnDocumentRenderer 对象将其正确格式化为列,但是当我这样做时,整个文档被设置为使用列。有没有办法让 iText 即时交换要使用的渲染器?
当我尝试动态更换渲染器时,我得到一个空指针异常 (com.itextpdf.kernel.pdf.PdfDictionary.get(PdfDictionary.java:482))。
PdfDocument pdf = new PdfDocument(new PdfWriter(targetFile));
Document document = new Document(pdf);
DocumentRenderer defRender = new DocumentRenderer(document);
document.setRenderer(defRender);
ColumnDocumentRenderer dictRender = getColumnRender();
while (<CONDITION>) {
document.setRenderer(dictRender);
document.add(new Paragraph("THIS IS NORMAL TEXT"));
document.add(new Paragraph("THIS IS NORMAL TEXT"));
document.add(new Paragraph("THIS IS NORMAL TEXT"));
<...>
document.setRenderer(defRender);
document.add(new Paragraph("THIS IS COLUMN TEXT"));
document.add(new Paragraph("THIS IS COLUMN TEXT"));
document.add(new Paragraph("THIS IS COLUMN TEXT"));
<...>
}
在我将渲染器设置为 dictRender 后,第一个 document.add() 语句在 com.itextpdf.kernel.pdf.PdfDictionary.get(PdfDictionary.java:482) 处引发空指针错误。
我不想创建多个不同的 PDF 文件,但我想这可能是我最终不得不做的事情。感谢您的帮助。
【问题讨论】:
-
当我尝试动态更换渲染器时 - 你如何尝试?如果您展示,可能有人可以改进您的解决方案。
-
更新了一个特定的代码示例。如果你能看看这个,让我知道你有什么特别的地方,我会非常感激的! ^^
-
在循环中你总是设置
dictRender。你是这个意思吗? -
Ack,这是我在复制代码时简化代码的结果。我正在更改代码中的渲染器,并且示例已更新以反映这一点。
-
好的。当您切换渲染器时,您的期望是什么?新渲染器可以在新页面上启动,还是您希望剩余的当前页面由新渲染器填充?