栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java > SpringBoot

SpringBoot(十五)_springboot实现预览pdf

SpringBoot 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot(十五)_springboot实现预览pdf

最近,项目上要做个打印的东西,还要预览。我想就直接生成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;@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();

    }    
    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;
    }    
    private void setFreemarkerCfg() {
        freemarkerCfg = new Configuration();        //freemarker的模板目录
        try {
            freemarkerCfg.setDirectoryForTemplateLoading(new ClassPathResource("template").getFile());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }    
    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

玩的开心!

作者:养码青年        

出处:http://www.cnblogs.com/zhenghengbin/        

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/234706.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号