itextpdf freemarker渲染
现有需求涉及到打印pdf操作,简单找了俩种方式
- 在现有的模板上进行编辑,操作难度比较大
- 通过freemarker生成静态页面,在进行转换html,完美。
关于动态生成pdf,网上参考的挺多的,看来看去还是觉得通过FreeMarker+IText生成pdf最为简单
参考地址 https://www.cnblogs.com/yunfeiyang-88/p/10984740.html
github demo地址 https://github.com/chywx/spring-boot-pdf/blob/freemarker-print/src/main/java/cn/chendahai/html2pdf/JavaToPdfHtmlFreeMarkerBet.java
撸起来
建立springboot工程
添加maven依赖
<!-- freemarker依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- itextpdf依赖 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.2</version>
</dependency>
<!-- 更好的css支持 -->
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.1.20</version>
</dependency>
application.properties配置freemarker,默认配置
spring.freemarker.charset=UTF-8
spring.freemarker.suffix=.ftl
spring.freemarker.content-type=text/html; charset=utf-8
spring.freemarker.template-loader-path=classpath:/templates
spring.mvc.static-path-pattern=/static/**
测试代码
public class JavaToPdfHtmlFreeMarkerBet {
private static final String DEST = "target/bet-gg.pdf";
private static final String HTML = "index7.html";
private static final String IMG_PATH = "file:///D:/project/javaproject/spring-boot-pdf/src/main/resources/static/";
private static Configuration freemarkerCfg;
static {
freemarkerCfg = new Configuration();
//freemarker的模板目录
try {
freemarkerCfg.setDirectoryForTemplateLoading(new File("src/main/resources/templates/betPrint"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException, DocumentException, com.lowagie.text.DocumentException {
Map<String, Object> data = new HashMap();
data.put("name", "dahai");
String content = JavaToPdfHtmlFreeMarkerBet.freeMarkerRender(data, HTML);
JavaToPdfHtmlFreeMarkerBet.createPdf(content, DEST);
}
/**
* freemarker渲染html
*/
public static String freeMarkerRender(Map<String, Object> data, String htmlTmp) {
Writer out = new StringWriter();
try {
// 获取模板,并设置编码方式
Template template = freemarkerCfg.getTemplate(htmlTmp);
template.setEncoding("UTF-8");
// 合并数据模型与模板
template.process(data, out); //将合并后的数据和模板写入到流中,这里使用的字符流
out.flush();
return out.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
return null;
}
public static void createPdf(String content, String dest) throws IOException, com.lowagie.text.DocumentException {
ITextRenderer render = new ITextRenderer();
// 解析html生成pdf
render.setDocumentFromString(content);
//解决图片相对路径的问题
render.getSharedContext().setBaseURL(IMG_PATH);
render.layout();
render.createPDF(new FileOutputStream(dest));
}
}
web环境
获取模板的话可以直接通过注入FreeMarkerConfigurer来获取
@Autowired
FreeMarkerConfigurer freeMarkerConfigurer;
Template template = freeMarkerConfigurer.getConfiguration().getTemplate("betPrint/print_match.ftl");
设置边距
由于是通过模板进行渲染,所以边距需要前端来进行控制
@page {
margin: 0in 0.1in 0in 0.1in;
mso-header-margin: .5in;
mso-footer-margin: .5in;
mso-page-orientation: landscape;
}
但是打印的时候如果选择实际大小,那会导致前面的配置失效

