【Java】使用iText依赖生成PDF文件

文章目录

  • 使用iText实现PDF文件生成
    • 1. 需求
    • 2 . 添加依赖
    • 3. 核心
    • 4. 实战案例:生成录用通知书
      • 4.1 整体架构
      • 4.2 初始化PDF文档
      • 4.3 配置中文字体
      • 4.4 添加背景图片
      • 4.5 添加文本内容
      • 4.6 处理文档生成
    • 5. 关键技巧与注意事项
      • 5.1 字体处理
      • 5.2 图片处理
      • 5.3 布局控制
      • 5.4 异常处理
    • 6. 前后端交互
      • 6.1 后端接口
      • 6.2 前端处理
    • 7. 效果
    • 8. 总结

使用iText实现PDF文件生成

1. 需求

在实际开发中,我们经常需要生成PDF文档,比如报告、通知书、证书等。本文将介绍如何使用iText库在Java中生成PDF文件,并结合实际案例讲解具体实现步骤。

功能:用户能够实现对录用通知的信息录入、打印功能。
业务:用户可以对作者名字、论文题目、期刊名称、录用时间等信息录入,并且可以生成PDF版的录用通知书。
录用通知书的模板见附件。

2 . 添加依赖

首先在项目中添加iText依赖:

   <!-- iText 7 核心包  实现转pdf的依赖--><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.5</version><type>pom</type></dependency><!-- 如果需要支持中文,添加以下依赖 --><dependency><groupId>com.itextpdf</groupId><artifactId>font-asian</artifactId><version>7.2.5</version></dependency>

3. 核心

使用iText生成PDF时,主要涉及以下几个核心类:

  • PdfWriter:负责写入PDF文件
  • PdfDocument:代表PDF文档
  • Document:用于添加内容的高级文档对象
  • PdfFont:字体对象,特别重要,用于处理中文等字符
  • Paragraph:段落对象,用于添加文本内容
  • Image:图片对象,用于添加图片

4. 实战案例:生成录用通知书

4.1 整体架构

@Service
public class LetterServiceImpl implements LetterService {@Overridepublic byte[] generatePdf(LetterParam param) {try {// PDF生成逻辑} catch (Exception e) {throw new RuntimeException("生成PDF失败", e);}}
}

4.2 初始化PDF文档

ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = new PdfWriter(baos);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);

4.3 配置中文字体

处理中文是PDF生成中的一个重要环节,需要正确配置字体:

String fontPath = Paths.get("src/main/resources/static/fonts/simsun.ttf").toAbsolutePath().toString();
PdfFont font = PdfFontFactory.createFont(fontPath, PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);
document.setFont(font);

4.4 添加背景图片

String backgroundPath = Paths.get("src/main/resources/static/background.png").toAbsolutePath().toString();
Image background = new Image(ImageDataFactory.create(backgroundPath));// 设置背景图片属性
background.setFixedPosition(0, 0);
background.setWidth(document.getPdfDocument().getDefaultPageSize().getWidth());
background.setHeight(document.getPdfDocument().getDefaultPageSize().getHeight());document.add(background);

4.5 添加文本内容

// 添加作者名字
document.add(new Paragraph(param.getAuthorName()).setFontSize(24).setMarginLeft(200).setFont(font));// 添加期刊名称
document.add(new Paragraph(param.getJournalName()).setFontSize(24).setTextAlignment(TextAlignment.CENTER).setFontColor(new DeviceRgb(0, 0, 255))  // 蓝色.setMarginTop(20).setFont(font));

4.6 处理文档生成

document.close();
return baos.toByteArray();

5. 关键技巧与注意事项

5.1 字体处理

  • 确保字体文件存在且路径正确
  • 使用PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED嵌入字体
  • 设置适当的字体大小和样式

5.2 图片处理

  • 背景图片设置为固定位置
  • 根据页面大小自适应图片尺寸
  • 注意图片格式支持(推荐PNG、JPG)

5.3 布局控制

  • 使用setMarginLeft()等方法控制元素位置
  • 通过setTextAlignment()设置文本对齐方式
  • 使用new Paragraph("\n")添加空行调整间距

5.4 异常处理

  • 包装iText可能抛出的异常
  • 提供清晰的错误信息
  • 确保资源正确关闭

在这里插入图片描述

6. 前后端交互

6.1 后端接口

@PostMapping("/upload")
public ResponseEntity<byte[]> generateLetter(@RequestBody LetterParam letter) {byte[] pdf = letterService.generatePdf(letter);HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_PDF);headers.setContentDispositionFormData("filename","acceptance_letter_" + letter.getAuthorName() + ".pdf");// 返回return new ResponseEntity<>(pdf, headers, HttpStatus.OK);
}

6.2 前端处理

const response = await letter(formData);
const blob = new Blob([response.data], { type: 'application/pdf' });
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = `录用通知书_${formData.authorName}.pdf`;
document.body.appendChild(link);
link.click();

7. 效果

在这里插入图片描述

8. 总结

使用iText生成PDF文件的关键步骤:

