需要的jar包
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.4.3</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
效果图: 模板填充数据,方框的数据为数据库查出来进行填充,有文字和图片
下面是详细的步骤:
1.首先,新建一个word文档,内容如下,另存为pdf格式,我的命名:测试.pdf。
2.打开Adobe Acrobat Pro
3.点击文件--创建-->创建表单---选择刚生成pdf文件---然后开始
4.如下图是制作好的pdf模板,直接保存即可。注意:黑框里面的名称,是后面程序要用到的,程序根据名称给对应的位置赋值的。
5点击属性中,可以选择换行,设置字体样式和大小,剧中对齐
代码:
package com.wxz;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import org.apache.commons.lang3.StringUtils;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;
/**
* TODO
* 使用pdf模板填充数据最后生成pdf文件
* @author wxz
* @date 2021/11/24 14:33
*/
public class TestPdf {
public static void main(String[] args) {
//pdf模板位置
String templatePath = "D:\\image\\测试pdf.pdf";
//图片位置
String imgpath = "D:\\image\\wyb.png";
// 生成的新文件路径
String pdfPath = "D:\\测试pdf.pdf";
try {
//设置中文字体
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
PdfReader reader = new PdfReader(templatePath);// 读取pdf模板
ByteArrayOutputStream bos = new ByteArrayOutputStream(); //获取字节数组输出流
PdfStamper stamper = new PdfStamper(reader, bos); //操作pdf文件
AcroFields form = stamper.getAcroFields(); //获取pdf模板中的属性
form.addSubstitutionFont(bf); //为属性设置字体
//处理模板文字部分
Map<String, String> map = new HashMap<String, String>();
map.put("bh", "99999");
map.put("mc", "aaaa有限公司");
map.put("dz", "安徽省马鞍山市花山区民族大道1099号大学城美食城A333092湖北省武汉社想下去金融港青年公寓");
map.put("fzrq", "2020-11-23");
map.put("yxqz", "2030-11-23");
for (Map.Entry<String, String> entry : map.entrySet()) {
form.setFieldProperty(entry.getKey(), "textsize", 8f, null);
form.setField(entry.getKey(), entry.getValue());
}
//处理模板图片
if (StringUtils.isNotBlank(imgpath)) {
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(imgpath);
//获取图片页面
PdfContentByte under = stamper.getOverContent(pageNo);
//图片大小自适应
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
//添加图片
image.setAbsolutePosition(x, y);
under.addImage(image);
}
stamper.setFormFlattening(true);// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
stamper.close();
reader.close();
//生成pdf路径
FileOutputStream fos = new FileOutputStream(pdfPath);
fos.write(bos.toByteArray());
fos.flush();
if (fos != null) {
fos.close();
}
if (bos != null) {
bos.close();
}
System.out.println("pdf模板生成了");
} catch (Exception e) {
e.printStackTrace();
}
}
}