一、导入依赖

为什么我不用jpedal,因为在我开发的项目中一启动就报错,所以换成pdfbox(pdf转图片)

<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.11</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.19</version></dependency><dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf</artifactId><version>9.1.5</version></dependency><dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf-itext5</artifactId><version>9.1.5</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.8</version></dependency>

二、 工具类书写

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;import javax.imageio.ImageIO;import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.itextpdf.text.pdf.BaseFont;
import freemarker.template.Configuration;
import freemarker.template.Template;/*** pdf转图片工具* * @author muyuan* */
public class PDFImgJspUtil {public static final String JSP = "hello.html";private static final String FONT = "simhei.ttf";private static final String IMG_EXT = "png";private static Configuration freemarkerCfg = null;static {freemarkerCfg = new Configuration();try {freemarkerCfg.setDirectoryForTemplateLoading(new File(PDFImgJspUtil.class.getResource("/").getPath()));} catch (IOException e) {e.printStackTrace();}}public static ByteArrayOutputStream imgIo(Map data) {String content = PDFImgJspUtil.freeMarkerRender(data, JSP);ByteArrayOutputStream pdfStream = PDFImgJspUtil.createPdf(content);ByteArrayOutputStream imgSteam = PDFImgJspUtil.pdfToImg(pdfStream.toByteArray(), 1, IMG_EXT);return imgSteam;}/*** 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;}/*** 根据模板生成pdf文件流*/public static ByteArrayOutputStream createPdf(String content) {ByteArrayOutputStream outStream = new ByteArrayOutputStream();ITextRenderer render = new ITextRenderer();ITextFontResolver fontResolver = render.getFontResolver();try {//如果显示中文,下面那条语句一定要写!!!!fontResolver.addFont("C:/WINDOWS/Fonts/simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);} catch (Exception e) {e.printStackTrace();}render.setDocumentFromString(content);render.layout();try {render.createPDF(outStream);return outStream;} catch (com.lowagie.text.DocumentException e) {e.printStackTrace();} finally {try {outStream.close();} catch (IOException e) {e.printStackTrace();}}return null;}/*** 根据pdf二进制文件 生成图片文件* @param pageNum 页数*/public static ByteArrayOutputStream pdfToImg(byte[] bytes, int pageNum, String formatName) {ByteArrayOutputStream out = new ByteArrayOutputStream();try {PDDocument document = PDDocument.load(bytes);PDFRenderer render = new PDFRenderer(document);int pages = document.getNumberOfPages();if (pageNum > 0 && pageNum <= pages) {BufferedImage image = render.renderImage(pageNum-1 , 1.5f);
//          BufferedImage image = render.renderImage(pageNum-1, 2.5f);ImageIO.write(image, formatName, out);}} catch (InvalidPasswordException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return out;}}

hello.html文件

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Insert title here</title><style>body{font-family:SimHei;}.blue{color: black;}@page{size:a4}table {border-collapse: collapse;
}
table td {border:1px solid black;width:200px;
}</style></head>
<body>
<div class="blue pos">
<table cellpadding="0" style="font-size:50px;"><tr><td>1</td><td>2</td><td>3</td></tr><tr><td>${sex}</td><td>${sex}</td><td>${sex}</td></tr><tr><td>${sex}</td><td>${sex}</td><td>${sex}</td></tr><tr><td>${sex}</td><td>${sex}</td><td>${sex}</td></tr><tr><td>${sex}</td><td>${sex}</td><td>${sex}</td></tr><tr><td>${sex}</td><td>${sex}</td><td>${sex}</td></tr></table>
</div>
</body>
</html>

这里有个几个非常要注意的点!!!

1、HTML模板的路径要写对
2、一定设设置字体,不然把中文放到HTML上是不会显示的
3、字体文件一定是对的,不然会报错

三、 请求

这里返回base64给前端

@RequestMapping("test")public String test() {return "admin/wechat/test";}@SuppressWarnings({ "restriction" })@RequestMapping("receipt")public void receipt(HttpServletRequest request,HttpServletResponse response) {Map<String, Object> data = new HashMap<String, Object>();data.put("sex", "农药");JSONObject object = new JSONObject();ByteArrayOutputStream outputStream=PDFImgJspUtil.imgIo(data);BASE64Encoder encoder = new BASE64Encoder();String base64 = encoder.encodeBuffer(outputStream.toByteArray()).trim();base64 = base64.replaceAll("\n", "").replaceAll("\r", "");try {object.put("code", "data:image/jpg;base64,"+base64);response.getWriter().write(object.toString());} catch (IOException e) {e.printStackTrace();}}

四、前端接收

test.jsp页面

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
<script src="../static/model/js/jquery-1.11.2.min.js"></script>
</head>
<body><img id="randomImage"  src="" /><script type="text/javascript">$(function() {refreshimg();})function refreshimg() {$.ajax({type : "POST",dataType : "json",url : "../article/receipt",success : function(data) {$('#randomImage').attr('src', data.code);},error : function() {}});$("#randomImage").click(refreshimg)}</script></body>
</html>

五、结果



总结:我使用了iText+Html+Freemarker动态渲染,用于iText不能对高级CSS解析,所以引入Flying Saucer-CSS(基于iText),生成PDF后,使用pdfbox将PDF转为图片,最后将base64返回给前端显示。

java电子回单生成,PDF转图片相关推荐

