1. 利用Java动态生成 PDF 文档,则需要开源的API。首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档。那么目前最佳的解决方案,你可能会想到 iText ,对没错。。。 iText+(Velocity / Freemarker)可以实现。不过据我熟悉,iText本身提供的HTML解析器还是不够强大,许多HTML标签和属性无法识别,更悲催的是简单的CSS它不认识,排版调整样式会让你头大的。不要失望,接下来我就来介绍一个比较理想的解决方案 flying-saucer + iText + Velocity / Freemarker)。
  2. 大家都知道 iText 是一个生成PDF文档的开源Java库,能够动态的从XML或者数据库生成PDF,同时还可以对文档进行加密,权限控制,甭且还支持Java/C#等。。。
  3. flying-saucer也是导出PDF的一种解决方案并且是基于iText的开源API,并且实现了CSS解析器,能够很好的支持CSS2.1,以及少量的CSS3
  4.  
  5. 生成PDF解决方案: Flying-Saucer + iText + Velocity
  6. 1. 第一步
  7. jar包放到你的工程里,需要的jar如下:
  8.  
  9. bcprov-jdk15-140.jar
  10. core-renderer.jar
  11. iText-2.0.8.jar
  12. iTextAsian.jar
  13. velocity-1.4.jar
  14.  
  15. Jar包下载地址:http://code.google.com/p/flying-saucer/downloads/list
  16. 2. 第二步
  17. 设计模版,进行排版调整样式,css样式也可以导入@import 等,通过Velocity模版引擎动态替换 页面内容,以下是模版内容:
  18. <?xml version="1.0" encoding="UTF-8" ?>
  19. <html>
  20. <head>
  21. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  22. <title>PDF模版</title>
  23. <style type="text/css">
  24. <!--
  25. body {
  26. font: 100% Verdana, Arial, Helvetica, sans-serif;
  27. margin: 0;
  28. padding: 0;
  29. text-align: center;
  30. color: #000000;
  31. }
  32. .oneColLiqCtrHdr #container {
  33. width: 100%;
  34. margin: 0 auto;
  35. text-align: left;
  36. }
  37. div.header-left {display: none}
  38. div.header-right {display: none}
  39. div.footer-left {display: none}
  40. div.footer-right {display: none}
  41. @media print {
  42. div.header-left {
  43. display: block;
  44. position: running(header-left);
  45. }
  46. div.header-right {
  47. display: block;
  48. position: running(header-right);
  49. }
  50. div.footer-left {
  51. display: block;
  52. position: running(footer-left);
  53. }
  54. div.footer-right {
  55. display: block;
  56. position: running(footer-right);
  57. }
  58. }
  59. @page {
  60. margin: 0.65in;
  61. padding: 1em;
  62. @top-left{
  63. content:element(header-left);
  64. };
  65. @top-right {
  66. content: element(header-right)
  67. };
  68. @bottom-left {
  69. content: element(footer-left)
  70. };
  71. @bottom-right {
  72. content: element(footer-right)
  73. };
  74. }
  75. #pagenumber:before {
  76. content: counter(page);
  77. }
  78. #pagecount:before {
  79. content: counter(pages);
  80. }
  81. .tbClass {
  82. width:100%;height:100%;
  83. border-left:1px #000000 solid;
  84. border-bottom:1px #000000 solid
  85. }
  86. .tbClass td {
  87. border-top:1px #000000 solid;
  88. border-right:1px #000000 solid
  89. }
  90. @page landscape{
  91. size:841.9pt 595.3pt;
  92. mso-page-orientation:landscape;
  93. margin:89.85pt 72.0pt 89.85pt 72.0pt;
  94. mso-header-margin:42.55pt;
  95. mso-footer-margin:49.6pt;
  96. mso-paper-source:0;
  97. layout-grid:15.6pt;
  98. }
  99. div.landscape{
  100. page:landscape;
  101. }
  102. @page portrait{
  103. size:595.3pt 841.9pt;
  104. margin:36.0pt 36.0pt 36.0pt 36.0pt;
  105. mso-header-margin:42.55pt;
  106. mso-footer-margin:49.6pt;
  107. mso-paper-source:0;
  108. layout-grid:16.3pt 0pt;
  109. mso-layout-grid-char-alt:0;
  110. }
  111. div.portrait{
  112. page:portrait;
  113. }
  114. -->
  115. </style>
  116. </head>
  117. <body class="oneColLiqCtrHdr">
  118. <div id="container">
  119. <div id="header">
  120. <!--***************页眉_start*****************-->
  121. <div id="header-left" class="header-left" align="left">
  122. 页眉左侧
  123. </div>
  124. <div id="header-right" class="header-right">
  125. 页眉右侧
  126. </div>
  127. <!--***************页眉_end*****************-->
  128. </div>
  129. <div id="footer">
  130. <!--***************页脚_start*****************-->
  131. <div id="footer-left" class="footer-left" align="left">
  132. 页脚左侧
  133. </div>
  134. <div id="footer-right" class="footer-right" align="right">
  135. 页脚右侧
  136. </div>
  137. <!--***************页脚_endt*****************-->
  138. </div>
  139. <div id="mainContent">
  140. <!-- start #mainContent -->
  141. <div>内容1</div>
  142. <div class="portrait" style="page-break-after:always"><!--分页-->
  143. <div>内容2</div>
  144. <div class="portrait" style="page-break-after:always"><!--分页-->
  145. <div class="landscape">内容3 横向显示</div>
  146. <!-- end #mainContent -->
  147. </div>
  148. </div>
  149. </body>
  150. </html>
  151. 3. 模版与业务数据整合
  152. @SuppressWarnings("unchecked")
  153. //打印业务数据对象baseInfo
  154. public void getPdf(BASEINFO baseInfo) throws Exception{
  155.  
  156. String sysurl = PdfBO.class.getProtectionDomain().getCodeSource().getLocation().getPath();
  157. sysurl = sysurl.substring(0,sysurl.indexOf("WEB-INF/",0));
  158. sysurl = java.net.URLDecoder.decode(sysurl, "UTF-8");
  159. //首先创建一个模板引擎的实例
  160. VelocityEngine engine = new VelocityEngine();
  161. //模版路径
  162. String tempath = sysurl+"\\pdf\\template";
  163. //设置参数
  164. engine.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, tempath);
  165. engine.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
  166. engine.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
  167. //初始化
  168. engine.init();
  169. //获得模板
  170. Template template = engine.getTemplate("template.html");
  171. //创建上下文,填充数据
  172. VelocityContext context = new VelocityContext();
  173. context.put("baseInfo",baseInfo);
  174. PrintUtils pdfUtil = new PrintUtils();
  175. context.put("PrintUtils", pdfUtil);
  176. //现在,把模板和数据合并,输出到Writer
  177. String vmpath = sysurl + "\\pdf\\template\\a.html";
  178. Writer writer = new PrintWriter(new FileOutputStream(new File(vmpath)));
  179. template.merge(context,writer);
  180. writer.flush();
  181. //生成PDF电子文档
  182. String sysurl = PdfBO.class.getProtectionDomain().getCodeSource().getLocation().getPath();
  183. sysurl = sysurl.substring(0,sysurl.indexOf("WEB-INF/",0));
  184. sysurl = java.net.URLDecoder.decode(sysurl, "UTF-8");
  185. //转换的文档路径
  186. String inFileUrl = sysurl + "\\pdf\\template\\a.html";
  187. String url = new File(inFileUrl).toURI().toURL().toString();
  188. //转换后PDF文件的输出路径
  189. String outFile_url_ = sysurl + "\\pdf\\doc\\a.pdf";
  190. OutputStream output = new FileOutputStream(outFile_url_);
  191. //实例ITextRenderer,加载html文档
  192. ITextRenderer renderer = new ITextRenderer();
  193. renderer.setDocument(url);
  194. //支持中文
  195. ITextFontResolver fontResolver = renderer.getFontResolver();
  196. fontResolver.addFont("C:/Windows/Fonts/ARIALUNI.TTF",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
  197. //PDF页眉图片路径
  198. renderer.getSharedContext().setBaseURL("file:"+sysurl+"\\images\\a.gif");
  199. renderer.layout();
  200. renderer.createPDF(output);
  201. output.close();
  202. PdfReader reader = new PdfReader(outFile_url_);
  203. // 加水印后PDF文件输出路径
  204. String filePath_stamper = sysurl + "\\pdf\\doc\\my.pdf";
  205. PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(filePath_stamper));
  206. BaseFont base = BaseFont.createFont("STSong-Light", "UniGB- UCS2-H",BaseFont.NOT_EMBEDDED);
  207. int total = reader.getNumberOfPages() + 1;
  208. //水印图片的路径
  209. String imageFilePath = sysurl + "\\images\\b.gif";
  210. Image image = Image.getInstance(imageFilePath);
  211. image.setAbsolutePosition(20, 50);
  212. image.scalePercent(50);
  213. PdfContentByte under;
  214. for (int i = 1; i < total; i++) {
  215. under = stamper.getUnderContent(i);
  216. under.addImage(image);
  217. under.beginText();
  218. under.setColorFill(Color.CYAN);
  219. under.setFontAndSize(base, 30);
  220. under.endText();
  221. }
  222. stamper.close();}
  223. }
  224. 5、生成PDF完成

