如何用Playwright Python将含<object>引用PDF的HTML转PDF?
问题解答
直接通过<object>或<embed>标签在HTML中内嵌PDF,再用Playwright for Python将HTML转为PDF的方案不可行——原因是Playwright依赖的Chromium内核默认没有内置PDF渲染插件来解析这类标签,因此会出现“Couldn't load plugin”的提示。
要实现将HTML内容与引用的PDF合并为单个PDF文件,你需要采用以下两种方案之一:
方案1:将PDF转为图片插入HTML
把目标PDF的每页转换为图片格式(如PNG/JPEG),在HTML中用<img>标签引用这些图片,再用Playwright将HTML转为PDF。这种方式能保证所有内容(包括原PDF内容)被正常渲染。
示例步骤:
- 使用
pdf2image库将PDF转为图片:
from pdf2image import convert_from_path # 把PDF转为图片列表 pdf_pages = convert_from_path("/path/to/file.pdf") # 保存每页图片 for idx, page in enumerate(pdf_pages): page.save(f"pdf_page_{idx}.png", "PNG")
- 修改HTML,用
<img>替换<object>标签:
<html> <body> <h1>Hello World</h1> <p>The following PDF should be inserted inline</p> <figure> <img src="pdf_page_0.png" width="100%" /> <!-- 若PDF有多页,依次添加对应图片标签 --> <img src="pdf_page_1.png" width="100%" /> </figure> <p>There might be other content, images or PDFs</p> </body> </html>
- 用Playwright将修改后的HTML转为PDF:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() page.goto("file:///path/to/modified.html") page.pdf(path="final_output.pdf") browser.close()
方案2:合并HTML生成的PDF与原PDF
先将HTML单独转为PDF,再用PDF处理库(如PyMuPDF、PyPDF2)把原PDF的页面插入到HTML生成的PDF的对应位置。
示例步骤(基于PyMuPDF):
- 用Playwright将HTML转为PDF:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() page.goto("file:///path/to/original.html") page.pdf(path="html_output.pdf") browser.close()
- 合并两个PDF:
import fitz # 打开HTML生成的PDF和原PDF html_pdf = fitz.open("html_output.pdf") original_pdf = fitz.open("/path/to/file.pdf") # 在HTML PDF的指定位置插入原PDF的所有页面(示例为第2页后,可根据需求调整) html_pdf.insert_pdf(original_pdf, start_at=1) # 保存合并后的最终PDF html_pdf.save("final_output.pdf") html_pdf.close() original_pdf.close()
两种方案可按需选择:若需要保留PDF的矢量清晰度,优先选方案2;若仅需可视化展示原PDF内容,方案1的实现流程更简单。
内容的提问来源于stack exchange,提问作者Radim Novotny
相关产品推荐
相关产品推荐

