Python PDF 转 Markdown 详解(转换整个文档,特定页面,表格,扫描 PDF)

目录

[安装所需 Python 库](#安装所需 Python 库)

[Python 将整个 PDF 转换为 Markdown](#Python 将整个 PDF 转换为 Markdown)

[Python 转换 PDF 指定页面为 Markdown](#Python 转换 PDF 指定页面为 Markdown)

[Python 提取 PDF 表格并转换为 Markdown 表格](#Python 提取 PDF 表格并转换为 Markdown 表格)

[Python 使用 OCR 将扫描版 PDF 转换为 Markdown](#Python 使用 OCR 将扫描版 PDF 转换为 Markdown)

总结

常见问题(FAQs)


.

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:

python 复制代码
pip install Spire.PDF

Python 将整个 PDF 转换为 Markdown

如果你希望将完整 PDF 一次性转换为 Markdown,而不进行逐页处理,这是最简单的方法。

使用 Spire.PDF for Python,可以通过一个方法直接完成转换:

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 转换。

python 复制代码
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 格式。

python 复制代码
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(光学字符识别)来提取内容。

基本流程如下:

  1. 将 PDF 每一页转换为图片
  2. 使用 OCR 识别图片中的文字
  3. 将结果写入 Markdown 文件

OCR 环境安装

在运行 OCR 之前,需要安装相关依赖:

pip install Spire.OCR

此外,还需要下载 OCR 模型文件:

  • 根据操作系统(Windows / Linux / macOS)下载对应模型
  • 解压到本地目录
  • 在代码中指定模型路径

该模型用于文本识别与语言处理。

Python 示例代码

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 语言不是中文,可以修改识别语言,例如中文:

python 复制代码
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 能保留格式吗?

基础格式(如段落、列表、简单表格)通常可以保留。但复杂布局(如多栏排版、合并单元格等)可能需要后期手动调整。

相关推荐
2601_954706492 小时前
云手机 API 自动化实战:Python 批量控机、挂机脚本完整实现
python·智能手机·自动化
Alan_6916 小时前
聊聊 Swagger/Postman/Apifox 的真实选型与 Python 项目实战
python·测试工具·postman
智慧物业老杨7 小时前
物业绿化数智化权责管控方案:基于工单平台的双层权限追溯模块落地实践
python
Metaphor6927 小时前
使用 Python 在 Word 文档中添加批注
python·word
FreakStudio7 小时前
WIZnet 开源方案分享:W55MH32 开发板 + 小智 AI实现以太网版本的小智机器人
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
会周易的程序员7 小时前
使用 pybind11 封装 C++ 日志库 microLog 为 Python 模块
java·c++·python·物联网·架构·日志·aiot
一只专注api接口开发的技术猿8 小时前
电商评论自动化监控与情感数据分析完整落地教程(附可直接运行 Python 代码)
大数据·数据库·python·数据分析·自动化
HAPPY酷8 小时前
【ROS2】 Conda 环境搭建(命令行版)
linux·运维·python·ubuntu·机器人·conda
柒和远方9 小时前
LeetCode 4. 寻找两个正序数组的中位数 —— 二分划分的艺术
javascript·python·算法