利用Java动态生成 PDF 文档的更多相关文章

  1. 手把手教你使用 Java 在线生成 pdf 文档

    一.介绍 在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需要提供相关的电子凭证信息给用户,例如网银/支付宝/微信购物支付的电子发票.订单的库存打印单.各种电子签署合同等等,以方便用户查 ...

  2. [转载]Java动态生成word文档(图文并茂)

    很多情况下,软件开发者需要从数据库读取数据,然后将数据动态填充到手工预先准备好的Word模板文档里,这对于大批量生成拥有相同格式排版的正式文件非常有用,这个功能应用PageOffice的基本动态填充功 ...

  3. [原创]Java动态生成word文档(图文并茂)

    很多情况下,软件开发者需要从数据库读取数据,然后将数据动态填充到手工预先准备好的Word模板文档里,这对于大批量生成拥有相同格式排版的正式文件非常有用,这个功能应用PageOffice的基本动态填充功 ...

  4. 自动把动态的jsp页面(或静态html)生成PDF文档,并且上传至服务器

    置顶2017年11月06日 14:41:04 阅读数:2311 这几天,任务中有一个难点是把一个打印页面自动给生成PDF文档,并且上传至服务器,然而公司框架只有手动上传文档,打印时可以保存为PDF在本 ...

  5. qt 利用 HTML 生成PDF文档,不能显示jpg图片

    利用 QPrinter 和html 生成 pdf文档 其中用html语句有显示图片的语句 但只能显示png格式的图片,不能显示jpg格式图片. 经过排查:语法,文件路径等都正确,最终在stack ov ...

  6. Java 动态生成 PDF 文件

    每片文章前来首小诗:   今日夕阳伴薄雾,印着雪墙笑开颜.我心仿佛出窗前,浮在半腰望西天.  --泥沙砖瓦浆木匠 需求: 项目里面有需要java动态生成 PDF 文件,提供下载.今天我找了下有关了,系 ...

  7. Spring Boot集成JasperReports生成PDF文档

    由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲染生成PDF文档.本人文采欠缺,写作能力 ...

  8. 使用PHP生成PDF文档

    原文:使用PHP生成PDF文档 实际工作中,我们要使用PHP动态的创建PDF文档,目前有许多开源的PHP创建PDF的类库,今天我给大家来介绍一款优秀的PDF库,它就是TCPDF,TCPDF是一个用于快 ...

  9. C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例

    C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...

