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

Python自動化快速實現(xiàn)將HTML轉(zhuǎn)換為PDF格式

 更新時間:2026年04月10日 08:35:45   作者:E-iceblue  
HTML(超文本標(biāo)記語言)是一種用于創(chuàng)建網(wǎng)頁的標(biāo)準(zhǔn)標(biāo)記語言,主要用于定義內(nèi)容的結(jié)構(gòu)與布局,在今天的文章中,我們就來看看如何在?Python?中將?HTML?快速轉(zhuǎn)換為?PDF,實現(xiàn)高效與精準(zhǔn)的文檔處理,希望對大家有所幫助

HTML(超文本標(biāo)記語言)是一種用于創(chuàng)建網(wǎng)頁的標(biāo)準(zhǔn)標(biāo)記語言,主要用于定義內(nèi)容的結(jié)構(gòu)與布局,但當(dāng)你需要將其作為本地文檔展示或存檔時,PDF 才是更加適合的選擇。無論是生成電子發(fā)票、技術(shù)文檔,還是導(dǎo)出美觀的報表,PDF 都能跨平臺地保留原始排版與視覺樣式。在今天的文章中,我們就來看看如何在 Python 中將 HTML 快速轉(zhuǎn)換為 PDF,實現(xiàn)高效與精準(zhǔn)的文檔處理。

準(zhǔn)備工作

在開始編寫代碼之前,我們需要安裝支持文檔處理的 Python 庫。本文將使用 Spire.Doc for Python,它能夠解析 HTML 的 CSS 樣式并將其精準(zhǔn)地渲染到 PDF 頁面中。你可以通過 pip 快速安裝:

pip install Spire.Doc

也可以到 E-ICEBLUE 官網(wǎng)下載 Spire.Doc 安裝包,然后進(jìn)行自定義手動安裝。此外,該產(chǎn)品還提供免費(fèi)版,專門用于小型項目或購買商業(yè)版前的測試。

在 Python 中將 HTML 文件轉(zhuǎn)換為 PDF

如果我們已經(jīng)擁有現(xiàn)成的 HTML 靜態(tài)文件,通過直接加載的方式進(jìn)行轉(zhuǎn)換是最為高效的選擇。這種方法非常適合處理大量的網(wǎng)頁存檔、離線技術(shù)手冊或自動生成的測試報告。在具體實現(xiàn)上,我們通過調(diào)用庫中封裝好的文件處理接口,能夠確保 HTML 的層級結(jié)構(gòu)被完整映射到文檔模型中,從而實現(xiàn)格式的精準(zhǔn)轉(zhuǎn)換。

代碼實現(xiàn)步驟:

  1. 創(chuàng)建一個 Document 類的對象。
  2. 調(diào)用 LoadFromFile 方法,加載 HTML 文件。
  3. 調(diào)用 SaveToFile 方法,將 HTML 保存為 PDF 格式的文件。

下方為代碼實例,使用時注意將文件路徑替換為真實路徑:

from spire.doc import Document, FileFormat, XHTMLValidationType

# 創(chuàng)建 Document 類的對象
doc = Document()

# 載入本地 HTML 文件
doc.LoadFromFile("input/示例文檔.html", FileFormat.Html, XHTMLValidationType.none)

# 將內(nèi)容直接保存為 PDF 格式
doc.SaveToFile("output/HTML文件轉(zhuǎn)PDF.pdf", FileFormat.PDF)
doc.Close()

HTML 文件與轉(zhuǎn)換后的 PDF 文件對比示意圖:

在 Python 中將 HTML 字符串轉(zhuǎn)換為 PDF

對于動態(tài)生成的內(nèi)容,例如從數(shù)據(jù)庫調(diào)取數(shù)據(jù)并渲染到 HTML 模板的情況,直接處理字符串流比操作文件更加靈活。這種方式提高程序的響應(yīng)速度和處理邏輯的連貫性。

