C# 添加、获取及删除PDF附件

简介: C# 添加、获取及删除PDF附件前言附件在PDF文档中很常见,这些附件可以是PDF或其他类型的文件。在PDF中,附件有两种存在方式,一种是普通的文件附件(document-level file attachment),另一种是注释(annotation)。

C# 添加、获取及删除PDF附件

前言

附件在PDF文档中很常见,这些附件可以是PDF或其他类型的文件。在PDF中,附件有两种存在方式,一种是普通的文件附件(document-level file attachment),另一种是注释(annotation)。本文主要介绍如何在C#应用程序中给PDF文档添加附件以及从PDF文档获取附件、删除附件。

我们都知道.NET Framework 本身并没有直接操作PDF的类库,因此在.NET应用程序中操作PDF文档必须要借助第三方组件提供的dll。本文主要使用的是Free Spire.PDF组件的dll。

实现

1.  添加附件

以下代码将介绍两种将文档附加到PDF的方式。一种是将文档作为文件附件添加到PDF,另一种则是将文档作为注释附加到PDF的页面中。

1.1  将文档作为文件附件添加到PDF

该方法是通过调用PdfAttachmentCollection类的Add()方法将文档添加到PdfDocument对象的Attachments集合中。

//加载PDF文档
PdfDocument pdf = new PdfDocument("Test.pdf");

//加载需要附加的文档
PdfAttachment attachment = new PdfAttachment("New.pdf");
//将文档添加到原PDF文档的附件集合中
pdf.Attachments.Add(attachment);

//保存文档
pdf.SaveToFile("Attachment1.pdf");

                      

1.2  将文档作为注释(annotation)附加到PDF文档的页面

创建注释时,我们需要用到以下类PdfAttachmentAnnotation:

namespace Spire.Pdf.Annotations
{
    // Summary:
    //     Represents an attachment annotation.
    public class PdfAttachmentAnnotation : PdfFileAnnotation
    {
        //
        // Parameters:
        //   rectangle:
        //     Bounds of the annotation.
        //
        //   fileName:
        //     A string value specifying the full path to the file to be embedded in the
        //     PDF file.
        public PdfAttachmentAnnotation(RectangleF rectangle, string fileName);
        //
        //
        // Parameters:
        //   rectangle:
        //     Bounds of the annotation.
        //
        //   fileName:
        //     A string value specifying the full path to the file to be embedded in the
        //     PDF file.
        //
        //   data:
        //     A byte array specifying the content of the annotation's embedded file.
        //
        // Remarks:
        //     If both FileName and FileContent are specified, the FileContent takes precedence.
        public PdfAttachmentAnnotation(RectangleF rectangle, string fileName, byte[] data);
        //
        //
        // Parameters:
        //   rectangle:
        //     The rectangle.
        //
        //   fileName:
        //     A string value specifying the full path to the file to be embedded in the
        //     PDF file.
        //
        //   stream:
        //     The stream specifying the content of the annotation's embedded file.
        //
        // Remarks:
        //     If both FileName and FileContent are specified, the FileContent takes precedence.
        public PdfAttachmentAnnotation(RectangleF rectangle, string fileName, Stream stream);

        public override string FileName { get; set; }
        //
        // Summary:
        //     Gets or Sets attachment's icon.
        public PdfAttachmentIcon Icon { get; set; }

        protected override void Initialize();
        protected override void Save();
    }
}

 代码段:

//加载PDF文档
PdfDocument doc = new PdfDocument("Test.pdf");

//给文档添加一个新页面
PdfPageBase page = doc.Pages.Add();

//添加文本到页面
PdfTrueTypeFont font1 = new PdfTrueTypeFont(new Font("Arial", 16f, System.Drawing.FontStyle.Bold));
page.Canvas.DrawString("Attachments:", font1, PdfBrushes.CornflowerBlue, new Point(50, 50));

//将文档作为注释添加到页面
PdfTrueTypeFont font2 = new PdfTrueTypeFont(new Font("Arial", 12f, System.Drawing.FontStyle.Bold));
PointF location = new PointF(52, 80);
String label = "Report.docx";
byte[] data = File.ReadAllBytes("Report.docx");
SizeF size = font2.MeasureString(label);
RectangleF bounds = new RectangleF(location, size);
page.Canvas.DrawString(label, font2, PdfBrushes.MediumPurple, bounds);
bounds = new RectangleF(bounds.Right + 3, bounds.Top, font2.Height / 2, font2.Height);
PdfAttachmentAnnotation annotation1 = new PdfAttachmentAnnotation(bounds, "Report.docx", data);
annotation1.Color = Color.Purple;
annotation1.Flags = PdfAnnotationFlags.NoZoom;
annotation1.Icon = PdfAttachmentIcon.Graph;
annotation1.Text = "Report.docx";
(page as PdfNewPage).Annotations.Add(annotation1);

//保存文档
doc.SaveToFile("Attachment2.pdf");


 

2.  获取附件

根据附件添加方式的不同,获取附件也分为以下两种相应的方式。

2.1  获取文件附件

获取文件附件时,我们还可以获取附件的信息如文件名,MimeType,描述,创建日期和修改日期等。

//加载PDF文档
PdfDocument pdf = new PdfDocument("Attachment1.pdf");