随机推荐

  1. 基于Vue2.0的单页面开发方案

    2016的最后一天,多多少少都应该总结一下这一年的得失,哪里做的好,哪里需要改进,记一笔,或许将来会用到呢. 毕业差不多半年了,一直是一个人在负责公司项目的前端开发与维护,当时公司希望前后端分离,提高 ...

  2. git 命令总结

    1 删除分支 git push origin :branch name(Task_******) //删除远程分支 git branch -D branch name(Task_******)     ...

  3. DevOps对于企业IT的价值

    其实从敏捷延展开的 DevOps 概念很早就已经被提出,不过由于配套的技术成熟度水平层次不齐, DevOps 的价值一直没有有效地发挥出来.现如今,随着容器技术的发展, DevOps 在企业中的实践难 ...

  4. svnserver hook python

    在使用中可能会遇到的错误排除 :1.Error: svn: 解析"D:\www\test"出错,或svn: E020024: Error resolving case of 'D: ...

  5. (译)你应该知道的jQuery技巧

    帮助提高你jQuery应用的简单小技巧. 回到顶部按钮 图片预加载 判断图片是否加载完 自动修补破损图像 Hover切换class类 禁用输入 停止正在加载的链接 toggle fade/slide ...

  6. [.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店

    一.前言 在前面专题一中,我已经介绍了我写这系列文章的初衷了.由于dax.net中的DDD框架和Byteart Retail案例并没有对其形成过程做一步步分析,而是把整个DDD的实现案例展现给我们,这 ...

  7. TODO:数据库优化之分页

    TODO:数据库优化之分页 本文的例子是以MongoDB数据库为准,其它数据库各位也可以举一反三进行优化. 在MongoDB中分页使用 a.skip(n)跳过前n个匹配的文档: b.limit(m)返 ...

  8. MySQL基础之存储过程

    学过之后却没有总结,今天好不容易有点时间来看看. 存储过程的优势 1.简化复杂的SQL语句,将多个SQL语句封装成为一个存储过程,可以在其中加上一些流程控制语句 2.存储过程封装在数据库内部,编译之后 ...

  9. (转载)解决“Windows Update一直无法完成”的方法

    近日彻底重装系统,启动Win7的"Windows Update",程序显示在检查更新,却一直没有结果. 在排除网络问题,排除杀毒软件和防火墙的问题之后,感觉还是程序或者配置除了问题 ...

  10. 在SQL Server中为什么不建议使用Not In子查询

        在SQL Server中,子查询可以分为相关子查询和无关子查询,对于无关子查询来说,Not In子句比较常见,但Not In潜在会带来下面两种问题: 结果不准确 查询性能低下       下面 ...