在代碼中,我們主要使用將字符串寫入文檔段落的方法來將其轉(zhuǎn)換為標(biāo)準(zhǔn)的 PDF 文件。這樣不僅能保持復(fù)雜的 CSS 樣式,還能方便地與其它動態(tài)生成的文檔元素進(jìn)行拼接。

代碼實現(xiàn)步驟:

  1. 創(chuàng)建文檔對象后,依次添加 SectionParagraph
  2. 使用 AppendHTML 方法,將 HTML 字符串動態(tài)寫入段落。
  3. 通過 SaveToFile 方法將整個文檔結(jié)構(gòu)渲染為 PDF 文件。
from spire.doc import Document, FileFormat

# 創(chuàng)建文檔對象并添加結(jié)構(gòu)
doc = Document()
sec = doc.AddSection() 
par = sec.AddParagraph() 

# 定義包含 CSS 樣式的 HTML 字符串
html_string = """
<html>
<head>
    <style>
        h1 { color: #2c3e50; font-family: Arial; }
        table { border-collapse: collapse; width: 100%; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background-color: #f2f2f2; }
    </style>
</head>
<body>
    <h1>旅游統(tǒng)計報表</h1>
    <table>
        <tr><th>國家</th><th>收入(億美元)</th></tr>
        <tr><td>法國</td><td>79.5</td></tr>
        <tr><td>美國</td><td>76.9</td></tr>
    </table>
</body>
</html>
"""

# 將 HTML 字符串渲染進(jìn)段落
par.AppendHTML(html_string)

# 保存文檔
doc.SaveToFile("E:/Administrator/Python1/output/HTML字符串轉(zhuǎn)PDF.pdf", FileFormat.PDF)
doc.Close()

保存后的 PDF 文件預(yù)覽:

進(jìn)階配置:轉(zhuǎn)換時設(shè)置頁邊距與頁面大小

直接將 HTML 文件或字符串轉(zhuǎn)換為 PDF 雖然簡便快捷,但在實際的應(yīng)用中,默認(rèn)的頁面設(shè)置不一定能夠匹配多種需求。因此,我們可以在轉(zhuǎn)換前通過 PageSetup 類對 PDF 的頁邊距、紙張大?。ㄈ?A4、Letter)進(jìn)行微調(diào)。

設(shè)置頁邊距

# 設(shè)置頁邊距(單位通常為磅)
sec.PageSetup.Margins.Top = 50.0
sec.PageSetup.Margins.Bottom = 50.0
sec.PageSetup.Margins.Left = 40.0
sec.PageSetup.Margins.Right = 40.0

合理的頁邊距設(shè)置不僅能讓文檔看起來更專業(yè),還能有效避免內(nèi)容被裁切。

設(shè)置頁面大小為 A4

# 設(shè)置頁面大小為 A4 紙張
# 還可以選擇 Letter, Legal, A3 等其他標(biāo)準(zhǔn)預(yù)設(shè)
sec.PageSetup.PageSize = PageSize.A4()

# 也可以手動指定頁面的寬度和高度(單位:磅)
# sec.PageSetup.PageSize = SizeF(600.0, 800.0)

設(shè)置頁面大小有助于使內(nèi)容能夠適配打印輸出或屏幕閱讀。

知識拓展

下面是小編為大家整理的Python借用免費(fèi)開源庫實現(xiàn)HTML 轉(zhuǎn) PDF的方法,希望對大家有所幫助

1.WeasyPrint (推薦)

適合需要生成高質(zhì)量報告、發(fā)票等專業(yè)文檔的場景,特別在處理表格、字體嵌入和多欄排版時表現(xiàn)出色。

from weasyprint import HTML, CSS
from weasyprint.text.fonts import FontConfiguration
# 準(zhǔn)備HTML內(nèi)容
html_content = """
<html>
<head><meta charset="UTF-8"><title>報告</title></head>
<body><h1>銷售報表</h1><p>2026年Q1數(shù)據(jù)...</p></body>
</html>
"""
# 字體配置(推薦)
font_config = FontConfiguration()
HTML(string=html_content).write_pdf(
    'report.pdf',
    stylesheets=[CSS(string='@page { size: A4; margin: 2cm; }')],
    font_config=font_config
)

