java根据模板导出pdf
准备
先做自己想用的pdf模板。
1、新建word文档,另存为pdf
2、使用工具创建pdf表单
黑框中的为后面代码中要用到的"key"值。
完成后保存即可
主体
1、pom.xml
<!-- 生成pdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.4.3</version>
</dependency>
2、工具类
public class PdfExport {
// 利用模板生成pdf
public static void pdfout(Map<String, Object> o,HttpServletResponse response) {
// 模板路径
String templatePath = "F:/test2.pdf";
// String templatePath = "/project/data/pdf/pdfModal.pdf";
PdfReader reader;
OutputStream out;
ByteArrayOutputStream bos;
PdfStamper stamper;
try {
//字体设置没用,但好像又有用。有用的话最好,没用的话试试“最后”的“1”
// BaseFont bf = BaseFont.createFont("F:/华文新魏.TTF",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
out = response.getOutputStream();// 输出流
reader = new PdfReader(templatePath);// 读取pdf模板
bos = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, bos);
AcroFields form = stamper.getAcroFields();
//文字类的内容处理
Map<String,String> datemap = (Map<String,String>)o.get("datemap");
// form.addSubstitutionFont(bf);//字体
for(String key : datemap.keySet()){
String value = datemap.get(key);
form.setField(key,value);
}
//图片类的内容处理
Map<String,String> imgmap = (Map<String,String>)o.get("imgmap");
for(String key : imgmap.keySet()) {
String value = imgmap.get(key);
String imgpath = value;
int pageNo = form.getFieldPositions(key).get(0).page;
Rectangle signRect = form.getFieldPositions(key).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();
Document doc = new Document();
PdfCopy copy = new PdfCopy(doc, out);
doc.open();
PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
copy.addPage(importPage);
doc.close();
out.flush();
out.close();
} catch (IOException e) {
System.out.println(e);
} catch (DocumentException e) {
System.out.println(e);
}
}
}
3、调用
@Controller
@RequestMapping("/zinPdf")
public class ZinPdfController{
@RequestMapping(value = "/pdf", produces = "application/json; charset=utf-8")
@ResponseBody
public Map<String, Object> selectApplyHorseRegByApplyTypeStatus(Map<String, Object> o, HttpServletResponse response) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
/***************************************主要是这里的东西*******************/
Map<String, Object> map = new HashMap<String, Object>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
// 获取String类型的时间
String date = sdf.format(new Date());
map.put("date", date);// date
map.put("weather", "晴");
map.put("todayF", "阳光明媚");
//图片
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("img", "f:/1.jpg");//
o.put("datemap", map);
o.put("imgmap", map2);
PdfExport.pdfout(o, response);
/***********************************************************************/
resultMap = ResponseData.success();
} catch (Exception e) {
resultMap = ResponseData.error("出现异常");
}
return resultMap;
}
}
4、结果
最后
1、文字域的字体字号等,是在准备阶段的第2步(创建pdf表单)时设置的。 如果是利用 AcroFields填充值的不需要在程序中设置字体,在模板文件中设置字体为中文字体就行了
2、注意模板路径
3、参考