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


    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进行测试。

  • 相关阅读:
    10.21SQL注入
    10.15计网相关
    10.11php+mysql
    10.10 接在10.8随笔中
    10.9 利用微信dll反弹shell复现
    10.8php续
    9.29 接9.27PHP相关
    java泛型
    java集合之Map接口
    java集合之Collection接口
  • 原文地址:https://www.cnblogs.com/Yesi/p/6410431.html
Copyright © 2020-2023  润新知