javaftl导出pdf_java根据模板导出PDF详细教程
题记:由于业务的需要,需要根据模板定制pdf⽂档,经测试根据模板导出word成功了;但是导出pdf相对⿇烦了⼀点。两天的研究测试java导出PDF,终于成功了,期间⾛了不少弯路,今分享出来,欢迎⼤家有问题在此交流,与君共勉!
⼀、需求
根据业务需要,需要在服务器端⽣成可动态配置的PDF⽂档,⽅便数据可视化查看。
此⽂的测试是在客户端通过java程序的测试,直接运⾏java类获得成功!
⼆、解决⽅案
iText+FreeMarker+JFreeChart⽣成可动态配置的PDF⽂档。
iText有很强⼤的PDF处理能⼒,但是样式和排版不好控制,直接写PDF⽂档,数据的动态渲染很⿇烦。
FreeMarker能配置动态的html模板,正好解决了样式、动态渲染和排版问题。
JFreeChart有这⽅便的画图API,能画出简单的折线、柱状和饼图,基本能满⾜需要。
三、实现功能
1、能动态配置PDF⽂档内容
2、能动态配置中⽂字体显⽰
3、设置⾃定义的页眉页脚信息
4、能动态⽣成业务图⽚
5、完成PDF的分页和图⽚的嵌⼊
四、主要代码结构说明:
1、component包:PDF⽣成的组件 对外提供的是PDFKit⼯具类和HeaderFooterBuilder接⼝,其中PDFKit负责PDF的⽣
成,HeaderFooterBuilder负责⾃定义页眉页脚信息。
2、builder包:负责PDF模板之外的额外信息填写,这⾥主要是页眉页脚的定制。
3、chart包:JFreeChart的画图⼯具包,⽬前只有⼀个线形图。
4、test包:测试⼯具类
5、util包:FreeMarker等⼯具类。
项⽬采⽤maven架构,开发⼯具为MyEclipse10,环境为jdk1.7
五、关键代码说明
1、模板配置
body {
font-family: pingfang sc light;
}
.center{
text-align: center;
width: 100%;
}
${templateName}
iText官⽹:${ITEXTUrl}
FreeMarker官⽹:${freeMarkerUrl}
JFreeChart教程:${JFreeChartUrl}
静态logo图
美团点评
⽓温变化对⽐图
我的图⽚
第⼆页开始了
列表值:
${item}
#list>
2、获取模板内容并填充数据
public static String getContent(String fileName,Object data){
String templatePath=getPDFTemplatePath(fileName).replace("\\", "/");
String templateFileName=getTemplateName(templatePath).replace("\\", "/");
String templateFilePath=getTemplatePath(templatePath).replace("\\", "/");
System.out.println("templatePath:"+templatePath);
System.out.println("templateFileName:"+templateFileName);
System.out.println("templateFilePath:"+templateFilePath);
if(StringUtils.isEmpty(templatePath)){
throw new FreeMarkerException("templatePath can not be empty!");
}
try{System.out.println("进到这⾥了,有来⽆回1");
Configuration config = new Configuration(Configuration.VERSION_2_3_25);
config.setDefaultEncoding("UTF-8");
config.setDirectoryForTemplateLoading(new File(templateFilePath));
config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
config.setLogTemplateExceptions(false);System.out.println("进到这⾥了,有来⽆回2");
Template template = Template(templateFileName);System.out.println("进到这⾥了,有来⽆回3"); StringWriter writer = new StringWriter();
template.process(data, writer);
writer.flush();
String html = String();
return html;
}catch (Exception ex){
throw new FreeMarkerException("FreeMarkerUtil process fail",ex);
}
}public static String getContent(String fileName,Object data){
String templatePath=getPDFTemplatePath(fileName);//根据PDF名称查对应的模板名称
String templateFileName=getTemplateName(templatePath);
String templateFilePath=getTemplatePath(templatePath);
if(StringUtils.isEmpty(templatePath)){
throw new FreeMarkerException("templatePath can not be empty!");
}
try{
Configuration config = new Configuration(Configuration.VERSION_2_3_25);//FreeMarker配置
config.setDefaultEncoding("UTF-8");
config.setDirectoryForTemplateLoading(new File(templateFilePath));//注意这⾥是模板所在⽂件夹,不是⽂件config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
config.setLogTemplateExceptions(false);
Template template = Template(templateFileName);//根据模板名称 获取对应模板
StringWriter writer = new StringWriter();
template.process(data, writer);//模板和数据的匹配
writer.flush();
String html = String();
return html;
}catch (Exception ex){
throw new FreeMarkerException("FreeMarkerUtil process fail",ex);
}
}
3、导出模板到PDF⽂件
/**
* @description 导出pdf到⽂件
* @param fileName 输出PDF⽂件名
* @param data 模板所需要的数据
*
*/
public String exportToFile(String fileName,Object data){
try {
String htmlData= Content(fileName, data);
if(StringUtils.isEmpty(saveFilePath)){
saveFilePath=getDefaultSavePath(fileName);
}
File file=new File(saveFilePath);
if(!ParentFile().exists()){
}
FileOutputStream outputStream=null;
try{
/
/设置输出路径
outputStream=new FileOutputStream(saveFilePath);
//设置⽂档⼤⼩
Document document = new Document(PageSize.A4);
PdfWriter writer = Instance(document, outputStream); //设置页眉页脚
PDFBuilder builder = new PDFBuilder(headerFooterBuilder,data); builder.setPresentFontSize(10);
writer.setPageEvent(builder);
//输出为PDF⽂件
convertToPDF(writer,document,htmlData);
}catch(Exception ex){
throw new PDFException("PDF export to File fail",ex);
}finally{
IOUtils.closeQuietly(outputStream);getsavefilename
}
} catch (Exception e) {
e.printStackTrace();
}
return saveFilePath;
}
4、测试⼯具类
public String createPDF(Object data, String fileName){
//pdf保存路径
try {
//设置⾃定义PDF页眉页脚⼯具类
PDFHeaderFooter headerFooter=new PDFHeaderFooter();
PDFKit kit=new PDFKit();
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论