SpringBoot(十五)_springboot实现预览pdf
最近,项目上要做个打印的东西,还要预览。我想就直接生成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相关推荐
- Springboot 以输出流形式 在线预览PDF 文件分存储 (本地/远程)
原因:本来是前端直接用url 显示pdf.但是url 容易暴露. 后来使用后台返回文件流的形式输出.前端显示.不多说直接上代码 1.文件存在服务器本地 @RequestMapping(value = ...
- Springboot 超简单实现在线预览,Word文档 doc、xlsx、pdf、txt等
前言 PDF.TXT 只要资源可访问,根本就不需要进行任何处理,直接访问查看就完事了. 也是因为这个PDF可以直接查看(现在浏览器基本支持了),那么我们实现Word文档在线预览,其实也是 把WORD文 ...
- Springboot + layui + FTP文件上传删除 + HTTP文件下载预览 + pdf.js文件预览(项目实战总结)
文件管理 0.需求及前言 1.前端,上传按钮嵌入数据表格中 2.利用IIS部署FTP文件服务器 3.后台FTP连接和文件操作 4.FTP遇到的问题和解决方案 5.预览PDF文件V1.0:FTP+临时文 ...
- springboot整合pdf.js实现在线预览pdf文件
今天在项目中实现pdf在线预览的功能的如图, 通过百度,查询合适的方法,最为简单的的是通过pdf.js的插件在前台展示.本以为是挺容易实现的,但都有莫名其妙的错误. 第一步:下载源码https://g ...
- springboot+vue整合pdf.js实现预览pdf
前景回顾: 上一次说到使用浏览器自带的预览pdf功能所遗留的问题,360浏览器不够给力,IE的我没测,估计也不行,于是乎我又翻阅资料(度娘)找到了一种新的实现方式,使用pdf.js实现 如果想看使用浏 ...
- spring boot2.X word在线预览 pdf.js
最近公司项目需求需要在线预览word文档,并且不能在在线下载和编辑.在此记录我是如何做的. 针对word的在线预览网上大多给的解决方案就是先把word文件转成pdf,然后通过pdf.js在线预览pdf ...
- SpringBoot实现万能文件在线预览,已开源,真香!!!
欢迎关注方志朋的博客,回复"666"获面试宝典 推荐一个用Spring Boot搭建的文档在线预览解决方案: kkFileView,一款成熟且开源的文件文档在线预览项目解决方案,对 ...
- android 在线预览pdf文件(目前最全)
android原生webView不支持预览pdf文件,ios却可以,所以android想要实现在线预览webView要通过其他方法,有以下几种方法: 一.andorid原生自带的pdf管理库,主要提供 ...
- 在线浏览pdf doc html,前端实现在线预览pdf、word、xls、ppt等文件
1.前端实现pdf文件在线预览功能 方式一: 通过a标签href属性实现 pdf文件理论上可以在浏览器直接打开预览但是需要打开新页面.在仅仅是预览pdf文件且UI要求不高的情况下可以直接通过a标签hr ...
最新文章
- 学界 | 量化深度强化学习算法的泛化能力
- 以太坊区块链_以太坊区块链搭建与使用(一)-私有链
- 关于 Notepad++ 崩溃之后正在编辑文件内容被清空的致命问题的补救措施
- 【HDU4734】F(x) 数位DP
- boost::type_erasure::incrementable相关的测试程序
- 思考题-算法小思考题
- krita绘图_使用Krita 2.9的Digital Painting提供了缺少的Krita文档
- 让老外吐血而亡的中国汉字
- Android技巧:ListView去掉橙黄底色
- ns3网络设置模块 PointToPoint
- meshLab裁剪网格
- 二进制学习-反跟踪技术
- 用Java解决牛客网小米校招编程真题XM5句子反转
- BugKu-MISC
- 8月3日 我用吃证明她的手艺
- Go关键字--type
- Scala之函数式编程
- less中的变量 单位问题
- 那些名站的网站关键词都是如何到百度首页的
- 致远项目管理SPM系统核心价值