1.简介

在这篇快速文章中,我们将重点介绍基于流行的iText和PdfBox库从头开始创建 PDF 文档。

2. Maven 依赖

<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.4</version>
</dependency>

可以在这里找到该库的最新版本:iTextPdfBox

如果需要加密我们的文件,则需要添加一个额外的依赖项。The Bounty Castle Provider。软件包包含加密算法的实现,并且两个库都需要:

<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.56</version>
</dependency>

可以在这里找到该库的最新版本:The Bounty Castle Provider

3.概述

iText 和 PdfBox 都是用于创建/操作 pdf 文件的 Java 库。尽管这些库的最终输出是相同的,但它们的操作方式略有不同。让我们看看它们。

4.在 IText 中创建 Pdf

4.1 在 Pdf 中插入文字

让我们看一下将带有“ Hello World”文本的新文件插入 pdf 文件的方式

Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("iTextHelloWorld.pdf")); document.open();
Font font = FontFactory.getFont(FontFactory.COURIER, 16, BaseColor.BLACK);
Chunk chunk = new Chunk("Hello World", font); document.add(chunk);
document.close();

使用 iText 库创建 pdf 的基础是操纵在 Document 中实现 Elements 接口的对象(在 5.5.10 版中,其中 45 种实现)。

可以添加到文档中并使用的最小元素称为 Chunk,基本上是一个带有应用字体的字符串。

此外,Chunk 可以与其他元素(如 Paragraphs,Section 等)结合使用,从而形成美观的文档。

4.2 插入图片

iText 库提供了一种将图像添加到文档的简便方法。我们只需要创建一个 Image 实例并将其添加到 Document 中。

Path path = Paths.get(ClassLoader.getSystemResource("Java_logo.png").toURI());

Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("iTextImageExample.pdf"));
document.open();
Image img = Image.getInstance(path.toAbsolutePath().toString());
document.add(img); document.close();

4.3 插入表

当我们想在 pdf 文件中添加表格时,可能会遇到问题。幸运的是,iText 提供了开箱即用的此类功能。

首先,我们需要创建一个 PdfTable 对象,并在构造函数中为我们的表提供许多列。现在我们可以简单地通过调用添加新单元格

现在,我们可以通过在新创建的表对象上调用 addCell 方法来简单地添加新单元格。只要定义了所有必需的单元格,iText 就会创建表行,这意味着一旦创建了一个包含 3 列的表并向其中添加 8 个单元格,则仅显示 2 行,每个行中包含 3 个单元格。

让我们看一个例子:

Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("iTextTable.pdf")); document.open(); PdfPTable table = new PdfPTable(3);
addTableHeader(table);
addRows(table);
addCustomRows(table); document.add(table);
document.close();

我们创建一个具有 3 列 3 行的新表。我们将第一行视为表格标题,其背景颜色和边框宽度已更改:

private void addTableHeader(PdfPTable table) {
Stream.of("column header 1", "column header 2", "column header 3")
.forEach(columnTitle -> {
PdfPCell header = new PdfPCell();
header.setBackgroundColor(BaseColor.LIGHT_GRAY);
header.setBorderWidth(2);
header.setPhrase(new Phrase(columnTitle));
table.addCell(header);
});
}

第二行将由三个单元格组成,仅带有文本,没有额外的格式。

private void addRows(PdfPTable table) {
table.addCell("row 1, col 1");
table.addCell("row 1, col 2");
table.addCell("row 1, col 3");
}

我们不仅可以在单元格中包括文本,还可以包括图像。此外,每个单元格可能会分别设置格式,在下面提供的示例中,我们应用了水平和垂直对齐方式调整:

private void addCustomRows(PdfPTable table)
throws URISyntaxException, BadElementException, IOException {
Path path = Paths.get(ClassLoader.getSystemResource("Java_logo.png").toURI());
Image img = Image.getInstance(path.toAbsolutePath().toString());
img.scalePercent(10); PdfPCell imageCell = new PdfPCell(img);
table.addCell(imageCell); PdfPCell horizontalAlignCell = new PdfPCell(new Phrase("row 2, col 2"));
horizontalAlignCell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(horizontalAlignCell); PdfPCell verticalAlignCell = new PdfPCell(new Phrase("row 2, col 3"));
verticalAlignCell.setVerticalAlignment(Element.ALIGN_BOTTOM);
table.addCell(verticalAlignCell);
}