//获取文档的第一个文件附件
PdfAttachment attachment = pdf.Attachments[0];

//获取该附件的信息
Console.WriteLine("Name: {0}", attachment.FileName);
Console.WriteLine("MimeType: {0}", attachment.MimeType);
Console.WriteLine("Description: {0}", attachment.Description);
Console.WriteLine("Creation Date: {0}", attachment.CreationDate);
Console.WriteLine("Modification Date: {0}", attachment.ModificationDate);

//将附件的数据写入到新文档
File.WriteAllBytes(attachment.FileName, attachment.Data);
Console.ReadKey();

 

2.2  获取注释附件

//加载PDF文档
PdfDocument pdf = new PdfDocument("Attachment2.pdf");

//实例化一个list并将文档内所有页面的Attachment annotations添加到该list
List<PdfAttachmentAnnotationWidget> attaches = new List<PdfAttachmentAnnotationWidget>();
foreach (PdfPageBase page in pdf.Pages)
{
    foreach (PdfAnnotation annotation in page.AnnotationsWidget)
    {
        attaches.Add(annotation as PdfAttachmentAnnotationWidget);
    }
}

//遍历list,将附件数据写入到新文档
for (int i = 0; i < attaches.Count; i++)
{
    File.WriteAllBytes(attaches[i].FileName, attaches[i].Data);
}

 

3.  删除附件

3.1  删除文件附件

//加载PDF文档
PdfDocument pdf = new PdfDocument("Attachment1.pdf");

//删除文档的所有文件附件
for (int i = 0; i < pdf.Attachments.Count; i++)
{
    pdf.Attachments.RemoveAt(i);
} 

//保存文档
pdf.SaveToFile("Remove.pdf");

 

3.2  删除注释附件

//加载PDF文档
PdfDocument pdf = new PdfDocument("Attachment2.pdf");

//删除文档的所有注释附件
foreach (PdfPageBase page in pdf.Pages)
{
    for (int i = 0; i < page.AnnotationsWidget.Count; i++)
    {
        PdfAnnotation annotation = page.AnnotationsWidget[i] as PdfAttachmentAnnotationWidget;

        page.AnnotationsWidget.Remove(annotation);                   
    }
}

//保存文档
pdf.SaveToFile("Result.pdf");

 

总结:

本文只对该dll的部分功能做了简单的介绍,如果需要了解更多内容,可以去官网NuGet下载dll进行测试。

目录
相关文章
|
前端开发 C#
C# 基于NPOI+Office COM组件 实现20行代码在线预览文档(word,excel,pdf,txt,png)
C# 基于NPOI+Office COM组件 实现20行代码在线预览文档(word,excel,pdf,txt,png)
|
C# Windows
C# DataTable导出PDF,解决引入中文字体失败的问题
C# DataTable导出PDF,解决引入中文字体失败的问题
C#使用wps转pdf
C#使用wps转pdf
206 0
|
C# Windows
C#编程学习15:应用程序帮助文档(chm/pdf)制作与C#调用
C#编程学习15:应用程序帮助文档(chm/pdf)制作与C#调用
C#编程学习15:应用程序帮助文档(chm/pdf)制作与C#调用
C#编程学习08:Spire Pdf组件的引用,以国际知名期刊OR为例
C#编程学习08:Spire Pdf组件的引用,以国际知名期刊OR为例
C#编程学习08:Spire Pdf组件的引用,以国际知名期刊OR为例
|
小程序 C# Python
【优化】C#小程序集成实现python定时段批量下载电子邮箱附件的bug排除
【优化】C#小程序集成实现python定时段批量下载电子邮箱附件的bug排除
126 0
|
C#
C#如何给PDF文档添加注释
整理文档时,我们可能会需要在一些或一段文字上添加注释加以说明,那如何以编程的方式实现呢?本文将实例讲述C#中如何使用免费组件给PDF文档添加文本注释,包括自由文本注释。自由文本注释能允许我们自定义它的风格和外观,非常具有实用价值。
1003 0
|
C#
C#给PDF文档添加文本和图片页眉
页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码、日期、公司徽标、文档标题、文件名或作者名等等。那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件Free Spire.PDF给PDF文档添加文本和图片页眉。
1170 0
|
C# 数据安全/隐私保护
C#如何在PDF文件添加图片印章
文档中添加印章可以起一定的作用,比如,防止文件随意被使用,或者确保文档内容的安全性和权威性。C#添加图片印章其实也有很多实现方法,这里我使用的是免费的第三方软件Free Spire.PDF for .NET,向大家阐述如何以编程的方式在PDF文件中添加图片印章。
1271 0
|
C#
C#中如何创建PDF网格并插入图片
这篇文章我将向大家演示如何以编程的方式在PDF文档中创建一个网格,并将图片插入特定的网格中。 网上有一些类似的解决方法,在这里我选择了一个免费版的PDF组件。安装控件后,创建新项目,添加安装目录下的dll文件作为项目的引用以及命名空间,如下: using Spire.Pdf; using Spire.Pdf.Graphics; using Spire.Pdf.Grid; 接下来是详细步骤及代码片段: 步骤1: 首先创建一个PDF文档,并添加一个新页面。
1054 0