Python 操作 PDF 附件:添加、查看与管理指南

在日常文档处理工作中,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 操作(如页面合并、文本提取等)构建更复杂的文档自动化方案。

相关推荐
神奇小汤圆3 小时前
接口响应慢到崩溃?CompletableFuture 并行编排让效率提升 3 倍
后端
程序员cxuan3 小时前
GPT-5.6 还不发布?不过大家可以先看看 Codex 的白皮书。
人工智能·后端·程序员
妙码生花3 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(八):设计管理员模型、热重载配置
前端·后端·go
ServBay4 小时前
拒绝当二等公民,Windows 开发者如何无痛开启 Claude Code 本地全栈运维?
后端·ai编程·mcp
用户34232323763174 小时前
从数据源到仪表盘——全链路端到端实战整合
后端
Apifox4 小时前
从 Postman 迁移到 Apifox:Workspace、Collection、Environment 现在可以一起导入了
前端·后端·程序员
用户7713970207066 小时前
深入解析 C# Path.ChangeExtension:原来改扩展名可以这么简单
后端
zimoyin6 小时前
深入理解 Kotlin 协程:从零实现一个 IO 优先 + 虚拟线程溢出的混合调度器
后端