Java-如何在PDF中添加,提取或删除附件
#java #pdf #attachment

pdf 是一种通用格式。除了其页面上呈现的内容外,它还可以用作存储容器。您可以将其他文件附加到提取以后。将文件连接到PDF而不是使用外部链接的优点是,如果将其移动到其他位置,则附件将与PDF 一起传播。在本文中,我将介绍如何使用Spire.PDF for Java 中的PDF文档中添加,提取和删除附件。

添加spire.pdf.jar作为依赖关系

如果您正在从事Maven项目,则可以使用以下方式将依赖项包括在pom.xml文件中:

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf</artifactId>
        <version>8.11.8</version>
    </dependency>
</dependencies>

如果您不使用Maven,则可以从this location中的zip文件中找到所需的JAR文件。将所有JAR文件包括在应用程序LIB文件夹中以运行本教程中给出的示例代码。

将附件添加到Java中的PDF

有两种将文件附加到PDF文档的方法 - 附加面板中的文件并作为注释附加文件。添加这两种附件的步骤如下。

  • 创建 pdfdocument 对象,然后使用 pdfdocument.loadfromfile() methot。
  • 创建 pdfattachment 基于某个文件的对象。
  • 使用 pdfdocument.getAttachments()。add() methot。
  • 创建基于特定文件的 pdfattachmentantation 对象,并使用 pdfpagebase.getAnnotationswidget()。add()。add()方法。此附件将出现在附件面板中,并在页面上显示为注释。
  • 使用 pdfdocument.savetofile()方法将文档保存到另一个PDF文件。
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.annotations.*;
import com.spire.pdf.attachments.PdfAttachment;
import com.spire.pdf.graphics.*;
import com.spire.pdf.PdfDocument;

import java.awt.*;
import java.awt.geom.Dimension2D;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class AttachFiles {

    public static void main(String[] args) throws IOException {

        //Create a PdfDocument object
        PdfDocument doc = new PdfDocument();

        //Load a sample PDF file
        doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Sample.pdf");

        //Attach a file to PDF
        PdfAttachment attachment = new PdfAttachment("C:\\Users\\Administrator\\Desktop\\Data.xlsx");
        doc.getAttachments().add(attachment);

        //Get a specific page
        PdfPageBase page = doc.getPages().get(8);

        //Draw a label on PDF
        String label = "Here is the report:";
        PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Arial", Font.PLAIN, 13));
        double x = 35;
        double y = doc.getPages().get(0).getActualSize().getHeight() - 280;
        page.getCanvas().drawString(label, font, PdfBrushes.getRed(), x, y);

        //Attach a file as an annotation
        String filePath = "C:\\Users\\Administrator\\Desktop\\Report.pptx";
        byte[] data = toByteArray(filePath);
        Dimension2D size = font.measureString(label);
        Rectangle2D bound = new Rectangle2D.Float((float) (x + size.getWidth() + 5), (float) y, 10, 15);
        PdfAttachmentAnnotation annotation = new PdfAttachmentAnnotation(bound, filePath, data);
        annotation.setColor(new PdfRGBColor(new Color(0, 128, 128)));
        annotation.setFlags(PdfAnnotationFlags.Default);
        annotation.setIcon(PdfAttachmentIcon.Graph);
        annotation.setText("Click here to open the file");
        page.getAnnotationsWidget().add(annotation);

        //Save to file
        doc.saveToFile("Attachments.pdf");
    }

    //Convert file to byte array
    public static byte[] toByteArray(String filePath) throws IOException {

        File file = new File(filePath);
        long fileSize = file.length();
        if (fileSize > Integer.MAX_VALUE) {
            System.out.println("file too big...");
            return null;
        }
        FileInputStream fi = new FileInputStream(file);
        byte[] buffer = new byte[(int) fileSize];
        int offset = 0;
        int numRead = 0;
        while (offset < buffer.length
                && (numRead = fi.read(buffer, offset, buffer.length - offset)) >= 0) {
            offset += numRead;
        }

        if (offset != buffer.length) {
            throw new IOException("Could not completely read file "
                    + file.getName());
        }
        fi.close();
        return buffer;
    }
}

attachFiles

从Java中的PDF提取附件

由于附件和注释附件中的附件是两种不同的东西,因此提取它们的方法是不同的。以下步骤演示了如何使用java的spire.pdf提取这两种类型的附件。

  • 创建 pdfdocument 对象,然后使用 pdfdocument.loadfromfile() methot。
  • 使用 pdfdocument.getAttachments()方法获取文档中的附件集合(不包含注释附件)。
  • 使用 pdfattachmentCollection.get()方法及其数据使用 pdfattachment.getdata()方法获得特定的附件。将数据写入文件并保存到指定文件夹。
  • 使用 pdfpagebase.getAnnotationswidget()方法从文档中获取注释收集,然后确定注释是否为附件注释。如果是,请将注释写入文件,然后保存到指定的文件夹。
