查看: 132|回复: 3

Python实用指南:用Spire.PDF将PDF转为Markdown(含页面提取与OCR)

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
PDF格式保真度高,但在文档编辑、内容复用和自动化流程中却显得笨重。将PDF转换为Markdown可以解决这一痛点:Markdown是纯文本,易于Git版本管理、对接GitHub/MkDocs等平台,也适合AI处理与自动化工作流。本文将介绍如何使用Python库Spire.PDF for Python实现PDF到Markdown的转换,涵盖整体转换、指定页面提取、表格提取以及针对扫描件的光学字符识别(OCR)。

## 安装依赖库

在开始之前,确保已安装Python 3.7或更高版本。通过pip安装Spire.PDF:
  1. pip install Spire.PDF
复制代码
如果需要对扫描版PDF进行OCR识别,还需安装Spire.OCR并下载对应的OCR模型文件。
  1. pip install Spire.OCR
复制代码
模型文件需根据操作系统(Windows/Linux/macOS)从官方渠道下载,解压到本地目录,并在代码中指定模型路径。

## 将整个PDF转换为Markdown

对于无需分页处理的简单PDF,可直接使用一行保存方法完成转换。代码示例如下:
  1. from spire.pdf import *
  2. input_file = "sample.pdf"
  3. output_file = "output.md"
  4. doc = PdfDocument()
  5. doc.LoadFromFile(input_file)
  6. doc.SaveToFile(output_file, FileFormat.Markdown)
  7. doc.Close()
复制代码
该库会自动解析PDF内容:文本保留段落并添加换行;图片转为Base64编码的PNG嵌入Markdown;表格转换为Markdown管道符结构;粗体、斜体等格式尽可能保留为标准语法。最终生成的Markdown结构贴近原始PDF,且保持可编辑性。

## 转换PDF指定页面为Markdown

对于大文件(如报告、手册),只需提取某几页时,可以先将选中页面复制到新PdfDocument对象中再转换。注意页面索引从0开始。
  1. from spire.pdf import *
  2. input_file = "report.pdf"
  3. output_file = "chapter2.md"
  4. src_pdf = PdfDocument()
  5. src_pdf.LoadFromFile(input_file)
  6. partial_pdf = PdfDocument()
  7. # 提取第3–6页(索引2–5)
  8. partial_pdf.InsertPageRange(src_pdf, 2, 5)
  9. partial_pdf.SaveToFile(output_file, FileFormat.Markdown)
  10. src_pdf.Close()
  11. partial_pdf.Close()
复制代码

## 提取PDF中的表格并转换为Markdown表格

表格是PDF中最常见的结构化数据,手动复制到Markdown容易出错。更好的方法是使用PdfTableExtractor提取表格数据并生成Markdown表格语法。
  1. from spire.pdf import *
  2. input_file = "invoice.pdf"
  3. output_file = "extracted_tables.md"
  4. pdf = PdfDocument()
  5. pdf.LoadFromFile(input_file)
  6. extractor = PdfTableExtractor(pdf)
  7. markdown_tables = []
  8. for page_idx in range(pdf.Pages.Count):
  9.     table_list = extractor.ExtractTable(page_idx)
  10.     if table_list:
  11.         for table in table_list:
  12.             row_count = table.RowCount
  13.             col_count = table.ColumnCount
  14.             for row in range(row_count):
  15.                 row_text = []
  16.                 for col in range(col_count):
  17.                     cell_value = table.GetText(row, col).replace("\n", " ")
  18.                     row_text.append(cell_value)
  19.                 markdown_tables.append("| " + " | ".join(row_text) + " |")
  20.                 if row == 0:
  21.                     markdown_tables.append("| " + " | ".join(["---"] * col_count) + " |")
  22.             markdown_tables.append("\n")
  23. with open(output_file, "w", encoding="utf-8") as f:
  24.     f.write("\n".join(markdown_tables))
  25. pdf.Close()
复制代码
输出结果如:
  1. | Product | Price | Quantity |
  2. |---------|-------|----------|
  3. | A       | 10    | 2        |
  4. | B       | 15    | 5        |
复制代码
结构清晰的表格转换效果较好,复杂布局(如合并单元格)可能需要后续手动调整。

