最近,项目上要做个打印的东西,还要预览。我想就直接生成pdf预览,然后用户选择打印

于是,昨天找了找资料。一般用itext 进行转pdf。于是我就用springboot试了试,代码比较简单,现在只是简单的一个实现。

整体流程如下

  • 1.获取数据(比如从数据库获取数据)
  • 2.通过freemarker 渲染页面
  • 3.将渲染的页面进行转换为pdf,放在本地
  • 4.读取pdf,实现预览

主要代码

pom文件

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>RELEASE</version><scope>compile</scope></dependency><!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency><!-- https://mvnrepository.com/artifact/com.itextpdf.tool/xmlworker --><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.13</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.5</version></dependency></dependencies>

PdfController代码

package com.kevin.pdf_demo.controller;import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;/*** @author: kevin* @Date: 2018/11/16*/
@RestController
public class PdfController {@Value("${DEST}")private String dest;@Value("${HTML}")private String html;@Value("${FONT}")private String font;private static Configuration freemarkerCfg = null;@RequestMapping(value = "helloPdf")public void showPdf(HttpServletResponse response) throws IOException, DocumentException {//需要填充的数据Map<String, Object> data = new HashMap<>(16);data.put("name", "kevin");String content = freeMarkerRender(data,html);//创建pdfcreatePdf(content, dest);// 读取pdf并预览readPdf(response);}public  void createPdf(String content,String dest) throws IOException, DocumentException {// step 1Document document = new Document();// step 2PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));// step 3document.open();// step 4XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);fontImp.register(font);XMLWorkerHelper.getInstance().parseXHtml(writer, document,new ByteArrayInputStream(content.getBytes("UTF-8")), null, Charset.forName("UTF-8"), fontImp);// step 5document.close();}/*** freemarker渲染html*/public  String freeMarkerRender(Map<String, Object> data, String htmlTmp) {Writer out = new StringWriter();try {// 获取模板,并设置编码方式setFreemarkerCfg();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;}/*** 设置freemarkerCfg*/private void setFreemarkerCfg() {freemarkerCfg = new Configuration();//freemarker的模板目录try {freemarkerCfg.setDirectoryForTemplateLoading(new ClassPathResource("template").getFile());} catch (IOException e) {e.printStackTrace();}}/*** 读取本地pdf,这里设置的是预览*/private void readPdf(HttpServletResponse response) {response.reset();response.setContentType("application/pdf");try {File file = new File(dest);FileInputStream fileInputStream = new FileInputStream(file);OutputStream outputStream = response.getOutputStream();IOUtils.write(IOUtils.toByteArray(fileInputStream), outputStream);response.setHeader("Content-Disposition","inline; filename= file");outputStream.flush();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}

运行效果

设置头信息使浏览器下载文件或预览

强制浏览器下载

response.setHeader("content-disposition", "attachment;filename=" + realName);

浏览器尝试打开,支持office online或浏览器预览pdf功能

response.setHeader("content-disposition", "inline;filename=" + realName);

完整代码 : github

玩的开心!

SpringBoot(十五)_springboot实现预览pdf相关推荐

  1. Springboot 以输出流形式 在线预览PDF 文件分存储 (本地/远程)

