收集優質技術文章(連載教程、部落格系列)時,瀏覽器「另存為」或列印 PDF 單檔處理效率低、缺乏統一目錄。本文提出 **H2P (HTML to PDF)** 解決方案:以 XML 描述 URL 集合與書籤階層,工具自動逐頁轉 PDF、合併並生成多層級書籤,產出可離線閱讀的電子書級 PDF。
href.h2p.xml (URL 定義) + outline.h2p.xml (書籤樹)
↓ ↓
H2P Tool (Java + C# 元件)
↓
單頁 PDF 生成 (C# WebBrowser 列印)
↓
iText 合併 + 書籤注入
↓
最終 PDF (含多層書籤)
<href-info>
<href id="KxgYaRxG">
<value><![CDATA[https://www.163.com]]></value>
</href>
<href id="eyEis6ra">
<value><![CDATA[https://news.163.com]]></value>
</href>
...
</href-info>
id:唯一鍵,對應輸出單頁 PDF 檔名 ({id}.pdf)&、? 等特殊字元<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>
chapter 直接映射 PDF 書籤樹層級href 參照 href.h2p.xml 的 id| 環節 | 技術 | 說明 |
|---|---|---|
| 單頁 HTML→PDF | C# 元件 (WebBrowser 列印) | 完美還原瀏覽器渲染 (CSS/JS/字型),唯有浮水印 |
| 多執行緒 | C# ThreadPool / Task | 元件多執行緒不穩,最終退回單執行緒循序處理 |
| Java 呼叫 C# | 批次檔 + ProcessBuilder | 放棄 JNI/JNA,簡單可靠 |
| PDF 合併/書籤 | iText 5.x | 書籤樹構建簡單、支援頁碼/縮放/樣式、效能佳 |
| XML 解析 | JDOM (DOM) 編輯/儲存;SAX + Stack 解析書籤樹 | 視用途選型 |
| GUI | Swing (JTree 編輯 XML) | 所見即所得編輯 href/outline |
| 類別載入 | 自訂 ClassLoader 掃描 lib/*.jar | 免用戶配置 CLASSPATH |
| JVM 參數 | -Xmx512m -Xms512m | 合併大量 PDF 易 OOM,預先鎖定堆大小 |
兩種理想解法(需網站端配合):
?h2p=1 參數,回傳無廣告、合併分頁的純內容頁類比 RSS 普及歷程,需社群共識與平台方推動。
H2P 以「XML 描述 + 異構元件協作 + iText 書籤注入」解決批量網頁離線閱讀痛點。雖受限於來源網頁品質,但在「已有優質內容 URL 清單」前提下,能快速產出結構完整、可跳轉的專業級 PDF 電子書,極大提升知識管理效率。