最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Spire.Doc for Java實(shí)現(xiàn)HTML轉(zhuǎn)PDF的操作方案

 更新時(shí)間:2026年04月09日 10:07:38   作者:缺點(diǎn)內(nèi)向  
本文記錄了使用Spire.DocforJava將HTML內(nèi)容轉(zhuǎn)換為PDF文檔的過程,包括環(huán)境準(zhǔn)備、兩種常見的轉(zhuǎn)換場(chǎng)景、進(jìn)階設(shè)置以及注意事項(xiàng),適用于樣式復(fù)雜度相對(duì)可控、排版以文檔流為主的轉(zhuǎn)換需求,需要的朋友可以參考下

在日常的 Java 開發(fā)工作中,我們偶爾會(huì)遇到需要將 HTML 內(nèi)容轉(zhuǎn)換為 PDF 文檔的需求。比如生成格式化的業(yè)務(wù)報(bào)告、導(dǎo)出帶有樣式的郵件模板、或是將前端頁面固化為可存檔的文件。實(shí)現(xiàn)這一功能有多種技術(shù)選型,本文記錄一種基于 Spire.Doc for Java 的實(shí)現(xiàn)方式,供有類似需求的開發(fā)者參考。

環(huán)境準(zhǔn)備

在開始編碼之前,需要先將 Spire.Doc for Java 引入到項(xiàng)目中。該組件支持通過 Maven 倉(cāng)庫(kù)進(jìn)行依賴管理,在 pom.xml 中添加以下配置即可:

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.doc</artifactId>
        <version>13.8.7</version>
    </dependency>
</dependencies>

如果不使用 Maven,也可以手動(dòng)下載 JAR 文件并將其添加到項(xiàng)目的 ClassPath 中。關(guān)于免費(fèi)版的限制說明:該組件存在免費(fèi)版 License,但在加載文檔時(shí)對(duì)段落數(shù)量、表格數(shù)量有硬性限制。若超出限制范圍,API 會(huì)拋出異常或僅能獲取文檔的前幾頁內(nèi)容。在實(shí)際項(xiàng)目中使用時(shí),建議先根據(jù)業(yè)務(wù)文檔的平均規(guī)模進(jìn)行可行性評(píng)估。

兩種常見的轉(zhuǎn)換場(chǎng)景

在實(shí)際應(yīng)用中,HTML 內(nèi)容的來源通常有兩種:一種是已經(jīng)生成好的 HTML 文件,另一種是程序運(yùn)行時(shí)動(dòng)態(tài)生成的 HTML 字符串。下面分別說明這兩種情況的處理方式。

場(chǎng)景一:將 HTML 文件轉(zhuǎn)換為 PDF

這是最直接的使用場(chǎng)景——已經(jīng)有一個(gè)現(xiàn)成的 HTML 文件,希望將其原樣轉(zhuǎn)換為 PDF。核心步驟是加載文件、指定格式、保存輸出:

import com.spire.doc.*;
import com.spire.doc.documents.XHTMLValidationType;
public class HtmlFileToPdf {
    public static void main(String[] args) {
        // 創(chuàng)建 Document 對(duì)象
        Document document = new Document();
        // 加載 HTML 文件
        // XHTMLValidationType.None 表示不進(jìn)行嚴(yán)格的 XHTML 校驗(yàn)
        document.loadFromFile("input.html", FileFormat.Html, XHTMLValidationType.None);
        // 保存為 PDF 格式
        document.saveToFile("output.pdf", FileFormat.PDF);
        document.dispose();
    }
}

loadFromFile 方法的第三個(gè)參數(shù) XHTMLValidationType 用于控制加載時(shí)的校驗(yàn)嚴(yán)格程度。如果 HTML 內(nèi)容中包含一些非標(biāo)準(zhǔn)寫法(如未閉合的標(biāo)簽),設(shè)置為 None 可以避免加載過程中拋出異常。

場(chǎng)景二:將 HTML 字符串轉(zhuǎn)換為 PDF

在一些動(dòng)態(tài)生成內(nèi)容的場(chǎng)景中,HTML 可能是在內(nèi)存中拼接好的字符串,而不是落盤的文件。此時(shí)可以通過 appendHTML 方法將字符串寫入文檔段落,再導(dǎo)出為 PDF:

import com.spire.doc.*;
import com.spire.doc.documents.Paragraph;

