在日常开发中,PDF文件的自动化编辑需求非常常见,例如批量修改合同中的日期、将PDF转为可编辑的Word文档、提取扫描件中的文字,或者动态填充表单域。本文基于Spire.PDF for Python和Spire.OCR for Python两个库,通过四个具体场景的代码示例,展示如何用Python高效处理这些任务。
所有操作均可在纯Python环境中完成,无需安装Adobe Acrobat或Microsoft Office。
## 环境准备
通过pip安装两个核心组件:- pip install Spire.Pdf
- pip install Spire.Ocr
复制代码 如果涉及多种文档格式(如Excel、PPT),可以直接安装集成包:该包额外包含Spire.XLS、Spire.Doc和Spire.Presentation等组件。
## 场景一:在PDF中查找并替换文本
适用场景:仅需修改PDF中的局部文字(如合同日期、发票金额),不影响整体排版。
核心逻辑:遍历PDF每一页,创建PdfTextReplacer对象,调用ReplaceAllText方法替换目标字符串,并可设置新文本颜色。
- from spire.pdf import *
- from spire.pdf.common import *
- # 加载PDF文档
- pdf = PdfDocument()
- pdf.LoadFromFile("/input/示例文档.pdf")
- # 遍历每一页
- for i in range(pdf.Pages.Count):
- page = pdf.Pages.get_Item(i)
- replacer = PdfTextReplacer(page)
- # 将"AI 绘画"替换为"AI 生成图画",颜色设为红色
- replacer.ReplaceAllText("AI 绘画", "AI 生成图画", Color.get_Red())
- # 保存替换后的文档
- pdf.SaveToFile("/output/替换所有文本.pdf")
- pdf.Close()
复制代码
注意:ReplaceAllText方法会替换当前页中所有匹配的文本,适用于精确匹配场景。如需区分大小写或正则匹配,可查看Spire.PDF的扩展方法。
## 场景二:PDF高保真转换为可编辑的Word
适用场景:需要对文档进行段落结构调整或二次编辑。
通过SaveToFile方法直接指定FileFormat.DOCX,即可将PDF转换为Word,最大程度保留原始排版。
- from spire.pdf import *
- pdf = PdfDocument()
- pdf.LoadFromFile("示例文档.pdf")
- pdf.SaveToFile("pdf转word.docx", FileFormat.DOCX)
- pdf.Close()
复制代码
转换后生成的.docx文件可以在Word中自由编辑,适合进一步处理。
## 场景三:OCR识别扫描件与图片PDF
适用场景:PDF由扫描仪或相机生成,内部只有图片而无文字层,无法直接提取文本。
需要先通过Spire.OCR对图片进行光学字符识别。如果PDF本身已经是独立的图片,可直接识别;如果是PDF文档,需要先将其转为图片(本文不展开,可参考后续教程)。
以下示例展示对单张图片进行OCR识别并输出文本文件:
- from spire.ocr import *
- scanner = OcrScanner()
- # 配置OCR模型路径(需提前下载模型)和语言
- configureOptions = ConfigureOptions()
- configureOptions.ModelPath = r"E:/DownloadsNew/win-x64/"
- configureOptions.Language = "Chinese"
- scanner.ConfigureDependencies(configureOptions)
- # 执行OCR识别
- scanner.Scan(r"/output/pdftoimage/ToImage_0.png")
- # 提取识别结果并写入文本文件
- text = scanner.Text.ToString()
- with open("/output/OCR结果.txt", "a", encoding="utf-8") as file:
- file.write(text + "\n")
复制代码
关键点:ModelPath需要指向下载的OCR模型目录,Language支持“Chinese”等参数。识别出的文本为简单顺序流,不含排版格式。
## 场景四:在PDF中填写可交互表单域
适用场景:使用预置表单域的PDF模板(如入职申请表、开户信息表),通过代码批量填充数据。
核心操作:获取表单部件集合FieldsWidget,遍历并根据字段类型(文本框、复选框等)和名称赋值。
- from spire.pdf import *
- pdf = PdfDocument()
- pdf.LoadFromFile("application_form.pdf")
- form_widget = PdfFormWidget(pdf.Form)
- for i in range(form_widget.FieldsWidget.Count):
- field = form_widget.FieldsWidget.get_Item(i)
-
- if isinstance(field, PdfTextBoxFieldWidget) and field.Name == "EmployeeName":
- field.Text = "张三"
- elif isinstance(field, PdfCheckBoxFieldWidget) and field.Name == "AgreeTerms":
- field.Checked = True
- pdf.SaveToFile("filled_form.pdf")
- pdf.Close()
复制代码
这种方法保证了PDF模板的防篡改特性,同时允许局部填写。
## 四种方案对比总结
| 方案 | 核心机制 | 优势 | 局限 |
|------|----------|------|------|
| 查找并替换文本 | 直接修改PDF文本流 | 零格式损失,内存占用低 | 无法进行段落级重构 |
| 转Word | 映射为Word DOM树 | 视觉还原度高,可深度编辑 | 超大文件转换时性能要求高 |
| OCR识别 | 图像像素特征识别 | 将不可选中的“死文字”变为可编辑文本 | 仅输出原始文本流,无排版 |
| 填写表单域 | 对预埋交互字段动态赋值 | 兼顾防篡改和局部填写 | 依赖预置模板 |
选择哪种方式取决于实际需求:如果只是修改几个关键字,用方案一;需要全面编辑,用方案二;扫描件用方案三;模板批量填充用方案四。
通过Spire.PDF for Python和Spire.OCR for Python,开发者可以轻松集成这些PDF自动化能力到自己的Python脚本中。在Spire.Office官网还可以找到更多API文档和示例。 |