依赖
<!-- https://mvnrepository.com/artifact/com.lowagie/itext -->
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>4.2.2</version>
<type>pom</type>
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
工具类
package com.ruoyi.common;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import java.io.*;
import java.util.*;
/**
* @ClassName pdfUtils
* @description: TODO
* @author: MaYuanbo
* @date 2023年06月15日
* @version: 1.0
*/
public class PdfUtils
{
/**
* @param fields
* @param data
* @throws IOException
* @throws DocumentException
*/
private static void fillData(AcroFields fields, Map<String, String> data) throws IOException, DocumentException {
List<String> keys = new ArrayList<String>();
Map<String, AcroFields.Item> formFields = fields.getFields();
for (String key : data.keySet()) {
if(formFields.containsKey(key)){
String value = data.get(key);
fields.setField(key, value); // 为字段赋值,注意字段名称是区分大小写的
keys.add(key);
}
}
Iterator<String> itemsKey = formFields.keySet().iterator();
while(itemsKey.hasNext()){
String itemKey = itemsKey.next();
if(!keys.contains(itemKey)){
fields.setField(itemKey, " ");
}
}
}
/**
* @param templatePdfName
* 模板pdf名称
* @param generatePdfPath
* 生成pdf路径
* @param data
* 数据
*/
public static String generatePDF(String templatePdfName, String generatePdfPath, Map<String, String> data) {
OutputStream fos = null;
ByteArrayOutputStream bos = null;
try {
byte[] bytes =generatePDF(templatePdfName,data);
fos = new FileOutputStream(generatePdfPath);
fos.write(bytes);
fos.flush();
return generatePdfPath;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
/**
* @param templatePdfName
* 模板pdf名称
* @param data
* 数据
*/
public static byte[] generatePDF(String templatePdfName, Map<String, String> data) {
ByteArrayOutputStream bos = null;
try {
InputStream istemplate =
PdfUtils.class.getClassLoader()
.getResourceAsStream(templatePdfName);
PdfReader reader = new PdfReader(istemplate);
bos = new ByteArrayOutputStream();
/* 将要生成的目标PDF文件名称 */
PdfStamper ps = new PdfStamper(reader, bos);
/* 使用中文字体 */
BaseFont bf = BaseFont.createFont("STSong-Light",
"UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
fontList.add(bf);
/* 取出报表模板中的所有字段 */
AcroFields fields = ps.getAcroFields();
fields.setSubstitutionFonts(fontList);
fillData(fields, data);
/* 必须要调用这个,否则文档不会生成的 如果为false那么生成的PDF文件还能编辑,一定要设为true*/
ps.setFormFlattening(true);
ps.close();
return bos.toByteArray();
// return bos;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
}
controller
@GetMapping("/pdf")
public void createPdf() throws IOException
{
CheckCertificate checkCertificate = getCheckCertificate();
//文本填充
Map<String ,String> map = new HashMap<>();
map.put("ctificateNumber",checkCertificate.getCertificateNumber());
map.put("liqName",checkCertificate.getLiqName());
map.put("checkName",checkCertificate.getCheckTime());
map.put("bottleBodyCode",checkCertificate.getBottleBodyCode());
map.put("liqYear",checkCertificate.getLiqYear());
map.put("bottoleMouthCode",checkCertificate.getBottleMouthCode());
map.put("productionDate",checkCertificate.getProductionDate());
map.put("liqSku",checkCertificate.getLiqSku());
map.put("liqStore",checkCertificate.getLiqStore());
map.put("checkProject",checkCertificate.getCheckProject());
map.put("genuineStandardDetails",checkCertificate.getGenuineStandardDetails());
map.put("positiveStandard",checkCertificate.getPositiveStandard());
map.put("backLabelBarcode",checkCertificate.getBackLabelBarCode());
map.put("organicCodeSimilarity",checkCertificate.getOrganicCodeSimilarity());
map.put("backLabelDetailsGenuine",checkCertificate.getBackLabelDetailGenuine());
map.put("backLabelBrandAuthentic",checkCertificate.getBackLabelBrandAuthentic());
map.put("plasticCapInkjetCodegGenuine",checkCertificate.getPlasticCapInkjetCodegGenuine());
map.put("rubberCapGearCharacteristics",checkCertificate.getRubberCapGearCharacteristics());
map.put("remark","");
map.put("liqReult",checkCertificate.getLiqResult());
String s = PdfUtils.generatePDF("PDFTemplate.pdf", getPDFpath(), map);
System.out.println(s);
private CheckCertificate getCheckCertificate()
{
//获取ctificateNumber
String ctificateNumber = getCtificateNumber();
CheckCertificate checkCertificate = new CheckCertificate();
checkCertificate.setCertificateNumber(ctificateNumber);
checkCertificate.setLiqName("茅台");
checkCertificate.setCheckTime("2020.02.14");
checkCertificate.setBottleBodyCode("631d1592090");
checkCertificate.setLiqYear("2021");
checkCertificate.setBottleMouthCode("stg-5124");
checkCertificate.setProductionDate("2021.12.13");
checkCertificate.setLiqSku("500ml/53vol");
checkCertificate.setCheckProject("外观视觉检测");
checkCertificate.setLiqStore("陕西中泰长安北路酒行");
checkCertificate.setGenuineStandardDetails("相似度99%");
checkCertificate.setPositiveStandard("正似度99%");
checkCertificate.setBackLabelBarCode("度99%");
checkCertificate.setOrganicCodeSimilarity("标似度99%");
checkCertificate.setBackLabelDetailGenuine("标度99%");
checkCertificate.setBackLabelBrandAuthentic("胶品相似度99%");
checkCertificate.setPlasticCapInkjetCodegGenuine("胶相似度99%");
checkCertificate.setRubberCapGearCharacteristics("相似度99%");
checkCertificate.setRemark("");
checkCertificate.setLiqResult("真");
return checkCertificate;
}
/**
* 生成合格证书的唯一
* @return
*/
private String getCtificateNumber()
{
UUID uuid = UUID.randomUUID();
String randomString = uuid.toString().replace("-", "").toUpperCase();
return "JM" + randomString.substring(0, 5)
+ "-" + randomString.substring(5, 10)
+ "-" + randomString.substring(10, 15);
}
/**
* 生成文件路径
* @return
*/
private String getPDFpath()
{
return profile + "/"+ IdUtils.fastSimpleUUID()+ ".pdf";
}
模板文件