当前位置: 首页 > news >正文

【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();
            //获取当前文档的

相关文章:

  • 牛客春招刷题训练营 3月25日 Java 查找两个字符串a,b中的最长公共子串 构造C的歪
  • 基于docker-compose 部署可道云资源管理器
  • 系留无人机照明芯片迎来革新:80V耐压输入+FP7195千瓦级大功率调光IC方案落地
  • GitLab 中文版17.10正式发布,27项重点功能解读【三】
  • html方法收集
  • Java 集合操作详解与使用指南
  • UE4学习笔记 FPS游戏制作14 发射抛物线子弹
  • 多维动态规划 力扣hot100热门面试算法题 面试基础 核心思路 背题
  • 第四届能源、电力与电气国际学术会议(ICEPET 2025)
  • 后缀表达式 | 第十届蓝桥杯省赛C++B组
  • 如何使用Xshell连接Linux虚拟机
  • K8S学习之基础五十:k8s中pod时区问题并通过kibana查看日志
  • android Firebase Cloud Messaging (FCM) 接入
  • # 用 Paramiko,轻松掌控远程服务器
  • 0基础 | 制作麦克风音频放大电路
  • 使用redis设置店铺状态
  • 【ESP32-C2】基于 esptool 完成 Secure Boot V2 和 Flash 加密 Development 模式的完整指令序列
  • 遥控器钥匙学习---通过uds指令
  • How to share files with Linux mint 22 via samba in Windows
  • spring - 十二种事务失效场景
  • 王毅同丹麦外交大臣会谈,表示在格陵兰问题充分尊重丹麦主权和领土完整
  • 马上评|房屋“注胶堵漏”骗局何以屡屡得逞
  • 广西桂林、百色、河池等地表态:全力配合中央对蓝天立的审查调查
  • 打造信息消费新场景、新体验,上海信息消费节开幕
  • 技术派|威胁F-35、击落“死神”,胡塞武装防空战力如何?
  • 再现五千多年前“古国时代”:凌家滩遗址博物馆今开馆