博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot(十五)_springboot实现预览pdf
阅读量:6570 次
发布时间:2019-06-24

本文共 5323 字,大约阅读时间需要 17 分钟。

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

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

整体流程如下

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

主要代码

pom文件

org.springframework.boot
spring-boot-starter-freemarker
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-web
RELEASE
compile
com.itextpdf
itextpdf
5.5.13
com.itextpdf.tool
xmlworker
5.5.13
commons-io
commons-io
2.5

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 */@RestControllerpublic 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
data = new HashMap<>(16); data.put("name", "kevin"); String content = freeMarkerRender(data,html); //创建pdf createPdf(content, dest); // 读取pdf并预览 readPdf(response); } public void createPdf(String content,String dest) throws IOException, DocumentException { // step 1 Document document = new Document(); // step 2 PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest)); // step 3 document.open(); // step 4 XMLWorkerFontProvider 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 5 document.close(); } /** * freemarker渲染html */ public String freeMarkerRender(Map
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);

完整代码 :

玩的开心!

转载地址:http://xnvjo.baihongyu.com/

你可能感兴趣的文章
Windows和Ubuntu双系统,修复UEFI引导的两种办法
查看>>
Android相关修改教程
查看>>
《Linux Device Drivers》第十一章 核心数据类型——note
查看>>
Android布局解析,图文(转)
查看>>
ASP.NET Redis 开发 入门
查看>>
c++ primer读书笔记之c++11(一)
查看>>
【Xamarin For IOS 开发需要的安装文件】
查看>>
svn服务器配置以及自动同步到web服务器
查看>>
zoj 1738 - Lagrange&#39;s Four-Square Theorem
查看>>
【iOS】Object-C注释
查看>>
Linux设备驱动之Ioctl控制【转】
查看>>
NSArray 初始化
查看>>
Android:简单联网获取网页代码
查看>>
抽象类,摘要方法
查看>>
武汉出租车集体罢工 是打车软件的错?
查看>>
Memcached完全解剖–1. memcached基金会
查看>>
Sqlite-SQLiteHelper类,操作SQLite数据库
查看>>
BZOJ 1823 JSOI 2010 盛宴 2-SAT
查看>>
软测试-计算机组成原理、系统和网络安全机构
查看>>
AndroidStudio的一些坑
查看>>