
在日常文档处理工作中,PDF 附件功能有着广泛的应用场景。例如,将合同原文与相关证明材料打包在同一个 PDF 文件中,或在技术文档中附上对应的数据文件和图片。手动操作虽然可行,但当需要批量处理大量文档时,效率就会成为瓶颈。
使用 Python 可以通过编程方式高效地完成 PDF 附件的添加、读取和删除操作,适合集成到自动化工作流中。
环境准备
使用 Python 操作 PDF 文档需要安装 Spire.PDF 库:
bash
pip install Spire.PDF
这个库提供了完整的 PDF 文档处理 API,包括附件管理功能。
添加附件到 PDF 文档
向 PDF 中添加附件有两种常见方式:一种是作为文档级附件(类似邮件中的附件),另一种是作为页面上的附件注释(显示为可点击的图标)。
添加文档级附件
文档级附件会出现在 PDF 阅读器的附件面板中,不会直接显示在页面内容上:
python
from spire.pdf.common import *
from spire.pdf import *
# 加载 PDF 文档
doc = PdfDocument()
doc.LoadFromFile("input.pdf")
# 创建附件对象,参数为文件名
attachment = PdfAttachment("data.xlsx")
# 将文件数据读入附件
with open("data.xlsx", "rb") as f:
attachment.Data = f.read()
# 设置附件的描述信息和 MIME 类型
attachment.Description = "源数据表格"
attachment.MimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
# 将附件添加到文档
doc.Attachments.Add(attachment)
# 保存文档
doc.SaveToFile("output.pdf")
doc.Close()
关键 API 说明:
PdfAttachment:表示一个附件对象,构造函数中的参数是附件的显示名称Data属性:用于设置附件的二进制数据MimeType属性:指定附件的 MIME 类型,便于阅读器识别文件类型Attachments.Add():将附件添加到文档的附件集合中
添加附件注释
附件注释会在 PDF 页面中显示为图标(如回形针、图钉),读者可以直接点击打开:
python
from spire.pdf.common import *
from spire.pdf import *
doc = PdfDocument()
doc.LoadFromFile("input.pdf")
page = doc.Pages[0]
# 读取要附加的文件数据
with open("report.pdf", "rb") as f:
data = Stream(f.read())
# 创建附件注释
bounds = RectangleF(50.0, 100.0, 15.0, 15.0)
annotation = PdfAttachmentAnnotation(bounds, "report.pdf", data)
annotation.Color = PdfRGBColor(Color.get_Teal())
annotation.Icon = PdfAttachmentIcon.Paperclip
annotation.Text = "附件:详细报告"
# 添加到页面
page.AnnotationsWidget.Add(annotation)
doc.SaveToFile("output.pdf")
doc.Close()
附件注释支持多种图标样式,包括 Paperclip(回形针)、PushPin(图钉)、Graph(图表)和 Tag(标签)等,可以根据内容类型选择合适的图标。
读取和提取附件
当收到一个包含附件的 PDF 文档时,你可能需要查看附件信息或将附件提取出来。
获取所有附件信息
python
from spire.pdf.common import *
from spire.pdf import *
pdf = PdfDocument()
pdf.LoadFromFile("document_with_attachments.pdf")
# 获取附件集合
collection = pdf.Attachments
if collection.Count > 0:
for i in range(collection.Count):
attachment = collection.get_Item(i)
print(f"文件名: {attachment.FileName}")
print(f"描述: {attachment.Description}")
if attachment.CreationDate:
print(f"创建时间: {attachment.CreationDate}")
print("---")
pdf.Close()
提取附件到本地
python
from spire.pdf.common import *
from spire.pdf import *
pdf = PdfDocument()
pdf.LoadFromFile("document_with_attachments.pdf")
collection = pdf.Attachments
# 提取所有附件
for i in range(collection.Count):
attachment = collection.get_Item(i)
attachment.Data.Save(attachment.FileName)
# 或提取单个附件(例如第二个附件)
attachment = collection.get_Item(1)
attachment.Data.Save(attachment.FileName)
pdf.Close()
attachment.Data.Save() 方法会将附件数据直接保存为文件,文件名会自动使用附件原始名称。
删除附件
清理文档或重新打包时,可以移除 PDF 中不再需要的附件:
python
from spire.pdf.common import *
from spire.pdf import *
doc = PdfDocument()
doc.LoadFromFile("document_with_attachments.pdf")
# 删除所有附件
doc.Attachments.Clear()
doc.SaveToFile("cleaned.pdf")
doc.Close()
如果需要仅删除特定附件,可以通过索引获取后逐个处理,或者通过文件名匹配后移除。
实用提示
- 添加附件前,确认文件以二进制模式打开(
"rb"),否则可能导致数据损坏 - 为附件设置准确的 MIME 类型有助于 PDF 阅读器正确识别和处理附件内容
- 附件注释的
Flags属性可以控制交互行为,如ReadOnly表示只读,Locked表示锁定不可移动 - 文档级附件和附件注释可以同时存在,两者互不冲突
结论
本文介绍了使用 Python 在 PDF 文档中添加、提取和删除附件的基本方法。这些操作可以通过 Spire.PDF 的 API 轻松完成,适合嵌入到批量文档处理流程中。在此基础上,还可以进一步结合其他 PDF 操作(如页面合并、文本提取等)构建更复杂的文档自动化方案。