这个是跟上一篇写的freemarker导出word是一块的。但是关联性不是很大。由于本人技术有限本篇导出也是根据网上大家的做出的demo混合而成。有不足的地方请大家指出。好改正,使以后看到的freemarker导出pdf的朋友们能通俗易懂上手。
本程序是在maven中实现的所以如果有的朋友是用jar包实现的请注意版本号。
<!-- itext 组件 --> <dependency> <groupId>com.itextpdf.tool</groupId> <artifactId>xmlworker</artifactId> <version>5.5.10</version> </dependency> <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>2.0.8</version> </dependency> <!-- freemarker --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.20</version> </dependency> <dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-pdf</artifactId> <version>9.0.9</version> </dependency> <dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>core-renderer</artifactId> <version>R8</version> </dependency>
这里需要注意下。itext要用2.0.8的版本要不然会在下面的itext使用的时候报字节错误。
程序也是个在web中实现的所以代码实现的时候也是访问的。
@RequestMapping(value="/pdfdown",method={RequestMethod.GET,RequestMethod.POST}) public void PDFchange(HttpServletRequest request, HttpServletResponse response) throws Exception{ //从数据库中查询需要的条件 Map<String,Object> variables = new HashMap<String,Object>(); List<UserTestBean> userList = new ArrayList<UserTestBean>(); UserTestBean tom = new UserTestBean("Tom",19,1); UserTestBean amy = new UserTestBean("Amy",28,0); UserTestBean leo = new UserTestBean("Leo",23,1); userList.add(tom); userList.add(amy); userList.add(leo); variables.put("title", "你看"); variables.put("userList", userList); /*variables.put("title","gerenjianli"); variables.put("userName","xueyucheng"); variables.put("userSex","man"); variables.put("userAge","17"); variables.put("height","161");sss variables.put("address","handan"); variables.put("University","ligong");sssss variables.put("skill","jineng"); variables.put("content","asdasasd");*/ String ftlName="ceshi.ftl"; //然后组装好之后调用该方法 FTLIMAGEPATH是用的配置模板中的内容实现的 try { ByteArrayOutputStream bos= PDFUtil.createPDF(request, ftlName, variables,FTLIMAGEPATH);/**字节*/ PDFUtil.renderPdf(response, bos.toByteArray(), "123"); } catch (Exception e) { logger.error("pdf导出出错。。。",e); } }
bean可以自己随便写个只要按照模式就行。下面也是调用的pdf工具类。让其实现的是客户端下载保存。没有在服务器端保存
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.io.Writer; import java.util.Locale; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.xhtmlrenderer.pdf.ITextFontResolver; import org.xhtmlrenderer.pdf.ITextRenderer; import com.lowagie.text.pdf.BaseFont; import freemarker.template.Configuration; import freemarker.template.Template; /** * pdf转换类 * @author test fengruiqi * 创建 时间2017年2月4日 上午9:36:42 * */ public class PDFUtil { /** * 创建pdf * @author fengruiqi * 创建时间 2017年2月4日 下午6:47:18 * @param request * @param ftlName * @param root * @return * @throws Exception */ public static ByteArrayOutputStream createPDF(HttpServletRequest request, String ftlName,Map root,String imageName) throws Exception { String basePath =request.getSession().getServletContext().getRealPath("/");//绝对路径 String basePath2=basePath.replaceAll("\\\\", "/"); Configuration cfg = new Configuration(); try { cfg.setLocale(Locale.CHINA); cfg.setEncoding(Locale.CHINA, "UTF-8"); //设置编码 cfg.setDefaultEncoding("UTF-8"); //设置模板路径 cfg.setDirectoryForTemplateLoading(new File(basePath + "/WEB-INF/views/ftl/")); //解决图片路径问题 设置好图片所选择的路径 if(imageName!=null && !"".equals(imageName)){ root.put("imagePath",imageName); } //获取模板 Template template = cfg.getTemplate(ftlName); template.setEncoding("UTF-8"); Writer writer = new StringWriter(); //数据填充模板 template.process(root, writer); String str = writer.toString(); //pdf生成 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); ITextRenderer iTextRenderer = new ITextRenderer(); iTextRenderer.setDocumentFromString(str); //设置字体 其他字体需要添加字体库 ITextFontResolver fontResolver = iTextRenderer.getFontResolver(); fontResolver.addFont(basePath + "/WEB-INF/views/font/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); iTextRenderer.setDocument(builder.parse(new ByteArrayInputStream(str.getBytes())),null); iTextRenderer.layout(); //生成PDF ByteArrayOutputStream baos = new ByteArrayOutputStream(); iTextRenderer.createPDF(baos); baos.close(); return baos; } catch(Exception e) { throw new Exception(e); } } /** * 客户端下载pdf * @author fengruiqi * 创建时间 2017年2月4日 下午7:05:01 * @param response * @param bytes * @param filename */ public static void renderPdf(HttpServletResponse response, final byte[] bytes, final String filename) { /* initResponseHeader(response, PDF_TYPE); */ setFileDownloadHeader(response, filename, ".pdf"); if (null != bytes) { try { response.getOutputStream().write(bytes); response.getOutputStream().flush(); } catch (IOException e) { throw new IllegalArgumentException(e); } } } /** * 分析并设置contentType与headers. */ /* private HttpServletResponse initResponseHeader(HttpServletResponse response, final String contentType, final String... headers) { // 分析headers参数 String encoding = DEFAULT_ENCODING; boolean noCache = DEFAULT_NOCACHE; for (String header : headers) { String headerName = StringUtils.substringBefore(header, ":"); String headerValue = StringUtils.substringAfter(header, ":"); if (StringUtils.equalsIgnoreCase(headerName, HEADER_ENCODING)) { encoding = headerValue; } else if (StringUtils.equalsIgnoreCase(headerName, HEADER_NOCACHE)) { noCache = Boolean.parseBoolean(headerValue); } else { throw new IllegalArgumentException(headerName + "不是一个合法的header类型"); } } // 设置headers参数 String fullContentType = contentType + ";charset=" + encoding; response.setContentType(fullContentType); if (noCache) { // Http 1.0 header response.setDateHeader("Expires", 0); response.addHeader("Pragma", "no-cache"); // Http 1.1 header response.setHeader("Cache-Control", "no-cache"); } return response; } */ /** * 设置让浏览器弹出下载对话框的Header * @author fengruiqi * 创建时间 2017年2月4日 下午6:58:44 * @param response * @param fileName * @param fileType */ public static void setFileDownloadHeader(HttpServletResponse response, String fileName, String fileType) { try { // 中文文件名支持 String encodedfileName = new String(fileName.getBytes("GBK"), "ISO8859-1"); response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedfileName + fileType + "\""); } catch (UnsupportedEncodingException e) { } } }
。
我在解决图片路径的问题时候没有用网上的使用绝对路径的方法,而是在模板中设置了存储路径的字段,
在程序中直接做成村路路径访问。不知道是因为包的原因还是其他什么,使用绝对路径我这里发现不了图片导出一直有错。
<html> <head> <title>${title}</title> <style> table { width:100%;border:green dotted ;border-width:2 0 0 2 } td { border:green dotted;border-width:0 2 2 0 } @page { size: 8.5in 11in; @bottom-center { content: "page " counter(page) " of " counter(pages); } } <#--使用字体一定要定义好--> body { font-family: SimSun; font-size:14px; font-style:italic; font-weight:500; } .heiti { font-family: simsun-bold; } </style> </head> <body> <h1>Just a blank page.</h1> <div style="page-break-before:always;"> <div align="center"> <h1>${title}</h1> </div> <div> <#-- freemarker的注释 imagePath是用来存储路径的 --> 图片支持 <img src="${imagePath}add.png " /> </div> <table> <tr> <td><b>Name</b></td> <td><b>Age</b></td> <td><b>Sex</b></td> </tr> <#list userList as user> <tr> <td>${user.name}</td> <td>${user.age}</td> <td> <#if user.sex = 1> male <#else> female </#if> </td> </tr> </#list> </table> </div> </body> </html>
将其需要的内容填充到模板里面使其补充就好,暂时还没发现问题。如果后续有问题再更改。大家发现问题或者有疑问的可以联系我qq963633167
相关推荐
总结,FreeMarker导出Word表格的核心在于理解XML结构,创建FreeMarker模板,以及正确地绑定数据。这个方法的好处是可以将格式设计与数据分离,使得数据的更新和格式的维护变得更加灵活和高效。在处理大量数据的导出...
`PDFTool`可能包含使用Freemarker的方法,如`processTemplate()`,此方法接受模板文件路径、数据模型和目标PDF输出路径作为参数。`FileController`则可能是处理HTTP请求的控制器,它接收一个HTML URL,并调用`PDF...
本篇文章将详细讲解如何利用FreeMarker模板来导出PDF文件。 1. **FreeMarker基本概念** FreeMarker是Java语言的一个模板引擎,它与Spring、Struts等框架结合紧密,允许开发者将逻辑代码与展示层分离,通过模板文件...
5. **生成PDF**:使用Freemarker的`process`方法将模板和数据模型结合,然后通过一个PDF库(如iText或Apache PDFBox)将结果转换为PDF。以下是一个使用iText的例子: ```java StringWriter writer = new ...
这篇博客 "freemarker+itext生成PDF" 可能详细介绍了如何结合这两者来生成PDF文件,这在报表生成、发票打印或任何需要静态化输出的场景中非常有用。 首先,让我们了解FreeMarker。FreeMarker是一个基于模板的语言,...
- Java代码:实现了`Freemarker`的配置、数据模型的构建、模板处理以及PDF生成。 - 示例数据:用于填充模板的数据。 - 测试用例:可能包含单元测试或集成测试,用于验证生成PDF的正确性。 在实际开发中,你可能需要...
使用Freemarker导出Word文档通常需要结合Apache POI库。首先,创建一个Freemarker模板,定义好文档结构和占位符。然后,通过Freemarker API将数据模型与模板关联,最后利用POI将生成的HTML转换为Word文档。 3. ...
本教程将探讨如何使用iText7和FreeMarker库结合,来创建一个基于模板的PDF生成流程,确保中文支持和图片的正常显示。 首先,iText7是一款强大的Java库,专门用于生成和操作PDF文档。它提供了丰富的API,可以方便地...
本示例将深入讲解如何利用iText库来导出PDF文件,以满足特定的需求。 首先,确保已将iText库添加到项目依赖中。通常,可以通过Maven或Gradle来引入。对于Maven项目,可以在pom.xml文件中添加以下依赖: ```xml ...
Java中使用FreeMarker生成PDF合同文件的过程主要包括配置FreeMarker环境、创建数据模型、解析模板、生成PDF以及添加图片盖章。通过结合FreeMarker的灵活性和Flying Saucer的转换能力,我们可以方便地将动态生成的...
Freemarker是一个强大的Java模板引擎,它允许开发者使用模板语言来分离应用的逻辑与呈现层。在本示例中,Freemarker被用于生成Word文档,实现数据与模板的结合,使得动态生成Word文档变得更加简单。 首先,让我们...
在本文档中,我们将探讨如何使用Java来根据模板导出包含统计图的PDF文档。主要涉及的技术包括iText库、FreeMarker模板引擎以及可能的数据处理和图形生成。 首先,iText是一个强大的Java库,用于创建和修改PDF文档。...
1. itextpdf(CreatePdf) 不太推荐需要在代码内部编写PDF格式,如果要使用,建议写个基类,将同一版本 或者同一类型的公共方法写入,差异化的抽象,一个模板一个子类,子类使用@Component命名,使用反射的方式获取...
本主题将探讨如何利用Freemarker模板生成PDF以及如何使用EasyPOI生成带有图片、水印和分页功能的Excel。 首先,让我们深入了解Freemarker。Freemarker是一个强大的模板引擎,它用于生成文本输出,如HTML、XML或PDF...
- 使用Freemarker导出Excel通常涉及到Apache POI库。首先,你需要创建一个Freemarker模板文件,定义好表格的结构和样式,然后将Java对象的数据填充到模板中。 - 创建`ftl`文件,例如`excel.ftl`,设置表格行、列的...
总结来说,使用FreeMarker导出Word和PDF文件是一种灵活且高效的方式,它可以将动态数据与预设的模板结合,生成符合特定格式的文档。通过封装工具类,可以方便地在各种项目中复用这段代码,提高开发效率。在实际应用...
Java 使用 FreeMarker 模板技术导出 Word 是一种常见的数据动态生成文档的方法,它结合了 Java 的编程能力和 FreeMarker 模板引擎的强大功能,能够帮助开发者高效地生成结构化的 Word 文档。FreeMarker 是一个开源的...
本文将深入探讨如何使用Java来根据模板导出包含统计图的PDF文档。主要涉及的技术包括iText库、FreeMarker模板引擎以及可能的数据可视化工具。 首先,iText是一个强大的Java库,专门用于创建和操作PDF文档。它提供了...
"一个freemarker导出word的通用包"就是解决这个问题的一个实用工具。这个工程利用了FreeMarker模板引擎,它是一个强大的、轻量级的、基于Java的模板语言,用于生成动态HTML、XML、PDF或其他格式的文本输出。以下是...
该源码对应个人博客【Spring Boot集成OpenPDF和Freemarker实现PDF导出功能并附源码】配套教程,地址:https://blog.csdn.net/lhmyy521125/article/details/140743558 小伙伴可以自行下载学习!不需要积分!不需要...