1添加依赖
<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>
2 制作pdf模板
2.1 下载Adobe Acrobat DC
去网上找下载资源。
2.2 制作PDF模版
使用word或者wps制作,填充完文本样式之后,转pdf。

在word中设计完成后,生成pdf文件
2.3使用Adobe编辑打开pdf
点击创建->创建表单:

选择一个文件,打开刚才生成的pdf文件:

可以自定义添加文本域:

修改文本域属性设置文本域名称:

设置好字体等后保存即可。
3 使用模板填充数据并生成pdf
public int insertFeeLog(FeeLog feeLog,String realPath) {
//生成缴费凭证编号
Village village = villageMapper.selectVillageByRealEstateId(feeLog.getWmRealEstateId());
String simpleSpell = village.getSimpleSpell();
long number = redisTemplate.opsForValue().increment("receiptNumber:"+simpleSpell);
String receiptNumber = simpleSpell+ LocalDate.now().getYear()+String.format("%06d",number);
feeLog.setReceiptNumber(receiptNumber);
//添加缴费记录
int count = feeLogMapper.insertFeeLog(feeLog);
//生成凭据pdf保存到数据库中
//创建路径
String savePath = "/receipt/"+simpleSpell+"/"+LocalDate.now().getYear()+"/"+LocalDate.now().getMonthValue();
File file = new File(realPath,savePath);
if(!file.exists()){
file.mkdirs();
}
String pdfPath= realPath+"/"+savePath+"/"+receiptNumber+".pdf";
//准备pdf模板数据
DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
Map<String,String> data = new HashMap<>();
String feeType = DictUtils.getDictLabel("wm_fee_type",feeLog.getDictWmFeeType());
data.put("feeTypeTitle",feeType+"收据");
data.put("residentName",feeLog.getRealEstate().getResident().getName());
data.put("realEstateTitle",feeLog.getRealEstate().getTitle());
data.put("area",feeLog.getRealEstate().getArea()+"平方米");
data.put("monthUnitFee",feeLog.getRealEstate().getMonthUnitFee()+"元/平方米");
Instant instant = feeLog.getEndTime().toInstant();
ZoneId zoneId = ZoneId.systemDefault();
// atZone()方法返回在指定时区从此Instant生成的ZonedDateTime。
LocalDate endDate = instant.atZone(zoneId).toLocalDate();
endDate = endDate.plusMonths(1).minusDays(1);
DateTimeFormatter dateTimeFormatter =DateTimeFormatter.ofPattern("yyyy年MM月dd日");
data.put("dateRange",dateFormat.format(feeLog.getBeginTime())+" 至 "+endDate.format(dateTimeFormatter));
data.put("amount", "人民币:¥"+feeLog.getAmount()+"元 大写:"+MoneyToChineseUtils.convert(feeLog.getAmount().doubleValue()));
Resident resident = residentMapper.selectResidentById(feeLog.getWmResidentId());
data.put("operator",resident.getName());
data.put("description",feeLog.getDescription());
data.put("receiptNumber",receiptNumber);
data.put("payTime",dateFormat.format(feeLog.getFeeTime()));
data.put("leftFooter",village.getReceiptMemo());
data.put("rightFooter",village.getReceiptSign());
Map<String,String> imageData = new HashMap<>();
imageData.put("stamp_af_image",realPath+"/stamp/"+simpleSpell+".jpg");
String templatePath=realPath+"/template/receipt.pdf";
PdfUtils.generatePDFByTemplate(templatePath,pdfPath,data,imageData);
//更新缴费记录
feeLog.setPic(savePath+"/"+receiptNumber+".pdf");
feeLogMapper.updateFeeLog(feeLog);
//修改不动产的最后缴费日期 金额 缴费截止到的日期
RealEstate realEstate = new RealEstate();
realEstate.setId(feeLog.getWmRealEstateId());
realEstate.setLastFee(feeLog.getAmount());
realEstate.setLastFeeTime(new Date());
realEstate.setFeeEndTime(feeLog.getEndTime());
realEstateMapper.updateRealEstate(realEstate);
return count;
}4 pdf填充及生成工具类
public class PdfUtils {
/**
*
* @param templatePath 模板文件物理路径
* @param pdfPath 生成的pdf文件物理路径
* @param data 填充的普通数据
* @param imageData 填充的图片数据
*/
public static void generatePDFByTemplate(String templatePath,String pdfPath,Map<String, String> data,Map<String,String> imageData) {
PdfReader reader = null;
PdfStamper ps = null;
OutputStream fos = null;
ByteArrayOutputStream bos = null;
try {
reader = new PdfReader(templatePath);
bos = new ByteArrayOutputStream();
ps = new PdfStamper(reader, bos);
// 使用中文字体
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
fontList.add(bf);
//填充数据
AcroFields fields = ps.getAcroFields();
fields.setSubstitutionFonts(fontList);
fillData(fields, data);//渲染
//填充图片
fillImageData(ps,fields,imageData);
//如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
ps.setFormFlattening(true);
if(ps != null){
ps.close();
}
//生成pdf路径存放的路径
fos = new FileOutputStream(pdfPath);
fos.write(bos.toByteArray());
}catch (Exception e){
e.printStackTrace();
}finally {
if(fos!=null){
try {
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bos != null){
try {
bos.close();
}
catch (IOException e){
e.printStackTrace();
}
}
if(reader != null){
try {
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* 填充模板中的数据
*/
public static void fillData(AcroFields fields, Map<String, String> data) {
try {
for (String key : data.keySet()) {
String value = data.get(key);
// 为字段赋值,注意字段名称是区分大小写的
fields.setField(key, value);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 填充模板中的图片数据
*/
public static void fillImageData(PdfStamper pdfStamper,AcroFields fields, Map<String, String> imageData) {
try {
for (String key : imageData.keySet()) {
String imagePath = imageData.get(key);
// 为字段赋值,注意字段名称是区分大小写的
int pageNo = fields.getFieldPositions(key).get(0).page;
Rectangle rectangle = fields.getFieldPositions(key).get(0).position;
float x = rectangle.getLeft();
float y = rectangle.getBottom();
//根据路径读取图片
Image image = Image.getInstance(imagePath);
//获取图片页面
PdfContentByte contentByte = pdfStamper.getOverContent(pageNo);
//图片大小自动适应
image.scaleToFit(rectangle.getWidth(),rectangle.getHeight());
//添加图片
image.setAbsolutePosition(x,y);
contentByte.addImage(image);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

0条评论
点击登录参与评论