Text是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。
项目要使用iText,必须引入jar包。才能使用,maven依赖如下:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
</dependency>
输出中文,还要引入下面itext-asian.jar包:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
设置pdf文件密码,还要引入下面bcprov-jdk15on.jar包:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.54</version>
</dependency>
iText常用类
- com.itextpdf.text.Document:这是iText库中最常用的类,它代表了一个pdf实例。如果你需要从零开始生成一个PDF文件,你需要使用这个Document类。首先创建(new)该实例,然后打开(open)它,并添加(add)内容,最后关闭(close)该实例,即可生成一个pdf文件。
- com.itextpdf.text.Paragraph:表示一个缩进的文本段落,在段落中,你可以设置对齐方式,缩进,段落前后间隔等
- com.itextpdf.text.Chapter:表示PDF的一个章节,他通过一个Paragraph类型的标题和整形章数创建
- com.itextpdf.text.Font:这个类包含了所有规范好的字体,包括family of font,大小,样式和颜色,所有这些字体都被声明为静态常量
- com.itextpdf.text.List:表示一个列表;
- com.itextpdf.text.Anchor:表示一个锚,类似于HTML页面的链接。
- com.itextpdf.text.pdf.PdfWriter:当这个PdfWriter被添加到PdfDocument后,所有添加到Document的内容将会写入到与文件或网络关联的输出流中。
- com.itextpdf.text.pdf.PdfReader:用于读取PDF文件;
iText使用
创建一个简单的pdf文件,如下:
首先用工具准备好PDF,这个制作过程可以先用word把模板制作好转成PDF保存。用工具Adobe Acrobat DC将PDF打开。点击工具的准备表单,就可以定义文本域的名称了。这里文本域的名称对应下面代码map集合的key,value是代码生成pdf后对应key的值。
没有工具的小伙伴可以留言评论:资料。
下面是一段简单的运行案例,要提前准备好模板文件PDF,图片等。将下面的rul地址替换成自己的文件、图片地址
package com.hw.ioz.web.test;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import org.apache.commons.lang3.StringUtils;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;
public class PdfTest {
/**
* TODO
* 使用pdf模板填充数据最后生成pdf文件
* @author TTc
* @date 2023/07/19 16:33
*/
public static void main(String[] args) {
//pdf模板位置
// String templatePath = "D:\\image\\测试pdf.pdf";
String templatePath = "E:\\Adobe Acrobat Document\\数字车位证书模板.pdf";
//图片位置
// String imgpath = "D:\\image\\wyb.png";
String imgpath = "E:\\Adobe Acrobat Document\\QRCode.jpg";
// 生成的新文件路径
// String pdfPath = "D:\\测试pdf.pdf";
String pdfPath = "E:\\Adobe Acrobat Document\\document\\parking.pdf";
try {
//设置中文字体
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
PdfReader reader = new PdfReader(templatePath);// 读取pdf模板
ByteArrayOutputStream bos = new ByteArrayOutputStream(); //获取字节数组输出流
PdfStamper stamper = new PdfStamper(reader, bos); //操作pdf文件
AcroFields form = stamper.getAcroFields(); //获取pdf模板中的属性
form.addSubstitutionFont(bf); //为属性设置字体
//处理模板文字部分
Map<String, String> map = new HashMap<String, String>();
map.put("assetName", "车位数据");
map.put("assetNo", "MAN50H0428CD275563777");
map.put("assetType", "数据资源");
map.put("confirmationTime", "2023/07/01 18:18:01 GMT+0800");
map.put("validPeriod", "2023年07月01日至2024年07月01日");
map.put("confirmingSubject", "全球有限公司");
map.put("unifiedSocialCreditIdentifier", "91110108MA01GM8U1W");
map.put("gieldSummary", "42011100401252TJ00000001TJB1A02600000\n" +
"N50H04528CD27556377752202307041110010");
map.put("entityName", "新长-B-B1A8");
map.put("confirmationChain", "MA");
map.put("img", "2030-11-23");
for (Map.Entry<String, String> entry : map.entrySet()) {
form.setFieldProperty(entry.getKey(), "textsize", 12f, null);
// form.setFieldProperty(entry.getKey(), "textfont", BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED), null);
form.setField(entry.getKey(), entry.getValue());
}
//处理模板图片
if (StringUtils.isNotBlank(imgpath)) {
int pageNo = form.getFieldPositions("img").get(0).page;
Rectangle signRect = form.getFieldPositions("img").get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
//根据路径读取图片
Image image = Image.getInstance(imgpath);
//获取图片页面
PdfContentByte under = stamper.getOverContent(pageNo);
//图片大小自适应
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
//添加图片
image.setAbsolutePosition(x, y);
under.addImage(image);
}
stamper.setFormFlattening(true);// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
stamper.close();
reader.close();
//生成pdf路径
FileOutputStream fos = new FileOutputStream(pdfPath);
fos.write(bos.toByteArray());
fos.flush();
if (fos != null) {
fos.close();
}
if (bos != null) {
bos.close();
}
System.out.println("pdf模板生成了");
} catch (Exception e) {
e.printStackTrace();
}
}
}
最后大功告成: