项目当中通常会有生成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路径需要相对路径加图片名 如xh.jpg

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和图片以及横向打印相关推荐

  1. java 将html生成图片_java通过html生成pdf,支持css和图片以及横向打印

    项目当中通常会有生成pdf的需求,pdf的排版尤为重要!通过html生成,最为方便. 1. 依赖 工具使用freemarker模板进行数据渲染 org.freemarker freemarker 2. ...

  2. java-使用 flying-saucer 通过 xhtml 生成 pdf 文档支持 css 和 图片

    java-使用 flying-saucer 通过 xhtml 生成 pdf 文档支持 css 和 图片 重要说明: 1.使用 xhtml 生成 pdf ,对于 xhtml 的语法要求非常严格: 2.中 ...

  3. 【iText5 生成PDF】纯Java代码实现生成PDF(自定义表格、文本水印、单元格样式)

    工作中遇到需要生成PDF.最终选择了iText.其他也有通过html再生成.感觉不太适合就用了代码实现. 使用iText 5.5.13.1版本.纯Java代码实现 1.自定义表格合并指定行列完成数据填 ...

  4. 以无代码的方式将Form打印内容转成生成PDF文件

    企业在应用SAP ERP时,可能需要大量 打印 通信文档如催款单,对账单,付款通知等.通过生成PDF格式的通信文件然后用电子邮件的方式发给客户或供应商,不仅大在降低打印成本和邮递费用,加快了与业务合作 ...

  5. QT实现打印预览及生成Pdf功能

    一.要实现打印功能,首先要在pro文件中加上 QT += printsupport 并且需要重新qmake 二.Qt提供了QPrintPreviewDIalog 类,所以打印功能可以直接通过此对话框实 ...

  6. java 生成pdf itext_使用Java组件itext 生成pdf介绍

    iText是一个能够快速产生PDF文件的Java类库.iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的.它的类库尤其与java Servlet有很好的给合.使用iText与 ...

  7. vscode+markdown+mpe+markdown pdf写markdown文档并生成pdf的解决方案和配置方法

    本文将介绍使用vscode的插件markdown all in one +markdown preview enhanced(MPE)+ markdown pdf来配置markdown写作环境的过程 ...

  8. java文字转pdf格式_java根据富文本生成pdf文件

    public classPdfUtil {/** 生成pdf工具类 * wmy 12:40 2019/8/9 * @Param [guideBook, pdfPath] * @return java. ...

  9. java生成pdf方法_详解Java生成PDF文档方法|chu

    最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持iText,生成PDF文档,还支持将XML ...

最新文章

  1. 黑客基础知识与防护(一)
  2. datatables php数据,html5 - datatables 加载不出来数据。
  3. JAVA学习笔记(2)—— java初始化三个原则
  4. 【转】调试JavaScript 错误的解决方案
  5. php千人千面框架,千人千面的设计才是最好设计!安卓 UI 可以如此自由
  6. Leetcode300. Longest Increasing Subsequence最长上升子序列
  7. 美团外卖Android Lint代码检查实践
  8. SQL SERVER 自定义函数参数数量对调用时参数数量的影响
  9. C++多继承构造和析构顺序
  10. golang下载网站的实例的办法
  11. 机器学习和模式识别怎么区分?
  12. RCC_APB2Periph_AFIO--复用IO时钟的使用
  13. 【微信小游戏开发 一】项目调研
  14. 什么是等保(信息安全等级保护)?
  15. 混迹职场,人际关系很重要
  16. 互联网人年底加薪指南
  17. HTML5期末大作业:在线电影网站设计——我不是药神电影介绍(4页) HTML+CSS+JavaScript 大二实训大作业HTML源码
  18. linux手机E680的几个概念
  19. 计算机系统未来发展方向论文,浅谈计算机未来发展趋势(期末论文)
  20. 赛门铁克SSL证书chrome不支持解决方法

热门文章

  1. ead开局 华三inode_03 EAD用户接入-受控软件管理-新华三集团-H3C
  2. 网络爬虫是干什么的呢?
  3. apriori算法的简介和改进总结
  4. MySQL系列----创建函数
  5. 集线器、网桥、交换机简介
  6. 微信不提示ipad登陆不上服务器,微信退出登录后,重新登录不了ipad
  7. NSString文本替换
  8. pve万兆网卡驱动_教你:高性价比万兆群晖方案——万兆SFP网卡配置使用教程
  9. 安卓开发实战讲解!首发10万字Android开发实战文档,完整版开放下载
  10. Hack The Box——Tabby