页面事件(iText 5)与事件处理程序和渲染器(iText 7)
在 iText 5 中,我们引入了页面事件的概念,允许开发人员在打开文档,打开新页面,页面结束以及文档关闭时添加特定行为。
在文档中,我们非常清楚地表明禁止在 onStartPage()
方法中添加内容; 内容只能在 onEndPage()
方法中添加。我们还非常清楚地表明,传递给页面事件方法的 Document
对象仅用于只读目的。即使在 onEndPage()
方法中也禁止使用 document.add()
。
不幸的是,许多开发人员完全忽略了文档,这导致了以下问题:
OnEndPage
事件处理程序中的“‘System.StackOverflowException”- 获取堆栈溢出异常生成 PDF
- 使用 PdfPageEventHelper,iTextSharp 行分隔符消失
- iTextSharp 错误文档在打开之前没有页面
- …
我记不清有多少次激动,因为另一位开发者发布了这些问题的副本。人们常常想知道他们为什么会得到一个严厉的答案,但是他们并没有意识到他们这方面的最小努力会拯救每个人,包括他们自己,有充足的时间。所有这些问题都可以通过说“阅读(你知道哪个)手册”来回答。
另一种选择是对 iText 进行彻底检查,以避免出现这类问题。
由于 iText 的有机增长,页面事件类也扩展了与页面事件无关的功能。它包含通用块功能,它注册了段落的开头和结尾,依此类推。
我们在 iText 7 中修复了什么:
我们删除了页面事件功能。
对于关于页面的所有事件,我们现在实现 IEventHandler
接口,并且我们使用 addEventHandler
将此处理程序作为 PdfDocumentEvent
添加到 PdfDocument
。在示例中,我们使用了 END_PAGE
事件,但我们也可以使用 START_PAGE
事件。无论你是在开始还是在结尾添加内容,都无关紧要。你可以在处理事件中阅读更多相关信息 ; 设置查看器首选项和编写器属性 ,这是 iText 7:Building Blocks教程中的第 7 章。
我们改进了构建块,因为我们使它们更加层次化(参见开始之前:类和接口概述 ,即 iText 7:Building Blocks教程的介绍)。我们还引入了一组 Renderer 类,每个构建块一个,我们允许开发人员调整这些渲染器,以便构建块在渲染时显示不同的行为。例如,请参阅添加 AbstractElement 对象(第 1 部分)中的渲染器示例,该示例是 iText 7:Building Blocks教程中的第 7 章。
这些更改简化了那些不想(想)了解 PDF 和 iText 的开发人员的功能,同时为那些不怕深入研究 iText 代码创建者的开发人员提供了丰富的灵活性。PDF 完全按照他们想要的方式。
想知道更多?获得免费电子书!