4.4 文件加密

为了使用 iText 库应用权限,我们需要已经创建了 pdf 文档。在我们的示例中,我们将使用之前生成的 iTextHelloWorld.pdf 文件。

使用 PdfReader 加载文件后,我们需要创建一个 PdfStamper,用于将其他内容应用于元数据,加密等文件:

PdfReader pdfReader = new PdfReader("HelloWorld.pdf");
PdfStamper pdfStamper
= new PdfStamper(pdfReader, new FileOutputStream("encryptedPdf.pdf")); pdfStamper.setEncryption(
"userpass".getBytes(),
".getBytes(),
0,
PdfWriter.ENCRYPTION_AES_256
); pdfStamper.close();

在我们的示例中,我们使用两个密码对文件进行了加密。用户密码(“ userpass”)(其中用户仅具有只读权限而无法打印),以及所有者密码(“ ownerpass”)用作主密钥,允许用户完全访问 pdf。

如果我们希望允许用户打印 pdf,而不是 0(setEncryption 的第三个参数),我们可以传递:

PdfWriter.ALLOW_PRINTING

当然,我们可以混合使用不同的权限,例如:

PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY

请记住,使用 iText 设置访问权限,我们还将创建一个临时 pdf,应将其删除;否则,任何人都可以完全访问它。

5.在 PdfBox 中创建 Pdf

5.1 在 Pdf 中插入文字

与 iText 相反,PdfBox 库提供了基于流操作的 API。没有类似 Chunk / Paragraph 等的类。PDDocument 类是内存中的 Pdf 表示形式,用户可以通过操纵 PDPageContentStream 类来写入数据。

让我们看一下代码示例:

PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page); PDPageContentStream contentStream = new PDPageContentStream(document, page); contentStream.setFont(PDType1Font.COURIER, 12);
contentStream.beginText();
contentStream.showText("Hello World");
contentStream.endText();
contentStream.close(); document.save("pdfBoxHelloWorld.pdf");
document.close();

5.2 插入图片

插入图像非常简单。

首先,我们需要加载一个文件并创建一个 PDImageXObject,然后将其绘制在文档上(需要提供确切的 x,y 坐标)。

就这样:

PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page); Path path = Paths.get(ClassLoader.getSystemResource("Java_logo.png").toURI());
PDPageContentStream contentStream = new PDPageContentStream(document, page);
PDImageXObject image
= PDImageXObject.createFromFile(path.toAbsolutePath().toString(), document);
contentStream.drawImage(image, 0, 0);
contentStream.close(); document.save("pdfBoxImage.pdf");
document.close();

5.3 插入表格

不幸的是,PdfBox 不提供任何允许创建表的现成方法。在这种情况下,我们可以手动绘制–从字面上看,画出每条线,直到我们的绘图类似于我们梦想中的桌子为止。

5.4 文件加密

PdfBox 库为用户提供了加密和调整文件权限的可能性。与 iText 相比,它不需要使用已经存在的文件,因为我们只使用 PDDocument。Pdf 文件权限由 AccessPermission 类处理,我们可以在其中设置用户是否可以修改,提取内容或打印文件。

随后,我们创建一个 StandardProtectionPolicy 对象,该对象将基于密码的保护添加到文档中。我们可以指定两种类型的密码。用户密码,之后用户将可以使用已应用的访问权限和所有者密码打开文件(对该文件无限制):

PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page); AccessPermission accessPermission = new AccessPermission();
accessPermission.setCanPrint(false);
accessPermission.setCanModify(false); StandardProtectionPolicy standardProtectionPolicy
= new StandardProtectionPolicy("ownerpass", "userpass", accessPermission);
document.protect(standardProtectionPolicy);
document.save("pdfBoxEncryption.pdf");
document.close();

我们的示例提出了一种情况,如果用户提供用户密码,则无法修改和打印文件。

6.结论

在本教程中,我们讨论了在两个流行的 Java 库中创建 pdf 文件的方法。

