PDF格式保真度高,但在文档编辑、内容复用和自动化流程中却显得笨重。将PDF转换为Markdown可以解决这一痛点:Markdown是纯文本,易于Git版本管理、对接GitHub/MkDocs等平台,也适合AI处理与自动化工作流。本文将介绍如何使用Python库Spire.PDF for Python实现PDF到Markdown的转换,涵盖整体转换、指定页面提取、表格提取以及针对扫描件的光学字符识别(OCR)。
## 安装依赖库
在开始之前,确保已安装Python 3.7或更高版本。通过pip安装Spire.PDF:如果需要对扫描版PDF进行OCR识别,还需安装Spire.OCR并下载对应的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: 基础格式(段落、列表、简单表格)可保留,复杂布局(多栏、合并单元格)可能需要后期手动调整。
合理使用上述方法能显著提升文档处理效率,减少手动排版工作。 |