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.rhkb.cn/news/327246.html

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

相关文章

JSR303数据校验 —— @Valid嵌套校验、集合校验

1. 依赖版本 &#xff08;1&#xff09;SpringBoot 3.1.11 &#xff08;2&#xff09;JDK17 2. Valid、Validated 简介 说明&#xff1a;在Spring框架中Valid默认不会对集合&#xff08;List、Set等&#xff09;内部的元素进行校验&#xff0c;需要将Spring提供的Validated注…

JVM调优工具命令详解(JVM调优看这一篇就够了)

Jmap 此命令可以用来查看内存信息,实例个数以及占用内存大小 1 jmap ‐histo 14660 #查看历史生成的实例 2 jmap ‐histo:live 14660 #查看当前存活的实例,执行过程中可能会触发一次full gc 打开log.txt,文件内容如下: num:序号 instances:实例数量 bytes:占用空间大小 class…

学校为何更热衷于使用SOLIDWORKS教育版教学

在当今的教育环境中&#xff0c;SOLIDWORKS教育版因其独特的优势&#xff0c;越来越受到学校的青睐。为什么学校更热衷于使用SolidWorks教育版进行教学呢&#xff1f;本文将从以下几个方面进行阐述。 首先&#xff0c;SOLIDWORKS教育版为学生们提供了一个与实际工程应用紧密结…

如何在Goland中配置一键运行项目

打开goland,点击配置,如下图 点开如下, 选择go构建 上图中有以下几点需要注意&#xff1a; 1.名称&#xff1a;为本条配置信息的名称&#xff0c;可以自定义&#xff0c;也可以使用系统默认的值&#xff1b; 2.运行种类(Run kind)&#xff1a;main包的文件名称可能为其他 设置…

5.13网络编程

只要在一个电脑中的两个进程之间可以通过网络进行通信那么拥有公网ip的两个计算机的通信是一样的。但是一个局域网中的两台电脑上的虚拟机是不能进行通信的&#xff0c;因为这两个虚拟机在电脑中又有各自的局域网所以通信很难实现。 socket套接字是一种用于网络间进行通信的方…

css: 动态设置网格线

参考这个博客做了网格线&#xff1a; http://t.csdnimg.cn/y20vM 把网格颜色&#xff0c;宽高和透明度做成可配置项。 <e-collapse title"网格线" :expand"false"><t-form-item label"颜色"><el-color-picker v-model"fo…

重学计算机网络

一、应用层 1. http1.0 与 http2.0 的区别 有两点 1是持久化&#xff0c; 这个持久化并不是磁盘的持久化&#xff0c;而是tcp连接建立的持久化。 HTTP/1.0默认情况下使用短连接&#xff0c;即每个请求/响应都会关闭连接。这意味着每次请求都需要重新建立连接&#xff0c;增…

通义千问 1.5 -7B fine-tune验证

尝试对对中文数据进行finetune验证&#xff0c;测试模型的可优化方向。下面是代码的详细情况 代码实现 from datasets import load_dataset from transformers import (AutoModelForCausalLM,AutoTokenizer,BitsAndBytesConfig,HfArgumentParser,AutoTokenizer,TrainingArgum…

音源分离 | Hybrid Spectrogram and Waveform Source Separation

一、摘要 本文提出了基于Demucs架构的的时域频域的分离模型。提出的模型在2021年索尼组织的音乐分离挑战中获胜。该架构还包括其他改进&#xff0c;如压缩残差分支、局部注意力或奇异值正则化。 在MusDB HQ数据集上&#xff0c;所有源的信噪比&#xff08;SDR&#xff09;平均提…

Flutter 玩转动画 + 自定义View 实现积分或金币领取流程动画

一、效果图 二、主要涉及的知识点 AnimationController、Animation、FractionalTranslation 动画Api的运用CustomPainter 自定义View以及每个时机的把握 主要是写篇博客来记录一下这个功能的实现&#xff0c;具体代码就看源代码了&#xff0c;有疑问可以私信沟通 源代码下载…

