前几天遇到了一个生成准考证的需求,并提供用户下载,然后百度了一圈还是觉得使用itextpdf这个框架好用点。但是还需要找到一个能创建pdf表单的工具来生成pdf模板。可以使用Adobe Acrobat进行创建,但是我自己电脑上刚好有一个软件可以制作就没有去下载了
下面只是用到了itextpdf一部分的功能,如果还有其他字体格式、样式的需求可以参考他的官方网址Overview (iText 5.5.13 API) (itextpdf.com)
我是用的是一款pj软件PDFelement,当初下它是用来转换pdf到word,没想到也可以制作pdf表单
可能有点看不清楚框框里写的啥,就是写的后端实体类中属性的名称,dddd最好一一对应嘛
还可以吧,此准考证模板地址:https://download.csdn.net/download/SleepNot_Need/87576794
在pom.xml里导入下面两个依赖就行了
<dependency>
<groupId>com.itextpdfgroupId>
<artifactId>itextpdfartifactId>
<version>5.5.13version>
dependency>
<dependency>
<groupId>com.itextpdfgroupId>
<artifactId>itext-asianartifactId>
<version>5.2.0version>
dependency>
public class PdfTest {
public static void main(String[] args) {
// 模板地址
String tempPath = "D:\\test\\ticketPdfTemplate.pdf";
// 生成pdf后的保存地址
String outTempPath = "D:\\test\\ticketPdf.pdf";
File old = new File(outTempPath);
if (old.exists()){
old.delete();
}
PdfReader reader;
FileOutputStream out;
ByteArrayOutputStream bos;
PdfStamper pdfStamper;
try {
// 查询准考证数据
ScpStudentAdmissionTicket ticket = this.baseMapper.selectById(id);
// 读取pdf模板
reader = new PdfReader(tempPath);
// 将填充完成后的pdf输出到指定位置
out = new FileOutputStream(outTempPath);
bos = new ByteArrayOutputStream();
pdfStamper = new PdfStamper(reader, bos);
// 获取到表单集合
AcroFields acroFields = pdfStamper.getAcroFields();
// 加载字体
BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
// 设置写入字体
acroFields.addSubstitutionFont(font);
// 设置文本信息
acroFields.setField("activityName", ticket.getActivityName());
acroFields.setField("studentName", ticket.getStudentName());
acroFields.setField("admissionNumber", ticket.getAdmissionNumber());
acroFields.setField("idCard", ticket.getIdCard());
acroFields.setField("examination", ticket.getExamination());
LocalDateTime examBeginTime = ticket.getExamBeginTime();
LocalDateTime examEndTime = ticket.getExamEndTime();
String time = examBeginTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 "))
+ examBeginTime.format(DateTimeFormatter.ofPattern("HH:mm"))
+ " - "
+ examEndTime.format(DateTimeFormatter.ofPattern("HH:mm"));
acroFields.setField("examinationTime", time);
// 设置图片
String url = ticket.getUrl();
// 根据地址读取需要放入pdf中的图片
Image image = Image.getInstance(url);
// 设置图片在哪一页
PdfContentByte overContent = pdfStamper.getOverContent(acroFields.getFieldPositions("image").get(0).page);
// 获取模板中图片域的大小
Rectangle signRect = acroFields.getFieldPositions("image").get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
// 图片等比缩放
image.scaleAbsolute(signRect.getWidth(), signRect.getHeight());
// 图片位置
image.setAbsolutePosition(x, y);
// 在该页加入图片
overContent.addImage(image);
// 如果为false那么生成的PDF文件还能编辑,一定要设为true
pdfStamper.setFormFlattening(true);
pdfStamper.close();
Document doc = new Document();
PdfCopy copy= new PdfCopy(doc, out);
doc.open();
PdfImportedPage importedPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
copy.addPage(importedPage);
doc.close();
} catch (IOException | DocumentException e) {
e.printStackTrace();
}
}
}
这里贴出来查询出来的准考证数据
{
“idCard”:“110101199003075939”,
“examEndTime”:“2021-01-01 09:00:00”,
“examBeginTime”:“2021-01-01 01:00:00”,
“examination”:“清华大学”,
“id”:“1428543333891039233”,
“activityName”:“物理竞赛”,
“admissionNumber”:“20210102”,
“studentName”:“学生姓名”,
“url”:“http://localhost/image/20210818/89fca5330db5bd2c6141d9b69973f062.png”
}