程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 根據批量URL生成有書簽的PDF文檔的解決方案

根據批量URL生成有書簽的PDF文檔的解決方案

編輯:關於JAVA

一、緣起

看到一篇好文章、一篇精彩的博文,我們最早期的做法有兩種,添加到收藏夾 ,或者另存為,後來出現了新的方式,轉貼到自己的博客裡、或者收藏到一些收 藏網站上(比如360doc)。近來又出現了生成PDF文檔的方式,比如某些網站,你 提交一個url,就為你生成對應的pdf,javaeye的電子書制作也很不錯,甚至可以 預測一下,浏覽器的“另存為”窗口裡有可能會有一個*.pdf選項。因為pdf實在 是太好了,小巧而有表現力豐富。盡管如此,如果有多篇好的文章呢,比如一個 非常優秀的連載(比如牛人寫的教程、開發心得),我們能做的也就是添加到收 藏夾或添加到自己博客的鏈接裡頭。想當年,沒錢買書的時候,就在網上找一些 教程來看,做得比較好的會有一個頁面列出該連載的所有連接,這種情況我通常 用迅雷以下載全部鏈接的方式(再去掉不相關的鏈接)批量下載下來,做的簡單 的只提供一個類似於上一篇下一篇的鏈接,這種情形到現在還是這樣。(易用性 啊,這個問題可大可小,往大的說,關系到應用模式和商業模式,往小的說也許 就是個美觀和方便。Javaei提供的快捷閱讀采取左邊樹形菜單展示目錄,右邊展 示內容的形式,這種形式在界面的設計上屢試不爽。)

本文就是要闡述一種根據批量URL生成有書簽的PDF文檔的解決方案,這個批量 URL就是一些好的文章的URL,根據這些URL生成一個合並的PDF文檔,並且要有書 簽(也就是左邊的樹形菜單),而且必須要有書簽。《java與模式》這本書想必 很多人都看過,老厚的一本書啊,我沒錢買,看的是一個下載的pdf,這個pdf給 我的印象太壞了,沒有書簽,要找個東西只能拉滾動條,盡管如此,我還是看完 了,書寫的不錯,制作pdf的那個人功過相抵。

二、思路

目的是要根據批量URL生成有書簽的PDF文檔,實現這個目的分兩步走:先解決 根據一個URL生成一個PDF文檔,再解決多個PDF合並並生成書簽的問題。

(1)根據一個URL生成一個PDF文檔

根據一個URL生成一個PDF文檔看似很容易,因為我們有iText,pdfbox這些開源 框架,實則不簡單,因為要保證生成的pdf文檔打開後的效果要和浏覽器裡的要一 樣,這無異於做一個浏覽器,目前的浏覽器尚且存在兼容的問題,所以自己寫一 個根據html生成pdf的想法很難實現。那麼另一個思路就是利用一些網站來實現這 個目的,經過嘗試,有些網站是需要提供URL和email,人家把生成好的pdf發到你 郵箱,這種形式無法通過代碼來訪問,也就無法批量處理;有些網站只需提交url ,就把生成的pdf響應給客戶端,這種形式可以通過程序來批量處理,但是生成的 pdf與浏覽器裡的效果相差太遠;還有一些網站根本就不支持中文。通過探索,終 於找到一個網站提供的C#做的dll可以達到這個要求,利用這個dll,寫個簡單的 C#程序就可以批量的生成pdf了,而且效果相當完美,美中不足的是生成的pdf裡 有人家的水印。

(2)多個PDF合並並生成書簽

多個PDF合並並生成書簽可以輕松的用iText搞定,合並是有一定的順序的,並 且書簽是樹形結構的,因此合並的順序,書簽的層次結構是需要事先確定好的。 所以對批量的URL要進行一定的描述,那麼很自然的選擇xml。

三、實現

我現在越來越覺得,只要不是基礎設施的東西,技術上都很簡單,關鍵是你有 沒有想法。這個實現先從xml描述開始。

Xml描述分兩步,先簡單的描述一批URL(這裡叫做href.h2p.xml),再來描述 層次關系(這裡叫做outline.h2p.xml)。h2p就是html to pdf的意思

先看href.h2p.xml

<href-info>
          <href id="KxgYaRxG">
                    <value><![CDATA[http;//www.163.com]]></value>
          </href>
          <href id="53Bw5A32">
                    <value><![CDATA[http://www.sohu.com]]></value>
          </href>
          <href id="eyEis6ra">
                    <value><![CDATA[http;//news.163.com]]></value>
          </href>
          <href id="DMQoSN2t">
                    <value><![CDATA[http;//sports.163.com]] ></value>
          </href>
          <href id="5vaf3LN7">
                    <value><![CDATA[http://news.sohu.com]]></value>
          </href>
</href-info>

這個xml很簡單,之所以這樣描述,是因為URL通常會有&而這個符號不能 出現在xml裡,而且作為屬性的值,還不能用<![CDATA[]]>,所以就作為一 個節點了。

根據這個xml生成的每個pdf文件的名字取id的值,後綴為pdf。

outline.h2p.xml內容如下:

<book name="我的PDF書">
          <chapter name="163" href="KxgYaRxG">
                    <chapter name="163新聞" href="eyEis6ra" />
                    <chapter name="163體育" href="DMQoSN2t" />
          </chapter>
          <chapter name="sohu" href="53Bw5A32">
                    <chapter name="sohu新聞" href="5vaf3LN7" />
          </chapter>
</book>

這個xml描述了每個pdf合並的順序,href的值和上一個xml的id值對應, chapter標簽嵌套的層次就是書簽的層次,name的值就是書簽的名稱。iText根據 這個xml把每個pdf合並成一個pdf,並生成書簽。

我把這兩個xml文件稱為h2p文件。

四、h2p文件

行文到這裡,這個解決方案就算結束了,俗話說,巧婦難為無米之炊,首先我 們要有上面說的這兩個xml文件,這兩個xml文件如果靠手工編輯的話,少量的URL 還行,如果多了就不方便了。所以應該有一個工具來編輯h2p文件。

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