  1. 正确配置环境和依赖
  2. 处理中文字体
  3. 设置背景和布局
  4. 添加文本内容
  5. 处理文件下载

通过这些步骤,我们可以生成专业的PDF文档。在实际应用中,还可以根据需求添加更多功能,如水印、加密、电子签名等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/456094.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索人工智能在自然语言处理中的应用

探索人工智能在自然语言处理中的应用 前言1. 机器翻译2. 情感分析3. 智能客服4. 文本生成未来展望 结语 前言 在信息爆炸的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;作为人工智能&#xff08;AI&#xff09;的一个重要分支&#xff0c;正以前所未有的速度改变着…

LabVIEW提高开发效率技巧----节省内存

在LabVIEW开发过程中&#xff0c;内存管理是保障程序稳定性和性能的关键。本文将详细介绍如何通过队列处理来节省内存&#xff0c;尤其是如何通过解耦释放不再需要的数据&#xff0c;防止内存泄漏。通过多个实际例子&#xff0c;从不同角度探讨队列处理在大数据量或长时间运行的…

苹果瑕疵数据集苹果质量数据集YOLO格式VOC格式 深度学习 目标检测 数据集

一、数据集概述 数据集名称&#xff1a;2类苹果图像数据集 数据集包含两类样本&#xff1a;正常苹果和有瑕疵的苹果。正常苹果样本代表完好的苹果&#xff0c;而有瑕疵的苹果样本代表苹果表面可能存在的损伤、瑕疵或病害。每个样本都经过详细标记和描述&#xff0c;以便训练模…

大语言模型数据类型与环境配置

文章目录 前言一、环境安装二、大语言模型数据类型1、基本文本指令数据类型2、数学指令数据类型3、几何图形指令数据类型4、多模态指令数据类型5、翻译指令数据类型 三、vscode配置 前言 简单给出环境安装与数据类型及vscode运行配置&#xff0c;其中vscode运行配置是便于我们…

专业135+总分400+西安交通大学815869(原909)信号与系统考研经验电子信息与通信工程,真题,大纲,参考书

经过将近一年的考研复习&#xff0c;终于梦圆西安交大&#xff0c;今年专业课815(和专硕869&#xff08;原909&#xff09;差不多)信号与系统135&#xff0c;总分400&#xff0c;回想这一年的复习还有很多经验和大家分享&#xff0c;希望可以对大家复习有所帮助&#xff0c;少走…

3.cpp基本数据类型

cpp基本数据类型 1.cpp基本数据类型 1.cpp基本数据类型 C基本数据类型和C语言的基本数据类型差不多 注意bool类型&#xff1a;存储真值 true 或假值 false&#xff0c;C语言编译器C99以上支持。 C语言的bool类型&#xff1a;要添加 #include <stdbool.h>头文件 #includ…

数据库相关知识点

1. 数据库分片与分区 分片&#xff08;Sharding&#xff09;&#xff1a;这是一种将数据水平分割的技术&#xff0c;每个分片包含数据的一个子集。分片通常用于提高数据库的扩展性和性能&#xff0c;特别是在处理大量数据时。通过将数据分布在多个分片上&#xff0c;可以并行处…

ruoyi域名跳转缓存冲突问题(解决办法修改:session名修改session的JSESSIONID名称)

【版权所有&#xff0c;文章允许转载&#xff0c;但须以链接方式注明源地址&#xff0c;否则追究法律责任】【创作不易&#xff0c;点个赞就是对我最大的支持】 前言 仅作为学习笔记&#xff0c;供大家参考 总结的不错的话&#xff0c;记得点赞收藏关注哦&#xff01; 目录 前…

Maven基础知识

一、Maven的概述 maven 是什么&#xff1f; 是一个项目管理工具&#xff0c;它包含了一个项目对象模型&#xff0c;一组标准集合&#xff0c;一个项目的生命周期&#xff0c;一个依赖管理系统&#xff0c;和用来运行定义在生命周期阶段和插件目标的逻辑。 二、Maven的依赖管理…

【331】基于Springboot的“有光”摄影分享网站系统

“有光”摄影分享网站设计与实现 摘 要 自互联网的发展至今&#xff0c;其基础理论与技术都已完善&#xff0c;并积极参与了整个社会各个领域。它容许信息根据媒体传播&#xff0c;并和信息可视化工具一起为大家提供优质的服务。对于信息多头管理、差错率高、信息安全系数差、…

Redis 命令集 (超级详细)

目录 Redis 常用命令集 string类型 hash类型 list类型 set类型 zset类型 bitmap 类型 geo 类型 GEOADD (添加地理位置的坐标) GEOPOS (获取地理位置的坐标) GEODIST (计算两个位置之间的距离) GEOHASH (返回一个或多个位置对象的 geohash 值) GEORADIUS (根据用户…

本地docker部署中间件和应用

Docker Desktop搭建 安装完成之后使用docker下载镜像&#xff0c;报以下错误&#xff1a; 解决办法&#xff1a; Docker Engine配置能访问的镜像地址&#xff1a; {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled…

Vue实现手风琴功能组件 vue 实现折叠面板功能

Vue实现手风琴功能组件 vue 实现折叠面板功能,前端不使用第三方组件实现手风琴折叠面板功能 效果图: dom<div class="foldSection"><divv-for="(item, index) in ListData":key="item.id"class="accordion"><div …

反编译工具jadx

一.官网 https://github.com/skylot/jadx 下载解压即可 二.使用 将想要反编译的apk文件拖入jadx中&#xff0c;等待反编译结束。 三.提醒 反编译出来的只能帮你理解逻辑&#xff0c;并且一般apk都会有加密。

SLAM|2. 差异与统一:坐标系变换与外参标定

本章主要内容 1.坐标系变换 2.相机外参标定 上一章我们了解了相机内参的概念&#xff0c;内参主要解决三维世界与二维图像之间的映射关系。有了内参我们可以一定程度上还原相机看到了什么&#xff08;但缺乏尺度&#xff09;。但相机看到的数据只是处于相机坐标系&#xff0c;为…

2021亚洲机器学习会议:面向单阶段跨域检测的域自适应YOLO(ACML2021)

原文标题&#xff1a;Domain Adaptive YOLO for One-Stage Cross-Domain Detection 中文标题&#xff1a;面向单阶段跨域检测的域自适应YOLO 1、Abstract 域转移是目标检测器在实际应用中推广的主要挑战。两级检测器的域自适应新兴技术有助于解决这个问题。然而&#xff0c;两级…

【Qt6聊天室项目】 主界面功能实现

1. 获取当前用户的个人信息 1.1 前后端逻辑分析&#xff08;主界面功能&#xff09; 主界面上所有的前后端交互逻辑相同&#xff0c;分析到加载会话列表后其余功能仅实现。 核心逻辑总结 异步请求-响应模型 客户端发起请求&#xff0c;向服务器发送包含会话ID的请求服务端处…

ASP.NET Core 8.0 中使用 Hangfire 调度 API

在这篇博文中&#xff0c;我们将引导您完成将 Hangfire 集成到 ASP.NET Core NET Core 项目中以安排 API 每天运行的步骤。Hangfire 是一个功能强大的库&#xff0c;可简化 .NET 应用程序中的后台作业处理&#xff0c;使其成为调度任务的绝佳选择。继续阅读以了解如何设置 Hang…

计算机毕业设计PySpark+大模型高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

基于Spark的高考报名信息推荐系统 系统用到的各项技术和工具的介绍&#xff1a; 1. Python Python是一种高级的、解释型的程序设计语言&#xff0c;因为其简洁而易学、可读性强等特点&#xff0c;在数据处理、人工智能、机器学习、Web开发等领域得到了广泛运用。在该系统中…

php AES 加解密(支持在线运行)

https://andi.cn/page/621792.html 这篇文章不仅给出了 php AES 加解密代码&#xff0c;而且可以在线运行来对数据进行加解密&#xff0c;满足实际中的一些需求。