Java PDFBox 教程展示了如何使用 PDFBox 在 Java 中创建 PDF 文件。

PDFBox

Apache PDFBox 是一个开源 Java 库,可用于创建、渲染、打印、拆分、合并、更改、验证和提取 PDF 文件的文本和元数据。

另一个非常流行的用于处理 PDF 文件的 Java 库称为iText

PDFBox Maven 依赖

我们需要为我们的项目添加以下 Maven 依赖项。

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.8</version>
</dependency>   

Java PDFBox 写入文本

在以下示例中,我们创建一个 PDF 文档并在其中写入一些文本。

JavaPdfBoxWriteText.java
package com.zetcode;import java.io.IOException;
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 JavaPdfBoxWriteText {public static void main(String[] args) throws IOException {try (PDDocument doc = new PDDocument()) {PDPage myPage = new PDPage();doc.addPage(myPage);try (PDPageContentStream cont = new PDPageContentStream(doc, myPage)) {cont.beginText();cont.setFont(PDType1Font.TIMES_ROMAN, 12);cont.setLeading(14.5f);cont.newLineAtOffset(25, 700);String line1 = "World War II (often abbreviated to WWII or WW2), "+ "also known as the Second World War,";cont.showText(line1);cont.newLine();String line2 = "was a global war that lasted from 1939 to 1945, "+ "although related conflicts began earlier.";cont.showText(line2);cont.newLine();String line3 = "It involved the vast majority of the world's "+ "countries—including all of the great powers—";cont.showText(line3);cont.newLine();String line4 = "eventually forming two opposing military "+ "alliances: the Allies and the Axis.";cont.showText(line4);cont.newLine();cont.endText();}doc.save("src/main/resources/wwii.pdf");}}
}

该示例将四行写入 PDF 文档。