pdf流形式返回
该实例是直接在本地磁盘生成pdf,如果是web环境下,可以通过生成流的方式,直接返回给客户端,避免了磁盘io
方式就是将
render.createPDF(new FileOutputStream(dest));
修改为
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
render.createPDF(outputStream);
总结:
- html的格式要求符合xml格式,必须要有闭合标签。比如
<input />只能写成<input></input> - 由于这是服务端生成的,自然跟客户端扯不上关系,这一点很好。但是跟window和linux还是有些细小的区别。比如linux字体的最小为12px
- CSS有些语法不支持,比如C3就不支持
- 加载图片可以使用file://协议,linux也是支持的。还有,简单起见,可以直接使用http加载网络图片
- 由于是通过模板渲染,边距,分页等设置就是前端的事了 比如
height: 100%;box-sizing: border-box;即可实现
itextpdf freemarker渲染的更多相关文章
- 问题:JFinal框架使用FreeMarker渲染视图报错
本人用的是JFinal-3.4. 问题描述: 在JFinal框架中使用FreeMarker渲染视图时,报 Caused by: java.lang.ClassNotFoundException: fr ...
- 使用freemarker和itext把html转pdf
1.把html转pdf,首先必须要解决中文显示问题,CSS样式问题以及可能的JS问题,先上例子,自己去体会. 2.先去下载simsun.ttc字体: 2.demo.html <!DOCTYPE ...
- JAVA使用ItextPDF
1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等.方便用户查看,下载,打印.目前常用的解决方案是,把相关数据信息,生成对应的pdf文件返回给用户. ...
- Java iText+FreeMarker生成PDF(HTML转PDF)
1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等.方便用户查看,下载,打印.目前常用的解决方案是,把相关数据信息,生成对应的pdf文件返回给用户. ...
- 在MyEclipse中搭建spring-boot+mybatis+freemarker框架
一.创建项目 1.右键-->New-->Project... 2.选中Maven Project,点击next 3.选中第一个 4.添写Group Id,Artifact Id,选择Com ...
- SpringBoot整合Freemarker+Mybatis
开发工具 , 开始 新建工程 .选择Spring Initializr 下一步 下一步,选择需要的组件 ..改一下工程名,Finish ..目录结构 首先,修改pom文件 然后,将applicatio ...
- Spring Boot 揭秘与实战(七) 实用技术篇 - FreeMarker 模板引擎
文章目录 1. FreeMaker 代替 JSP 作为页面渲染 2. 生成静态文件 3. 扩展阅读 4. 源代码 Spring Boot 提供了很多模板引擎的支持,例如 FreeMarker.Thym ...
- FreeMarker自定义TemplateDirectiveModel
[参考:http://blog.csdn.net/fangzhangsc2006/article/details/8687371] 在采用FreeMarker做前台视图模板的情况下,我们可以通过< ...
- java 替换字符串模板(模板渲染)
java渲染字符串模板,也就是说在java字符串模板中设置变量字符串,使用变量去渲染指定模板中设置好的变量字符串.下面介绍4种替换模板方式: 1.使用内置String.format String me ...
随机推荐
- Oracle 存储过程解锁及表解锁和停止执行
查看进程: select * from v$process; 根据存储过程名称查找是否被锁: select * FROM dba_ddl_locks where name =upper('sp_1') ...
- C# excel文件导入导出
欢迎关注微信公众号 C#编程大全 这里有更多入门级实例帮你快速成长 在C#交流群里,看到很多小伙伴在excel数据导入导出到C#界面上存在疑惑,所以今天专门做了这个主题,希望大家有所收获! 环境:wi ...
- Monkey常用操作
原文:https://www.cnblogs.com/lauren1003/p/6193277.html 一.Monkey测试原理:Monkey是Android中的一个命令行工具,可以运行在模拟器里或 ...
- C语言中数组与指针的异同之处!你不知道的编程奥秘~
C语言的数组和指针一直是两个容易混淆的东西,当初在学习的时候,也许为了通过考试会对指针和数组的一些考点进行突击,但是很多极其细节的东西也许并不是那么清楚.本篇侧重点在于分析数组与指针的关系,什么时候数 ...
- k8s-获取kuboardtoken
master节点执行命令 echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kub ...
- 如何获取前端提交来得json格式数据
composer.json { "require": { "guzzlehttp/guzzle": "~6.0" } } composer ...
- Error:(4, 17) java: 程序包org.junit不存在
内容:Error:(4, 17) java: 程序包org.junit不存在 场景:运行测试类的时候,IED新建一个自己的项目,并且不用maven的情况下 解决方案:File -> Projec ...
- linux ssh自动输入密码,expect使用
想搞一个使用ssh登录批量ip地址执行命令,自动输入密码的脚本,但是ssh不能使用标准输入来实现自动输入密码,于是了解到了expect这个可以交互的命令 是什么 查看使用man查看expect,是这么 ...
- ssm整合之applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- Stream(二)
public class Test { /* * Stream接口: * 实现类 * IntStream * DoubleStream * LongStream * * 一.创建Stream * 1. ...