Python实现PDF转 Markdown的完整指南
作者:SunnyDays1011

PDF 虽能完美保留版式,但在编辑、复用及程序化处理时却缺乏灵活性。即便是复制表格、提取章节或导入文档系统等基础操作,也往往需要繁琐的手动重排。
将 PDF 转换为 Markdown 可有效解决这一痛点。作为纯文本格式,Markdown 不仅易于编辑和 Git 版本管理,还能无缝对接 GitHub、MkDocs 等平台,更是 AI 处理与自动化工作流的理想选择。
在本文中,我们将介绍几种使用 Python 将 PDF 转换为 Markdown 的实用场景,主要包括以下内容:
- 将整个 PDF 转换为 Markdown
- 仅转换指定页面
- 提取 PDF 表格并转换为 Markdown 表格
- 使用 OCR 将扫描版 PDF 转换为 Markdown
安装所需 Python 库
要在 Python 中实现 PDF 到 Markdown 的转换,可以使用 Spire.PDF for Python。该库支持加载 PDF 文件,并将其保存为多种格式,包括 Markdown。
在开始之前,请确保你已安装 Python 3.7 或以上版本。然后通过终端安装 Spire.PDF:
pip install Spire.PDF
Python 将整个 PDF 转换为 Markdown
如果你希望将完整 PDF 一次性转换为 Markdown,而不进行逐页处理,这是最简单的方法。
使用 Spire.PDF for Python,可以通过一个方法直接完成转换:
from spire.pdf import * input_file = "sample.pdf" output_file = "output.md" # 加载 PDF 文件 doc = PdfDocument() doc.LoadFromFile(input_file) # 保存为 Markdown 格式 doc.SaveToFile(output_file, FileFormat.Markdown) doc.Close()
该库会自动解析 PDF 内容并转换为 Markdown 格式。具体处理方式如下:
- 文本会被保留为段落,并自动添加换行结构
- 图片会被转换为 Base64 编码的 PNG,并嵌入 Markdown 文件中
- 表格会转换为 Markdown 的管道符(|)表格结构
- 粗体、斜体等格式会尽可能保留为标准 Markdown 语法
最终生成的 Markdown 在结构上尽量贴近原始 PDF,同时保持可编辑性与兼容性。
Python 转换 PDF 指定页面为 Markdown
很多 PDF(例如报告、手册或技术文档)通常内容较长,但我们往往只需要其中某一部分章节或页面。
在这种情况下,可以先提取指定页面,再进行 Markdown 转换。
from spire.pdf import * input_file = "report.pdf" output_file = "chapter2.md" # 加载原始 PDF src_pdf = PdfDocument() src_pdf.LoadFromFile(input_file) # 创建新的 PDF 文档用于存放选定页面 partial_pdf = PdfDocument() # 提取第 3–6 页(从 0 开始计数) partial_pdf.InsertPageRange(src_pdf, 2, 5) # 保存为 Markdown partial_pdf.SaveToFile(output_file, FileFormat.Markdown) src_pdf.Close() partial_pdf.Close()
InsertPageRange() 方法会将选定页面复制到新文档中,再进行转换。
需要注意的是,页面索引从 0 开始,因此 2–5 实际对应第 3–6 页。
Python 提取 PDF 表格并转换为 Markdown 表格
表格是 PDF 中最常见的结构化数据类型之一,尤其常见于发票、财务报表和产品目录中。然而,手动复制表格到 Markdown 往往既耗时又容易出错。
更高效的方式是直接提取表格数据并转换为 Markdown 格式。
from spire.pdf import *
input_file = "invoice.pdf"
output_file = "extracted_tables.md"
# 加载 PDF 文件
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 表格行
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()当 PDF 中包含结构化表格时,会被转换为 Markdown 表格语法:
| Product | Price | Quantity |
|--------|------|----------|
| A | 10 | 2 |
| B | 15 | 5 |
最终效果取决于原始 PDF 的结构:
- 结构清晰的表格转换效果较好
- 复杂布局(如合并单元格或不规则表格)可能需要后期微调
Python 使用 OCR 将扫描版 PDF 转换为 Markdown
有些 PDF 并不是文本型文件,而是扫描件或纯图片形式,内容以像素存在,无法直接提取文本。
在这种情况下,需要使用 OCR(光学字符识别)来提取内容。
基本流程如下:
- 将 PDF 每一页转换为图片
- 使用 OCR 识别图片中的文字
- 将结果写入 Markdown 文件
OCR 环境安装
在运行 OCR 之前,需要安装相关依赖:
pip install Spire.OCR
此外,还需要下载 OCR 模型文件:
- 根据操作系统(Windows / Linux / macOS)下载对应模型
- 解压到本地目录
- 在代码中指定模型路径
该模型用于文本识别与语言处理。
Python 示例代码
from spire.pdf import *
from spire.ocr import *
def convert_pdf_page_to_image(pdf, page_index):
"""将 PDF 指定页面转换为图片"""
return pdf.SaveAsImage(page_index)
def recognize_text_from_image(image_path, language, model_path):
"""使用 OCR 识别图片文字"""
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}"')OCR 多语言支持
如果 PDF 语言不是中文,可以修改识别语言,例如中文:
recognized_text = recognize_text_from_image(
image_path,
"English",
model_path
)注意事项
OCR 的识别准确率与扫描质量密切相关:
- 高分辨率、清晰扫描效果最佳
- 模糊或倾斜文档会降低准确率
- 手写文本或复杂背景可能无法正确识别
总结
将 PDF 转换为 Markdown 是一种将静态文档转化为结构化、可编辑、可复用内容的高效方式。
根据不同类型的 PDF,可以选择不同方法:
- 完整转换:适用于简单文档
- 页面提取:适用于大文件或局部内容
- 表格提取:适用于结构化数据
- OCR 识别:适用于扫描件或图片型 PDF
合理选择转换方式,可以显著提升文档处理效率,并减少大量手动排版工作。
常见问题(FAQs)
所有 PDF 都可以转换为 Markdown 吗?
并非所有 PDF 都能以相同方式转换。文本型 PDF 通常可以直接处理,而扫描版 PDF 需要 OCR。最终效果也取决于文档结构复杂程度。
如何选择合适的 PDF 转 Markdown 方法?
取决于使用场景:
- 简单文档 → 完整转换
- 大型文件 → 页面提取
- 结构化数据 → 表格提取
- 扫描或图片 PDF → OCR
PDF 转 Markdown 能保留格式吗?
基础格式(如段落、列表、简单表格)通常可以保留。但复杂布局(如多栏排版、合并单元格等)可能需要后期手动调整。
到此这篇关于Python实现PDF转 Markdown的完整指南的文章就介绍到这了,更多相关Python PDF转Markdown内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