注意:WeasyPrint 默認(rèn)不支持外部網(wǎng)絡(luò)字體,可通過 font_config 參數(shù)指定自定義字體文件路徑。

2.Playwright

如果你需要完整保留網(wǎng)頁的JS交互效果和精確布局,Playwright是最佳選擇。

from playwright.sync_api import sync_playwright
with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto('https://example.com')
    page.pdf(path='example.pdf', format='A4')
    browser.close()

3.pdfkit

適合快速將靜態(tài)HTML內(nèi)容轉(zhuǎn)換為PDF,或?qū)khtmltopdf有使用經(jīng)驗的開發(fā)者。

import pdfkit
# 從URL生成
pdfkit.from_url('https://example.com', 'example.pdf')
# 從文件生成
pdfkit.from_file('input.html', 'output.pdf')

注意:使用前需先安裝 wkhtmltopdf 命令行工具。

4.xhtml2pdf

適合處理簡單HTML結(jié)構(gòu)且對代碼體積有要求的項目。

from xhtml2pdf import pisa
with open('test.pdf', 'w+b') as result_file:
    pisa.CreatePDF('<p>簡單內(nèi)容</p>', dest=result_file)

注意:xhtml2pdf 對 CSS 3 的支持有限,布局可能失真。

避坑指南:排查和解決常見問題

1.網(wǎng)絡(luò)資源加載失?。╓easyPrint/pdfkit):HTML 中引用的 CSS、JS、圖片如果使用相對路徑,可能無法加載。建議替換為絕對路徑,或使用 --enable-local-file-access 選項。

2.中文字體顯示為方塊(所有本地工具):系統(tǒng)未安裝中文字體。可指定系統(tǒng)中已安裝的字體(如 SimHei、Microsoft YaHei),或通過代碼嵌入 .ttf 字體文件并指定 @font-face。

3.頁面分頁錯亂(WeasyPrint/pdfkit):通過 CSS 的 page-break-before/after/inside 屬性精確控制分頁;@page 可定義頁邊距和頁眉頁腳。

4.安裝依賴錯誤(pdfkit)pdfkit 只是 Python 的封裝,必須在系統(tǒng)中單獨安裝 wkhtmltopdf 并配置環(huán)境變量。如果提示未找到,可在代碼中指定可執(zhí)行文件路徑:

config = pdfkit.configuration(wkhtmltopdf=r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe')
pdfkit.from_url('url', 'out.pdf', configuration=config)

5.CSS Flex/Grid 樣式丟失:WeasyPrint 對 Flexbox/Grid 支持較好,而 pdfkit/wkhtmltopdf 基于過時的 Qt WebKit,無法渲染現(xiàn)代 CSS。這種情況建議改用 WeasyPrint。

6.性能問題:批量轉(zhuǎn)換大量 HTML 時,可復(fù)用 Playwright 的瀏覽器實例,或?qū)?WeasyPrint 使用多線程并發(fā)處理,避免每次轉(zhuǎn)換都重新啟動瀏覽器。

總結(jié)

通過以上兩種方法,我們可以輕松應(yīng)對各種 HTML 轉(zhuǎn) PDF 的場景。無論是處理現(xiàn)有的文件庫,還是動態(tài)渲染即時生成的網(wǎng)頁數(shù)據(jù),Spire.Doc for Python 都能提供簡單高效的解決方案。