public class HtmlStringToPdf {
    public static void main(String[] args) {
        // 創(chuàng)建 Document 對(duì)象并添加節(jié)
        Document document = new Document();
        Section section = document.addSection();
        Paragraph paragraph = section.addParagraph();
        
        // HTML 字符串(可包含內(nèi)聯(lián)樣式)
        String htmlContent = "<html><body>" +
                "<h2 style='color: #333;'>銷售數(shù)據(jù)報(bào)告</h2>" +
                "<table border='1' style='border-collapse: collapse;'>" +
                "<tr><th>產(chǎn)品</th><th>銷量</th><th>金額</th></tr>" +
                "<tr><td>產(chǎn)品A</td><td>120</td><td>¥12,000</td></tr>" +
                "<tr><td>產(chǎn)品B</td><td>85</td><td>¥8,500</td></tr>" +
                "</table>" +
                "<p>生成時(shí)間:2026年4月9日</p>" +
                "</body></html>";
        
        // 將 HTML 字符串追加到段落
        paragraph.appendHTML(htmlContent);
        
        // 保存為 PDF
        document.saveToFile("output_from_string.pdf", FileFormat.PDF);
        document.dispose();
    }
}

這種方式的原理是先將 HTML 內(nèi)容渲染到 Word 文檔對(duì)象模型中,再?gòu)?Word 文檔導(dǎo)出為 PDF。對(duì)于常見的 CSS 樣式(如顏色、邊框、字體等)支持較好,但部分 CSS3 布局特性(如 Flexbox、Grid 布局)可能無法被完全解析和呈現(xiàn)。

進(jìn)階設(shè)置:PDF 輸出參數(shù)調(diào)優(yōu)

在轉(zhuǎn)換過程中,Spire.Doc 提供了一些參數(shù)可供調(diào)整,以優(yōu)化輸出效果。這種轉(zhuǎn)換本質(zhì)上是先將 HTML 解析為 Word 的文檔對(duì)象模型(Document Object Model),再調(diào)用渲染引擎生成 PDF。因此,針對(duì) Word 轉(zhuǎn) PDF 的輸出參數(shù)在此場(chǎng)景下同樣適用:

import com.spire.doc.*;

public class HtmlToPdfWithSettings {
    public static void main(String[] args) {
        Document document = new Document();
        document.loadFromFile("input.html", FileFormat.Html, XHTMLValidationType.None);
        
        // 創(chuàng)建 PDF 參數(shù)對(duì)象
        ToPdfParameterList pdfParams = new ToPdfParameterList();
        
        // 嵌入所有字體,確??缭O(shè)備顯示一致
        pdfParams.isEmbeddedAllFonts(true);
        
        // 禁用超鏈接效果(鏈接文字不再顯示為藍(lán)色下劃線樣式)
        pdfParams.setDisableLink(false);
        
        // 設(shè)置圖片 JPEG 壓縮質(zhì)量(默認(rèn) 80%)
        document.setJPEGQuality(60);
        
        // 保存時(shí)傳入?yún)?shù)
        document.saveToFile("output_optimized.pdf", pdfParams);
        document.dispose();
    }
}

注意事項(xiàng)與踩坑記錄

在使用過程中,有幾個(gè)容易遇到的問題值得提前關(guān)注:

1. 中文字體顯示問題
如果 HTML 中使用了系統(tǒng)中未安裝的字體,PDF 輸出可能出現(xiàn)亂碼或字體回退異常。建議在 HTML 的 CSS 中優(yōu)先使用通用字體族(如 font-family: "Microsoft YaHei", "SimHei", sans-serif;),或確認(rèn)運(yùn)行環(huán)境已安裝所需字體文件。

2. HTML 復(fù)雜布局的兼容性邊界
該組件的 HTML 解析引擎基于 Word 文檔模型設(shè)計(jì),而非瀏覽器內(nèi)核。因此,依賴現(xiàn)代 CSS 特性的布局方式(如 display: flex、position: stickygrid)大概率無法按瀏覽器效果呈現(xiàn)。在設(shè)計(jì) HTML 模板時(shí),建議回歸傳統(tǒng)的文檔流布局,以表格和塊級(jí)元素為主進(jìn)行排版。

3. 內(nèi)存資源釋放
處理大批量文檔轉(zhuǎn)換任務(wù)時(shí),需注意在循環(huán)中及時(shí)調(diào)用 dispose() 方法釋放非托管資源,避免內(nèi)存持續(xù)占用導(dǎo)致服務(wù)壓力。

4. 版本迭代帶來的兼容性變化
根據(jù)公開的版本發(fā)布記錄,該組件在迭代中會(huì)修復(fù) HTML 轉(zhuǎn) Word/PDF 過程中的圖片丟失、樣式錯(cuò)亂等問題。若遇到特定結(jié)構(gòu)的渲染異常,可以嘗試更新依賴版本以獲取最新的解析邏輯。

結(jié)語

Spire.Doc for Java 提供了一套 API 接口,能夠在無 Microsoft Office 環(huán)境依賴的情況下完成 HTML 到 PDF 的轉(zhuǎn)換工作流。對(duì)于樣式復(fù)雜度相對(duì)可控、排版以文檔流為主的轉(zhuǎn)換需求而言,這是一種可行的技術(shù)路徑。

