【Java实战】Java实现PDF在线预览功能

前言

最近需要实现在浏览器上预览 PDF 并能提供下载的功能,这里对功能的实现做一个简单的记录

一、功能实现

PDF 的预览网上说的最多的是PDF.JS实现预览,作者对这个接触的不多,所以第一时间还是想的后台通过文件流操作,利用各个浏览器的内核支持PDF预览功能来实现。

二、实现步骤

1.方法一

将需要在浏览器上预览的PDF放在静态文件夹下,使用ClassLoader获取class路径得到pdf文件的目录,通过流操作实现预览

代码如下(示例):

@ResponseBody
@RequestMapping("/preview")
public void preview(HttpServletResponse response, boolean flag) {
    String filePath = this.getClass().getClassLoader().getResource("../../static/pdf/readme.pdf").getPath();
    System.out.println("filePath:" + filePath);
    File f = new File(filePath);
    if (StringUtils.isBlank(filePath)) {
        LogUtil.appLog.info("文件不存在!");
        return;
    }
    BufferedInputStream br = null;
    OutputStream out = null;
    try {
        br = new BufferedInputStream(new FileInputStream(f));
        byte[] bs = new byte[1024];
        int len = 0;
        response.reset(); // 非常重要
        if (flag) {
            // 在线打开方式
            URL u = new URL("file:///" + filePath);
            String contentType = u.openConnection().getContentType();
            response.setContentType(contentType);
            response.setHeader("Content-Disposition", "inline;filename="
                    + "操作手册V1.0.pdf");
        } else {
            // 纯下载方式
            //response.setContentType("application/x-msdownload");
            response.setContentType("application/pdf;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename="
                    + "操作手册V1.0.pdf");
        }
        out = response.getOutputStream();
        while ((len = br.read(bs)) > 0) {
            out.write(bs, 0, len);
        }
        out.flush();
        out.close();
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
        LogUtil.appLog.info("pdf处理文件异常" + e);
    } finally {
        if (out != null) {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2.方法二

引入IOUtils来实现,这个里面的流不需要关闭,浏览器会自动获取然后展示。关闭的话浏览器就无法加载!

代码如下(示例):

@RequestMapping(value = "/preview")
public void showPdf(HttpServletResponse response) {
    try {
        String filePath = this.getClass().getClassLoader().getResource("../../static/pdf/readme.pdf").getPath();
        File file = new File(filePath);
        FileInputStream fileInputStream = new FileInputStream(file);
        response.setHeader("Content-Type", "application/pdf");
        OutputStream outputStream = response.getOutputStream();
        IOUtils.write(IOUtils.toByteArray(fileInputStream), outputStream);
    } catch(Exception e) {
        e.printStackTrace();
    }
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了pdf预览功能的实现,以上方法亲测有效,希望能给大家一个参考。

创作不易,关注💖、点赞👍、收藏🎉就是对作者最大的鼓励👏,欢迎在下方评论留言🧐

posted on 2022-08-05 08:53  猫的树kireCat  阅读(4779)  评论(0编辑  收藏  举报