以上就是Python自動化快速實現(xiàn)將HTML轉(zhuǎn)換為PDF格式的詳細(xì)內(nèi)容,更多關(guān)于Python HTML轉(zhuǎn)PDF的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python中自動化運(yùn)維應(yīng)用詳細(xì)指南

    Python中自動化運(yùn)維應(yīng)用詳細(xì)指南

    Python?在自動化運(yùn)維(DevOps)中扮演著重要角色,通過豐富的第三方庫和框架,可以高效完成服務(wù)器管理、配置部署、監(jiān)控告警、日志分析等任務(wù),下面我們來看看具體應(yīng)用吧
    2025-06-06
  • Python 數(shù)據(jù)化運(yùn)營之KMeans聚類分析總結(jié)

    Python 數(shù)據(jù)化運(yùn)營之KMeans聚類分析總結(jié)

    這篇文章主要介紹了Python 數(shù)據(jù)化運(yùn)營KMeans聚類相關(guān)的一些總結(jié),感興趣的話一起來閱讀下文吧
    2021-08-08
  • Python?Flask?上傳文件測試示例

    Python?Flask?上傳文件測試示例

    這篇文章主要為大家介紹了Python?Flask?上傳文件測試的方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 如何使用Python的Requests包實現(xiàn)模擬登陸

    如何使用Python的Requests包實現(xiàn)模擬登陸

    這篇文章主要為大家詳細(xì)介紹了使用Python的Requests包模擬登陸,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python切片的步進(jìn)、添加、連接簡單操作示例

    python切片的步進(jìn)、添加、連接簡單操作示例

    這篇文章主要介紹了python切片的步進(jìn)、添加、連接簡單操作,結(jié)合實例形式分析了Python切片運(yùn)算的常見操作技巧,需要的朋友可以參考下
    2019-07-07
  • python中reload重載實例用法

    python中reload重載實例用法

    在本篇文章里小編給大家整理的是一篇關(guān)于python中reload重載實例用法相關(guān)知識點,有興趣的朋友們可以參考下。
    2020-12-12
  • Python爬蟲之批量下載喜馬拉雅音頻

    Python爬蟲之批量下載喜馬拉雅音頻

    今天教大家如何利用Python爬蟲批量下載喜馬拉雅音頻,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Python守護(hù)進(jìn)程用法實例分析

    Python守護(hù)進(jìn)程用法實例分析

    這篇文章主要介紹了Python守護(hù)進(jìn)程用法,實例分析了Python守護(hù)進(jìn)程的功能及使用方法,需要的朋友可以參考下
    2015-06-06
  • 淺談Python幾種常見的歸一化方法

    淺談Python幾種常見的歸一化方法

    這篇文章主要介紹了幾種常見的歸一化方法,數(shù)據(jù)歸一化是深度學(xué)習(xí)數(shù)據(jù)預(yù)處理中非常關(guān)鍵的步驟,可以起到統(tǒng)一量綱,防止小數(shù)據(jù)被吞噬的作用,需要的朋友可以參考下
    2023-04-04
  • Python基礎(chǔ)教程之Pandas數(shù)據(jù)分析庫詳解

    Python基礎(chǔ)教程之Pandas數(shù)據(jù)分析庫詳解

    Pandas是一個基于 NumPy 的非常強(qiáng)大的開源數(shù)據(jù)處理庫,它提供了高效、靈活和豐富的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具,本文中,我們將學(xué)習(xí)如何使用Pandas來處理和分析數(shù)據(jù),感興趣的小伙伴跟著小編一起來看看吧
    2023-07-07

最新評論

高青县| 滦平县| 泾川县| 滁州市| 专栏| 漳平市| 桂林市| 伽师县| 卫辉市| 石台县| 孟村| 鹤峰县| 滦南县| 上思县| 德安县| 克拉玛依市| 秦皇岛市| 屯昌县| 星子县| 江安县| 通州区| 北票市| 尉氏县| 彰化县| 夏津县| 桂东县| 桦川县| 漠河县| 钟祥市| 闸北区| 漳平市| 景东| 赫章县| 田阳县| 澄城县| 武威市| 雅江县| 奉节县| 海丰县| 福安市| 类乌齐县|