    原因:本来是前端直接用url 显示pdf.但是url 容易暴露. 后来使用后台返回文件流的形式输出.前端显示.不多说直接上代码 1.文件存在服务器本地 @RequestMapping(value = ...

  2. Springboot 超简单实现在线预览,Word文档 doc、xlsx、pdf、txt等

    前言 PDF.TXT 只要资源可访问,根本就不需要进行任何处理,直接访问查看就完事了. 也是因为这个PDF可以直接查看(现在浏览器基本支持了),那么我们实现Word文档在线预览,其实也是 把WORD文 ...

  3. Springboot + layui + FTP文件上传删除 + HTTP文件下载预览 + pdf.js文件预览(项目实战总结)

    文件管理 0.需求及前言 1.前端,上传按钮嵌入数据表格中 2.利用IIS部署FTP文件服务器 3.后台FTP连接和文件操作 4.FTP遇到的问题和解决方案 5.预览PDF文件V1.0:FTP+临时文 ...

  4. springboot整合pdf.js实现在线预览pdf文件

    今天在项目中实现pdf在线预览的功能的如图, 通过百度,查询合适的方法,最为简单的的是通过pdf.js的插件在前台展示.本以为是挺容易实现的,但都有莫名其妙的错误. 第一步:下载源码https://g ...

  5. springboot+vue整合pdf.js实现预览pdf

    前景回顾: 上一次说到使用浏览器自带的预览pdf功能所遗留的问题,360浏览器不够给力,IE的我没测,估计也不行,于是乎我又翻阅资料(度娘)找到了一种新的实现方式,使用pdf.js实现 如果想看使用浏 ...

  6. spring boot2.X word在线预览 pdf.js

    最近公司项目需求需要在线预览word文档,并且不能在在线下载和编辑.在此记录我是如何做的. 针对word的在线预览网上大多给的解决方案就是先把word文件转成pdf,然后通过pdf.js在线预览pdf ...

  7. SpringBoot实现万能文件在线预览,已开源,真香!!!

    欢迎关注方志朋的博客,回复"666"获面试宝典 推荐一个用Spring Boot搭建的文档在线预览解决方案: kkFileView,一款成熟且开源的文件文档在线预览项目解决方案,对 ...

  8. android 在线预览pdf文件(目前最全)

    android原生webView不支持预览pdf文件,ios却可以,所以android想要实现在线预览webView要通过其他方法,有以下几种方法: 一.andorid原生自带的pdf管理库,主要提供 ...

  9. 在线浏览pdf doc html,前端实现在线预览pdf、word、xls、ppt等文件

    1.前端实现pdf文件在线预览功能 方式一: 通过a标签href属性实现 pdf文件理论上可以在浏览器直接打开预览但是需要打开新页面.在仅仅是预览pdf文件且UI要求不高的情况下可以直接通过a标签hr ...

最新文章

  1. 学界 | 量化深度强化学习算法的泛化能力
  2. 以太坊区块链_以太坊区块链搭建与使用(一)-私有链
  3. 关于 Notepad++ 崩溃之后正在编辑文件内容被清空的致命问题的补救措施
  4. 【HDU4734】F(x) 数位DP
  5. boost::type_erasure::incrementable相关的测试程序
  6. 思考题-算法小思考题
  7. krita绘图_使用Krita 2.9的Digital Painting提供了缺少的Krita文档
  8. 让老外吐血而亡的中国汉字
  9. Android技巧:ListView去掉橙黄底色
  10. ns3网络设置模块 PointToPoint
  11. meshLab裁剪网格
  12. 二进制学习-反跟踪技术
  13. 用Java解决牛客网小米校招编程真题XM5句子反转
  14. BugKu-MISC
  15. 8月3日 我用吃证明她的手艺
  16. Go关键字--type
  17. Scala之函数式编程
  18. less中的变量 单位问题
  19. 那些名站的网站关键词都是如何到百度首页的
  20. 致远项目管理SPM系统核心价值

热门文章

  1. torch.full()简介
  2. 灵魂出窍的神经生物学基础!
  3. 揭秘毕加索被隐藏千年的“画中画”,神经网络让它重新面世
  4. 神经网络:你的大脑是一台计算机吗?
  5. 永远不要辞职,除非……
  6. 分享实录|区块链技术与智能合约入门(开发实例)
  7. 建筑工程的发展、未来那个职业将会兴起!
  8. CPU被夺走的三种状态 执行时间久了 IO操作让cpu等待 被优先级高的抢占
  9. nginx配置websocket负载均衡
  10. XShell 技巧分享