  1. Java使用itext生成Pdf

    Java使用itext生成Pdf 背景 所需依赖 解决jpedal-lgpl jar包问题 示例代码 生成带图片的PDF(使用本地文件系统图片) 生成带图片的PDF(使用网络图片) 背景 在某些业务场 ...

  2. HTML生成PDF模板(Java iText+FreeMarker生成PDF(HTML转PDF))

    Java iText+FreeMarker生成PDF(HTML转PDF) 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等.方便用户查看,下载,打 ...

  3. Java纯后端生成PDF格式报表的三种方案(包含echarts图表)

    最近做了一个奇葩的需求,研究了一下Java纯后端生成PDF报表的方案,顺便将研究的方案做个总结复盘,分享一下. 需求分析:Java后端定时任务统计汇总成报表数据,并生成PDF格式的报表文件,并通过邮件 ...

  4. Java:iText生成pdf文档

    依赖 <!-- pdf:start --> <dependency><groupId>com.itextpdf</groupId><artifac ...

  5. 小程序画布功能+JAVA用KUMO生成词云图片

    小程序画布功能+JAVA用KUMO生成词云图片 KUMO git地址:https://github.com/kennycason/kumo 原理:利用Kumo生成词云,并转换成64位传到小程序,小程序 ...

  6. java用itextPDF生成PDF文件保存至本地并上传至ftp服务器

    标题java用itextPDF生成PDF文件保存至本地并上传至ftp服务器 所需jar :itext-asian-5.2.0.jar,itextpdf-5.5.5.jar,commons-net-3. ...

  7. java 生成字体文件,java使用itext生成pdf文件-设置字体,itextpdf,import com.l

    java使用itext生成pdf文件-设置字体,itextpdf,import com.limport com.lowagie.text.Document;import com.lowagie.tex ...

  8. Java | 将文字生成在空白图片居中位置(根据图片大小,自动调节文字大小)

    Java | 将文字生成在空白图片居中位置(根据图片大小,自动调节文字大小) 话不多说,直接上代码.(大家可以自己根据需要设置图片大小,不过图片过小时,字体会变模糊,尽量设置图片大一点,600~100 ...

  9. Ubuntu下Java使用pdfbox将pdf转换为图片的方法及问题

    Ubuntu下Java使用pdfbox将pdf转换为图片的方法及问题 使用pdfbox-2.0.3和fontbox-2.0.3,实现pdf转图片功能. 官方手册链接: http://pdfbox.ap ...

最新文章

  1. 改变窗口背景_Illustrator实例教程:只需三步,利用画笔描边做出炫酷的背景
  2. sqli-labs(十二)(union以及select的过滤)
  3. C# 读取保存App.config配置文件的完整源码参考
  4. 数据库同步热备方案(云南某金属企业)
  5. pmp每日三题(2022年2月21日)
  6. qduoj - 今晚一起打CF吧——Codeforces,十三亿人的ACM梦。(排序背包)
  7. 《01》ECMAScript 6 简介
  8. 输入参数_太实用!输入参数1秒算出功率,这款计算工具又快又准
  9. 关于打印数组一直输出地址符号的一个解决方法
  10. 免费资源:Polaris UI套件 + Linecons图标集(AI, PDF, PNG, PSD, SVG)
  11. python做逻辑回归r2_利用python实现逻辑回归
  12. ARMv8-A vs ARMv7 Registers
  13. Android 打开第三方APP
  14. FZU - 1759 Problem 1759 Super A^B mod C 欧拉降幂公式
  15. docker安装UnlockMusic(音乐格式转换工具 )
  16. Python七天快速入门——第一天
  17. 假如shiro启动报The bean ‘sysUserServiceImpl‘ could not be injected as a ‘com.zyr.springbootdemo.sys.user.
  18. dialog.js弹窗插件
  19. IKAnalyzer中文分词分析内容目录
  20. 用墨刀做出的交互动效,10个优秀作品欣赏

热门文章

  1. 浙大宁理c语言试卷,电磁场与电磁波教学大纲-浙江大学宁波理工学院教务部.PDF...
  2. SpringCloud电商项目开发完整流程
  3. 费希尔阀门定位器DVC6200的调试
  4. 李宏毅深度学习--《Unsupervised Learning》+《PCA》+《Matrix Factorization》
  5. 多益网络游戏引擎面试
  6. 电子政务源代码java_基于jsp的电子政务系统项目-JavaEE实现电子政务系统项目 - java项目源码...
  7. 记一次前端揭开绘制地图的神秘面纱分享会
  8. 腾讯云大学-基于云的153个场景实验案例
  9. php农产品防伪追溯系统源码
  10. PhoneGap开发手机程序入门教程