01.在Java中如何创建PDF文件的更多相关文章

  1. 利用aspose-words 实现 java中word转pdf文件

    利用aspose-words  实现 java中word转pdf文件 首先下载aspose-words-15.8.0-jdk16.jar包 引入jar包,编写Java代码 package test; ...

  2. 怎么用OCR图文识别软件在MS Office中创建PDF文件

    ABBYY PDF Transformer+是一款可创建.编辑及将PDF文件转换为其他可编辑格式的OCR图文识别软件,不仅可以从纸质文档.图像文件和任何其他流行格式创建PDF文件(相关文章请参考如何从 ...

  3. Java 创建PDF文件包的2种方法

    1. 概述 PDF文件包可方便在仅打开一个窗口的情况下阅读多个文档,通过将多个PDF文档或其他非PDF文档封装在一起,打开文件包后可以随意切换查看文件包中的文档,在需要编辑更改的情况,也可以打开文本包 ...

  4. java 用PDFBox 删除 PDF文件中的某一页

    依赖: <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox-app ...

  5. java中如何创建带路径的文件

    请教各位大侠了,java中如何创建带路径的文件,说明下 这个路径不存在 ------回答--------- ------其他回答(2分)--------- Java code File f = new ...

  6. 使用iText库创建PDF文件

    前言 译文连接:http://howtodoinjava.com/apache-commons/create-pdf-files-in-java-itext-tutorial/ 对于excel文件的读 ...

  7. java操作office和pdf文件java读取word,excel和pdf文档内容

    在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...

  8. 网页中动态嵌入PDF文件/在线预览PDF内容https://www.cnblogs.com/xgyy/p/6119459.html

    #网页中动态嵌入PDF文件/在线预览PDF内容# 摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如 ...

  9. java操作Excel、PDF文件

    java操作Excel.PDF文件 分享者:Vashon 分享来源:CSDN博客 下面这些是在开发中用到的一些东西,有的代码贴的不是完整的,只是贴出了关于操作EXCEL的代码: jxl是一个*国人写的 ...

随机推荐

  1. python语言(五)匿名函数、读写excel、操作数据库、加密、redis操作

    一.匿名函数 递归:就是调用自己 def func(): num = int(input('num:')) if num % 2 ==0: print('是偶数') return else: func ...

  2. 论文画图工具使用(2)vision软件

    1 软件安装和破解 https://www.cnblogs.com/shitou6/p/8986396.html 自己的网盘 链接:https://pan.baidu.com/s/1EWU0xLMTI ...

  3. C# VS常用操作

    VS点击项目,就会打开文件,其实我只是想选中而已, 在这个地方可以改. 原文:https://blog.csdn.net/yellowegg/article/details/12217309

  4. ESA2GJK1DH1K微信小程序篇: 测试微信小程序扫描Air202上面的二维码绑定设备,并通过MQTT控制设备

    前言 一,微信小程序篇小程序下载(该功能为小程序篇基础功能源码) 实现功能概要 微信小程序通过扫描GPRS上的二维码,绑定GPRS设备.然后使用小程序通过GPRS远程控制开发板上的继电器, 远程显示单 ...

  5. linux高性能服务器编程 (九) --I/O复用

    第九章 I/O复用 I/O复用就是一个线程可以同时监听多个文件描述符,提高程序性能.虽然I/O复用可以同时监听多个文件描述符,但是它本身是阻塞的,如果多个文件描述符准备就绪,如果不采取措施它仍然是串行 ...

  6. 【BigData】Java基础_数组

    什么是数组?数据是可以装一组数据的变量 1.定义数组 float[] arr1 = new float[10]; // 可以装10个float数据 int[] arr2 = new int[10]; ...

  7. 分析WordPress数据表之用户表(功能篇)

    数据表分析 wp_users wp_usermeta 用户系统就是靠着这两张表来实现的. 具体事例分析 添加用户 添加成功后,我们会分别在wp_users及wp_usermeta表中分别看到test0 ...

  8. 声源定位之2精读《sound localization based on phase difference enhancement using deep neuarl networks》

    2.1.1 题目与摘要 1.为什么要增强IPD? The phase differences between the discrete Fourier transform (DFT) coeffici ...

  9. [SQL]用于提取组内最新数据,左连接,内连接,not exist三种方案中,到底谁最快?

    本作代码下载:https://files.cnblogs.com/files/xiandedanteng/LeftInnerNotExist20191222.rar 人们总是喜欢给出或是得到一个简单明 ...

  10. 防止同一IP多次请求攻击

    防止同一IP多次请求攻击 防止入侵者,通过死循环同一时间批量向服务器请求数据,导致服务器内存开销不断膨胀,最后直接瘫痪. 一. 新增一个spring的拦截器 , 拦截所有请求 <mvc:inte ...