生成pdf有多種方法,這裏demo一個經過變量填充帶表單的pdf模板的方法,相對比較簡單,也比較乾淨(相對於一個一個元素的拼接出來一個pdf文件)git
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.4.3</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
複製代碼
示例中支持文本框、checkbox、radio、插入圖片,添加水印的話,google一下會有不少現成的代碼github
一、checkbox在編輯表單時注意添加選項-導出值不能使用中文 這裏使用的true bash
二、注意圖片的處理方式,具體參考代碼/**
*
* @param dataMap 表單參數
* @param templateFilePath 模板路徑
* @throws Exception
*/
public static void createPDFAndDownload(Map<String, Object> dataMap, String templateFilePath) throws Exception {
/* 使用中文字體 */
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
fontList.add(bf);
PdfReader reader = new PdfReader(PdfUtil.class.getClassLoader().getResourceAsStream("templates/" + templateFilePath));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PdfStamper ps = new PdfStamper(reader, bos);
AcroFields fields = ps.getAcroFields();
fields.setSubstitutionFonts(fontList);
fillData(fields, dataMap, ps);
/* 必需要調用這個,不然文檔不會生成的 */
ps.setFormFlattening(true);
ps.close();
//輸出到本地指定目錄
File file = new File("D:\\result.pdf");
bos.writeTo(new FileOutputStream(file));
bos.close();
//直接輸出到response下載
// response.setHeader("Content-Disposition",
// "attachment; filename=" + new String(fileName.getBytes(charset), "iso8859-1"));
// byte[] result = bos.toByteArray();
// response.setContentLength(result.length);
// OutputStream os = null;
// os = response.getOutputStream();
// os.write(result, 0, result.length);
// os.flush();
// os.close();
}
複製代碼
填充數據maven
/**
*
* @param fields
* @param data
* @param ps
* @throws IOException
* @throws DocumentException
*/
public static void fillData(AcroFields fields, Map<String, Object> data, PdfStamper ps) throws IOException, DocumentException {
for (String key : data.keySet()) {
if (key.endsWith("Checkbox")) {
fields.setField(key, "" + data.get(key));
} else if (key.endsWith("Image")) {
int pageNo = fields.getFieldPositions(key).get(0).page;
Rectangle signRect = fields.getFieldPositions(key).get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
// 讀圖片
//key resources 下的相對路徑
Image image = Image.getInstance(PdfUtil.class.getClassLoader().getResource((String) data.get(key)));
// 獲取操做的頁面
PdfContentByte under = ps.getOverContent(pageNo);
// 根據域的大小縮放圖片
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
// 添加圖片
image.setAbsolutePosition(x, y);
under.addImage(image);
} else if (key.endsWith("Radio")) {
String value = data.get(key) + "";
fields.setField(key, value); // 爲字段賦值,注意字段名稱是區分大小寫的
} else {
String value = data.get(key) + "";
fields.setField(key, value); // 爲字段賦值,注意字段名稱是區分大小寫的
}
}
}
複製代碼
main方法測試工具
public static void main(String[] args) {
Map<String, Object> dataMap = new HashMap<String, Object>();
//文本
dataMap.put("code", "1234");
//checkbox
dataMap.put("checkbox1", "true");
//插入圖片 非水印
dataMap.put("testImage", "images/1.gif");
//radio
dataMap.put("testRadio", "select1");
dataMap.put("testRadio", "select2");
try {
createPDFAndDownload(dataMap, "test_form.pdf");
} catch (Exception e) {
e.printStackTrace();
}
}
複製代碼
demo測試