每个 iText 文档多个渲染器:更新了更多详细信息

2023-12-01

我正在使用 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(使用前将#替换为@)

每个 iText 文档多个渲染器:更新了更多详细信息 的相关文章

随机推荐

  • 如何使用[[UIApplication sharedApplication] openURL:]打开其他应用程序?

    我跟着http iosdevelopertips com cocoa launching your own application via a custom url scheme html在 app2 FontTest 中打开 app1 G
  • 以编程方式为 Outlook 2010 创建自定义通讯簿

    我想创建一个自定义联系人列表 或地址簿 因为它被称为 这样在 Outlook 中 用户将查看 建议的联系人 联系人 等 然后是 自定义联系人 我去尝试了以下方法 int count this Application GetNamespace
  • Java NetBeans 中无法识别 .isBlank() [重复]

    这个问题在这里已经有答案了 我尝试实现 isBlank 来省略空格 netBeans IDE 11 0 和 8 2 显示 找不到符号 错误 当这个项目从另一台电脑打开时它就可以工作了 public FormulaElement parseF
  • 使用 VBA 时 Form.Submit 未完成

    我有一个正在从中提取数据的网页 除了单击图像元素然后提交表单并创建包含数据的弹出窗口之外 我可以使用 VBA 完成所有操作 图像元素中的属性之一称为 productguid 并且具有字符串值 a12 545 在我用鼠标单击图像元素之前 表单
  • 量角器 AngularJS 全局变量

    我使用 Protractor 和 angularjs 来创建我的 e2e 测试 我有许多文件 其规格数组非常大 并且我想在所有文件之间共享一个通用函数 有没有办法创建一个全局的 beforeEach 我可以在其中注入我的函数 Exports
  • 如何解析具有相同结构但不同名称的json数组[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我想解析一个 json 文件 但它的过程是这样的 CDG id 32569 airport name Charles De Gaulle latitude 49 0167 longi
  • 需要 GeckoFX 的代理用户名和通行证帮助吗?

    我正在尝试设置代理用户名和密码 我看到了这个帖子 http geckofx org viewtopic php id 832 我认为这可能是用户名 密码的类似设置 例如 Skybound Gecko GeckoPreferences Use
  • 使用 Xpath 处理较大 XML 文件的最佳方法是什么?

    我有一个要求 必须使用大型 XML 4 GB 文件 来查找其中的值 基本上我必须编写大约 30 个不同的 Xpath 并将这些值存储在列表中 当我尝试解析 XML 时 它会抛出内存错误 我尝试过使用 lxml 和 ElementTree 来
  • Angular 2 的最佳实践

    Angular 2 被认为是前端开发的完整框架 与 jQuery 的各种功能相比 优点之一是以托管方式进行前端交互 另一方面 jQuery非常灵活 其特性可以按需逐个函数应用 它与纯HTML代码配合良好 尤其是视觉设计师准备了好看的模板 从
  • 防止数字粘贴到 .net windows 窗体中的文本框中

    我已阻止使用按键事件在文本框中输入数字 但是 当使用 Ctrl V 或通过鼠标粘贴内容时 数字将被输入到文本框中 如何防止这种情况发生 我必须允许粘贴 输入除数字之外的所有文本 非常简单的方法是使用以下命令检查文本TextChanged事件
  • C 中的结构填充

    如果我在 C 中有以下结构定义 typedef struct example char c int ii int iii 当我声明上述结构类型的变量时 应该分配什么内存 例如 ee 以及什么是结构填充以及结构填充是否存在任何风险 尝试一下
  • 缩小映射函数的泛型类型

    我期望 TS 的最新版本 例如 43183 使这种模式成为可能 而无需不安全的铸造 有任何想法吗 操场 export type Mapping number number string string function get
  • SSIS(SQL Server 集成服务)安装失败

    安装 Microsoft DataTools IntegrationServices exe 在已安装 Visual Studio 2019 的 Windows 10 PC 上 我收到这个错误 谁能帮助我理解为什么会发生这种情况 预先非常感
  • HTML5 音频无法在 ie7 或 ie8 中工作

    在 IE7 8 中测试时 我的脚本崩溃并收到此错误 SCRIPT438 对象不支持属性或方法 播放 我正在使用 HTML5 音频标签在我的网页上嵌入和播放音频 div div
  • 在 grails 中使用 junit 4

    我想在我的 grails 测试中使用一些 JUnit 4 功能 但目前 grails 测试在 JUnit 3 下运行 JUnit 4 可以从 groovy 使用 但用 JUnit 4 替换 grails 中的 JUnit jar 似乎并不能
  • MySql 错误:#105(代码 150)。当我创建数据库架构时,我收到错误代码 150。

    DROP SCHEMA IF EXISTS YouthMinistry CREATE SCHEMA IF NOT EXISTS YouthMinistry DEFAULT CHARACTER SET utf16 COLLATE utf16
  • 将存储为 NUMERIC 的日期转换为 DATETIME

    我目前正在处理一个查询 需要计算两个不同日期之间的天数差异 我的问题DATE之前的列 因为它们都存储为numeric列这是一个完全的痛苦 我尝试使用CONVERT正如我过去所做的那样 尝试获取不同的部分DATETIME字符串已构建 但我没有
  • Python 中的 if 和 elif 是良好的编程实践

    你好 我目前正在尝试很好地掌握 Python 中的 if elif else 结构 我正在 python 中尝试一些奇怪的组合 有一个测试程序来了解 if if elif elif else 代码中的输出 但是我得到了像这样的奇怪结果 in
  • Oracle 奇怪行为字符串与星期几的比较

    虽然下面的代码打印 错误的星期四 10 FEB 是星期四 BEGIN IF to char to date 10 FEB 2011 DD MON YYYY Day Thursday THEN dbms output put line Cor
  • 每个 iText 文档多个渲染器:更新了更多详细信息

    我正在使用 iText7 创建一个包含多个部分的文档 有些部分要正常格式化 但有些要格式化为列 我可以使用 ColumnDocumentRenderer 对象将其正确格式化为列 但是当我这样做时 整个文件设置为使用列 有什么方法可以让 iT