使用itextpdf进行pdf模板的填充

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

提示:这里可以添加本文要记录的大概内容:

例如:使用Adobe Acrobat DC进行pdf模板的编辑,利用itextpdf的工具类进行pdf的获取,得到每一个文本域,并对文本域进行填充


提示:以下是本篇文章正文内容,下面案例可供参考

一、使用Adobe Acrobat DC编辑模板

pdf处理软件
使用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编辑生成图片的方法。

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用itextpdf填充pdf模板的步骤如下: 1. 首先,创建一个Word文件,并设置好需要填充的位置和样式,然后将其另存为pdf格式。 2. 打开Adobe Acrobat Pro DC软件,点击文件->创建->创建表单,导入刚刚生成的pdf文件。 3. 在表单编辑页面,双击需要填充的字段,将其名称改为你想要的名称,并记住这个名称,后面会用到。 4. 设置好所有需要填充的字段后,保存表单。 5. 在代码中导入所需的itextpdf依赖,并编写代码来填充pdf模板。可以使用itextpdf的API来读取pdf模板,找到需要填充的字段,并将其值设置为你想要的值。 6. 将需要使用的字体文件放置在resources目录下。 7. 进行测试,查看填充后的pdf效果。 如果你觉得使用pdf模板的方式不方便,也可以参考itextpdf的其他方法,例如使用固定段落Paragraph来指定段落位置进行填充。 需要注意的是,如果在填充pdf模板时遇到问题,可以参考其他开发者的解决方案,例如引入itext-asian依赖来解决导出的pdf没有值的问题。 #### 引用[.reference_title] - *1* *2* [java使用itext填充pdf模板,超简单教学,有手就行](https://blog.csdn.net/weixin_42596407/article/details/120035922)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值