freemarket+itext+springboot将html静态页面渲染后导出为pdf文件
1、maven依赖 <dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.4.2</version>
</dependency> <dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>core-renderer</artifactId>
<version>R8</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
2、controller @RequestMapping(value = "projectExport", method = RequestMethod.GET)
public void projectExport(HttpServletRequest request, HttpServletResponse response) {
try { Map map=new HashMap<String,Object>();
map.put("test","测试"); ByteArrayOutputStream baos = PDFUtil.createPDF("templates/project.html", map);
//设置response文件头 PDFUtil.renderPdf(response, baos.toByteArray(), "pdf文件");
baos.close();
} catch (Exception e) {
logger.info("导出报错",e);
}
}
3、PDFUtil import com.itextpdf.text.pdf.BaseFont;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.commons.lang.StringUtils;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer; import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Locale; /**
* PDF工具类
* @author LQX
*
*/
public class PDFUtil { private static String DEFAULT_ENCODING="utf-8";
private static String PDF_TYPE="application/pdf";
private static boolean DEFAULT_NOCACHE=true;
private static String HEADER_ENCODING="utf-8";
private static String HEADER_NOCACHE="no-cache"; /**
* 生成PDF文件流
* @param ftlName 文件名称
* @param root 数据
* @return ByteArrayOutputStream
* @throws Exception
*/
public static ByteArrayOutputStream createPDF(String ftlName, Object root) throws Exception {
//相对路径
File file = new File(PDFUtil.class.getResource("/").getPath());
Configuration cfg = new Configuration();
try {
cfg.setLocale(Locale.CHINA);
cfg.setEncoding(Locale.CHINA, "UTF-8");
//设置编码
cfg.setDefaultEncoding("UTF-8");
//设置模板路径
cfg.setDirectoryForTemplateLoading(file);
//获取模板
Template template = cfg.getTemplate(ftlName);
template.setEncoding("UTF-8");
ITextRenderer iTextRenderer = new ITextRenderer();
//设置字体
ITextFontResolver fontResolver = iTextRenderer.getFontResolver();
fontResolver.addFont(file.getPath() + "/public/font/simsun.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Writer writer = new StringWriter();
//数据填充模板
template.process(root, writer);
//设置输出文件内容及路径
String str = writer.toString();
iTextRenderer.setDocumentFromString(str);
/*iTextRenderer.getSharedContext().setBaseURL("");//共享路径*/
iTextRenderer.layout();
//生成PDF
ByteArrayOutputStream baos = new ByteArrayOutputStream();
iTextRenderer.createPDF(baos);
baos.close();
return baos;
} catch(Exception e) {
throw new Exception(e);
}
}
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 static 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.
* @param
*/
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) {
}
}
}
3、project.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>PDF下载</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style mce_bogus="1" type="text/css">
body {font-family: SimSun; }
@page {size: 800mm 400mm}
</style>
</head>
<body>
<table width="100%" height="60" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td>12345</td>
<td>${test}</td>
<td>abc</td>
</tr>
</table>
</body>
</html>
需要注意的点: (1)、中文字体 html中要将body标签的字体设置为SimSun,然后项目中要放这个字体文件,因为服务器中通常没有这个文件,simsun.ttf字体百度上都可以下载。只有设置了字体后html中的中文才能识别出来。 (2)、css文件 如果你想导的pdf文件的样式是css渲染后的页面样式,一定要注意link中css引用的路径,通常用服务器的绝对路径,你也可以自己换一换路径试试。导出时会因为一些外部的文件的路径写的不对而出现空指针异常,可以先把这些都注释掉再调试。 (3)、html标签 这个工具导出的时候对html标签的要求比较的严格,比如一些闭合标签一定要写完整,href链接中直接请求接口带参数的时候有&连接的时候要在&后面加上amp; (4)、pdf文件的大小 给这个html文件加上css样式@page {size:800mm 400mm}这个样式可以调整pdf的文件,因为我导出的时候宽度达不到我想要的宽度,但是我还是不会动态的去设置这个大小,欢迎知道的小伙伴指教。
————————————————
原文链接:https://blog.csdn.net/haha_66666/article/details/83025919
freemarket+itext+springboot将html静态页面渲染后导出为pdf文件的更多相关文章
- 页面直接导出为PDF文件,支持分页与页边距
将WEB页面直接导出为pdf文件是经常会用到的一个功能,尤其是各种报表系统.总结了一下目前几种主流的做法: 在后端用代码生成pdf文件,比如iText一类: 在后端抓取页面并生成pdf文件,比如pha ...
- 把页面上的图表导出为pdf文件,分享一种请求下载文件的方法
最近客户提出一个需求,就是把页面上的图表导出为pdf文件. 找了很多资料.终于有了点头绪.最主要是参考了HighCharts的做法.http://www.hcharts.cn/ 实现原理:把页面图表的 ...
- 将w3cplus网站中的文章页面提取并导出为pdf文档
最近在看一些关于CSS3方面的知识,主要是平时看到网页中有很多用CSS3实现的很炫的效果,所以就打算系统的学习一下.在网上找到很多的文章,但都没有一个好的整理性,比较凌乱.昨天看到w3cplus网站中 ...
- Vue 页面导出成PDF文件
注意事项 如果导出的页面中设计到图片或者其他文件跨域文件,需要后端服务配合 安装依赖 npm install html2Canvas --save npm install jspdf--save 封装 ...
- hexo 静态页面生成后页面打不开的问题
我这里的原因是4000端口被占用了 *** hexo入门指南教程: 官方文档 用Hexo 3 搭建github blog 做一款hexo主题(进阶) 坑 1 要安装node和git 2 别忘了安装he ...
- 浅谈php生成静态页面
一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权 ...
- PHP代码为什么不能直接保存HTML文件——>PHP生成静态页面教程
1.server会依据文件的后缀名去进行解析,假设是HTML文件则server不会进行语法解析.而是直接输出到浏览器. 2.假设一个页面中所有都是HTML代码而没有须要解析的PHP语法,则没有必要保存 ...
- 怎么给PDF文件交换页面
在使用PDF文件的时候有文件页面的排版错误的时候,这个时候就需要交换页面了,那么怎么给PDF文件交换页面呢,在使用PDF文件的时候需要交换页面的时候要怎么做呢,下面小编就为大家分享一下PDF文件交换页 ...
- 如何将两个PDF文件合并到一个页面中
在目前职场办公中,很多使用的文件格式是PDF文件格式,由于工作的需要,经常需要将PDF文件合并在一起,但由于PDF文件不能直接编辑修改,不能OFFICE,WPS那样,通过复制粘贴将两者合并,那如何解决 ...
随机推荐
- JVM笔记——类加载
1.在java代码中,类型(如class enum interface)的加载.连接.初始化过程都是在程序运行期完成的.这个特性,使得本为静态语言的java,拥有了动态语言的某些特征 加载:查找并加载 ...
- druid监控
1 @ConfigurationProperties(prefix = "spring.datasource") 2 @Bean 3 public DataSource druid ...
- 11. const 修饰成员函数
const 限定只读,对函数的实参进行保护 常数据成员:必须出现在类的定义体中,常数据成员必须进行初始化,并且不能被更新,但常数据成员的初始化只能通过构造函数的初始化列表进行 1. 常函数 成员函数加 ...
- 源码编译搭建LNMP环境
LNMP源码编译 1.LNMP介绍 LNMP=Linux Nginx Mysql PHP Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器.Ng ...
- Java中定时器Timer致命缺点(附学习方法)
简介 这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问.后来还是决定写了主要是想把自己分析问题思路分享给大家,让大家在学习过程中能够参考,学习态度我相信大部分人 ...
- SICP 课程总结 & 复习
SICP 课程总结 & 复习 小作文 有赖于那个终极的.伟大的.命定的教务系统,我选上了这门课:SICP,Structure and Interpret of Computer Program ...
- 杭电2734----Quicksum(C++)(数字与字符的关系)
Quicksum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 关于c语言的知识点不足的地方
在最近的一次c语言考试之前,自己根据老师说的会出原题的卷子的总结 关于代码的自动对齐,dev c++ CTRL+shift+A/a 关于运算顺序的csdn上有,常考的有/ %等 上地址 https:/ ...
- PHP 打水印功能
/** * @param $str 需要打水印的文字 * @param int $size 文字大小 * @param int $red 文字的颜色 rgb r * @param int $gree ...
- 【Java基础】集合
集合 集合概述 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要对对象进行存储.另一方面,使用 Array 存储对象方面具有一些弊端,而 Java 集合就像一种容器 ...