制作模板
首先需要安装Adobe Acrobat DC来制作模板
程序实现
<dependency>
<groupId>org. apache .pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
/**
* 根据模板生成pdf
*
* @param contract
* @return
*/ @SneakyThrows
public void createPDF(ContractData contract, HttpServletResponse response) {
Pdf reader reader = null;
AcroFields s = null;
PdfStamper ps = null;
ByteArrayOutputStream bos = null;
try {
ClassPathResource resource = new ClassPathResource("contractTemplate.pdf");
InputStream is = resource.getInputStream();
reader = new PdfReader(is);
bos = new ByteArrayOutputStream();
ps = new PdfStamper(reader, bos);
s = ps.getAcroFields();
Class clazz = ContractData.class;
Field[] fields = clazz.getDeclaredFields();
try {
for (Field f : fields) {
f.setAccessible(true);
if (f.get(contract) != null) {
s.setField(f.getName(), f.get(contract).toString());
}
}
} catch (IllegalAccessException e) {
throw new CommonException();
}
// 如果为false那么生成的PDF文件还能编辑,一定要设为true
ps.setFormFlattening(true);
ps. close ();
response.reset();
response.setContentType("application/pdf");
ServletOutputStream fos = response.getOutputStream();
fos.write(bos.toByteArray());
fos.flush();
fos.close();
} catch (IOException | DocumentException e) {
e.printStackTrace();
} finally {
try {
bos.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Data
class ContractData {
private String contractNo;
private String partyAName;
private String partyBName;
}
这样就可以了
下面是生成的最终pdf文件
大功告成~