各式PDF產出應用

白皮書:PDF產出方式情形分析

DocEvents作業平臺可應對各種不同方式的PDF產出情形,合理安排其產出方式和優化方法:選擇串行或者並行;以逐頁生成的方式增添數據,或者以現有文檔為基準,僅更新個別物件;面向速度而不必考慮數據量,或者跟蹤優化數據而犧牲速度;依靠PDF模塊自帶的自動管理,或者由控制界面進行額外的輔助工作;等等。所以這些,都以完全相似、易懂易用的XML屬性予以指定,不僅功能強大靈活,而且用戶的維護工作也得以極大簡化。

應用概覽

同是PDF電子文檔輸出,根絕數據源的不同,實質上可能大相徑庭。就一個任務流程來看,即存在一對一、一對多、多對一、多對多等主要模式,其中又可細分。針對不同情形,本系統設計了健全的方式應對這些主要的應用場合,以下討論適用于DocEvents的XML任務定義。

一、一對一。包括單個非PDF文檔比如AFP或TIFF轉換為PDF,或者針對單個PDF的數據處理,例如精簡數據或增加内容,後者是以現成的PDF為基礎。

二、一對多。同樣是非PDF轉爲PDF,但要求按一定的條件切割文檔,以串行的方式生成文檔,或者並行生成多個PDF,而將輸入源的頁面根據不同的條件置入指定的目標PDF。一個文檔拆分爲單頁的PDF,也屬此類。還有一種情形是填表輸出:每組輸入數據,結合選定的模板,生成一個PDF。對這種應用來説,如果輸出不分檔,則反過來成爲一對一模式。

三、多對一。不同來源的數據合併為同一個PDF,用於數據文檔歸併,其中會涉及重復數據的智能剔除。也可以某一現成的PDF為基礎,逐步添加新數據,而後輸出。

四、多對多。多個輸入文檔在依次轉換之後,根據不同的條件置入並行開啓的各個PDF目標文檔,整個任務結束之後這些目標檔案才關閉。

所有這些都可由相似的兩個動作類型所實現:用於文檔方式的PdfOut,和用於目錄方式的PdfMerge。一對一、一對多屬於前者,多對一、多對多則屬於後者。兩种應用都需要定義文檔名、目錄名,都可指定串行方式還是並行方式,都可指定不斷添加至末尾還是自動關閉,並且都可以定義書簽、加密等細節。在文檔方式下,操作的基本單元是頁面,也可能是一組頁面,比如來自頁面組、緩存區的頁面,或者填表輸出、頁面分割之後產生的一組頁面;在目錄方式下,操作的單元則是文件。

image006

一對一

最簡單而常用的案例,莫過於從AFP到PDF的轉換,把一個AFP檔完整地轉換為PDF,而不論頁數多寡。鑒于AFP的遍歷掃描是按頁或者頁組進行,產出端PDF文檔保持開啓,而每次遇到新的一頁或者一組,即以追加方式加入該PDF。任務結束之後,程式會自動予以關閉。在遍歷期間,每次追加一頁或者一組,都有機會創建一個新的書簽。

特別地,儅輸入文檔就是PDF時,如果頁面内容沒有修改,那麽其數據可以直接導入所產出的PDF,而不需要根據頁面内容重新構建,此擧可保證最大程度的保真度和運行效率。

image007

image008

 

image009

一對多

上述轉換中,如果每次遍歷單個或者一組新頁,都生成一個新的PDF產出檔,也就是稱爲“切檔”的邏輯,那麽就成爲需要自動管理文檔命名的“一對多”方式。鑒于無法預先規定每個輸出檔的完整命名,一般使用自動序號即可,或者在遍歷期間採集頁組的命名、檢索特定的屬性、或者捕捉頁面特定位置的内容等,以獲取獨特的識別資訊,用運行期間以參數置換的方式構造獨特的文檔名稱。

填表輸出是另一個常見的一對多案例,跟前一情形的區別在於每次的頁面是產自于動態複製,不過對於產出端來説無甚分別。以上這兩种情形都是順序生成PDF,也就是每產出一個新檔,當前使用的PDF文檔就予以關閉,仿佛生産流水綫的運作。但也可能存在這樣的需求:需要有限的幾個產出檔保持同時開啓,而每個新的頁面需要根據不同的規則置入特定的PDF檔。任務結束之後,所有的這些PDF才同時關閉。相對于前者的串行方式,這個是並行方式。

image010

 多對一

由一對一的情形引申,假如挑選多個不同的輸入檔,而產出目標不變,則效果上相當於資料歸併。這帶來許多新的挑戰,特別是面對巨量的數據,如何以最精簡、高效而最不消耗系統資源的方式運作。對同一來源的頁面來説,因爲這種單一性,通常不存在冗餘,數據也便於識別。但是不同來源的數據,因爲每一來源都攜帶一套完整的、它自身需要的資源,結果在歸併時就非常容易存在冗餘,如何識別和消除,將是一個極關鍵的問題。

技術概覽

本司的技術方案對上述所有情形所面臨的不同挑戰都提出了足夠高效的應對策略,通過強大而靈活的DocEvents框架,使得用戶可以根據需求自行選擇工作方式。比如,一個完整的一對一轉換依照這樣的方式定義即可:

image011

這段XML代碼的意圖是:在遍歷輸入檔的頁面時(PageExit事件觸發),每遇到新的一頁,就置入與輸入文檔同名的PDF文檔中。注意其中的append關鍵字,這表示新的頁將添加至文檔末尾,而程式會自動管理該文檔的生成與關閉。如果沒有這個關鍵字,那麽每次都會生成一個同名的新檔,每次覆蓋掉現有的文件,而最後這個輸出檔只有一頁。

如果輸出為單頁文檔正是所要到達的目標(一對多),而又不想重復寫入同一文檔,最簡便的方法就是在文檔命名中增加一個自動序號參數。爲了便於排序,建議使用微軟通用的格式化表達,如下圖所示意,其中序號會佔用四位數字:

image012

如果來源是單頁但又希望每次有多頁存儲于同一文檔,可以使用緩存方法,也就是遇到一頁時不直接添加至輸出,而是放進一個固定尺寸的緩衝區,儅緩衝區滿時(CacheStop事件觸發)才引發PDF產出,此時已緩存的頁面一併交予後者。如果來源是帶有頁組結構的AFP,則將PDF產出機制直接定義在頁組結束事件(PageGroupExit)即可,更加簡便。而如果想要複雜,比如增加各種條件判斷,把未知數目的頁面寫入不同的PDF,本方案同樣也有進階的技術,請參閲相關的參考手冊。

image013image014

那麽多對一的情形呢?對於目錄遍歷,每次遇到一個文檔,觸發的是Document事件,調用對應于目錄方式的PdfMerge動作,並且設置為添加方式就可以了。文檔將整個加入輸出端,如果是非PDF則全部頁面在轉譯之後增添,如果輸入是PDF則整個文檔以優化方式導入,以最大程度地保留非頁面數據。在下例中,我們設定每次在增加新内容時,也生成一個書簽。

image014

在實際應用中,常常會有更複雜的情形,但也只需要增添數個同樣簡明扼要的語句。從上面的簡要介紹就可以看出,爲何本司的技術方案乃是當下最受歡迎、最具潛力的架構之一。

About the Author: Cyphia