博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用Java动态生成 PDF 文档
阅读量:7252 次
发布时间:2019-06-29

本文共 4653 字,大约阅读时间需要 15 分钟。

利用Java动态生成 PDF 文档,则需要开源的API。首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档。那么目前最佳的解决方案,你可能会想到 iText ,对没错。。。 iText+(Velocity / Freemarker)可以实现。不过据我熟悉,iText本身提供的HTML解析器还是不够强大,许多HTML标签和属性无法识别,更悲催的是简单的CSS它不认识,排版调整样式会让你头大的。不要失望,接下来我就来介绍一个比较理想的解决方案 flying-saucer + iText + (Velocity / Freemarker)。          大家都知道 iText 是一个生成PDF文档的开源Java库,能够动态的从XML或者数据库生成PDF,同时还可以对文档进行加密,权限控制,甭且还支持Java/C#等。。。          flying-saucer也是导出PDF的一种解决方案并且是基于iText的开源API,并且实现了CSS解析器,能够很好的支持CSS2.1,以及少量的CSS3           生成PDF解决方案: Flying-Saucer + iText + Velocity1.  第一步将jar包放到你的工程里,需要的jar如下:      bcprov-jdk15-140.jar     core-renderer.jar     iText-2.0.8.jar     iTextAsian.jar     velocity-1.4.jar Jar包下载地址:http://code.google.com/p/flying-saucer/downloads/list2.  第二步设计模版,进行排版调整样式,css样式也可以导入@import 等,通过Velocity模版引擎动态替换 页面内容,以下是模版内容:
PDF模版
内容1
内容2
内容3 横向显示
3. 模版与业务数据整合 @SuppressWarnings("unchecked") //打印业务数据对象baseInfo public void getPdf(BASEINFO baseInfo) throws Exception{ String sysurl = PdfBO.class.getProtectionDomain().getCodeSource().getLocation().getPath(); sysurl = sysurl.substring(0,sysurl.indexOf("WEB-INF/",0)); sysurl = java.net.URLDecoder.decode(sysurl, "UTF-8"); //首先创建一个模板引擎的实例 VelocityEngine engine = new VelocityEngine(); //模版路径 String tempath = sysurl+"\\pdf\\template"; //设置参数 engine.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, tempath); engine.setProperty(Velocity.INPUT_ENCODING, "UTF-8"); engine.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8"); //初始化 engine.init(); //获得模板 Template template = engine.getTemplate("template.html"); //创建上下文,填充数据 VelocityContext context = new VelocityContext(); context.put("baseInfo",baseInfo); PrintUtils pdfUtil = new PrintUtils(); context.put("PrintUtils", pdfUtil); //现在,把模板和数据合并,输出到Writer String vmpath = sysurl + "\\pdf\\template\\a.html"; Writer writer = new PrintWriter(new FileOutputStream(new File(vmpath))); template.merge(context,writer); writer.flush(); //生成PDF电子文档 String sysurl = PdfBO.class.getProtectionDomain().getCodeSource().getLocation().getPath(); sysurl = sysurl.substring(0,sysurl.indexOf("WEB-INF/",0)); sysurl = java.net.URLDecoder.decode(sysurl, "UTF-8"); //转换的文档路径 String inFileUrl = sysurl + "\\pdf\\template\\a.html"; String url = new File(inFileUrl).toURI().toURL().toString(); //转换后PDF文件的输出路径 String outFile_url_ = sysurl + "\\pdf\\doc\\a.pdf"; OutputStream output = new FileOutputStream(outFile_url_); //实例ITextRenderer,加载html文档 ITextRenderer renderer = new ITextRenderer(); renderer.setDocument(url); //支持中文 ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont("C:/Windows/Fonts/ARIALUNI.TTF",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); //PDF页眉图片路径 renderer.getSharedContext().setBaseURL("file:"+sysurl+"\\images\\a.gif"); renderer.layout(); renderer.createPDF(output); output.close(); PdfReader reader = new PdfReader(outFile_url_); // 加水印后PDF文件输出路径 String filePath_stamper = sysurl + "\\pdf\\doc\\my.pdf"; PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(filePath_stamper)); BaseFont base = BaseFont.createFont("STSong-Light", "UniGB- UCS2-H",BaseFont.NOT_EMBEDDED); int total = reader.getNumberOfPages() + 1; //水印图片的路径 String imageFilePath = sysurl + "\\images\\b.gif"; Image image = Image.getInstance(imageFilePath); image.setAbsolutePosition(20, 50); image.scalePercent(50); PdfContentByte under; for (int i = 1; i < total; i++) { under = stamper.getUnderContent(i); under.addImage(image); under.beginText(); under.setColorFill(Color.CYAN); under.setFontAndSize(base, 30); under.endText(); } stamper.close();} }5、生成PDF完成

转载地址:http://nxebm.baihongyu.com/

你可能感兴趣的文章
Java线程练习
查看>>
Algs4-1.5.22Erods-renyi模型的倍率实验
查看>>
计算机硬件的组成、python的开发层面及语法介绍
查看>>
python面试知识点
查看>>
栅格布局
查看>>
Zimber 8.8.12卸载后重新安装报错解决办法
查看>>
Git 自救指南
查看>>
spring boot配置项目访问路径,配置拦截器,配置静态虚拟路径
查看>>
linux运维笔记
查看>>
Lake Counting (DFS)
查看>>
信息安全影响因素
查看>>
org.apache.poi 读excel空列跳过的问题
查看>>
hadoop安装
查看>>
作业-闰年流程图
查看>>
delegate事件委托
查看>>
Linux Process VS Thread VS LWP
查看>>
Linux命令——free
查看>>
.net操作AD域
查看>>
IO流实现模拟软件试用的功能
查看>>
ScrollView和ListView滑动冲突问题
查看>>