在许多应用中,我们需要从 PDF 文件中提取文本内容和嵌入的图像。为了实现这一目标,Apache PDFBox
是一个非常实用的开源工具库。它提供了丰富的 API,可以帮助我们轻松地读取 PDF 文件、提取其中的文本、图像以及其他资源。
本文将介绍如何使用 Apache PDFBox 来提取 PDF 文件中的文本和图像,并将图像保存为文件。通过实际代码示例,您将学会如何高效地处理 PDF 文件中的内容。
1. Apache PDFBox 简介
Apache PDFBox 是一个用于创建、操作和提取 PDF 内容的 Java 库。它提供了一些重要的功能,包括:
- 提取 PDF 文件中的文本内容。
- 提取 PDF 文件中的图像。
- 创建和修改 PDF 文档。
- 操作 PDF 表单、数字签名等。
PDFBox 是完全开源的,适用于 Java 开发者,用于处理 PDF 文档中的各种数据。
2. 目标
在本文中,我们的目标是使用 PDFBox 从 PDF 文件中提取:
- 文本内容:每一页的文本信息。
- 图像:嵌入到 PDF 中的图像并保存为文件。
3. 示例代码
以下是使用 Apache PDFBox 提取 PDF 中文本和图像的完整代码示例:
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.text.PDFTextStripper;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;public class PdfboxTest {// 提取PDF中的文本和图像private static void readTextAndImage(String filePath) {try (PDDocument document = PDDocument.load(new File(filePath))) {// 获取PDF文档的页数int numberOfPages = document.getNumberOfPages();// 遍历每一页提取文本和图像for (int i = 0; i < numberOfPages; i++) {PDPage page = document.getPage(i);// 提取页面文本PDFTextStripper textStripper = new PDFTextStripper();textStripper.setStartPage(i + 1);textStripper.setEndPage(i + 1);String pageText = textStripper.getText(document);System.out.println("Page " + (i + 1) + " Content: \n" + pageText + "\n");// 提取图像资源PDResources resources = page.getResources();for (COSName xObjectName : resources.getXObjectNames()) {if (resources.isImageXObject(xObjectName)) {PDImageXObject imageObject = (PDImageXObject) resources.getXObject(xObjectName);BufferedImage bImage = imageObject.getImage();// 将图像保存为 PNG 格式try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {ImageIO.write(bImage, "png", baos);byte[] imageBytes = baos.toByteArray();String imageFilePath = "image_" + System.currentTimeMillis() + ".png";try (FileOutputStream fos = new FileOutputStream(imageFilePath)) {fos.write(imageBytes);System.out.println("Page " + (i + 1) + " Image saved: " + imageFilePath);}}}}}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {// 输入PDF文件路径String filePath = "/path/to/your/pdf-file.pdf"; // 请替换为实际的 PDF 文件路径readTextAndImage(filePath);}
}
4. 代码分析
1. 加载 PDF 文件
我们通过 PDDocument.load()
方法加载 PDF 文件。该方法会返回一个 PDDocument
对象,表示整个 PDF 文档。
try (PDDocument document = PDDocument.load(new File(filePath))) {int numberOfPages = document.getNumberOfPages();
2. 提取文本内容
PDFTextStripper
类是用于从 PDF 中提取文本的工具。我们通过设置 startPage
和 endPage
来指定提取特定页面的文本。getText()
方法将返回当前页面的文本内容。
PDFTextStripper textStripper = new PDFTextStripper();
textStripper.setStartPage(i + 1);
textStripper.setEndPage(i + 1);
String pageText = textStripper.getText(document);
3. 提取图像
为了提取 PDF 页面中的图像,我们使用 PDPage.getResources()
获取该页面的资源对象。资源对象包含页面的所有资源,包括图像。然后我们通过 resources.getXObject()
方法获取图像对象,并使用 PDImageXObject.getImage()
获取 BufferedImage
,最后将图像保存为字节数组。
PDResources resources = page.getResources();
for (COSName xObjectName : resources.getXObjectNames()) {if (resources.isImageXObject(xObjectName)) {PDImageXObject imageObject = (PDImageXObject) resources.getXObject(xObjectName);BufferedImage bImage = imageObject.getImage();
然后,我们将图像保存为 PNG 格式的文件:
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {ImageIO.write(bImage, "png", baos);byte[] imageBytes = baos.toByteArray();String imageFilePath = "image_" + System.currentTimeMillis() + ".png";try (FileOutputStream fos = new FileOutputStream(imageFilePath)) {fos.write(imageBytes);System.out.println("Page " + (i + 1) + " Image saved: " + imageFilePath);}
}
5. 总结
通过 Apache PDFBox,我们可以轻松地从 PDF 文档中提取文本和图像。上面的示例代码展示了如何遍历 PDF 文件的每一页,提取其中的文本内容,并且提取页面中所有的图像资源并保存为文件。这种方法对于处理 PDF 报告、提取嵌入图像或处理表单数据非常有用。
希望本文的示例能够帮助你更好地使用 PDFBox 处理 PDF 文件。如果你有更多问题或需求,欢迎与我们讨论!