Python实用指南:用Spire.PDF将PDF转为Markdown(含页面提取与OCR)
PDF格式保真度高,但在文档编辑、内容复用和自动化流程中却显得笨重。将PDF转换为Markdown可以解决这一痛点:Markdown是纯文本,易于Git版本管理、对接GitHub/MkDocs等平台,也适合AI处理与自动化工作流。本文将介绍如何使用Python库Spire.PDF for Python实现PDF到Markdown的转换,涵盖整体转换、指定页面提取、表格提取以及针对扫描件的光学字符识别(OCR)。## 安装依赖库
在开始之前,确保已安装Python 3.7或更高版本。通过pip安装Spire.PDF:
pip install Spire.PDF
如果需要对扫描版PDF进行OCR识别,还需安装Spire.OCR并下载对应的OCR模型文件。
pip install Spire.OCR
模型文件需根据操作系统(Windows/Linux/macOS)从官方渠道下载,解压到本地目录,并在代码中指定模型路径。
## 将整个PDF转换为Markdown
对于无需分页处理的简单PDF,可直接使用一行保存方法完成转换。代码示例如下:
from spire.pdf import *
input_file = "sample.pdf"
output_file = "output.md"
doc = PdfDocument()
doc.LoadFromFile(input_file)
doc.SaveToFile(output_file, FileFormat.Markdown)
doc.Close()
该库会自动解析PDF内容:文本保留段落并添加换行;图片转为Base64编码的PNG嵌入Markdown;表格转换为Markdown管道符结构;粗体、斜体等格式尽可能保留为标准语法。最终生成的Markdown结构贴近原始PDF,且保持可编辑性。
## 转换PDF指定页面为Markdown
对于大文件(如报告、手册),只需提取某几页时,可以先将选中页面复制到新PdfDocument对象中再转换。注意页面索引从0开始。
from spire.pdf import *
input_file = "report.pdf"
output_file = "chapter2.md"
src_pdf = PdfDocument()
src_pdf.LoadFromFile(input_file)
partial_pdf = PdfDocument()
# 提取第3–6页(索引2–5)
partial_pdf.InsertPageRange(src_pdf, 2, 5)
partial_pdf.SaveToFile(output_file, FileFormat.Markdown)
src_pdf.Close()
partial_pdf.Close()
## 提取PDF中的表格并转换为Markdown表格
表格是PDF中最常见的结构化数据,手动复制到Markdown容易出错。更好的方法是使用PdfTableExtractor提取表格数据并生成Markdown表格语法。
from spire.pdf import *
input_file = "invoice.pdf"
output_file = "extracted_tables.md"
pdf = PdfDocument()
pdf.LoadFromFile(input_file)
extractor = PdfTableExtractor(pdf)
markdown_tables = []
for page_idx in range(pdf.Pages.Count):
table_list = extractor.ExtractTable(page_idx)
if table_list:
for table in table_list:
row_count = table.RowCount
col_count = table.ColumnCount
for row in range(row_count):
row_text = []
for col in range(col_count):
cell_value = table.GetText(row, col).replace("\n", " ")
row_text.append(cell_value)
markdown_tables.append("| " + " | ".join(row_text) + " |")
if row == 0:
markdown_tables.append("| " + " | ".join(["---"] * col_count) + " |")
markdown_tables.append("\n")
with open(output_file, "w", encoding="utf-8") as f:
f.write("\n".join(markdown_tables))
pdf.Close()
输出结果如:
| Product | Price | Quantity |
|---------|-------|----------|
| A | 10 | 2 |
| B | 15 | 5 |
结构清晰的表格转换效果较好,复杂布局(如合并单元格)可能需要后续手动调整。
## 使用OCR将扫描版PDF转换为Markdown
扫描件或图片型PDF无法直接提取文本,需借助OCR。基本流程:将每页转为图片 → OCR识别 → 将识别文本写入Markdown文件。
以下示例代码演示了OCR转换过程:
from spire.pdf import *
from spire.ocr import *
def convert_pdf_page_to_image(pdf, page_index):
return pdf.SaveAsImage(page_index)
def recognize_text_from_image(image_path, language, model_path):
scanner = OcrScanner()
configure_options = ConfigureOptions()
configure_options.Language = language
configure_options.ModelPath = model_path
scanner.ConfigureDependencies(configure_options)
scanner.Scan(image_path)
visualTextAligner = VisualTextAligner(scanner.Text)
return visualTextAligner.ToString()
input_file = "ScannedDocument.pdf"
output_file = "ScannedPDF.md"
model_path = r"D:\Download\win-x64"# 根据实际路径修改
pdf = PdfDocument()
pdf.LoadFromFile(input_file)
with open(output_file, "w", encoding="utf-8") as writer:
writer.write("# 扫描PDF的OCR结果\n\n")
for page_index in range(pdf.Pages.Count):
image = convert_pdf_page_to_image(pdf, page_index)
image_path = f"page_{page_index + 1}.png"
image.Save(image_path)
recognized_text = recognize_text_from_image(image_path, "Chinese", model_path)
writer.write(f"## 第 {page_index + 1} 页\n\n")
writer.write(recognized_text)
writer.write("\n\n")
pdf.Close()
print(f'扫描版PDF已成功转换为 "{output_file}"')
语言参数可改为"English"以识别英文。OCR准确率依赖扫描质量:高分辨率、清晰文档效果最佳;模糊、倾斜或复杂背景会降低准确率;手写文本可能无法正确识别。
## 总结与常见问题
根据不同类型的PDF选择合适的方法:
- 简单文档 → 完整转换
- 大文件或局部内容 → 页面提取
- 结构化数据 → 表格提取
- 扫描或图片型PDF → OCR
**Q: 所有PDF都能转换为Markdown吗?**
A: 文本型PDF通常可直接处理,扫描版需要OCR。最终效果取决于文档结构复杂度。
**Q: PDF转Markdown能保留格式吗?**
A: 基础格式(段落、列表、简单表格)可保留,复杂布局(多栏、合并单元格)可能需要后期手动调整。
合理使用上述方法能显著提升文档处理效率,减少手动排版工作。
Re: Python实用指南:用Spire.PDF将PDF转为Markdown(含页面提取与OCR)
楼主这篇教程很实用,正好最近在折腾PDF批量转Markdown。之前手动复制表格太痛苦了,表格提取那段代码可以直接拿过来用,感谢分享!OCR部分也正好能解决扫描件的问题。请问一下,Spire.PDF的OCR识别对中文扫描件支持怎么样?需要额外下载中文字体包吗?Re: Python实用指南:用Spire.PDF将PDF转为Markdown(含页面提取与OCR)
感谢分享,这篇指南非常实用!尤其是表格提取和OCR的部分,正好解决了我处理扫描版PDF的痛点。有个小疑问:OCR模型文件除了官方渠道,有推荐的具体版本吗?另外,如果PDF里包含中文混合英文的扫描内容,Spire.OCR 的识别效果怎么样?麻烦楼主有空再补充一下,谢谢!Re: Python实用指南:用Spire.PDF将PDF转为Markdown(含页面提取与OCR)
非常感谢分享这么详细的教程!最近正好在整理一批PDF资料,想转成Markdown方便做知识库管理。你提到的页面提取和表格提取功能特别实用,尤其是表格那个例子,手动复制确实容易错乱。关于OCR的部分,我之前试过其他库但配置比较麻烦,Spire.OCR搭配模型文件的方式看起来清晰很多。请问下模型文件大概多大?下载速度如何?再次感谢你的整理,已经收藏了!
页:
[1]