pdf横向打印java_java通过html生成pdf,支持css和图片以及横向打印
项目当中通常会有生成pdf的需求,pdf的排版尤为重要!通过html生成,最为方便.
1. 依赖
工具使用freemarker模板进行数据渲染
org.freemarker
freemarker
2.3.29
commons-fileupload
commons-fileupload
1.4
org.xhtmlrenderer
flying-saucer-pdf
9.1.18
2. 工具类
import java.io.*;
import java.util.Locale;
import java.util.Map;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.lowagie.text.pdf.BaseFont;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class PdfUtil {
/**
* 通过模板导出pdf文件
* @param data 数据
* @param templateFileName 模板文件名
* @throws Exception
*/
public static ByteArrayOutputStream createPDF(Map data, String templateFileName) throws Exception {
// 创建一个FreeMarker实例, 负责管理FreeMarker模板的Configuration实例
Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
// 指定FreeMarker模板文件的位置
cfg.setClassForTemplateLoading(PdfUtil.class,"/templates");
ITextRenderer renderer = new ITextRenderer();
OutputStream out = new ByteArrayOutputStream();
try {
// 设置 css中 的字体样式(暂时仅支持宋体和黑体) 必须,不然中文不显示
renderer.getFontResolver().addFont("/static/font/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
// 设置模板的编码格式
cfg.setEncoding(Locale.CHINA, "UTF-8");
// 获取模板文件
Template template = cfg.getTemplate(templateFileName, "UTF-8");
StringWriter writer = new StringWriter();
// 将数据输出到html中
template.process(data, writer);
writer.flush();
String html = writer.toString();
// 把html代码传入渲染器中
renderer.setDocumentFromString(html);
// 设置模板中的图片路径 (这里的images在resources目录下) 模板中img标签src路径需要相对路径加图片名 如
String url = PdfUtil.class.getClassLoader().getResource("static/images").toURI().toString();
renderer.getSharedContext().setBaseURL(url);
renderer.layout();
renderer.createPDF(out, false);
renderer.finishPDF();
out.flush();
return (ByteArrayOutputStream)out;
} finally {
if(out != null){
out.close();
}
}
}
}
代码中需要注意路径设置,否则会导致css和图片引入无效
cfg.setClassForTemplateLoading(PdfUtil.class,"/templates"); 指定FreeMarker模板文件的位置
renderer.getFontResolver().addFont("/static/font/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 指定字体文件,否则中文不显示
PdfUtil.class.getClassLoader().getResource("static/images").toURI().toString(); 指定模板中图片路径
静态资源目录结构:
3. 使用
建议使用时,先写一个html静态页面,调试好了再复制到ftl文件中,保存成模板
静态index.html
.center{
width: 380px;
height: 538px;
background: url("images/zs.png") center no-repeat;
margin: 10% auto;
font-family: SimSun;
position: relative;
}
.name{
position: absolute;
top: 216px;
left: 60px;
font-size: 20px;
width: 74px;
text-align: center;
display: block;
}
李逍遥
模板zhengshu.ftl
.center{
width: 380px;
height: 538px;
background: url("images/zs.png") center no-repeat;
margin: 15% auto;
font-family: SimSun;
position: relative;
}
.name{
position: absolute;
top: 216px;
left: 60px;
font-size: 20px;
width: 74px;
text-align: center;
display: block;
}
${name}
把需要设置数据的地方,用freemarker语法进行占位${}
单元测试
@Test
public void pdf() throws IOException {
ByteArrayOutputStream baos = null;
FileOutputStream out = null;
try {
Map data = new HashMap<>();
data.put("name", "李逍遥");
baos = PdfUtil.createPDF(data, "zhengshu.ftl");
String fileName = "获奖证书.pdf";
File file = new File(fileName);
out = new FileOutputStream(file);
baos.writeTo(out);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(baos!=null){
baos.close();
}
if(out != null){
out.close();
}
}
}
使用controller
mport java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/pdf")
public class PdfController {
@RequestMapping("/export")
public void exportPdf(HttpServletResponse response) throws Exception{
ByteArrayOutputStream baos = null;
OutputStream out = null;
try {
// 模板中的数据,实际运用从数据库中查询
Map data = new HashMap<>();
data.put("name", "李逍遥");
baos = PdfUtil.createPDF(data, "zhengshu.ftl");;
// 设置响应消息头,告诉浏览器当前响应是一个下载文件
response.setContentType( "application/x-msdownload");
// 告诉浏览器,当前响应数据要求用户干预保存到文件中,以及文件名是什么 如果文件名有中文,必须URL编码
String fileName = URLEncoder.encode("获奖证书.pdf", "UTF-8");
response.setHeader( "Content-Disposition", "attachment;filename=" + fileName);
out = response.getOutputStream();
baos.writeTo(out);
baos.close();
} catch (Exception e) {
e.printStackTrace();
throw new Exception("导出失败:" + e.getMessage());
} finally{
if(baos != null){
baos.close();
}
if(out != null){
out.close();
}
}
}
}
4. 横向打印
有时网页比较宽时,生成的pdf宽度不够,导致显示内容不完整,可以通过在模板css设置@page控制
/*设置页面宽高 A4大小*/
@page{size:297mm 210mm;}
参考:
原文:https://www.cnblogs.com/linyufeng/p/13402901.html
pdf横向打印java_java通过html生成pdf,支持css和图片以及横向打印相关推荐
- java 将html生成图片_java通过html生成pdf,支持css和图片以及横向打印
项目当中通常会有生成pdf的需求,pdf的排版尤为重要!通过html生成,最为方便. 1. 依赖 工具使用freemarker模板进行数据渲染 org.freemarker freemarker 2. ...
- java-使用 flying-saucer 通过 xhtml 生成 pdf 文档支持 css 和 图片
java-使用 flying-saucer 通过 xhtml 生成 pdf 文档支持 css 和 图片 重要说明: 1.使用 xhtml 生成 pdf ,对于 xhtml 的语法要求非常严格: 2.中 ...
- 【iText5 生成PDF】纯Java代码实现生成PDF(自定义表格、文本水印、单元格样式)
工作中遇到需要生成PDF.最终选择了iText.其他也有通过html再生成.感觉不太适合就用了代码实现. 使用iText 5.5.13.1版本.纯Java代码实现 1.自定义表格合并指定行列完成数据填 ...
- 以无代码的方式将Form打印内容转成生成PDF文件
企业在应用SAP ERP时,可能需要大量 打印 通信文档如催款单,对账单,付款通知等.通过生成PDF格式的通信文件然后用电子邮件的方式发给客户或供应商,不仅大在降低打印成本和邮递费用,加快了与业务合作 ...
- QT实现打印预览及生成Pdf功能
一.要实现打印功能,首先要在pro文件中加上 QT += printsupport 并且需要重新qmake 二.Qt提供了QPrintPreviewDIalog 类,所以打印功能可以直接通过此对话框实 ...
- java 生成pdf itext_使用Java组件itext 生成pdf介绍
iText是一个能够快速产生PDF文件的Java类库.iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的.它的类库尤其与java Servlet有很好的给合.使用iText与 ...
- vscode+markdown+mpe+markdown pdf写markdown文档并生成pdf的解决方案和配置方法
本文将介绍使用vscode的插件markdown all in one +markdown preview enhanced(MPE)+ markdown pdf来配置markdown写作环境的过程 ...
- java文字转pdf格式_java根据富文本生成pdf文件
public classPdfUtil {/** 生成pdf工具类 * wmy 12:40 2019/8/9 * @Param [guideBook, pdfPath] * @return java. ...
- java生成pdf方法_详解Java生成PDF文档方法|chu
最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持iText,生成PDF文档,还支持将XML ...
最新文章
- 黑客基础知识与防护(一)
- datatables php数据,html5 - datatables 加载不出来数据。
- JAVA学习笔记(2)—— java初始化三个原则
- 【转】调试JavaScript 错误的解决方案
- php千人千面框架,千人千面的设计才是最好设计!安卓 UI 可以如此自由
- Leetcode300. Longest Increasing Subsequence最长上升子序列
- 美团外卖Android Lint代码检查实践
- SQL SERVER 自定义函数参数数量对调用时参数数量的影响
- C++多继承构造和析构顺序
- golang下载网站的实例的办法
- 机器学习和模式识别怎么区分?
- RCC_APB2Periph_AFIO--复用IO时钟的使用
- 【微信小游戏开发 一】项目调研
- 什么是等保(信息安全等级保护)?
- 混迹职场,人际关系很重要
- 互联网人年底加薪指南
- HTML5期末大作业:在线电影网站设计——我不是药神电影介绍(4页) HTML+CSS+JavaScript 大二实训大作业HTML源码
- linux手机E680的几个概念
- 计算机系统未来发展方向论文,浅谈计算机未来发展趋势(期末论文)
- 赛门铁克SSL证书chrome不支持解决方法