開啟 HTML 轉 PDF

概述
Open HTML to PDF 是一個純Java 庫,用於使用CSS 2.1(和更高版本的標準)進行佈局和格式化,輸出為PDF 或圖像,呈現格式良好的XML/XHTML(甚至某些HTML5)的合理子集。
使用這個庫可以產生漂亮的 PDF 文件。但請注意,您不能將現代 HTML5+ 扔到這個引擎上並期望得到很好的結果。您必須為此庫專門製作 HTML 文檔,並使用它的擴充 CSS 功能(如 #31 或 #32)才能獲得良好的結果。避免在分頁符號附近浮動並使用表格佈局。
入門
- 整合指南 - 取得 Maven 工件和程式碼以開始使用。
- 1.0.10 線上沙箱 - 現在有日誌!
- Templates for Openhtmltopdf - 適用於該專案的 MIT 許可範本。更新於 2021 年 9 月 21 日。
- 展示文件 - PDF
- 文件維基
- 範本作者指南 - PDF - 已棄用 - 首選 wiki - 將資訊移至 wiki
- 範例專案 - 漂亮的履歷表產生器
與飛碟的區別
- 使用維護良好的開源(相容 LGPL)PDFBOX 作為 PDF 庫,而不是 iText。
- 適當支援產生可存取的 PDF(第 508 條、PDF/UA、WCAG 2.0)。
- 正確支援產生符合 PDF/A 標準的 PDF。
- 新的、更快的渲染器意味著這個專案對於非常大的文檔可以快幾倍。
- 更好地支援 CSS3 轉換。
- PDF 的自動視覺回歸測試,包含許多端對端測試。
- 能夠插入剪切內容的頁面。
- SVG 和 MathML 的內建外掛。
- 字體後備支援。
- 對 RTL 和雙向文件的支援有限。
- 不利的一面是,不支援 OpenType 字體。
- 腳註支持。
- 更多。請參閱下面的變更日誌。
執照
Open HTML to PDF 是在 LGPL 下分發的。 Open HTML to PDF 本身已獲得 GNU Lesser General Public License 2.1 或更高版本的許可,可從 http://www.gnu.org/copyleft/lesser.html 取得。只要您遵守授權條款,您就可以以任何方式、為任何目的使用 Open HTML to PDF。 LGPL 許可證的副本作為許可證-lgpl-2.1.txt 或許可證-lgpl-3.txt 包含在我們的發行版和原始碼樹中。
pdf-a 測試模組是一個例外,它是根據 GPL 授權的。此模組未分發至 Maven Central,僅用於測試。
Open HTML to PDF 使用幾個 FOSS 軟體包來完成工作。這些的清單可以在依賴圖中找到。
學分
Open HTML to PDF 是基於 Flying-saucer 的。功勞歸於該專案的貢獻者。程式碼也將使用來自 neoFlyingSaucer
常問問題
- OPEN HTML TO PDF 已使用 OpenJDK 8、11 和 17(早期存取)進行測試。它至少需要 Java 8 才能運作。
- 不,您不能在 Android 上使用它。
- 您應該能夠在 Google App Engine(Java 8 或更高環境)上使用它。讓我們知道您的經驗。
未實現流動列。在 RC12 中實作。- 不,它不是網頁瀏覽器。具體來說,它不運行 javascript 或實現許多現代標準,例如 Flex 和網格佈局。
測試用例
歡迎測試案例,失敗或工作,請將它們放在/openhtmltopdf-examples/src/main/resources/testcases/
中並從/openhtmltopdf-examples/src/main/java/com/openhtmltopdf/testcases/TestcaseRunner.java
運行它們。
變更日誌
頭 - 1.0.11-SNAPSHOT
1.0.10(2021年9月13日)
注意:在此版本之後,舊的慢速渲染器將被刪除。快速模式一直是預設模式(自 1.0.5 起),因此您只需在呼叫將被刪除的useSlowMode
方法時檢查程式碼。
- #551安全性修復帶有
page-break-inside: avoid
約束。感謝您堅持@swillis12 並調試@syjer。 - #729安全升級 xmlgraphics-commons(用於 SVG 渲染)以避免 CVE。謝謝@electrofLy。
- #711 註腳支援(測試版)。請參閱 wiki 上的腳註文件。感謝您請求@a-leithner 和@slumki。
- #761 CSS 屬性會停用邊框上的斜角,以防止難看的抗鋸齒效果,尤其是在表格儲存格上。請參閱 wiki 上的 -fs-border-rendering 屬性。感謝您提供樣本@gandboy91。
- #103 對於具有關聯異常的日誌訊息,預設輸出異常類別名稱和訊息。
- #711(混合)對
::before
和::after
內容物進行更好的裝箱。現在應該能夠正確定義偽內容周圍的邊框。 - #738 支援 PDF/UA 中的其他元素,包括藝術、部分、節、部分、標題和區塊引用。謝謝@AndreasJacobsen。
- #736 使用 dom 突變器實作不支援的內容(例如字體標籤屬性)的新範例。感謝您請求@mgabhishek06kodur。
- #707 修復不相容 PDF/A 的 PDF/UA 文件缺失都柏林核心元資料的回歸問題。謝謝@mgm-rwagner,@syjer。
- #732 允許定位
table
元素。謝謝@fcorneli。 - #727 允許使用
page
和pages
計數器的初始頁碼。感謝@fanthos 的公關。
1.0.9(2021年6月18日)
安全版本:此版本是由於 PDFBOX 和 Batik 依賴項的安全版本而提前發布的。
- #722 升級 PDFBOX(至 2.0.24)- 避免早期版本和 PDFBoxGraphics2D 中的 CVE。非常感謝@rotator。
- #678 將 Batik 版本升級到 1.14 (CVE-2020-11987) - 再次強烈建議避免不受信任的 SVG 和 XML。謝謝@rotator。
- #716 用日誌呼叫取代流氓
println
呼叫。感謝@syjer 的公關,@tfo 的報道。 - #708 允許
shape-rendering
SVG CSS 屬性。感謝@syjer 的公關,@RAlfoeldi 的報導。 - #703 刪除對 JRE 標準函式庫中已棄用方法的呼叫。可能會變更 XML 閱讀器類別。由@danfickle 實現。
- #702 設定預設 HTTP/HTTPS 處理程序的逾時。感謝您檢舉@gengzi。
- 162228 透過 URL 解析器放置指向 SVG 中光柵圖像的連結。
- #694 修復不正確的 B3 紙張尺寸。感謝@lfintalan 報告行號!
- ab48fd 不要多次記錄遺失的字體。
注意:PDFBOX CVE 與在 PDFBOX 中載入不受信任的 PDF 相關,因此該項目不會直接受到影響。但是,在類別路徑中包含 CVE 並不是一個好主意。
1.0.8(2021年3月22日)
安全發布
- #675 將 PDFBOX 更新到 2.0.23 以避免 CVE。感謝您檢舉@Samuel3。
注意:這些 CVE 與在 PDFBOX 中載入不受信任的 PDF 相關,因此該專案不會直接受到影響。但是,在類別路徑中包含 CVE 並不是一個好主意。
1.0.7(2021年3月19日)
- #650 支援一個元素上的多個背景影像。感謝您提出請求@baedorf。
- #669 支援後備字體。感謝您請求@asu2 並協助@draco1023。
- #640 透過連結上的下載屬性實現檔案嵌入。感謝@syjer 的原創公關以及@lindamarieb 和@vader 的請求。
- #666 API 用於取得渲染內容最底部的 y 位置,以便能夠使用其他工具定位後續內容。感謝您對 PR @stechio 的廣泛審查以及 @DSW-AK 的請求。
- #664 改進了對 PDF/A 和 PDF/UA 標準的支援。感謝 @qligier 的公關。
- #653 修正了具有 z 索引或變換的內聯區塊元素被輸出兩次的問題。感謝您檢舉@hannes123bsi。
- #655 RTL 方向有序列表的正確佈局。感謝 @johnnyaug 的公關。
- #658 實現
content
屬性的target-text
功能。感謝@BenjaminVega 的公關。 - #647 修正在多執行緒環境中設定記錄器時的競爭條件。感謝 @syjer 的公關。
- #638 能夠根據資源類型和 url 插入外部資源控制。感謝@syjer 的原創公關。
- #628 使用 PDF-BOX 中的增強影像嵌入方法。感謝 PR @rototor 以及您在 PDF-BOX 中實現此功能的工作。
- #627 修復空字體樣式導致 NPE 的回歸。感謝公關@rototor。
- #338 實作唯讀單選按鈕組。感謝 @ThoSchCon、@aleks-shbln、@dmitry-weirdo、@syjer 和 @paulito-bandito 的調查、報告和耐心。
1.0.6(2020年12月22日)
重要提示: #615 這是一個錯誤修復版本,用於解決在使用帶有頂部/底部邊距的浮動元素的斷字時出現的無限循環問題。
- #624 將 PDFBOX 更新至 2.0.22,將 pdfbox-graphics2d 更新至 0.30。謝謝@rotator。
- #467 防止 CSS 導入循環的可能性。
- #621 資料 uri 中允許有空格。謝謝@syjer。
1.0.5(2020年11月30日)
安全性: #609 將 Apache Batik SVG 渲染器更新到最新版本以避免安全性問題。如果您使用此項目來渲染不受信任的 SVG(不建議),則應立即更新。非常感謝@halvorbmundal。
重要提示:快速渲染器現在是預設的,以準備刪除舊的慢速渲染器。若要暫時使用慢渲染器,您可以呼叫已棄用的方法builder.useSlowMode()
(僅限 PDF 輸出)。
重要提示: #543 由於版本 2.0.21 中存在不間斷空格的錯誤,此版本保留在 PDFBOX 版本 2.0.20 上。請確保 2.0.21 版本不在您的類別路徑中。該錯誤已在即將發布的 2.0.22 中修復。
- #544 用於為 thymeleaf 和原始 XHTML 格式的預先安裝 PDF 範本建立網站的程式碼。查看模板網站以預覽模板。
- #533 條碼插件。 @syjer 提供的非常有用的 PR。條碼插件文件。
- #521 將 Java2D 影像輸出移至快速渲染器並進行一般改進。 Java2D 影像輸出文件。
- 9ffd0e #568 過濾掉在某些字體中可見但不應該是軟連字符的有問題的字符。謝謝@StephanSchrader。
- #587 修復空白:nowrap 切斷而不是換行。感謝@vipcxj 最終透過 PR 修復了問題。
- #577 新增前景 PDF 抽屜外掛(特別適用於浮水印)。感謝@rototor 的公關和@sillen102 的堅持。
- #566 將
baseUri
arg 重新命名為baseDocumentUri
並改進 javadoc 以避免混淆。感謝您檢舉@NehalDamania。 - 801780 將 junit 測試依賴項更新為 4.13.1,以避免安全掃描器警告(特定安全性問題不會影響此程式庫)。
- #553 修正了使用負邊距時 ContentLimitContainer 導致 NPE 的問題。感謝您檢舉@adilxoxo。
- #552 最佳化 jul 日誌記錄的日誌格式化程式。感謝 @syjer 令人印象深刻的公關。
- #542 改進清單裝飾放置。感謝 @syjer 的公關和 @mndzielski 的報導。
- #458 修正了在頁邊距區域中輸出(剪切)清單裝飾的問題。
- #525 刪除未使用的架構/DTD。顯著減小罐子的尺寸。感謝 @syjer 的公關。
- #592 允許在連結的 SVG 影像的寬度/高度屬性中使用單位(px、cm、em 等)值。謝謝@DanielWulfert。
- #594 #458 修復更多重複內容和 PDF/UA 崩潰。謝謝@ThomHurks,@fungc。
- #599 修正 InlineText.setSubstring 上發生的 RuntimeException。謝謝@LAlves91。
- #605 修復以使代理對的合理性起作用。謝謝@EmanuelCozariz。
- #601 將 CI 移至 Github 操作。謝謝@syjer。
- #597 推廣資料 uri 支援。謝謝@syjer,@Leostat86。
- #613 允許將 SVG、MathML 的字型新增為檔案而不是輸入流,以避免 JDK 錯誤。謝謝@syjer、@sureshkumar-ramalingam、@olayinkasf。
1.0.4(2020年7月25日)
- b88538 修正使用
word-wrap: break-word
時的無限循環。感謝您報告、測試和調查@swarl。感謝@rototor 和@syjer 的測試和調試。 - #492 對斷行演算法進行大量測試以避免未來的無限循環。作者:@danfickle。
- #515 將套用於 SVG 元素的文檔 CSS 樣式傳遞給 SVG 實作。感謝您的請求和貢獻@amckain92。
- #514 修正:在對齊 rtl 線時正確定位框。感謝@lzhy1101 的報告和測試。
- #512 #507 #502 清理程式碼,包括刪除未使用的程式碼、泛型等。
- #489 日誌記錄的廣泛檢修,包括每次運行診斷消費者。非常感謝@syjer,在這個 PR 中做了很多工作。有關詳細信息,請參閱 wiki 上的日誌記錄頁面。
- #501 將 PDFBOX 升級到 2.0.20,將 PDFBox-Graphics2D 升級到 0.26。感謝@rotator 的公關。
- #490 修正了解碼影像資料 url 失敗時的 NPE。感謝 @syjer 的公關和 @AlexisCothenet 的報導。
- #516 將 OSGI 捆綁元資料新增至 MANIFEST.MF。感謝您提出請求並進行調查@zspitzer。
1.0.3(2020年5月25日)
- 重要提示:此版本包含兩個錯誤的修復,這些錯誤可能會導致使用
word-wrap: break-word
時出現無限循環/拒絕服務。如果您正在使用該功能,請及時升級。 - #483 修正
word-wrap: break-word
和軟連字號。感謝@rototor 的公關、@syjer 的分析和@swarl 的報告。 - #466 修正
word-wrap: break-word
和零寬度方塊。感謝@syjer 的分析和@AlexisCothenet 的報告。 - #486 SVG 外掛程式現在可以提供外部資源允許的協定列表,並且將使用任何配置的 uri 解析器/流處理程序。感謝@syjer 的公關和@ieugen 的報道。
- #480 修正了從自訂物件抽屜返回的連結形狀。感謝@rototor 的公關和@hbergmey 的報道。
- #485 實現對 SVG 資料 uri 的支援。感謝@syjer 的公關和@adrianrodfer 的報道。
- #470 允許
mailto:
連結或任何其他有效連結。感謝@syjer 的公關和@mndzielski 的報告。 - #464 尊重 CSS
direction
屬性。感謝@AnanasPizza 的報告。 - #460 將拋出的異常類別更改為更具體的
IOException
。感謝@leonorader 的公關。 - #459 實作
rem
CSS 單元。感謝@leonorader 的報告。 - #211 圖片現在可以在 CSS
content
屬性中使用。感謝您請求@Kuhlware。 - #445 修正了 Jsoup 轉換文件中未擷取屬性值的問題。感謝您報告@testinfected。
- #450 僅 Java2D 輸出:能夠透過程式碼添加字體。預設情況下也將不再使用環境字體。若要使用環境字體:
builder.useEnvironmentFonts(true)
。
1.0.2(2020年2月25日)
- 安全性刪除了 Log4J 1.x 適配器,因為它具有 CVE-2019-17571,且沒有可用的更新版本。
- #448 實現對
background-image
屬性的linear-gradient
支援。作者:@danfickle。由@rja907 請求。 - #429
word-wrap: break-word
。現在,一個單字不會被破壞,除非它對一行來說太大了。作者:@danfickle。感謝您報告和測試@mndzielski。 - #433 不要對齊以
<br/>
標記結尾的行。感謝您檢舉@fcorneli。 - #440 刪除右對齊文字的尾隨空白,以避免鋸齒狀外觀。感謝您檢舉@AnanasPizza。
- #446 使用
lang()
選擇器時尋找祖先元素上的 lang 屬性。感謝@fungc 報告並追蹤該錯誤。 - #430 在來源 jar 中使用相對路徑而非絕對路徑進行授權。感謝您報告 @gabro 並透過 PR @syjer 進行修復。
- #417 保持具有寬度/高度屬性以及最小/最大寬度/高度屬性的影像的縱橫比。感謝您的報告和修復的基礎@swarl。
- #423 允許使用
format
標籤指定多個字型來源。僅使用format(truetype)
。感謝@MichaelZaleskovsky 的請求和@syjer 的實施基礎。 - #415 如果使用者嘗試浮動表格儲存格,請避免類別轉換異常。感謝您檢舉@dmartineau99 和公關@syjer。
- #421 當合理的文字與不合理的內容混合時,避免 NPE。感謝您檢舉@Megingjard 和公關@syjer。
- 將 PDFBOX 2.0.17 更新至 2.0.19。
1.0.1(2019年11月18日)
- #413 處理表單問題,例如輸入元素上沒有名稱,而不拋出 NPE。感謝@syjer 的公關和@mmatecki 的報道。
- #412 將 HTML 區塊級元素新增為預設 CSS
section
。謝謝@syjer。 - #339 刪除 JSoup 到 DOM 轉換器模組。謝謝@kewilson。
- 0cd098 修正了帶有尾隨空格的區塊最後一行的字母間距支援。還有性能改進和重構。作者:@danfickle。
- #410 修正了清單項目計數器上錯誤的粗體設定。感謝@syjer 的公關修復(和測試!)和@acieplinski 的報告。
- Wiki 可設定的文字對齊設定作為對齊調整的一部分,當行上沒有空格時,也允許在字元間使用更多空間。作者:@danfickle。 #403 中列出的提交。
- #403 軟連字號支援。當用作行結束字元時,軟連字元現在被替換為硬連字元。謝謝@sbrunecker。
- #408 修正了書籤不適用於 HTML5 解析器(例如 JSoup)的問題。感謝@syjer 進行調查和修復,感謝@Milchreis 進行報告。
- #404 將 Batik 升級到 1.12,將 xmlgraphics-common 升級到 2.4(兩者都在 SVG 模組中使用)以避免其中之一或兩者出現 CVE。謝謝@avoiculet。
- #396 使用邊框半徑屬性更快渲染框。謝謝@mndzielski。
- #400 支援
lang
和title
屬性以及abbr
標籤,以實現可存取的 PDF。謝謝@Ignaciort91。 - #394、#395 將 PDFBOX 升級到 2.0.17,將 pdfbox-graphics2d 升級到 0.25。謝謝@cristan,@rototor。
- #384 允許使用者提供 PDFont 供應商。謝謝@DSW-PS。
- #373 修復回歸問題,其中為具有特定長寬比的影像提供最大寬度和最大高度。謝謝@rotator。
- #380 對流動列的更好支持,包括顯式分欄符、浮動內容、區塊級嵌套內容。作者:@danfickle。
1.0.0(2019年7月23日)
- #372 大幅改進了對
img
、 svg
和math
元素的大小調整支援。 - #344 在
img
標籤中使用 PDF: <img src="some.pdf" page="1" alt="Some alt text" />
。
舊版
查看 CHANGELOG.md。