简介
Apache PDFBox库是一个用于处理PDF文档的开源Java工具。该项目允许创建新的PDF文档,操作现有PDF文档,并从PDF文档中提取内容。Apache PDFBox还包括几个命令行实用程序。
Apache PDFBox的主要功能如下:
- 从PDF文件中提取Unicode文本。
- 将单个PDF拆分成多个文件或合并多个PDF文件。
- 从PDF表单中提取数据或填写PDF表单。
- 验证PDF文件是否符合 PDF/A-1b 标准。
- 使用标准的Java打印API打印PDF文件。
- 将PDF另存为图像文件,例如PNG或JPEG。
- 从头开始创建PDF,包括嵌入字体和图像。
- 对PDF文件进行数字签名。
导入
首先,我们需要确保已经将PDFBox库添加到我的Java项目中。如果你使用的是maven,那么在pom.xml中添加如下依赖:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.28</version>
</dependency>
这里使用的版本是:2.0.28。
Talk is cheap. Show me the code.
创建PDF文档
我们可以使用以下代码创建一个简单的PDF文档:
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
public class CreatePDF {
public static void main(String[] args) {
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
PDType1Font font = PDType1Font.HELVETICA_BOLD;
try {
PDPageContentStream contentStream = new PDPageContentStream(document, page);
contentStream.beginText();
contentStream.setFont(font, 12);
contentStream.newLineAtOffset(100, 700);
contentStream.showText("Hello, World!");
contentStream.endText();
contentStream.close();
document.save(new File("one-more.pdf"));
document.close();
System.out.println("PDF created successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
这个代码段创建一个新的PDF文档,并在其第一页上写入"Hello, World!"。我使用了Helvetica Bold字体,并将其大小设置为12。
接下来,我将文本显示在PDF页面上,并使用contentStream.close()
方法关闭PDPageContentStream
对象。
最后,我将文档保存为"one-more.pdf"文件,然后关闭PDDocument对象。效果如下图:
读取PDF文件
我们可以使用以下代码读取PDF文件中的全部内容:
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
public class ReadPDFExample {
public static void main(String[] args) {
// 创建文件对象
File file = new File("one-more.pdf");
try {
// 创建 PDF 文档对象
PDDocument document = PDDocument.load(file);
// 创建 PDF 文本剥离器
PDFTextStripper stripper = new PDFTextStripper();
// 获取 PDF 文件的全部内容
String text = stripper.getText(document);
// 输出 PDF 文件的全部内容
System.out.println(text);
// 关闭 PDF 文档对象
document.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
首先,创建一个文件对象,然后使用 PDDocument 类的静态方法 load() 加载 PDF 文件并创建一个 PDF 文档对象。
然后,我们创建一个 PDFTextStripper 对象,并使用它的 getText() 方法获取 PDF 文件的全部内容。
最后,我们输出 PDF 文件的全部内容,并关闭 PDF 文档对象。
输出内容就是之前我们写入的:
Hello, World!
插入图片
我们可以使用以下代码在PDF文件中插入图片:
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
public class InsertImageInPDF {
public static void main(String[] args) {
try {
// 加载PDF文件
PDDocument document = PDDocument.load(new File("one-more.pdf"));
// 获取第一页
PDPage page = document.getPage(0);
// 加载图像文件
PDImageXObject image = PDImageXObject.createFromFile("one-more.jpg", document);
// 在指定位置插入图像
PDPageContentStream contentStream = new PDPageContentStream(document, page, AppendMode.APPEND, true, true);
contentStream.drawImage(image, 200, 500, image.getWidth(), image.getHeight());
// 关闭流
contentStream.close();
// 保存修改后的PDF文件
document.save("one-more-jpg.pdf");
// 关闭文档
document.close();
System.out.println("PDF created successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个例子中,我们加载了一个名为“one-more.pdf”的PDF文件,获取了第一页,并加载了一个名为“one-more.jpg”的图像文件。
然后,我们使用drawImage()
方法在PDF文档中的指定位置插入了图像。
最后,我们将修改后的文档保存到名为“one-more-jpg.pdf”的新文件中,并关闭文档。效果如下图:
读取图片
我们可以使用以下代码在PDF文件中读取图片:
import java.io.IOException;
import java.util.List;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
public class ReadPDFImagesExample {
public static void main(String[] args) {
try {
// 加载PDF文件
PDDocument document = PDDocument.load(new File("one-more-jpg.pdf"));
PDPageTree pageTree = document.getPages();
// 遍历每个页面
for (PDPage page : pageTree) {
int pageNum = pageTree.indexOf(page) + 1;
int count = 1;
System.out.println("Page " + pageNum + ":");
for (COSName xObjectName : page.getResources().getXObjectNames()) {
PDXObject pdxObject = page.getResources().getXObject(xObjectName);
if (pdxObject instanceof PDImageXObject) {
PDImageXObject image = (PDImageXObject) pdxObject;
System.out.println("Found image with width "
+ image.getWidth()
+ "px and height "
+ image.getHeight()
+ "px.");
String fileName = "one-more-" + pageNum + "-" + count + ".jpg";
ImageIO.write(image.getImage(), "jpg", new File(fileName));
count++;
}
}
}
document.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在此示例中,我们使用PDDocument
类从指定的PDF文件中加载文档,并遍历每个页面以查找其中的图像。
对于每个页面,我们获取其资源(包括图像)并检查其中是否存在图像。
如果存在,则我们遍历它们,并使用PDImageXObject
对象获取它们的属性,例如宽度和高度。
然后,使用ImageIO把图片保存到本地文件系统。
输出如下:
Page 1:
Found image with width 150px and height 150px.
结尾
Apache PDFBox是一个功能强大的工具,除了以上的功能,还有许多其他功能值得我们去探索和发掘。如果你对Apache PDFBox有任何疑问或想了解更多功能,欢迎在评论区向我提问,或者直接访问官方网站:https://pdfbox.apache.org/。