`

freemarker导出pdf

阅读更多

这个是跟上一篇写的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

 

 

0
0
分享到:
评论

相关推荐

    freemarker 导出word表格

    总结,FreeMarker导出Word表格的核心在于理解XML结构,创建FreeMarker模板,以及正确地绑定数据。这个方法的好处是可以将格式设计与数据分离,使得数据的更新和格式的维护变得更加灵活和高效。在处理大量数据的导出...

    通过freemarker模板 生成PDF

    `PDFTool`可能包含使用Freemarker的方法,如`processTemplate()`,此方法接受模板文件路径、数据模型和目标PDF输出路径作为参数。`FileController`则可能是处理HTTP请求的控制器,它接收一个HTML URL,并调用`PDF...

    freemark模板导出PDF

    本篇文章将详细讲解如何利用FreeMarker模板来导出PDF文件。 1. **FreeMarker基本概念** FreeMarker是Java语言的一个模板引擎,它与Spring、Struts等框架结合紧密,允许开发者将逻辑代码与展示层分离,通过模板文件...

    freemarker解析成pdf

    5. **生成PDF**:使用Freemarker的`process`方法将模板和数据模型结合,然后通过一个PDF库(如iText或Apache PDFBox)将结果转换为PDF。以下是一个使用iText的例子: ```java StringWriter writer = new ...

    freemarker+itext生成PDF

    这篇博客 "freemarker+itext生成PDF" 可能详细介绍了如何结合这两者来生成PDF文件,这在报表生成、发票打印或任何需要静态化输出的场景中非常有用。 首先,让我们了解FreeMarker。FreeMarker是一个基于模板的语言,...

    freemarker+html生成pdf.zip

    - Java代码:实现了`Freemarker`的配置、数据模型的构建、模板处理以及PDF生成。 - 示例数据:用于填充模板的数据。 - 测试用例:可能包含单元测试或集成测试,用于验证生成PDF的正确性。 在实际开发中,你可能需要...

    Freemarker导出 word 和 pdf 工具类

    使用Freemarker导出Word文档通常需要结合Apache POI库。首先,创建一个Freemarker模板,定义好文档结构和占位符。然后,通过Freemarker API将数据模型与模板关联,最后利用POI将生成的HTML转换为Word文档。 3. ...

    基于itext7+freemarker模板导出pdf

    本教程将探讨如何使用iText7和FreeMarker库结合,来创建一个基于模板的PDF生成流程,确保中文支持和图片的正常显示。 首先,iText7是一款强大的Java库,专门用于生成和操作PDF文档。它提供了丰富的API,可以方便地...

    itext 导出pdf 例子

    本示例将深入讲解如何利用iText库来导出PDF文件,以满足特定的需求。 首先,确保已将iText库添加到项目依赖中。通常,可以通过Maven或Gradle来引入。对于Maven项目,可以在pom.xml文件中添加以下依赖: ```xml ...

    Java中使用 FreeMarker 生成pdf盖章合同文件

    Java中使用FreeMarker生成PDF合同文件的过程主要包括配置FreeMarker环境、创建数据模型、解析模板、生成PDF以及添加图片盖章。通过结合FreeMarker的灵活性和Flying Saucer的转换能力,我们可以方便地将动态生成的...

    Freemarker导出word示例,包括jfreechart图表

    Freemarker是一个强大的Java模板引擎,它允许开发者使用模板语言来分离应用的逻辑与呈现层。在本示例中,Freemarker被用于生成Word文档,实现数据与模板的结合,使得动态生成Word文档变得更加简单。 首先,让我们...

    java根据模板导出PDF详细教程(包含统计图).rar

    在本文档中,我们将探讨如何使用Java来根据模板导出包含统计图的PDF文档。主要涉及的技术包括iText库、FreeMarker模板引擎以及可能的数据处理和图形生成。 首先,iText是一个强大的Java库,用于创建和修改PDF文档。...

    JAVA项目代码绘制PDF和通过freemarker动态生成PDF

    1. itextpdf(CreatePdf) 不太推荐需要在代码内部编写PDF格式,如果要使用,建议写个基类,将同一版本 或者同一类型的公共方法写入,差异化的抽象,一个模板一个子类,子类使用@Component命名,使用反射的方式获取...

    利用freemarker 模板生成pdf ,利用easypoi 生成excel(带图片,水印,分页)

    本主题将探讨如何利用Freemarker模板生成PDF以及如何使用EasyPOI生成带有图片、水印和分页功能的Excel。 首先,让我们深入了解Freemarker。Freemarker是一个强大的模板引擎,它用于生成文本输出,如HTML、XML或PDF...

    freemarker导出Excel、Word、HTMLdemo

    - 使用Freemarker导出Excel通常涉及到Apache POI库。首先,你需要创建一个Freemarker模板文件,定义好表格的结构和样式,然后将Java对象的数据填充到模板中。 - 创建`ftl`文件,例如`excel.ftl`,设置表格行、列的...

    freemarker导出Word和pdf工具类

    总结来说,使用FreeMarker导出Word和PDF文件是一种灵活且高效的方式,它可以将动态数据与预设的模板结合,生成符合特定格式的文档。通过封装工具类,可以方便地在各种项目中复用这段代码,提高开发效率。在实际应用...

    java使用freemarker模板技术导出word

    Java 使用 FreeMarker 模板技术导出 Word 是一种常见的数据动态生成文档的方法,它结合了 Java 的编程能力和 FreeMarker 模板引擎的强大功能,能够帮助开发者高效地生成结构化的 Word 文档。FreeMarker 是一个开源的...

    java根据模板导出PDF详细教程(包含统计图)

    本文将深入探讨如何使用Java来根据模板导出包含统计图的PDF文档。主要涉及的技术包括iText库、FreeMarker模板引擎以及可能的数据可视化工具。 首先,iText是一个强大的Java库,专门用于创建和操作PDF文档。它提供了...

    一个freemarker导出word的通用包

    "一个freemarker导出word的通用包"就是解决这个问题的一个实用工具。这个工程利用了FreeMarker模板引擎,它是一个强大的、轻量级的、基于Java的模板语言,用于生成动态HTML、XML、PDF或其他格式的文本输出。以下是...

    Spring Boot集成OpenPDF和Freemarker实现PDF导出功能教程配套源码

    该源码对应个人博客【Spring Boot集成OpenPDF和Freemarker实现PDF导出功能并附源码】配套教程,地址:https://blog.csdn.net/lhmyy521125/article/details/140743558 小伙伴可以自行下载学习!不需要积分!不需要...

Global site tag (gtag.js) - Google Analytics