第一步:生成pdf模板
先用word写好固定格式的文档,再利用wps将文档转成pdf文件,然后利用Adobe Acrobat DC(此工具是收费的,可以百度搜索进行破解)进行表单域编辑(如下图),编辑成自己想要的模板文件。
第二步:新建项目
在开发者工具中新建项目,导入jar包或写入maven依赖配置,我在这里用的itext的jar,但itext是收费的,所以也是破解版的,我没有用到maven构建项目,所以我直接导入了这个三个jar包(itextpdf-5.5.5.jar、itext-asian-5.2.0.jar、fontbox-2.0.12.jar)
fontbox-2.0.12.jar (官网下载的fontbox-2.0.12.jar没有中文字体,修改过后的jar包)下载链接https://download.csdn.net/download/javabigadog/10932972
第三步:根据开发需求编写demo
我完成的demo可以添加文本域和图片域、还可以给pdf文件添加水印
/**
*map为表单域所对应的数据,若是图片,则为图片本地路径
/
public String createPDF(Map<String, String> map) {
//模板所处位置
String templatePdfUrl ="C:\\temp\\Template.pdf";
String pdfUrl = "C:\\temp\\test.pdf";
PdfReader reader = null;
AcroFields af = null;
PdfStamper ps = null;
ByteArrayOutputStream bos = null;
FileOutputStream fos = null;
//加入pdf内容
try {
reader = new PdfReader(templatePdfUrl);
bos = new ByteArrayOutputStream();
ps = new PdfStamper(reader,bos);
af = ps.getAcroFields();
//使用中文字体
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
af.addSubstitutionFont(bfChinese);
System.out.println("size:"+map.size());
//给表单文本域赋值
Set<Entry<String, String>> set = map.entrySet();
Iterator<Entry<String, String>> it = set.iterator();
Entry<String, String> entry = null;
while (it.hasNext()) {
entry = it.next();
if(entry.getValue()!=null) {
System.out.println("key:"+entry.getKey()+" "+entry.getValue());
af.setField(entry.getKey(), entry.getValue());
}
}
//设置不能编辑
ps.setFormFlattening(true);
//添加图片
String imgpath=map.get("IMGURL");
File imgFile = new File( imgpath);
if(imgFile.exists()) {
int pageNo1 = af.getFieldPositions("DZYZ_af_image").get(0).page;
Rectangle signRect1 = af.getFieldPositions("DZYZ_af_image").get(0).position;
float x1 = signRect1.getLeft();
float y1 = signRect1.getBottom();
Image image1 = Image.getInstance( imgpath);
PdfContentByte under1 = ps.getOverContent(pageNo1);
image1.scaleToFit(signRect1.getWidth(),signRect1.getHeight());
image1.setAbsolutePosition(x1,y1);
under1.addImage(image1);
}
//添加水印
String waterMarkName=map.get("waterMarkName");
PdfContentByte under;
Rectangle wmRect =ps.getReader().getPageSizeWithRotation(1);
under = ps.getOverContent(1);
under.saveState();
// set Transparency
PdfGState gs = new PdfGState();
// 设置透明度为0.2
gs.setFillOpacity(0.2f);
under.setGState(gs);
under.restoreState();
under.beginText();
//设置字体和字体大小
under.setFontAndSize(bfChinese, 18);
under.setTextMatrix(30, 30);
under.setColorFill(new BaseColor(179,185,181));
for (int y = 0; y < 10; y++) {
for (int x = 0; x < 8; x++) {
// 水印文字成35度角倾斜
under.showTextAligned(Element.ALIGN_LEFT
, waterMarkName, 5+ 260* x, 260*y, 35);
}
under.endText();
under.setLineWidth(1f);
under.stroke();
ps.close();
reader.close();
fos = new FileOutputStream(pdfUrl);
fos.write(bos.toByteArray());
fos.flush();
} catch (IOException|DocumentException e) {
e.printStackTrace();
}finally{
try {
if(fos!=null) {
fos.close();
}
if(bos!=null) {
bos.close();
}
if(reader!=null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return pdfUrl;
}
▄█▀█●老铁,站住!别跑,我又不收你钱,如果我的demo能够帮助到你,请给我一个赞吧!