當(dāng)然,如果項(xiàng)目對(duì) PDF 輸出的像素級(jí)精確度有極高要求(例如需要完美還原瀏覽器渲染效果的電子發(fā)票),基于無頭瀏覽器的方案(如 Playwright、Puppeteer 或 Selenium)依然是更穩(wěn)妥的選擇。技術(shù)選型總是在環(huán)境依賴與渲染精度之間做權(quán)衡,建議結(jié)合具體業(yè)務(wù)場(chǎng)景評(píng)估后再行決策。

以上就是基于Spire.Doc for Java實(shí)現(xiàn)HTML轉(zhuǎn)PDF的操作方案的詳細(xì)內(nèi)容,更多關(guān)于Java實(shí)現(xiàn)HTML轉(zhuǎn)PDF的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring中WebClient的創(chuàng)建和使用詳解

    Spring中WebClient的創(chuàng)建和使用詳解

    這篇文章主要介紹了Spring中WebClient的創(chuàng)建和使用詳解,在Spring5中,出現(xiàn)了Reactive響應(yīng)式編程思想,并且為網(wǎng)絡(luò)編程提供相關(guān)響應(yīng)式編程的支持,如提供了WebFlux,它是Spring提供的異步非阻塞的響應(yīng)式的網(wǎng)絡(luò)框架,需要的朋友可以參考下
    2023-11-11
  • JAVA實(shí)現(xiàn)社會(huì)統(tǒng)一信用代碼校驗(yàn)的方法

    JAVA實(shí)現(xiàn)社會(huì)統(tǒng)一信用代碼校驗(yàn)的方法

    這篇文章主要介紹了JAVA實(shí)現(xiàn)社會(huì)統(tǒng)一信用代碼校驗(yàn)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 詳解Java中使用泛型實(shí)現(xiàn)快速排序算法的方法

    詳解Java中使用泛型實(shí)現(xiàn)快速排序算法的方法

    這篇文章主要介紹了Java中使用泛型實(shí)現(xiàn)快速排序算法的方法,快速排序的平均時(shí)間復(fù)雜度為(n\log n),文中的方法立足于基礎(chǔ)而并沒有考慮優(yōu)化處理,需要的朋友可以參考下
    2016-05-05
  • 排查Java進(jìn)程內(nèi)存占比過高的方法

    排查Java進(jìn)程內(nèi)存占比過高的方法

    某天下午運(yùn)維反應(yīng)集成環(huán)境的一個(gè)Java服務(wù)內(nèi)存飆高,內(nèi)存耗的太高了,會(huì)疑似內(nèi)存泄漏,所以本文記一次排查Java進(jìn)程內(nèi)存占比過高的解決方法,需要的朋友可以參考下
    2023-10-10
  • java簡(jiǎn)單實(shí)現(xiàn)多線程及線程池實(shí)例詳解

    java簡(jiǎn)單實(shí)現(xiàn)多線程及線程池實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了java簡(jiǎn)單實(shí)現(xiàn)多線程,及java爬蟲使用線程池實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Spring @ComponentScan注解掃描組件原理

    Spring @ComponentScan注解掃描組件原理

    這篇文章主要介紹了Spring @ComponentScan自動(dòng)掃描組件使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • intellij idea 啟動(dòng)tomcat 1099端口被占用的解決

    intellij idea 啟動(dòng)tomcat 1099端口被占用的解決

    這篇文章主要介紹了intellij idea 啟動(dòng)tomcat 1099端口被占用的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java JDK安裝、環(huán)境配置圖文教程

    Java JDK安裝、環(huán)境配置圖文教程

    JDK 是Java程序開發(fā)的核心工具包,包含了開發(fā)Java應(yīng)用程序所需的所有資源,本文給大家介紹Java JDK安裝、環(huán)境配置圖文教程,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • 跨域解決方案Jsonp原理解析

    跨域解決方案Jsonp原理解析

    這篇文章主要介紹了跨域解決方案Jsonp原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Spring實(shí)戰(zhàn)之協(xié)調(diào)作用域不同步的Bean操作示例

    Spring實(shí)戰(zhàn)之協(xié)調(diào)作用域不同步的Bean操作示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之協(xié)調(diào)作用域不同步的Bean操作,結(jié)合實(shí)例形式分析了Spring協(xié)調(diào)作用域不同步的Bean相關(guān)配置及使用技巧,需要的朋友可以參考下
    2019-11-11

最新評(píng)論

北碚区| 台中市| 宁海县| 都匀市| 宣化县| 长岭县| 怀仁县| 西城区| 丹凤县| 大城县| 南昌县| 股票| 阳高县| 楚雄市| 左权县| 青铜峡市| 定远县| 延吉市| 迁安市| 峨眉山市| 邵阳市| 黑山县| 临洮县| 宜宾市| 齐齐哈尔市| 阿拉善右旗| 两当县| 阿拉善盟| 巨鹿县| 米林县| 侯马市| 象山县| 双鸭山市| 当雄县| 临西县| 祁东县| 海伦市| 托克逊县| 哈巴河县| 宜丰县| 广南县|