免费泛域名/通配符SSL证书获取高质量教程

随着网络安全意识的提升&#xff0c;HTTPS加密已经成为网站标配&#xff0c;确保数据传输的安全性。对于拥有多个子域名的网站&#xff0c;使用泛域名或通配符SSL证书无疑是最高效、经济的解决方案。本文将详细介绍如何免费获取并部署高质量的泛域名/通配符SSL证书&#xff0c;…

Allegro如何输出各层PCB视图的PDF文件

如何输出各层PCB视图的PDF文件 1、说明 用Allegro设计好PCB后&#xff0c;有时需要出各层的PDF文档出来进行汇报和展示&#xff0c;这时就需要将各层的平面视图全部以PDF的形式加载出来&#xff0c;具体方法如下。 2、PDF文件的输出方法&#xff08;以四层板为例&#xff09; …

木里风景文化|基于SSM+vue的木里风景文化管理平台的设计与实现(源码+数据库+文档)

木里风景文化管理平台 目录 基于SSM&#xff0b;vue的木里风景文化管理平台的设计与实现 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 管理员功能模块 3 用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源…

OpenAI最新模型GPT4o十个牛逼的应用场景!

OpenAI真是要压着谷歌打么&#xff1f;哈哈&#xff01; 直接赶在谷歌之前开了一个新品发布会。 今天凌晨直播&#xff0c;早上一起来就发现已经可以体验新模型了。 从录播内容来看&#xff0c;并没有传言的GPT5&#xff0c;也没有所谓的搜索功能。 但是&#xff0c;这次更新…

数字化社会的引擎:揭示Facebook的影响力

在当今数字化社会中&#xff0c;社交媒体平台扮演着至关重要的角色&#xff0c;而Facebook作为其中的巨头之一&#xff0c;其影响力不可忽视。本文将深入探讨Facebook的影响力&#xff0c;从多个角度揭示其在数字化社会中的引擎作用。 1. 社交互动的核心平台 Facebook作为社交…

利用爬虫解决数据采集难题

文章目录 安装为什么选择 BeautifulSoup 和 requests&#xff1f;安装 BeautifulSoup 和 requests解决安装问题 示例总结 在现代信息时代&#xff0c;数据是企业决策和发展的关键。然而&#xff0c;许多有用的数据分散在网络上&#xff0c;且以各种格式和结构存在&#xff0c;因…

HCIP的学习(16)

BGP的状态机 ​ OSPF的状态机是在描述整个协议的完整工作过程&#xff0c;而BGP的状态机仅描述的是对等体关系建立过程中的状态变化。-----因为BGP将邻居建立过程以及BGP路由收发过程完全隔离。 ​ IGP协议在启动后&#xff0c;需要通过network命令激活接口&#xff0c;从而使…

JavaEE技术之MySql主从复制及mycat[了解,不讲]

文章目录 1. 主从复制1.1. 主从同步的原理1.2. 检查数据库远程访问权限1.3. 主从配置1.3.1. master配置1.3.2. slave配置1.3.3. 主库创建同步用户1.3.4. 从库配置主从关系1.3.5. 重置主从关系 1.4. 测试主从复制 2. Mycat2.1. Mycat简介2.2. MyCat读写分离原理2.3. 不废话&…

【快捷部署】022_ZooKeeper(3.5.8)

&#x1f4e3;【快捷部署系列】022期信息 编号选型版本操作系统部署形式部署模式复检时间022ZooKeeper3.5.8Ubuntu 20.04tar包单机2024-05-07 一、快捷部署 #!/bin/bash ################################################################################# # 作者&#xff…

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环入门

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环入门 1、 for i in range(3):Dev.step(3)for j in range(3):Dev.turnLeft()Dev.step(-2)Dev.turnLeft()2、 for i in range(3):Dev.turnLeft()Dev.step(4)Dev.turnRight()Dev.step(2)for i in range(4):Dev.step(2)D…