itextpdf 7生成pdf(主要是文字和表格,支持中文)

我们经常会遇到要导出pdf的需求,方式有很多种 今天的教程是采用itextpdf的方式生成pdf
itextpdf是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF文档,而且可以将Html文件转化为PDF文件。

这里先展示一下效果图
测试pdf效果图

首先在pom.xml中引入相关依赖

<dependencys><!-- itext7 --><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.1</version><type>pom</type></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>pdftest</artifactId><version>7.1.16</version><scope>test</scope></dependency>
</dependencys>

PdfUtil 工具类

创建pdf、获取字体
如果需要添加水印,可以自行修改对应的图片路径(static/logo.png)
其中用到的字体文件在这里下载

package com.***.utils.pdf;import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.*;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.extgstate.PdfExtGState;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.properties.TextAlignment;
import com.itextpdf.layout.properties.UnitValue;
import com.itextpdf.layout.properties.VerticalAlignment;import java.io.FileNotFoundException;
import java.io.IOException;public class PdfUtil {static final String LOGO_TEXT = "";/*** 给pdf 添加水印** @param doc Document 对象* @throws Exception*/public static void generateWatermark(Document doc) throws Exception {
//        PdfDocument pdfDoc = new PdfDocument(new PdfReader(fis), new PdfWriter(fos));
//        Document doc = new Document(pdfDoc);
//        PdfFont font = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H");PdfDocument pdfDoc = doc.getPdfDocument();// 将字体包拖到路径下PdfFont pdfFont = getZhFont();Paragraph paragraph = new Paragraph(LOGO_TEXT).setFont(pdfFont).setFontSize(14);ImageData img = ImageDataFactory.create(PdfUtil.class.getClassLoader().getResource("static/logo.png"));float w = img.getWidth();float h = img.getHeight();PdfExtGState gs1 = new PdfExtGState().setFillOpacity(0.1f);for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) {PdfPage pdfPage = pdfDoc.getPage(i);Rectangle pageSize = pdfPage.getPageSizeWithRotation();pdfPage.setIgnorePageRotationForContent(true);PdfCanvas over = new PdfCanvas(pdfDoc.getPage(i));over.saveState();over.setExtGState(gs1);float x = pageSize.getX();float y = pageSize.getY();float pageWidth = pageSize.getWidth();float pageHeight = pageSize.getHeight();while (y < pageHeight) {if (y == 0) y = y + 10;while (x < pageWidth) {
//                    if(x==0) x = x+48;if (x == 0) x = x + 68;over.addImageWithTransformationMatrix(img, w / 2, 0, 0, h / 2, x, y, false);
//                    doc.showTextAligned(paragraph, x+32, y+38, i, TextAlignment.LEFT, VerticalAlignment.TOP, 0.3f);x = x + 180;}x = pageSize.getX();y = y + 120;}over.restoreState();}
//        doc.close();}/*** 获取中文字体** @return* @throws IOException*/public static PdfFont getZhFont() throws IOException {return PdfFontFactory.createFont(PdfUtil.class.getClassLoader().getResource("static/msyh.ttf").toString(),PdfEncodings.IDENTITY_H);}/*** 获得一个 PDF table cell** @param txt text* @param v   最大宽度百分比* @return*/public static Cell newPdfCell(String txt, float v) {return new Cell().add(new Paragraph(txt).setTextAlignment(TextAlignment.CENTER)).setVerticalAlignment(VerticalAlignment.MIDDLE).setMaxWidth(UnitValue.createPercentValue(v));}/*** 新建 pdfDoc** @param pdfPath  pdfPath* @param fileName 文件名* @return* @throws FileNotFoundException*/public static Document newPdfDoc(String pdfPath, String fileName) throws FileNotFoundException {String filePath = pdfPath + fileName;// pdf加密// PdfWriter writer = new PdfWriter(filePath, new WriterProperties().setStandardEncryption(null, "Hz123456".getBytes(), EncryptionConstants.ALLOW_SCREENREADERS,//         EncryptionConstants.ENCRYPTION_AES_128));PdfWriter writer = new PdfWriter(filePath);PdfDocument pdf = new PdfDocument(writer);pdf.setDefaultPageSize(PageSize.A4);return new Document(pdf);}}

TableBuilder 工具类

用于构建pdf中用到的表格

package com.***.pdf;import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.properties.TextAlignment;
import com.itextpdf.layout.properties.UnitValue;
import com.itextpdf.layout.properties.VerticalAlignment;
import lombok.Data;import java.util.List;@Data
public class TableBuilder {/*** pdf表格对象*/Table table;/*** 表格列数*/Integer column;/*** 每列宽度百分比*/Float columnWidthPercent;/*** 创建表格** @param column  列数* @param pdfFont 字体* @return*/public static TableBuilder builder(int column, PdfFont pdfFont) {TableBuilder tableBuilder = new TableBuilder();tableBuilder.setColumn(column);tableBuilder.setColumnWidthPercent(100f / column);float[] values = new float[column];for (int i = 0; i < column; i++) {values[i] = 3;}Table table = new Table(UnitValue.createPercentArray(values))// 这里是设置表格占整个pdf的宽度百分比,这里设置的是100%.setWidth(UnitValue.createPercentValue(100)).setTextAlignment(TextAlignment.CENTER).setVerticalAlignment(VerticalAlignment.MIDDLE)// 设置字体.setFont(pdfFont)// 设置字体大小.setFontSize(10);tableBuilder.setTable(table);return tableBuilder;}// 这里添加数据时,需要注意,每一行的数据个数必须与表格列数一致,单元格无数据时,添加空字符串/*** 添加一行数据* @param row 一行数据* @return*/public TableBuilder addRow(List<String> row) {for (String item : row) {this.table.addCell(PdfUtil.newPdfCell(item, this.columnWidthPercent));}return this;}/*** 添加多行数据* @param rowList 多行数据* @return*/public TableBuilder addRows(List<List<String>> rowList) {for (List<String> row : rowList) {this.addRow(row);}return this;}/*** 获取表格对象* @return*/public Table build() {return this.table;}}

使用以上工具类构建一个测试的pdf,测试pdf效果在文章开头查看

package com.***;import com.***.utils.pdf.PdfUtil;
import com.***.utils.pdf.TableBuilder;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Div;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.properties.HorizontalAlignment;
import com.itextpdf.layout.properties.TextAlignment;
import com.itextpdf.layout.properties.UnitValue;
import org.junit.jupiter.api.Test;import java.io.IOException;
import java.util.Arrays;
import java.util.List;public class PdfTest {@Testpublic void testPdf() throws IOException {Document document = PdfUtil.newPdfDoc("/Desktop/", "test.pdf");// 这里的字体对象一个pdf用一次,不能重复(多个pdf)使用,否则会报错PdfFont pdfFont = PdfUtil.getZhFont();Div head1Div = new Div().setWidth(UnitValue.createPercentValue(100)).setHeight(UnitValue.createPercentValue(100)).setHorizontalAlignment(HorizontalAlignment.CENTER);// 标题,22号字体,居中对齐,加粗Paragraph title = new Paragraph("测试pdf标题").setFont(pdfFont).setFontSize(22).setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER).setBold();head1Div.add(title);head1Div.add(new Paragraph("一、第一部分:测试表格").setFont(pdfFont).setFontSize(16).setBold());List<String> header = Arrays.asList("姓名", "年龄", "性别", "手机号", "邮箱", "地址", "职业", "备注");List<List<String>> data = Arrays.asList(Arrays.asList("张三", "25", "男", "13812345678", "zhangsan@qq.com", "北京市海淀区", "学生", "无"),Arrays.asList("王五", "28", "男", "13812345680", "wangwu@qq.com", "广东省深圳市", "律师", "无"));// 表格,8列,字体为pdfFontTable table = TableBuilder.builder(8, pdfFont).addRow(header).addRows(data).build();head1Div.add(table);document.add(head1Div);document.close();}}

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

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

相关文章

C语言实现猜数字小游戏

1.随机数生成 要想实现猜数字小游戏&#xff0c;依赖于随机数的生成 1.1 rand()函数 这个函数是用来生成随机数的&#xff0c;返回值是正整数&#xff0c;他的值的范围是0到rand_max之间的&#xff0c;rand_max的值在大多数编译器上面是32767&#xff0c;rand()函数的使用必…

【算法】动态规划之背包DP问题(2024.5.11)

前言&#xff1a; 本系列是学习了董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com) 动态规划系列 【算法】动态规划之线性DP问题-CSDN博客 01背包 步骤&#xff1a; 分析容量j与w[i]的关系&#xff0c;然后分析是否要放…

全新神经网络架构KAN——本文用于学习与探索

论文地址&#xff1a;https://arxiv.org/pdf/2404.19756 Github&#xff1a;GitHub - KindXiaoming/pykan: Kolmogorov Arnold Networks 文档说明&#xff1a;Welcome to Kolmogorov Arnold Network (KAN) documentation! — Kolmogorov Arnold Network documentation 本文仅…

SQLite性能测试(插入)

最近一直在思考一个问题&#xff0c;SQLite 做到这么轻量级&#xff0c;那它注定不会像 MySql 一样强性能&#xff0c;那么它的性能怎么样呢&#xff1f;并发量多高呢&#xff1f; 官方解释&#xff1a; About SQLite 最大数据库大小&#xff1a;281TB 最大行大小&#xff1…

【C语言题解】输入n(1~9),再输入n个长度不超过50的字符串,给这n个字符串排序并输出它们

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ &#x1f308;感谢大家的阅读、点赞、收藏和关注 解题思路&#xff1a; 首先&#xff1a;使用一个二维字符数组来存储输入的字符串。由于n的范围是1到9&#xff0c;我们可以直接定义一…

进程间通信:连接不同程序世界的桥梁

目录 一、进程间通信的重要性 二、常见的进程间通信方式 三、进程间通信的目的 四、进程间通信的本质 在计算机编程的领域中&#xff0c;进程间通信&#xff08;Inter-Process Communication&#xff0c;IPC&#xff09;是一个至关重要的概念。当我们在操作系统中运行多个程…

Golang | Leetcode Golang题解之第83题删除排序链表中的重复元素

题目&#xff1a; 题解&#xff1a; func deleteDuplicates(head *ListNode) *ListNode {if head nil {return nil}cur : headfor cur.Next ! nil {if cur.Val cur.Next.Val {cur.Next cur.Next.Next} else {cur cur.Next}}return head }

基于Python+Django+MySQL实现Web版的增删改查

Python Web框架Django连接和操作MySQL数据库学生信息管理系统(SMS),主要包含对学生信息增删改查功能&#xff0c;旨在快速入门Python Web。 开发环境 开发工具&#xff1a;Pycharm 2020.1开发语言&#xff1a;Python 3.8.0Web框架&#xff1a;Django 3.0.6数据库&#xff1a;…

【SpringBoot】Redis Lua脚本实战指南:简单高效的构建分布式多命令原子操作、分布式锁

文章目录 一.Lua脚本1.Lua特性2.Lua优势 二.Lua语法1.注释2.变量3.数据类型&#xff1a;3.1.基本类型3.2.对象类型&#xff1a;表&#xff08;table&#xff09; 4.控制结构&#xff1a;4.1.条件语句: 使用if、else和elseif来实现条件分支。4.2.循环结构&#xff1a;Lua支持for…

Vue中进行粘贴板粘贴数据(图片、文字等)

在页面中如果需要进行粘贴数据&#xff0c;那么就要读取系统粘贴板clipboard&#xff0c;通过此Api来进行粘贴板数据的操作。 目录: 一.封装相关函数1.示例代码&#xff1a;2.代码解释&#xff1a; 二.页面中进行粘贴1.代码示例&#xff1a;2.代码解释&#xff1a; 三.运行结果…

使用html和css实现个人简历表单的制作

根据下列要求&#xff0c;做出下图所示的个人简历&#xff08;表单&#xff09; 表单要求 Ⅰ、表格整体的边框为1像素&#xff0c;单元格间距为0&#xff0c;表格中前六列列宽均为100像素&#xff0c;第七列 为200像素&#xff0c;表格整体在页面上居中显示&#xff1b; Ⅱ、前…

Ansible----playbook模块之templates模块、tags模块、roles模块

目录 引言 一、templates模块 &#xff08;一&#xff09;关键信息 &#xff08;二&#xff09;实际操作 1.定义主机组 2.设置免密登录 3.分别建立访问目录 4.定义模板文件 5.创建playbook文件 6.执行剧本 7.验证结果 二、tags模块 &#xff08;一&#xff09;创建…