頁面事件(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 完全按照他們想要的方式。
想知道更多?獲得免費電子書!