pdf 是一种通用格式。除了其页面上呈现的内容外,它还可以用作存储容器。您可以将其他文件附加到和提取以后。将文件连接到PDF而不是使用外部链接的优点是,如果将其移动到其他位置,则附件将与PDF 一起传播。在本文中,我将介绍如何使用Spire.PDF for Java 中的PDF文档中添加,提取和删除附件。
- Add Attachments to PDF in Java
- Extract Attachments from PDF in Java
- Remove Attachments from PDF in Java
添加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;
}
}
从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();
}
}
}
}
}
从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);
}
}
}
}
}