## 使用OCR将扫描版PDF转换为Markdown

扫描件或图片型PDF无法直接提取文本,需借助OCR。基本流程:将每页转为图片 → OCR识别 → 将识别文本写入Markdown文件。

以下示例代码演示了OCR转换过程:
  1. from spire.pdf import *
  2. from spire.ocr import *
  3. def convert_pdf_page_to_image(pdf, page_index):
  4.     return pdf.SaveAsImage(page_index)
  5. def recognize_text_from_image(image_path, language, model_path):
  6.     scanner = OcrScanner()
  7.     configure_options = ConfigureOptions()
  8.     configure_options.Language = language
  9.     configure_options.ModelPath = model_path
  10.     scanner.ConfigureDependencies(configure_options)
  11.     scanner.Scan(image_path)
  12.     visualTextAligner = VisualTextAligner(scanner.Text)
  13.     return visualTextAligner.ToString()
  14. input_file = "ScannedDocument.pdf"
  15. output_file = "ScannedPDF.md"
  16. model_path = r"D:\Download\win-x64"  # 根据实际路径修改
  17. pdf = PdfDocument()
  18. pdf.LoadFromFile(input_file)
  19. with open(output_file, "w", encoding="utf-8") as writer:
  20.     writer.write("# 扫描PDF的OCR结果\n\n")
  21.     for page_index in range(pdf.Pages.Count):
  22.         image = convert_pdf_page_to_image(pdf, page_index)
  23.         image_path = f"page_{page_index + 1}.png"
  24.         image.Save(image_path)
  25.         recognized_text = recognize_text_from_image(image_path, "Chinese", model_path)
  26.         writer.write(f"## 第 {page_index + 1} 页\n\n")
  27.         writer.write(recognized_text)
  28.         writer.write("\n\n")
  29. pdf.Close()
  30. print(f'扫描版PDF已成功转换为 "{output_file}"')
复制代码
语言参数可改为"English"以识别英文。OCR准确率依赖扫描质量:高分辨率、清晰文档效果最佳;模糊、倾斜或复杂背景会降低准确率;手写文本可能无法正确识别。

## 总结与常见问题

根据不同类型的PDF选择合适的方法:
- 简单文档 → 完整转换
- 大文件或局部内容 → 页面提取
- 结构化数据 → 表格提取
- 扫描或图片型PDF → OCR

**Q: 所有PDF都能转换为Markdown吗?**
A: 文本型PDF通常可直接处理,扫描版需要OCR。最终效果取决于文档结构复杂度。

**Q: PDF转Markdown能保留格式吗?**
A: 基础格式(段落、列表、简单表格)可保留,复杂布局(多栏、合并单元格)可能需要后期手动调整。

合理使用上述方法能显著提升文档处理效率,减少手动排版工作。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python实用指南:用Spire.PDF将PDF转为Markdown(含页面提取与OCR)

楼主这篇教程很实用,正好最近在折腾PDF批量转Markdown。之前手动复制表格太痛苦了,表格提取那段代码可以直接拿过来用,感谢分享!OCR部分也正好能解决扫描件的问题。请问一下,Spire.PDF的OCR识别对中文扫描件支持怎么样?需要额外下载中文字体包吗?
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python实用指南:用Spire.PDF将PDF转为Markdown(含页面提取与OCR)

感谢分享,这篇指南非常实用!尤其是表格提取和OCR的部分,正好解决了我处理扫描版PDF的痛点。有个小疑问:OCR模型文件除了官方渠道,有推荐的具体版本吗?另外,如果PDF里包含中文混合英文的扫描内容,Spire.OCR 的识别效果怎么样?麻烦楼主有空再补充一下,谢谢!
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python实用指南:用Spire.PDF将PDF转为Markdown(含页面提取与OCR)

非常感谢分享这么详细的教程!最近正好在整理一批PDF资料,想转成Markdown方便做知识库管理。你提到的页面提取和表格提取功能特别实用,尤其是表格那个例子,手动复制确实容易错乱。关于OCR的部分,我之前试过其他库但配置比较麻烦,Spire.OCR搭配模型文件的方式看起来清晰很多。请问下模型文件大概多大?下载速度如何?再次感谢你的整理,已经收藏了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-7 11:36 , Processed in 0.025002 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部