我正在使用 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 文件,但我想这可能是我最终必须要做的。感谢您在这里的任何帮助。
发生异常的原因是,默认情况下,页面内容会在可以节省内存的情况下立即刷新。
为了避免立即刷新内容,有一个参数DocumentRenderer
and ColumnDocumentRenderer
构造函数。
因此,例如,要创建一个DocumentRenderer
关闭立即冲洗后,您必须按如下方式创建它:
DocumentRenderer defRender = new DocumentRenderer(document, false);
这非常相似ColumnDocumentRenderer
.
接下来,由于您已关闭自动刷新并自行更改渲染器,因此在代码末尾,就在之前document.close();
,您必须手动刷新渲染器:
defRender.flush();
dictRender.flush();
现在内容出现了,但由于内容重叠,结果仍然可能看起来很难看。这要由开发人员来解决,因为两个渲染器是独立的实例,并且它们维护currentArea
彼此独立。要正确处理此问题,您必须更新currentArea
您要切换到的渲染器的currentArea
您刚刚完成的上一个渲染器的工作。您可以通过扩展提供的标准渲染器或调用来做到这一点renderer.getCurrentArea()
并修改bBox
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)