一、引言
PDF(Portable Document Format)是一种通用的文档格式,广泛应用于电子文档的创建、分发和阅读。Apache PDFBox是一个强大的开源Java库,用于创建、编辑和处理PDF文件。本文将通过详细的步骤和示例,帮助您快速入门Apache PDFBox,掌握PDF文件的生成、编辑与处理。
二、生成PDF文件
- 引入依赖
首先,确保您的项目中引入了Apache PDFBox的依赖。在Maven项目中,可以在pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.24</version>
</dependency>
- 创建PDF文档
接下来,使用以下代码创建一个新的PDF文档:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
public class PDFGenerator {
public static void main(String[] args) {
try {
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
contentStream.beginText();
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);
contentStream.newLineAtOffset(25, 700);
contentStream.showText("Hello, PDFBox!");
contentStream.endText();
contentStream.close();
document.save("generated.pdf");
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述代码创建了一个包含一页的PDF文档,并在页面上绘制了一段文本“Hello, PDFBox!”。最后,将生成的PDF文件保存为generated.pdf
。
三、编辑PDF文件
除了生成PDF文件,Apache PDFBox还提供了编辑现有PDF文件的功能。下面是一个简单的示例,演示如何使用PDFBox打开现有PDF文件并修改其内容:
- 引入依赖(同上)
- 打开PDF文件并编辑内容:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.interactive.annotation.*;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.*;
import org.*;
import java.*;
public class PDFEditor {
public static void main(String[] args) throws Exception {
PDDocument document = PDDocument.load(new File("path/to/existing_document_name"));
PDPage page = (PDPage) document.getDocumentCatalog().getPages().get(0);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
contentStream = new PDPageContentStream(document, page, AppendMode向往添加内容, setNonStrokingColor设置颜色, setFont将字体添加到内容流中,showText添加文本到内容流中,close关闭内容流。);
contentStream = new PDPageContentStream(document, page, AppendMode.APPEND, SetOperation.INTERACT, PDPageResources(), false, false); contentStream = new PDPageContentStream(document, page, AppendMode, SetOperation, PDPageResources(), false, false);
contentStream = new PDPageContentStream(document, page, AppendMode);
contentStream = new PDPageContentStream(documentcontentStream = new PDPageContentStream(document, page, AppendMode.APPEND);
contentStream.beginText();
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);
contentStream.newLineAtOffset(25, 700);
contentStream.showText("Hello, PDFBox!");
contentStream.endText();
contentStream.close();
document.save("edited_document_name.pdf");
document.close();
}
}
上述代码打开了一个现有的PDF文件,并在第一页上添加了一段文本“Hello, PDFBox!”。然后,将修改后的PDF文件保存为edited_document_name.pdf
。
四、处理PDF文件
除了生成和编辑PDF文件,Apache PDFBox还提供了许多其他功能,用于处理PDF文件。以下是一些常见的处理操作:
- 提取文本:使用PDFBox的
PDDocument
类和PDPageContentStream
类,可以轻松地从PDF文件中提取文本。以下是一个简单的示例:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
public class PDFTextExtractor {
public static void main(String[] args) throws Exception {
PDDocument document = PDDocument.load(new File("path/to/pdf_file"));
PDFTextStripper stripper = new PDFTextStripper();
String text = stripper.getText(document);
System.out.println(text);
document.close();
}
}
上述代码打开指定的PDF文件,提取所有文本,并将结果打印到控制台。 2. 合并PDF文件:使用PDFBox,您可以轻松地将多个PDF文件合并为一个文件。以下是一个简单的示例:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.*;
import org.*;
import java.*;
public class PDFMerger {
public static void main(String[] args) throws Exception {
PDDocument document = new PDDocument();
for (String file : files) { PDDocument doc = PDDocument.load(new File(file));
for (PDPage page : doc.getPages()) {
PDRectangle mediaBox = page.getMediaBox();
float llx = mediaBox.getLowerLeftX();
float lly = mediaBox.getLowerLeftY();
float urx = mediaBox.getUpperRightX();
float ury = mediaBox.getUpperRightY();
PDPage newPage = new PDPage(PDRectangle.A4);
newPage .setMediaBox(new PDRectangle(0,0,842,595));
document .addPage(newPage );
PDPageContentStream contentStream = new PDPageContentStream(document, newPage , AppendMode, SetOperation, PDPageResources(), false, false);
contentStream = new PDPageContentStream(document, newPage ,AppendMode);
contentStream.beginText();
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);
contentStream.newLineAtOffset(25, 700);
contentStream.showText(doc.getDocumentInformation().getTitle());
contentStream.endText();
contentStream.close();
}
doc.close();
document.save("merged_pdf.pdf");
document.close();
}
}
这段代码加载一系列PDF文件,将每个文件的标题添加到一个新页面上,然后将所有这些页面合并到一个名为merged_pdf.pdf
的PDF文件中。
- 创建表格:使用PDFBox,您可以在PDF文件中创建和编辑表格。以下是一个简单的示例,演示如何创建一个包含两列和三行的表格:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.interactive.table.*;
public class PDFTableCreator {
public static void main(String[] args) throws Exception {
PDDocument document = new PDDocument();
PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);
PDTable table = new PDTable(new float[] {50, 50, 50}); // 2 columns, 3 rows
page.getContents().add(table);
PDTableHeader header = table.getHeader();
header.getRegion().setBBox(new PDRectangle(36, 748, 350, 10)); // Header position and size
header.getRegion().setColumnWidths(new float[] {350, 350}); // Column widths
header.addCell("Header 1");
header.addCell("Header 2");
PDTableFooter footer = table.getFooter();
footer.getRegion().setBBox(new PDRectangle(36, 640, 350, 10)); // Footer position and size
footer.getRegion().setColumnWidths(new float[] {350, 350}); // Column widths
footer.addCell("Footer 1");
footer.addCell("Footer 2");
// Add some data to the table
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
table.addCell("Cell " + (i + 1) + "," + (j + 1));
}
}
document.save("table_example.pdf");
document.close();
}
}
这个示例创建了一个包含两列和三行的表格,并添加了表头、页脚和数据。您可以根据需要调整表格的大小、位置和样式。
- 添加图像:使用PDFBox,您可以将图像添加到PDF文件中。以下是一个简单的示例,演示如何将一张图片添加到PDF页面上:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import java.io.File;
import java.io.IOException;
public class PDFImageAdder {
public static void main(String[] args) throws IOException {
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
PDImageXObject pdImage = PDImageXObject.createFromFile("path/to/image.jpg", document);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
contentStream.drawImage(pdImage, 100, 100, pdImage.getWidth(), pdImage.getHeight());
contentStream.close();
document.save("image_example.pdf");
document.close();
}
}
这个示例加载一个名为image.jpg
的图像文件,并将其绘制到PDF页面的指定位置。您可以根据需要调整图像的位置、大小和旋转角度。
- 创建目录:使用PDFBox,您可以在PDF文件中创建目录,以便更好地组织和导航文档。以下是一个简单的示例,演示如何创建一个包含两个章节的目录:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline;
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem;
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineNode;
public class PDFOutlineAdder {
public static void main(String[] args) throws Exception {
PDDocument document = new PDDocument();
PDDocumentOutline outline = document.getDocumentCatalog().getDocumentOutline();
// 添加第一个章节
PDOutlineItem item1 = outline.addOutlineItem("Chapter 1");
item1.setDestination(document.getPage(0));
// 添加第二个章节
PDOutlineItem item2 = outline.addOutlineItem("Chapter 2");
item2.setDestination(document.getPage(1));
document.save("outline_example.pdf");
document.close();
}
}
这个示例创建了一个包含两个章节的目录,并为每个章节设置了相应的页面作为目标。您可以在文档中添加更多的章节和子章节,并使用setDestination
方法设置相应的目标页面。通过使用PDFBox的PDDocumentOutline
类,您可以更好地组织和导航您的PDF文档。
- 添加注释:使用PDFBox,您可以在PDF页面上添加注释。以下是一个简单的示例,演示如何添加注释:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationText;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationTextCharacterProperties;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationTextMarkup;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationUnderline;
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDDestination;
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageDestination;
public class PDFAnnotationAdder {
public static void main(String[] args) throws Exception {
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
// 添加文本注释
PDAnnotationTextMarkup textMarkup = new PDAnnotationTextMarkup(page);
textMarkup.setContents("这是一个文本注释");
textMarkup.setRectangle(new PDRectangle(50, 500, 200, 100));
textMarkup.setQuadPoints(new float[] {50, 510, 50, 410, 250, 410, 250, 510});
page.getAnnotations().add(textMarkup);
// 添加带下划线的注释
PDAnnotationUnderline underline = new PDAnnotationUnderline(page);
underline.setContents("这是一个带下划线的注释");
underline.setRectangle(new PDRectangle(50, 400, 200, 100));
underline.setQuadPoints(new float[] {50, 410, 50, 310, 250, 310, 250, 410});
page.getAnnotations().add(underline);
// 添加指向特定页面的注释
PDAnnotationText text = new PDAnnotationText();
text.setContents("点击跳转到第2页");
text.setRectangle(new PDRectangle(50, 300, 200, 100));
text.setQuadPoints(new float[] {50, 310, 50, 210, 250, 210, 250, 310});
textMarkup.setAction(new PDActionGoTo(document, new PDPageDestination(document.getPage(1))));
page.getAnnotations().add(text);
document.save("annotation_example.pdf");
document.close();
}
}
本文来自极简博客,作者:编程灵魂画师,转载请注明原文链接:Apache PDFBox入门指南:理解PDF文件的生成、编辑与处理