使用C#代码从 PDF 文档中提取附件

发布时间:2026/10/11 17:28:27

使用C#代码从 PDF 文档中提取附件 PDF 附件可以帮助用户查看与文档中特定内容相关的更多信息。PDF 中的附件主要分为两种文档级附件和注释附件二者的区别如下。文档级附件这类附件直接添加到 PDF 文档中不会显示在页面上而是显示在 PDF 阅读器的“附件”面板中。注释附件这类附件添加到页面的特定位置通常以回形针图标的形式显示。查看者可以双击该图标打开附件。本文将介绍如何使用 C# 和 VB.NET 从 PDF 文档中提取这两种类型的附件。安装相关库首先需要将相关库文件添加为 .NET 项目的引用。你可以下载对应的安装包并将其中的 DLL 文件添加到项目中也可以通过 NuGet 包管理器安装所需的库。PM Install-Package Spire.PDF使用 C# 和 VB.NET 从 PDF 中提取附件可以通过PdfDocument.Attachments属性获取 PDF 文档中的文档级附件。以下步骤演示如何提取 PDF 中的所有文档级附件并将其保存到本地文件夹。创建一个PdfDocument对象。使用PdfDocument.LoadFromFile()方法加载 PDF 文件。通过PdfDocument.Attachments属性获取文档中的附件集合。使用PdfAttachment.Data属性获取指定附件的数据。将附件数据写入文件并保存到指定文件夹。完整示例代码如下using Spire.Pdf; using Spire.Pdf.Attachments; using System.Net.Mail; namespace ExtractAttachments { class Program { static void Main(string[] args) { // 创建 PdfDocument 对象 PdfDocument doc new PdfDocument(); // 加载包含附件的 PDF 文件 doc.LoadFromFile(C:\\Users\\Administrator\\Desktop\\Attachments.pdf); // 获取 PDF 文档的附件集合 PdfAttachmentCollection attachments doc.Attachments; // 指定输出文件夹路径 string outputFolder C:\\Users\\Administrator\\Desktop\\output\\; // 遍历附件集合 for (int i 0; i attachments.Count; i) { // 将附件写入文件 File.WriteAllBytes(outputFolder attachments[i].FileName, attachments[i].Data); } } } }使用 C# 和 VB.NET 从 PDF 中提取注释附件注释附件是与 PDF 页面相关联的元素。若要获取指定页面中的注释可以使用PdfPageBase.AnnotationsV2属性。随后需要判断某个注释是否为文件附件注释。以下步骤介绍如何从 PDF 文档中提取注释附件并将其保存到本地文件夹。创建一个PdfDocument对象。使用PdfDocument.LoadFromFile()方法加载 PDF 文件。通过PdfDocument.Pages[]属性获取文档中的指定页面。使用PdfPageBase.AnnotationsV2属性获取该页面的注释集合。判断指定注释是否属于PdfFileAttachmentAnnotation类型。如果是则将注释附件写入文件并保存到指定文件夹。完整示例代码如下using Spire.Pdf; using Spire.Pdf.Interactive.Annotations; namespace ExtractAnnotationAttachments { class Program { static void Main(string[] args) { // 创建 PdfDocument 对象 PdfDocument doc new PdfDocument(); // 加载包含附件的 PDF 文件 doc.LoadFromFile(C:\\Users\\Administrator\\Desktop\\AnnotationAttachments.pdf); // 指定输出文件夹路径 string outputFolder C:\\Users\\Administrator\\Desktop\\Output\\; // 遍历所有页面 for (int i 0; i doc.Pages.Count; i) { // 获取页面的注释集合 PdfAnnotationCollection collection doc.Pages[i].AnnotationsV2; // 遍历所有注释 for (int j 0; j collection.Count; j) { // 判断注释是否为 PdfFileAttachmentAnnotation 类型 if (collection[j] is PdfFileAttachmentAnnotation) { // 将注释附件写入文件 PdfFileAttachmentAnnotation attachmentAnnotation (PdfFileAttachmentAnnotation)collection[j]; PdfFileSpecification fileSpecification attachmentAnnotation.FileSpecification; // 获取附件文件名 String fileName Path.GetFileName(fileSpecification.FileName); // 获取附件数据 byte[] data fileSpecification.EmbeddedFile.Data; // 将附件保存到指定文件夹 File.WriteAllBytes(outputFolder fileName, data); } } } } } }总结本文介绍了如何使用 C# 从 PDF 文档中提取附件主要包括文档级附件和注释附件两种类型。对于文档级附件可以通过PdfDocument.Attachments属性获取附件集合并遍历集合将附件数据保存到本地文件夹。对于注释附件则需要遍历 PDF 文档的各个页面获取页面中的注释集合并判断注释是否属于PdfFileAttachmentAnnotation类型。确认后即可提取附件的文件名和数据并将其保存为本地文件。通过以上方法可以根据附件在 PDF 文档中的存储方式选择合适的提取方法便于后续查看、管理和处理 PDF 中的嵌入文件。
延伸阅读

更多相关文章

2026/10/11 17:28:27

8700客户端运维手册:连接配置、参数下发与故障排查

简介:这份docx文档围绕海康威视iVMS-8700客户端操作展开,面向智能楼宇安防项目的实施、运维及售前售后人员。压缩包仅含1个docx文档,整体约1.09MB,内容紧凑,适合直接打印或按章节速查。目前已有349人学习下载&#xff…

2026/10/11 17:23:27

铁路窗口售票系统需求分析:从业务边界到异常流的完整拆解

简介:中国铁路窗口售票系统需求分析文档,面向软件开发人员、软件工程专业学生、需求分析学习者以及铁路售票系统设计初学者,可作为课程报告、毕业设计或实际项目需求阶段的参考蓝本。文档围绕系统总体目标、功能要求、体系架构、业务需求、票…

2026/10/11 19:33:32

十月十日,与黑猫 Shell 调试内核的静谧午后

十月十日,秋阳正好。 午后的阳光穿过百叶窗的缝隙,在深灰色的实木办公桌上切出一道道明暗交替的光栅。窗外的银杏树叶已经开始泛出淡淡的金黄,偶尔一阵秋风拂过,树叶沙沙作响。研发大楼的走廊里依旧回荡着匆忙的脚步声&#xff0c…

2026/10/11 19:33:32

C语言指针入门:从内存地址到调试实战

如果票选C语言里劝退率最高的知识点,指针应该能排进前三。我当年刚学的时候也被绕得晕头转向,书上一句“指针就是变量的地址”,可我脑子里总在犯嘀咕:地址到底长什么形状?直到后来在调试器里亲眼盯着一块内存、看着变量…

2026/10/11 19:33:32

编译原理实验:正则表达式转NFA与Lex扫描器实战全解

简介:本资源为编译原理课程实验报告文档,适用于计算机科学与技术专业本科生,也适合正在学习编译器前端知识、需要参考正则表达式到NFA转换实现及Lex词法分析器设计的学习者。实验依托Engintime CP Lab平台完成,报告详细梳理了从领…

2026/10/11 19:28:32

具身智能落地指南:从VLA模型到系统集成

简介:《具身智能发展报告(2024年)》是由中国信通院与北京人形机器人创新中心联合发布的研究报告,面向AI与机器人领域的研究者、工程师及政策制定者,系统梳理具身智能的概念内涵、技术体系、应用潜力与未来趋势。报告从…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