程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> pdf生成的解決方案(H2p)之H2P技術細節

pdf生成的解決方案(H2p)之H2P技術細節

編輯:關於JAVA

H2P在很多人看來是個令人激動的方案,而且javaei網站提供h2p文件資源又是 相當自然的一件事情,一想到h2p,我都很高興,因為這個方案是我提出來的,盡 管實現h2p的技術很成熟。在這篇文章裡,說一下實現h2p所涉及到的技術吧,既 有核心的j2se應用,又有開源框架的使用。

(1)dtd的應用,為了規范使用者正確的編輯h2p文件,我定義了h2p文件的 dtd,當然我還有一個奢望,希望能成為一種規范。

(2)使用根據dtd校驗xml(h2p文件),h2p-tool需要解析xml(h2p文件)提 取url生成pdf並合並,不合法的xml文件肯定不能正確的生成pdf,所以必須對xml 文件進行校驗。

(3)xml解析,編輯h2p,用JTree展示xml的樹形結構,這一部分用的是dom解 析(具體的是JDom),獲取書簽的目錄結構並構建書簽的數據結構,這一部分用 的是SAX解析,並借助於Stack。保存xml文件用的是dom。

(4)swing的應用,h2p-tool編輯功能用的是swing,展示並編輯樹形結構用 的是JTree

(5)C#組件,根據url生成單個的pdf,用的是c#組件,並在vs.net開發平台 上進行了簡單的開發。Javaei提供的h2p文件通常包含幾十條url,單就每條url生 成pdf也需要一點時間,何況是幾十條,所以運用多線程是必須的方式,研究了一 下c#的多線程(c#的多線程方式也很有意思,感覺比java的簡單),可是別人的 組件在多線程下表現欠佳,無賴之下,只好還是采用單線程。本想用jni把c#的調 用封裝起來,但經過研究,據說比較麻煩,就放棄了,所以采用簡單的辦法,用 批處理來調用。

(6)iText的應用,生成單個pdf頁面以及合並pdf生成書簽用的是iText。在 合並的時候,也研究過另一個框架就是pdfbox。IText確實強悍,理論上,應用 iText可以實現任意效果的輸出,應該可以實現浏覽器的效果,但比較麻煩。 iText在生成書簽這一塊,做得相當漂亮,書簽可以指向任意一個頁面的任意部分 ,還可以設置書簽對應頁面的打開效果,對書簽的開發也很便利,直接構造書簽 的樹形數據結構我認為是最簡單的,iText還支持用xml描述書簽的結構。

(7)Classloader的應用,h2p-tool的運行依賴於很多的jar包,通常我們開 發的時候,都是把jar包放在指定的目錄,應用服務器會去加載依賴的jar包。在 h2p-tool中,需要自己處理jar包。因為這是提供給用戶使用的工具,不應要求使 用者去配置除了jdk環境變量以外的變量。所以解決jar包加載的問題通常的辦法 是在主類(帶有main方法的類)所在jar包裡的Manifest.mf文件裡寫上jar包的相 對路徑。這種辦法不太靈活,所以在h2p-tool中,對類加載進行了改寫,使其自 動加載指定目錄下的jar包。

(8)jvm參數的應用,因為要合並的pdf很多,再合並的時候會占用大量內存 ,很容易out of memery,所以在批處理文件裡,需要配置適當的jvm參數,主要 是兩個:-Xmx512m -Xms512m,這兩個參數的意義這裡不再贅述,網上有很多的。

總結一下,實現h2p-tool的技術細節貌似很多,實則很少,除了JDOm和iText ,再就是j2se核心的東西了,出列上面列到的,還包括流、字符集的處理等。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved