脚本专家 发表于 2026-6-16 15:00:02

Python使用Spire.PDF实现PDF转HTML的三种方式及工具类封装

在数字化内容管理和网页发布中,将PDF转换为HTML是一项实用技能。HTML具有更好的可访问性、搜索引擎友好性和响应式布局,可以将静态PDF转化为可在线查看、搜索和分享的网页内容。本文基于Spire.PDF for Python库,介绍三种转换方式(基本转换、配置选项转换、流式输出),并提供完整的工具类封装及参数调优建议。

环境准备

使用pip安装Spire.PDF库:


pip install Spire.PDF


安装后即可在项目中操作PDF并执行HTML转换。

基本PDF转HTML转换

最简单的转换是直接将PDF保存为HTML,保留文本、图片和基本布局。


from spire.pdf.common import *
from spire.pdf import *

def ConvertPDFToHTML():
    inputFile = "/项目进度.pdf"
    outputFile = "ToHTML.html"
    doc = PdfDocument()
    doc.LoadFromFile(inputFile)
    doc.SaveToFile(outputFile, FileFormat.HTML)
    doc.Close()
    print(f"HTML文件已保存至: {outputFile}")

if __name__ == "__main__":
    ConvertPDFToHTML()


核心只有三步:加载PDF、保存为HTML、关闭文档。生成的HTML可直接在浏览器打开。

配置转换选项:控制图片嵌入与布局

当需要更精细的控制(如是否嵌入图片、图片质量、布局方式)时,使用
SetPdfToHtmlOptions()
方法。


from spire.pdf.common import *
from spire.pdf import *

def ConvertPDFToHTMLWithOptions():
    inputFile = "/示范文本.pdf"
    outputFile = "Configured.html"
    doc = PdfDocument()
    doc.LoadFromFile(inputFile)

    # 参数:useCssLayout(False=绝对定位), embedImages(True=Base64嵌入), imageQuality(1-100)
    doc.ConvertOptions.SetPdfToHtmlOptions(False, True, 1)
    doc.SaveToFile(outputFile, FileFormat.HTML)
    doc.Close()
    print(f"带嵌入图片的HTML: {outputFile}")

if __name__ == "__main__":
    ConvertPDFToHTMLWithOptions()



SetPdfToHtmlOptions
的三个参数:
- useCssLayout:False使用绝对定位(保持原布局),True使用流式布局(适合响应式设计)。
- embedImages:True将图片编码为Base64嵌入HTML(自包含文件),False则图片单独保存到文件夹。
- imageQuality:1-100,数值越大质量越高但文件越大。

此方式生成的HTML是自包含的,适合独立分发。注意:原文此处命名为“按页面分割输出”,但实际并未分割页面,而是设置转换选项。如果需要按页面分割,需要额外逻辑(如遍历页面逐一保存),本文暂不展开。

流式输出转换结果

如果希望将HTML内容输出到内存或网络流而不是文件,使用
SaveToStream()
方法。


from spire.pdf.common import *
from spire.pdf import *

def ConvertPDFToHTMLStream():
    inputFile = "./Demos/Data/Sample.pdf"
    outputFile = "HTMLStream_Output.html"
    doc = PdfDocument()
    doc.LoadFromFile(inputFile)
    fileStream = Stream(outputFile)
    doc.SaveToStream(fileStream, FileFormat.HTML)
    fileStream.Close()
    doc.Close()
    print(f"流输出已保存至: {outputFile}")

if __name__ == "__main__":
    ConvertPDFToHTMLStream()


流式输出适合将HTML内容直接存入数据库、发送给上游服务或进行后续内容修改。也可使用
io.BytesIO
获取字节数组。

封装PDF转HTML工具类

实际项目中可封装一个工具类,包含基本转换、资源分离、内存流输出和批量转换等功能。


from spire.pdf.common import *
from spire.pdf import *
import os
import io

class PDFToHTMLConverter:
    def __init__(self):
      pass

    def convert_to_html(self, input_file, output_file,
                        embed_images=True, image_quality=80,
                        use_css_layout=False):
      if not os.path.exists(input_file):
            print(f"文件不存在: {input_file}")
            return False
      try:
            doc = PdfDocument()
            doc.LoadFromFile(input_file)
            doc.ConvertOptions.SetPdfToHtmlOptions(
                use_css_layout, embed_images, image_quality)
            doc.SaveToFile(output_file, FileFormat.HTML)
            doc.Close()
            print(f"✓ 转换成功: {os.path.basename(input_file)} -> {os.path.basename(output_file)}")
            return True
      except Exception as e:
            print(f"✗ 转换失败: {os.path.basename(input_file)} - {str(e)}")
            return False

    def convert_to_html_with_assets(self, input_file, output_folder):
      if not os.path.exists(input_file):
            print(f"文件不存在: {input_file}")
            return False
      try:
            if not os.path.exists(output_folder):
                os.makedirs(output_folder)
            doc = PdfDocument()
            doc.LoadFromFile(input_file)
            doc.ConvertOptions.SetPdfToHtmlOptions(False, False, 80)
            base_name = os.path.splitext(os.path.basename(input_file))
            html_file = os.path.join(output_folder, f"{base_name}.html")
            doc.SaveToFile(html_file, FileFormat.HTML)
            doc.Close()
            print(f"✓ 转换成功: {os.path.basename(input_file)} -> {html_file}")
            print(f"图片资源保存在: {output_folder}")
            return True
      except Exception as e:
            print(f"✗ 转换失败: {os.path.basename(input_file)} - {str(e)}")
            return False

    def convert_to_memory_stream(self, input_file, embed_images=True,
                                 image_quality=80, use_css_layout=False):
      if not os.path.exists(input_file):
            print(f"文件不存在: {input_file}")
            return None
      try:
            doc = PdfDocument()
            doc.LoadFromFile(input_file)
            doc.ConvertOptions.SetPdfToHtmlOptions(
                use_css_layout, embed_images, image_quality)
            memory_stream = io.BytesIO()
            stream = Stream(memory_stream)
            doc.SaveToStream(stream, FileFormat.HTML)
            doc.Close()
            html_content = memory_stream.getvalue()
            memory_stream.close()
            print(f"✓ 转换成功: {os.path.basename(input_file)} -> 内存流")
            return html_content
      except Exception as e:
            print(f"✗ 转换失败: {os.path.basename(input_file)} - {str(e)}")
            return None

    def batch_convert_folder(self, input_folder, output_folder,
                           embed_images=True, image_quality=80):
      if not os.path.exists(input_folder):
            print(f"输入文件夹不存在: {input_folder}")
            return
      if not os.path.exists(output_folder):
            os.makedirs(output_folder)
      pdf_files =
      if not pdf_files:
            print(f"在 {input_folder} 中未找到PDF文件")
            return
      print(f"找到 {len(pdf_files)} 个PDF文件,开始转换...")
      success_count = 0
      fail_count = 0
      for pdf_file in pdf_files:
            input_path = os.path.join(input_folder, pdf_file)
            base_name = os.path.splitext(pdf_file)
            output_path = os.path.join(output_folder, f"{base_name}.html")
            if self.convert_to_html(input_path, output_path,
                                    embed_images=embed_images,
                                    image_quality=image_quality):
                success_count += 1
            else:
                fail_count += 1
      print(f"\n转换完成! 成功: {success_count}, 失败: {fail_count}")
      print(f"输出目录: {output_folder}")

    def get_html_content_stats(self, html_content):
      if html_content is None:
            return None
      content = html_content if isinstance(html_content, str) else html_content.decode('utf-8')
      stats = {
            'size_bytes': len(content.encode('utf-8')),
            'size_kb': len(content.encode('utf-8')) / 1024,
            'has_images': '<img' in content.lower(),
            'has_tables': '<table' in content.lower(),
            'has_links': '<a ' in content.lower() or '<a href=' in content.lower(),
      }
      return stats


使用示例:


def main():
    converter = PDFToHTMLConverter()
    # 基本转换(图片嵌入)
    converter.convert_to_html("./Documents/Report.pdf", "./Output/Report.html",
                              embed_images=True, image_quality=90)
    # 转换并分离图片
    converter.convert_to_html_with_assets("./Documents/Presentation.pdf",
                                       "./Output/Presentation_HTML")
    # 内存流处理
    html_content = converter.convert_to_memory_stream("./Documents/Brief.pdf",
                                                      embed_images=True)
    if html_content:
      stats = converter.get_html_content_stats(html_content)
      print(f"HTML统计: {stats}")
    # 批量转换
    converter.batch_convert_folder("./Documents/PDFs", "./Output/HTMLs",
                                 embed_images=True, image_quality=85)

if __name__ == "__main__":
    main()


常见应用场景示例

- 在线文档查看器:将用户上传的PDF转换为HTML(内存流),存储到数据库或缓存实现预览。
- 文档归档系统:批量转换法律文档为HTML,高质量归档(image_quality=95)。
- 内容管理系统集成:将PDF文章转换为HTML(不嵌入图片,由CMS管理),提取内容后发布。

转换质量优化建议

图片处理:
- 嵌入 vs 分离:单文件分发用嵌入,网站发布用分离(可利用CDN缓存)。
- 质量平衡:网页浏览70-85,归档90-100。
- 格式优化:可考虑将Base64图片转为WebP(需额外处理)。

布局保持:
- 需要响应式设计:启用CSS流式布局(
useCssLayout=True
)。
- 需要精确原始布局:使用绝对定位(
useCssLayout=False
)。
- 字体处理:确保目标设备有对应字体,或在CSS中引用Web字体。

性能优化:
- 批量处理时建议分批进行,避免内存溢出。
- Web应用中用异步任务(如Celery)处理转换请求。
- 对频繁访问的文档缓存HTML结果。

常见问题与解决方案

布局错乱:调整
SetPdfToHtmlOptions
参数,使用绝对定位(第一个参数设为False)可更好地保持原始布局。

图片显示异常:检查
embedImages
设置。若分离图片,确保图片文件夹与HTML的相对路径正确。

中文乱码:确保HTML头部包含
<meta charset="UTF-8">
,否则手动添加。

文件体积过大:降低
imageQuality
参数,或分离图片资源并使用压缩格式。

总结

通过Spire.PDF for Python,开发者可以灵活运用基础转换、配置选项和流式处理,实现PDF到HTML的高质量转化。结合工具类封装和参数调优,可轻松集成到在线文档查看器、内容管理系统等场景,提升文档的可访问性和传播效率。

热心网友3 发表于 2026-6-16 15:10:01

Re: Python使用Spire.PDF实现PDF转HTML的三种方式及工具类封装

感谢楼主的详细分享!这三种转换方式覆盖了从简单到灵活的场景,工具类封装也很实用,尤其是参数调优的建议对实际项目很有帮助。想请教一下,`useCssLayout=True` 时生成的流式布局在响应式页面中表现如何?另外,工具类里的 `image_quality` 参数默认80,对于高精度图文混排的PDF,是否推荐适当提高数值?期待楼主能补充一下批量转换的完整示例,方便直接复用。再次感谢!

热心网友7 发表于 2026-6-16 17:25:00

Re: Python使用Spire.PDF实现PDF转HTML的三种方式及工具类封装

感谢分享!这个工具类封装得很实用,尤其是流式输出和配置选项,正好解决了我之前想把PDF转成内嵌图片的HTML用于邮件展示的需求。问一下,对于带有复杂表格或特殊字体的PDF,Spire.PDF转换后的HTML兼容性怎么样?另外,图片质量设成1和100在实际文件大小上差别大吗?

热心网友5 发表于 2026-6-16 20:00:00

Re: Python使用Spire.PDF实现PDF转HTML的三种方式及工具类封装

感谢分享,非常详细的教程!Spire.PDF 这个库之前没怎么用过,看了你的介绍感觉操作挺简洁的,三种方式覆盖了不同场景,工具类封装也很实用。 有个小地方想确认一下:在 `config` 的 `SetPdfToHtmlOptions` 那部分,你提到“按页面分割输出”但实际是设置转换选项,是不是标题或描述上有点小偏差?另外工具类代码里 `image_qualit` 少了个字母 y,应该是 `image_quality`。 另外想请教一下,如果 PDF 里包含复杂排版(比如多栏、表格、水印),转换成 HTML 后布局会失真吗?有没有什么参数能优化这类内容的还原效果?期待更多实战中的调优经验~
页: [1]
查看完整版本: Python使用Spire.PDF实现PDF转HTML的三种方式及工具类封装