import com.spire.pdf.PdfDocument;
import com.spire.pdf.annotations.*;
import com.spire.pdf.attachments.PdfAttachmentCollection;

import java.io.*;

public class ExtractAttachments {

    public static void main(String[] args) throws Exception {

        //Create a PdfDocument object
        PdfDocument doc = new PdfDocument();

        //Load a PDF file that contains attachments
        doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Attachments.pdf");

        //Get the attachment collection of the PDF document
        PdfAttachmentCollection attachments = doc.getAttachments();

        //Loop through the collection
        for (int i = 0; i < attachments.getCount(); i++) {

            //Specify the output file path and name
            File file = new File("C:\\Users\\Administrator\\Desktop\\output\\" + attachments.get(i).getFileName());
            OutputStream output = new FileOutputStream(file);
            BufferedOutputStream bufferedOutput = new BufferedOutputStream(output);

            //Get a specific attachment and write to file
            bufferedOutput.write(attachments.get(i).getData());
            bufferedOutput.close();
        }

        //Loop through the pages
        for (int i = 0; i < doc.getPages().getCount(); i++) {

            //Get the annotation collection
            PdfAnnotationCollection collection = doc.getPages().get(i).getAnnotationsWidget();

            //Loop through the annotations
            for (Object annotation : collection) {

                //Determine if an annotation is an instance of PdfAttachmentAnnotationWidget
                if (annotation instanceof PdfAttachmentAnnotationWidget) {

                    //Save the attchment annoation out of the document
                    File file = new File("C:\\Users\\Administrator\\Desktop\\output\\" + ((PdfAttachmentAnnotationWidget) annotation).getText());
                    OutputStream output = new FileOutputStream(file);
                    BufferedOutputStream bufferedOutput = new BufferedOutputStream(output);
                    bufferedOutput.write(((PdfAttachmentAnnotationWidget) annotation).getData());
                    bufferedOutput.close();
                }
            }
        }
    }
}

Extract

从Java中的PDF中删除附件

以下是使用java的spire.pdf从PDF文档中删除附件的步骤。

  • 创建 pdfdocument 对象,然后使用 pdfdocument.loadfromfile() methot。
  • 使用 pdfdocument.getAttachments()方法获取文档中的附件集合(不包含注释附件)。
  • 使用 pdfattachmentCollection.clear()方法删除所有附件。或者,您可以使用 pdfattachmentCollection.removeat(index)方法删除特定的附件。
  • 要从特定页面上删除注释附件,我们首先使用 pdfpagebase.getAnnotationswidget()方法从文档中获取注释收集,然后确定注释是否为附件注释,如果是的,请删除注释使用 pdfannotationCollection.remove()方法。
  • 使用 pdfdocument.savetofile()方法将文档保存到另一个PDF文件。
import com.spire.pdf.PdfDocument;
import com.spire.pdf.annotations.PdfAnnotation;
import com.spire.pdf.annotations.PdfAnnotationCollection;
import com.spire.pdf.annotations.PdfAttachmentAnnotationWidget;
import com.spire.pdf.attachments.PdfAttachmentCollection;

public class RemoveAttachments {

    public static void main(String[] args) {

        //Create a PdfDocument object
        PdfDocument doc = new PdfDocument();

        //Load a PDF file
        doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Attachments.pdf");

        //Get attachment collection, not containing annotation attachments
        PdfAttachmentCollection attachments = doc.getAttachments();

        //Remove all attachments
        attachments.clear();

        //Remove a specific attachment
        //attachments.removeAt(0);

        //Remove annotation attachments from the document
        removeAnnotationAttachment(doc);

        //save to file
        doc.saveToFile("output/DeleteAttachments.pdf");
        doc.close();
    }

    public static void removeAnnotationAttachment(PdfDocument doc){

        //Loop through the pages
        for (int i = 0; i < doc.getPages().getCount(); i++) {

            //Get the annotation collection
            PdfAnnotationCollection annotationCollection = doc.getPages().get(i).getAnnotationsWidget();

            //Loop through the annotations
            for (Object annotation: annotationCollection) {

                //Determine if an annotation is an instance of PdfAttachmentAnnotationWidget
                if (annotation instanceof PdfAttachmentAnnotationWidget){

                    //Remove the attachment annotation
                    annotationCollection.remove((PdfAnnotation) annotation);
                }
            }
        }
    }
}

RemoveAttachments