try (PDDocument doc = new PDDocument()) {

一个新PDDocument的被创建。默认情况下,文档为 A4 格式。

PDPage myPage = new PDPage();
doc.addPage(myPage);

将创建一个新页面并将其添加到文档中。

try (PDPageContentStream cont = new PDPageContentStream(doc, myPage)) {

要写入 PDF 页面,我们必须创建一个PDPageContentStream对象。

cont.beginText();...cont.endText();

文字写在beginTextendText方法之间。

cont.setFont(PDType1Font.TIMES_ROMAN, 12);
cont.setLeading(14.5f);

我们设置字体和文字前导。

cont.newLineAtOffset(25, 700);

我们用方法开始一个新的文本行newLineAtOffset。页面的原点位于左下角。

String line1 = "World War II (often abbreviated to WWII or WW2), "+ "also known as the Second World War,";
cont.showText(line1);

文字是用showText方法写的。

cont.newLine();

使用该newLine方法,我们移动到下一行文本的开头。

Java PDFBox 读取文本

下一个示例从 PDF 文件中读取文本。

JavaPdfBoxReadText.java
package com.zetcode;import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;public class JavaPdfBoxReadText {public static void main(String[] args) throws IOException {File myFile = new File("src/main/resources/wwii.pdf");try (PDDocument doc = PDDocument.load(myFile)) {PDFTextStripper stripper = new PDFTextStripper();String text = stripper.getText(doc);System.out.println("Text size: " + text.length() + " characters:");System.out.println(text);}}
}

该示例打印 PDF 文档的文本及其大小。

File myFile = new File("src/main/resources/wwii.pdf");try (PDDocument doc = PDDocument.load(myFile)) {

src/main/resources我们从目录中 加载一个 PDF 文档。

PDFTextStripper stripper = new PDFTextStripper();
String text = stripper.getText(doc);

PDFTextStripper用于从 PDF 文件中提取文本。

Java PDFBox 创建图像

下一个示例在 PDF 文档中创建图像。

JavaPdfBoxCreateImage.java
package com.zetcode;import java.io.IOException;
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;public class JavaPdfBoxCreateImage {public static void main(String[] args) throws IOException {try (PDDocument doc = new PDDocument()) {PDPage myPage = new PDPage();doc.addPage(myPage);String imgFileName = "src/main/resources/sid2.jpg";PDImageXObject pdImage = PDImageXObject.createFromFile(imgFileName, doc);int iw = pdImage.getWidth();int ih = pdImage.getHeight();float offset = 20f; try (PDPageContentStream cont = new PDPageContentStream(doc, myPage)) {cont.drawImage(pdImage, offset, offset, iw, ih);}doc.save("src/main/resources/mydoc.pdf");}}
}

该示例从目录加载图像,创建新的 PDF 文档,并将图像添加到页面中。

String imgFileName = "src/main/resources/sid2.jpg";
PDImageXObject pdImage = PDImageXObject.createFromFile(imgFileName, doc);

PDImageXObject用于处理 PDFBox 中的图像。

int iw = pdImage.getWidth();
int ih = pdImage.getHeight();

我们得到图像的宽度和高度。

try (PDPageContentStream cont = new PDPageContentStream(doc, myPage)) {cont.drawImage(pdImage, offset, offset, iw, ih);
}

PDPageContentStream's drawImage将图像绘制到页面中。

Java PDFBox 文档信息

PDF 文档可以包含描述文档本身或文档中某些对象的信息,例如文档的作者或其创建日期。可以使用该PDDocumentInformation对象设置和检索基本信息。

JavaPdfBoxDocumentInformation.java
package com.zetcode;import java.io.IOException;
import java.util.Calendar;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentInformation;
import org.apache.pdfbox.pdmodel.PDPage;public class JavaPdfBoxDocumentInformation {public static void main(String[] args) throws IOException {try (PDDocument doc = new PDDocument()) {PDPage myPage = new PDPage();doc.addPage(myPage);PDDocumentInformation pdi = doc.getDocumentInformation();pdi.setAuthor("Jan Bodnar");pdi.setTitle("World war II");pdi.setCreator("Java code");Calendar date = Calendar.getInstance();pdi.setCreationDate(date);pdi.setModificationDate(date);pdi.setKeywords("World war II, conflict, Allies, Axis powers");doc.save("src/main/resources/mydoc.pdf");}}
}

该示例创建了一些文档信息元数据。可以在 PDF 查看器的 PDF 文档属性中查看该信息。

PDDocumentInformation pdi = doc.getDocumentInformation();

我们得到PDDocumentInformation对象。

pdi.setAuthor("Jan Bodnar");
pdi.setTitle("World war II");
pdi.setCreator("Java code");

我们设置了一些元数据信息。

Java PDFBox 写入元数据

可扩展元数据平台 (XMP)是一种 ISO 标准,用于为数字文档和数据集创建、处理和交换标准化和自定义元数据。PDF 文件使用 XMP 来存储其他元数据信息。

元数据.xml
<?xml version="1.0" encoding="UTF-8"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/"><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"  xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"><rdf:Description rdf:about=""><dc:title>World war II</dc:title><dc:date>2018-01-25</dc:date><dc:author>Jan Bodnar</dc:author></rdf:Description></rdf:RDF>
</x:xmpmeta>

这是一个 XML 文档,其中包含一些关于 PDF 文档的基本元数据。

JavaPdfBoxMetadataWrite.java
package com.zetcode;import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDMetadata;public class JavaPdfBoxMetadataWrite {public static void main(String[] args) throws IOException {try (PDDocument doc = new PDDocument()) {PDPage myPage = new PDPage();File myFile = new File("src/main/resources/metadata.xml");try (InputStream is = Files.newInputStream(myFile.toPath())) {PDMetadata meta = new PDMetadata(doc, is);PDDocumentCatalog catalog = doc.getDocumentCatalog();catalog.setMetadata(meta);doc.addPage(myPage);}doc.save("src/main/resources/mydoc.pdf");}}
}

该示例从 XML 文件中读取元数据并将其存储在生成的二进制文档中。

PDMetadata meta = new PDMetadata(doc, is);

PDMetadata用于处理元数据。

PDDocumentCatalog catalog = doc.getDocumentCatalog();
catalog.setMetadata(meta);

我们将元数据设置为文档的目录。

Java PDFBox 读取元数据

在下一个示例中,我们从 PDF 文档中读取元数据。

JavaPdfBoxMetadataRead.java
package com.zetcode;import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
import org.apache.pdfbox.pdmodel.common.PDMetadata;public class JavaPdfBoxMetadataRead {public static void main(String[] args) throws IOException {File myFile = new File("src/main/resources/sinatra.pdf");try (PDDocument doc = PDDocument.load(myFile)) {PDDocumentCatalog catalog = doc.getDocumentCatalog();PDMetadata metadata = catalog.getMetadata();if (metadata == null) {System.err.println("No metadata in document");System.exit(1);}try (InputStream is = metadata.createInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr)) {br.lines().forEach(System.out::println);}}}
}

该示例从 PDF 文档中读取元数据并将其打印到控制台。

PDDocumentCatalog catalog = doc.getDocumentCatalog();
PDMetadata metadata = catalog.getMetadata();

我们PDMetadataPDDocumentCatalog.

if (metadata == null) {System.err.println("No metadata in document");System.exit(1);
}

文件可能不包含元数据;因此,我们做一些简单的检查。

try (InputStream is = metadata.createInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr)) {br.lines().forEach(System.out::println);
}

createInputStream创建文档元数据的输入流 。我们从这个流中读取数据并将其打印到终端。

在本教程中,我们展示了如何使用 PDFBox 库在 Java 中处理 PDF 文件。

Java PDFBox相关推荐

  1. java pdfbox读取pdf中的表格

    java pdfbox读取pdf中的表格 目前遇到了需要解析pdf中表格的需求,遇到无法解析表格中的空格,求助大神帮助!!! <dependency><groupId>org. ...

  2. PDF转换成图片(Java pdfbox实现 附中文乱码解决方案)

    PDF转换成图片(Java pdfbox实现) pdf转成图片在java中主流的做法就是pdfbox和icepdf 然而我选择pdfbox 废话不多说上代码 引入依赖 <!--pdfbox--& ...

  3. java pdfbox 解析报错_pdfbox 读取文件报错 java.io.IOException: Page tree root must be a dictionary...

    pdfbox java.io.IOException: Page tree root must be a dictionary 示例代码 public static void main(String[ ...

  4. java pdfbox 提取pdf 标题_java – 使用pdfbox从PDF文件中提取文本

    我试图使用pdfbox从PDF文件中提取文本,但不是作为命令行工具,而是在我的 Java应用程序中.我正在使用jsoup下载pdf. res = Jsoup .connect(host+action) ...

  5. JAVA PDFbox 坐标选区提取文字

    pdfboxjar包默认是按照行来提取文字的,但是我们的pdf可能并是按照行来进行排序的,那么我们就可能用到坐标矩形选区操作,选取固定区域的文字,原理大家不必纠结,我们只需要拿来用即可,他只是一个工具 ...

  6. java pdfbox 转jpg_java实现PDF转图片的方法

    本文实例为大家分享了java实现PDF转图片的具体代码,供大家参考,具体内容如下 1.首先利用maven引入所需jar包 org.apache.pdfbox fontbox 2.0.1 org.apa ...

  7. java pdfbox maven_java pdfbox2.0.0 获取表格和字

    获取pdf中的表格线和字的坐标直接改路径就可以实现功能,官方给出的例子,通过自己的修改也可分开显示各种横线竖线.我自己的改动没有给出. 最后的两个函数是在某网站上找的,没仔细看,也是获取表格的. pa ...

  8. java pdfbox 合并PDF、PDF转图片、PDF插入图片

    1.添加依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox< ...

  9. JAVA PdfBox库提取PDF文件某一页转为图片

    Apache PDFBox 库是一个开源.用于操作 PDF 文档的 Java 工具库.PDFBox 允许创建新的 PDF 文档.操作现有文档,以及从文档中提取内容. 获取 Apache PDFBox ...

最新文章

  1. s平面上的圆对应的z平面上的图形
  2. [pyinstaller]PermissionError: [Errno 13] Permission denied:C:\Users\xxx\AppData\Local\ucrtbase.dll
  3. store内部数据调用 与 view使用store数据
  4. Spark-shell进行粘贴模式
  5. 计时器小程序——由浅入深实例讲解
  6. arduino蓝牙通讯代码_蓝牙4.0模块 无线数据传输模块 无线蓝牙串口 Arduino
  7. 【转】为了修复打码女神脸,他们提出二阶段生成对抗网络EdgeConnect
  8. 一文快速入门分库分表(必修课)
  9. [Unity] AnimationEvent 的 receiver 需要继承 Mono
  10. 帝国CMS7.0 7.2 7.5微信登录插件 UTF-8版本
  11. scal的函数定义(day01)
  12. HTML语言的一些元素(二)
  13. 苹果Mac应用软件加密及网站黑名单工具:​​​​Cisdem AppCrypt
  14. verycd重整——《TrainSignal视频教程》(TrainSignal)[ISO]
  15. OS X系统U盘安装的问题
  16. 计算机编程游戏本还是商务本,游戏本和商务本哪个比较适合编程?
  17. 如何在DOS系统中进入phpStudy的MySQL ?
  18. Java顺序结构综合练习三之金融投资收益计算
  19. zencart模板列表下载地址
  20. python 图表制作及功能化_Python实现从excel读取数据绘制成精美图像

热门文章

  1. 【小沐学前端】Ubuntu系统手动搭建Node.js环境
  2. -Wl,-rpath的使用(不完全)
  3. 如何有效降低采购成本?
  4. Windows经常蓝屏 启动速度慢 经常死机 +常用dos命令(win10、win11适用)
  5. 【LeetCode】427. Construct Quad Tree 建立四叉树
  6. 载20(S)-人参皂苷/细胞穿膜肽-单克隆抗体-载丝裂霉素白蛋白纳米微球的制备
  7. 十位顶级名人终身不婚的秘密
  8. CATIA CAA二次开发实现获取几何曲线所对应的具体类型
  9. iframe分栏拖拽伸缩例子
  10. 查看MySQL每个表占用的空间