共计 5689 个字符,预计需要花费 15 分钟才能阅读完成。
一、创立 pdf 模板
应用 PDFelement 制作 pdf 模板(数据域的名称对应前面插入的 key)
二、导入 maven 依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
《2020 最新 Java 根底精讲视频教程和学习路线!》
三、插入数据和图片到 pdf 模板
Map<String, Object> data;// 要插入的数据
// 初始化 itext
// 设置编码
BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
PdfReader pdfReader=new PdfReader(“pdf 模板文件门路”);
PdfStamper pdfStamper=new PdfStamper(pdfReader, new FileOutputStream(“输入 pdf 文件门路”));
AcroFields form = pdfStamper.getAcroFields();
form.addSubstitutionFont(baseFont);
// 写入数据
for(String key:data.keySet()){String value=data.get(key).toString();
//key 对应模板数据域的名称
form.setField(key,value);
}
// 增加图片
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("图片门路");
PdfContentByte under = pdfStamper.getOverContent(pageNo);
// 设置图片大小
image.scaleAbsolute(signRect.getWidth(), signRect.getHeight());
// 设置图片地位
image.setAbsolutePosition(x, y);
under.addImage(image);
// 设置不可编辑
pdfStamper.setFormFlattening(true);
pdfStamper.close();
PS:合并多个 pdf 成一个
// 先删除之前的 all.pdf
String filePath="all.pdf";
File file=new File(filePath);
file.delete();
// 要合并的所有 pdf 的门路
List<String> fileList;
//all.pdf 保留门路
String savepath="all.pdf";
Document document = null;
try {document = new Document(new PdfReader(fileList.get(0)).getPageSize(1));
PdfCopy copy = new PdfCopy(document, new FileOutputStream(savepath));
document.open();
for (int i = 0; i < fileList.size(); i++) {PdfReader reader = new PdfReader(fileList.get(i));
int n = reader.getNumberOfPages();// 取得总页码
for (int j = 1; j <= n; j++) {document.newPage();
PdfImportedPage page = copy.getImportedPage(reader, j);// 从以后 Pdf, 获取第 j 页
copy.addPage(page);
}
}
} catch (IOException e) {e.printStackTrace();
} catch (DocumentException e) {e.printStackTrace();
} finally {if (document != null) {document.close();
}
}
上面代码是用在我的项目中应用得截取局部作为参考:
// 保留门路 生成
String savePath =
GlConfig.getDownloadResourcePath() + "student/" + student.getName() + "ClassHoursProve.pdf";
// 生成 pdf
PdfUtil.exportTemplateByPdf(savePath, dto.toJson(), path);
pdfUtil
package com.gl.common.file.util;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.json.JSONObject;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Map;
@Slf4j
public class PdfUtil {
/**
* 学时证实模板门路
*/
public static final URL TEMPLATE_URL = ResourceUtil.getResource("template/ClassHoursProve.pdf");
/**
* 导出 PDF 办法
*
* @param savePath 保留服务器门路
* @param obj 导出的参数
*/
public static void exportTemplateByPdf(String savePath, JSONObject obj,String filePath) {
PdfReader reader = null;
ByteArrayOutputStream bos = null;
PdfStamper stamper = null;
OutputStream os = null;
FileOutputStream out = null;
File file;
Document document = null;
PdfCopy copy = null;
Document doc = null;
try {
/** 实例化文档对象 */
document = new Document(PageSize.A4, 50, 40, 40, 50);
/** 创立 PdfWriter 对象 */
// 打开文档
document.open();
/** pdf 文档中中文字体的设置,留神肯定要增加 iTextAsian.jar 包 */
String localFontPath = "c:windowsfonts";
BaseFont bfChinese =
BaseFont.createFont(localFontPath + "simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
FileUtils.deleteFile(savePath);
file = new File(savePath);
if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}
out = new FileOutputStream(file);
reader = new PdfReader(TEMPLATE_URL);
bos = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, bos);
AcroFields form = stamper.getAcroFields();
// 文字类的内容解决
form.addSubstitutionFont(bfChinese);
String vlaues;
for (Map.Entry<String, Object> entry : obj.entrySet()) {vlaues = String.valueOf(entry.getValue());
if ("photo".equals(entry.getKey()) || "qrcode".equals(entry.getKey())) {
try {
// 通过域名获取所在页和坐标,左下角为终点
int pageNo = form.getFieldPositions(entry.getKey()).get(0).page;
Rectangle signRect = form.getFieldPositions(entry.getKey()).get(0).position;
// 印章地位
Rectangle seal_signRect = form.getFieldPositions("month").get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
// 印章坐标地位
float seal_x = seal_signRect.getLeft();
float seal_y = seal_signRect.getBottom();
// 读图片
Image image = Image.getInstance(vlaues);
Image seal_image = Image.getInstance(filePath);
// 获取操作的页面
PdfContentByte under = stamper.getOverContent(pageNo);
// 依据域的大小缩放图片
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
seal_image.scaleToFit(signRect.getWidth(), signRect.getHeight());
// 增加图片
image.setAbsolutePosition(x, y);
seal_image.setAbsolutePosition(seal_x, seal_y);
under.addImage(image);
under.addImage(seal_image);
} catch (Exception e) {log.info(e.getMessage());
}
} else {if ("fileno".equals(entry.getKey())) {form.setFieldProperty(entry.getKey(), "textsize", 50f, null);
} else {form.setFieldProperty(entry.getKey(), "textsize", 10f, null);
}
form.setField(entry.getKey(), vlaues);
}
}
// 如果为 false,生成的 PDF 文件能够编辑,如果为 true,生成的 PDF 文件不能够编辑
stamper.setFormFlattening(true);
stamper.close();
doc = new Document();
copy = new PdfCopy(doc, out);
doc.open();
PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
copy.addPage(importPage);
doc.close();
document.close();
copy.flush();
copy.close();} catch (Exception e) {log.info(e.getMessage());
} finally {
try {if (stamper != null) {stamper.close();
stamper = null;
}
if (reader != null) {reader.close();
reader = null;
}
IOUtils.closeQuietly(os);
IOUtils.closeQuietly(bos);
IOUtils.closeQuietly(out);
if (document != null) {document.close();
document = null;
}
if (doc != null) {doc.close();
doc = null;
}
if (copy != null) {copy.flush();
copy.close();
copy = null;
}
} catch (Exception ignored) {}}
}
}
链接地址:https://blog.csdn.net/Aurora_____/article/details/111209096
正文完