提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
使用itextpdf进行pdf模板的填充
前言
提示:这里可以添加本文要记录的大概内容:
例如:使用Adobe Acrobat DC进行pdf模板的编辑,利用itextpdf的工具类进行pdf的获取,得到每一个文本域,并对文本域进行填充
提示:以下是本篇文章正文内容,下面案例可供参考
一、使用Adobe Acrobat DC编辑模板
使用Adobe Acrobat DC打开pdf模板
找到工具,点击准备表单
在工具栏找到文本域,在合适的位置添加文本域
右击,打开属性配置属性
二、使用itextpdf进行填充
1.添加maven依赖
<!-- itextpdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<!-- itextpdf的亚洲字体支持 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
2.放置模板
在resource目录下的static目录创建pdf目录,将准备好的pdf模板放置到该目录下
3.进行处理
// 内容填充
Map<String, String> parametersMap = new HashMap<>(5);
// 证书类型
parametersMap.put("type", type);
// 获得者姓名
parametersMap.put("name", name);
// 需要填写的内容
parametersMap.put("content", content);
// 所在学校
parametersMap.put("school", school);
// 获取时间
parametersMap.put("date", date);
将需要填充的内容防止进入map集合中,注意key值要与文本域的名称相同
// 加载资源文件,模板文件
ClassPathResource classPathResource = new ClassPathResource("XXX1");
InputStream templateInputStream = classPathResource.getInputStream();
// 创建PDF临时文件
File tempPdfFile = File.createTempFile("XXX2", ".pdf");
OutputStream newPdfOutputStream = new FileOutputStream(tempPdfFile);
System.out.println(tempPdfFile.getAbsolutePath());
// 创建图片临时文件
File tempJpgFile = File.createTempFile("XXX3", ".jpg");
System.out.println(tempJpgFile.getAbsolutePath());
// 生成图片所在服务器的位置
String picUrl = "";
// 开始pdf的处理
PdfReader pdfReader;
ByteArrayOutputStream byteArrayOutputStream;
PdfStamper pdfStamper;
准备了三个名称,第一个XXX1,是pdf模板所在的文件路径
“static/pdf/证书.pdf”,第二个XXX2则是处理完的pdf文件,临时保存的名称,第三个XXX3则是我们需要得到的jpg图片的名称
// 读取pdf模板
pdfReader = new PdfReader(templateInputStream);
byteArrayOutputStream = new ByteArrayOutputStream();
pdfStamper = new PdfStamper(pdfReader, byteArrayOutputStream);
// 得到每一个文本域
AcroFields acroFields = pdfStamper.getAcroFields()
获取到文本域后就可以对其进行填充了
// 黑体字体
BaseFont baseFont = BaseFont.createFont("xxx1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
// 宋体字体
BaseFont baseFont1 = BaseFont.createFont("xxx2", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
acroFields.setFieldProperty(key, "textsize", 100f, null);
acroFields.setFieldProperty(key, "textcolor", new BaseColor(156, 106, 2), null);
acroFields.setFieldProperty(key, "textfont", baseFont, null);
在static目录下创建font目录,将需要的文字导入进去,xxx1为黑体字体的路径static/font/SourceHanSansK-Heavy.ttf,xxx2为宋体路径,acroFields.setFieldProperty()方法为文本域设置填充属性,包括字体样式和字体大小
// 此处单独处理行间距
try {
Font font = new Font(baseFont1, 30f, -1, new BaseColor(0, 0, 0));
List<AcroFields.FieldPosition> list = acroFields.getFieldPositions(key);
int page = list.get(0).page;
PdfContentByte pdfContentByte = pdfStamper.getOverContent(page);
ColumnText columnText = new ColumnText(pdfContentByte);
Rectangle rectangle = list.get(0).position;
columnText.setSimpleColumn(rectangle);
Chunk chunk = null;
chunk = new Chunk(parametersMap.get(key));
Paragraph paragraph = new Paragraph(60f, chunk);
columnText.addText(paragraph);
paragraph.setFont(font);
columnText.addElement(paragraph);
columnText.go();
} catch (DocumentException e) {
e.printStackTrace();
}
如果需要设置行间距,还需要单独处理对应的文本域
acroFields.setField(key, parametersMap.get(key));
最后使用该方法将填充的内容放置到文本域中
// 如果为false那么生成的PDF文件还能编辑,一定要设为true
pdfStamper.setFormFlattening(true);
pdfStamper.close();
Document document = new Document();
PdfCopy pdfCopy = new PdfCopy(document, newPdfOutputStream);
document.open();
PdfImportedPage importPage = pdfCopy.getImportedPage(new PdfReader(byteArrayOutputStream.toByteArray()), 1);
pdfCopy.addPage(importPage);
pdfCopy.close();
// PDF处理完毕
document.close();
// 开始转成图片
// 将文件地址和文件名拼接成路径 注意:线上环境不能使用\\拼接
try {
// 写入文件
PDDocument doc = PDDocument.load(tempPdfFile);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
for (int i = 0; i < pageCount; i++) {
// dpi为144,越高越清晰,转换越慢
// Windows native DPI
BufferedImage image = renderer.renderImageWithDPI(i, 150);
// 将图片写出到该路径下
ImageIO.write(image, "jpg", tempJpgFile);
}
// 关闭文件,结束临时文件的使用
doc.close();
// 上传文件
R<SysFile> upload = remoteFileService.upload(getMultipartFile(tempJpgFile));
// 删除文件
// 删除生成的PDF临时文件
tempPdfFile.delete();
// 删除生成的JPG临时文件
tempJpgFile.delete();
picUrl = upload.getData().getUrl();
填充完后,进行处理,关闭文件流,删除零时文件,转换文件格式等一系列操作
总结
本文简单介绍了使用java进行pdf编辑生成图片的方法。