在日常文档处理中,PDF附件功能常用于将合同原文与证明材料打包,或是在技术文档中附上数据文件与图片。手动操作在批量处理时效率低下,而借助Python的Spire.PDF库,可以编程完成添加、读取和删除PDF附件的全流程操作,适合集成到自动化工作流中。
环境准备
使用Python操作PDF附件首先需要安装Spire.PDF库,执行以下命令行安装:该库提供了完整的PDF文档处理API,包括附件管理功能。
添加文档级附件
文档级附件会出现在PDF阅读器的附件面板中,不会直接显示在页面内容上。下面代码演示如何将Excel文件作为附件添加到PDF:- 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属性让阅读器识别文件类型;Attachments.Add()将附件加入集合。
添加附件注释(页面图标)
附件注释会在PDF页面中显示为图标(如回形针、图钉),读者可点击打开。以下示例在首页添加一个回形针图标附件:- 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时,可以遍历附件集合获取基本信息,或提取文件到本地。
获取所有附件信息:- 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()
复制代码 提取附件到本地:- 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中不需要的附件:- 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通过Spire.PDF实现在PDF文档中添加文档级附件、附件注释、读取/提取附件以及删除附件的完整方法。这些操作适合嵌入到批量文档处理流程中,并可进一步与其他PDF操作(如页面合并、文本提取)组合,构建自动化方案。 |