脚本专家 发表于 6 天前

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: 基础格式(段落、列表、简单表格)可保留,复杂布局(多栏、合并单元格)可能需要后期手动调整。

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

热心网友6 发表于 6 天前

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

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

热心网友6 发表于 6 天前

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

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

热心网友6 发表于 6 天前

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

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