【Java】Springboot集成itextpdf制作pdf(内附pdf添加表格、背景图、水印,条形码、二维码,页码等功能)
目录
- 前言
-
- 一、引入依赖
- 二、整体思路与步骤
- 三、代码实现(完整例子)
-
- 1、创建一个接口
- 2、创建自定义事件处理器
- 3、创建一个实现类
- 4、写一个控制器调用接口
- 5、启动springboot项目,浏览器调用接口
前言
iTextPDF 是一个用于创建和操作 PDF 文档的 Java 库。它功能强大,支持生成、修改、加密、签名 PDF 文件,二维码、条形码生成等操作,本文使用iTextPDF的8.0.5版本,总结了利用iTextPDF技术来实现pdf生成的各种操作,如果大家在项目中有pdf生成的需求可以按照此篇文章的例子来实现。
一、引入依赖
在pom文件中引入如下依赖
1、itextpdf核心包
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-core</artifactId>
<version>8.0.5</version>
<type>pom</type>
</dependency>
2、中文字体支持包
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>font-asian</artifactId>
<version>8.0.5</version>
</dependency>
3、二维码和条形码包
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>barcodes</artifactId>
<version>8.0.5</version>
</dependency>
4、加密相关包(如无pdf加密可以不引入)
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
<version>8.0.5</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>bouncy-castle-adapter</artifactId>
<version>8.0.5</version>
</dependency>
二、整体思路与步骤
一般情况下我们生成的pdf大概包含标题、正文、页眉、页脚、字体、背景、水印、表格、加密等这些元素,由于生成的pdf可能存在多页,所以像是页眉、页脚、背景、水印这些元素需要每一页都存在,特别是页脚中的页码数字还需要随着页数增加自动填充,iTextPDF 提供了一个IEventHandler(事件处理器)接口,我们通过实现这个接口就可以自定义实现上述效果,可以在每一页插入元素。
整体的pdf生成思路如下:
1、创建ByteArrayOutputStream输出流对象,用于存放数据
2、创建WriterProperties配置项对象,此配置可以设置pdf加密等内容
3、创建PdfDocument文档对象并且添加流对象和配置对象
4、创建自定义事件处理器并添加,用于处理页眉页脚等内容
5、创建字体PdfFont对象,用于pdf文档统一字体
6、创建PageSize页面尺寸对象,用于设置pdf尺寸,一般也就是A4
7、通过PdfDocument对象创建Document文档对象并且设置尺寸
8、通过Document文档对象设置字体、创建标题、段落、表格等等我们业务所需要的内容
9、上述步骤处理完毕后数据就已经存在于ByteArrayOutputStream输出流中,然后将流响应到浏览器下载
三、代码实现(完整例子)
根据上述步骤进行详细代码编写,本篇文章通过实现一个接口实现pdf生成并响应到浏览器下载的效果,这也是常见的开发需求,如果大家在项目中有遇到的可以直接看这个例子,只需要根据自己的业务删减修改即可。
1、创建一个接口
创建一个生成pdf接口PdfService,创建一个生成pdf的方法generatePdf传入一个响应对象用于后续调用时候响应到浏览器下载
import javax.servlet.http.HttpServletResponse;
/**
* @Author: 你住过的屋檐
* @aphorism You are lucky to have someone to help you.No one to help you, is just fate.No one should do anything for you, because life is your own, you are responsible for yourself
*/
public interface PdfService {
/**
* 生成pdf
* @param response
*/
void generatePdf(HttpServletResponse response);
}
2、创建自定义事件处理器
事件处理器中处理页眉、页脚、二维码、条形码、背景等内容,下面代码中每一处都有详细的说明,大家一看就可以明白
import com.itextpdf.barcodes.Barcode128;
import com.itextpdf.barcodes.BarcodeQRCode;
import com.itextpdf.barcodes.qrcode.EncodeHintType;
import com.itextpdf.barcodes.qrcode.ErrorCorrectionLevel;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.AffineTransform;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.extgstate.PdfExtGState;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Div;
import com.itextpdf.layout.element.Image;
import lombok.Data;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: 你住过的屋檐
* @aphorism You are lucky to have someone to help you.No one to help you, is just fate.No one should do anything for you, because life is your own, you are responsible for yourself
* 该类实现了给pdf添加背景图、水印,条形码、二维码,页码功能,大家有需要自行看代码,注释写的很详尽
*/
@Data
public class PdfHeaderFooter implements IEventHandler {
@Override
public void handleEvent(Event event) {
if (event instanceof PdfDocumentEvent) {
PdfDocumentEvent e = (PdfDocumentEvent) event;
//获取pdf文档对象
PdfDocument pdfDocument = e.getDocument();
//获取当前文档的