背景:项目中实现pdf文件的预览以及下载

环境:jdk1.8、SpringBoot2.0、Maven
    PDF.js下载地址: http://mozilla.github.io/pdf.js/getting_started/#download(下载2.1.266版本即可)

将下载的源码拷入项目中
    修改viewer.js:

将defaultUrl: {
    value: 'compressed.tracemonkey-pldi-09.pdf',---此处是默认的pdf的路径
    kind: OptionKind.VIEWER
  }
  修改为:
  defaultUrl: {
    value: '',
    kind: OptionKind.VIEWER
  }

打开新窗口预览:

<input type="button" value="预览" id="viewBtn">
    <script type="text/javascript">
        $("#viewBtn")
                .click(
                        function() {
                            var curWwwPath = window.document.location.href;
                            var pathName = window.document.location.pathname;
                            var pos = curWwwPath.indexOf(pathName);
                            var localhostPath = curWwwPath.substring(0, pos);

//此处以get请求调用后台接口   并在新的窗口下打开此pdf文件

             window.open("http://localhost:8081/api/file/preview?fileName=2019_PDF.pdf");

});
    //后台controller代码,根据前端传入的fileName到指定目录读取pdf文件,进行展示
    @RequestMapping(value = "/preview", method = RequestMethod.GET)
    public void prePDF(String fileName, HttpServletRequest request, HttpServletResponse response) {
        logger.info("文件名:" + fileName);
        File file = new File("E:/pdf/" + fileName);
        if (file.exists()) {
            byte[] data = null;
            try {
                FileInputStream input = new FileInputStream(file);
                data = new byte[input.available()];
                input.read(data);
                response.getOutputStream().write(data);
                input.close();
            } catch (Exception e) {
                logger.info("pdf文件处理异常...");
            }
        }
    }

PDF文件下载:

<input type="button" value="下载" id="download">
$("#download").click(function() {
            var form = $("<form>");
            form.attr("style", "display:none");
            form.attr("target", "");
            form.attr("method", "post");//提交方式为post
            form.attr("action", "/downloadFile");//定义action
            $("body").append(form);
            form.submit();
        });

//这个例子是展示传的死的参数  如果想实现前台向后台传参  可以在Html中写一个form表单然后隐藏掉  在form表单中写入一个input 通过这个input进行传值

//例:

<form action="/api/file/downloadFile" style="display: none" method="post" id="downloadForm">
<input type="text" name="fileId" value="0" id="downloadFilename">
</form>
function downloadpdf(fileId) {
if(parseInt(fileId)==0){
layer.msg("暂无文件!")
}else {
// var form = $("<form>");
// var input = document.createElement('input'); //创建input节点
// input.setAttribute('type', 'text'); //定义类型是文本输入
// document.getElementsByTagName("input")[0].name="fileName";
// document.getElementsByName("fileName")[0].value="lalla";
// document.getElementsByTagName("form")[0].appendChild(input);
// form.attr("style", "display:none");
// form.attr("target", "");
// form.attr("method", "post");//提交方式为post
// form.attr("action", "/api/file/downloadFile");//定义action
document.getElementById("downloadFilename").value = fileId;
var form = document.getElementById("downloadForm");
$("body").append(form);
form.submit();
} //我这里通过前台向后台传入了一个id 然后后台通过id在数据库中查询文件的地址 //若想传其他参数可以参考这个...
 

//后台代码
@RequestMapping(value="/downloadFile")
    public void downloadFile(HttpServletResponse response) {
        String downloadFilePath = "E:/pdf/";    //被下载的文件在服务器中的路径,
        String fileName = "0602.pdf";            //被下载文件的名称
    
        File file = new File(downloadFilePath+fileName);
        if (file.exists()) {

// 设置强制下载不打开      针对于浏览器能打开的文件类型  如果不进行这一行的设置  浏览器并不会进行下载  而是直接在浏览器中打开
            response.setContentType("application/force-download");

//当点击下载时  指定浏览器中弹出下载框的文件名  如果注释这段代码 文件名会默认显示为当前接口注解的名字(比如本文中的downloadFile)
            response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
            byte[] buffer = new byte[1024];
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            try {
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                OutputStream outputStream = response.getOutputStream();
                int i = bis.read(buffer);
                while (i != -1) {
                  outputStream.write(buffer, 0, i);
                  i = bis.read(buffer);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if(bis != null) {
                    try {
                        bis.close();
                    }catch(IOException e) {
                        e.printStackTrace();
                    }
                }
                if(fis != null) {
                    try {
                        fis.close();
                    }catch(IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

预览页面顶部会有相应的工具栏,打印、下载、翻页、放大等,根据个人实际需要,可以查看页面源码,在viewer.html中注释掉相应的功能.

也可以通过pdfbox读取PDF文件内容:

引入jar包:
<!-- PDF读取依赖 -->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.4</version>
        </dependency>

后台读取pdf文件代码:

public String viewPDF(String proCode,String fileName,String originPage, HttpServletRequest request) {
        request.setAttribute("dse_sessionId", request.getParameter("dse_sessionId").trim());
        logger.info("披露报告预览文件名:" + fileName);
        File file = new File(constant.getExposeLocalDir() + fileName);
        if (!file.exists()) { // 文件不存在,则 从FTP下载文件到本地
            }
        }
        //读取pdf文件内容-代码实现
        try {
            PDDocument document = PDDocument.load(file);
            document.getClass();
            if(!document.isEncrypted()) {
                PDFTextStripperByArea stripper = new PDFTextStripperByArea();
                stripper.setSortByPosition(true);
                PDFTextStripper textStripper = new PDFTextStripper();
                String exposeContent = textStripper.getText(document);
                String[] content = exposeContent.split("\\n");
                StringBuffer stringBuffer = new StringBuffer();
                for(String line:content) {
                    stringBuffer.append(line);
                }
            }
            
        } catch (Exception e) {
            logger.info("读取pdf文件异常...");
        }
    
        return "";
    }

声明:本片文章转载自:https://blog.csdn.net/Xing_Pengfei/article/details/97649888

笔者只不过在此基础上稍微进行修改,笔者用的是Maven项目,可能和此位博客稍微有些不同
————————————————
版权声明:本文为CSDN博主「午夜学徒xpf」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Xing_Pengfei/article/details/97649888

PDF文件预览和下载的更多相关文章

  1. java 文件转成pdf文件 预览

    一.前端代码 //预览功能 preview: function () { //判断选中状态 var ids =""; var num = 0; $(".checkbox& ...

  2. Vue PDF文件预览vue-pdf

       最近做项目,遇到预览PDF这个功能,在网上找了找,大多推荐的是pdf.js,不过在Vue中还是想偷懒直接npm组件,最后找到了一个还不错的Vue-pdf 组件,GitHub地址:https:// ...

  3. iOS实现pdf文件预览,上下翻页、缩放,读取pdf目录

    最近有个朋友想做一个pdf预览,要求能够上下滑动翻页.带缩放.目录跳转功能. 因为之前我只做过简单的预览,那时直接用uiwebview实现的,这次找了下资料,发现一个比较好的库. 其原理实现: 自定义 ...

  4. 利用 ICEpdf 快速实现 pdf 文件预览功能

    之前工作中,需要实现一个在线预览pdf的功能,一开始用的的 jQuery-media 插件来实现的,后来感觉有点慢,就继续寻找更好的替代品,直到遇见了 ICE pdf... ICEpdf (官网:ht ...

  5. 分享一个操作pdf文件的js文件-pdfObject.js(文件预览、下载、打印等操作都具备)

    获取相关资料或者源码的朋友可以关注下公众号,回复关键字pdf20200518即可

  6. vue中如何实现pdf文件预览?

    今天产品提出一个优化的需求,就是之前我们做的图片展示就是一个img标签搞定,由于我们做的是海外后台管理系统,那边的人上传的文件时pdf格式,vue本事是不支持这种格式文件展示的,于是就google搜索 ...

  7. html 转成 pdf 进行预览、下载、打印

    html 页面转成 pdf,直接看代码: 参考地址: https://github.com/linwalker/render-html-to-pdf 给出代码 方便粘贴: var downPdf = ...

  8. 实战动态PDF在线预览及带签名的PDF文件转换

    开篇语: 最近工作需要做一个借款合同,公司以前的合同都是通过app端下载,然后通过本地打开pdf文件,而喜欢创新的我,心想着为什么不能在线H5预览,正是这个想法,说干就干,实践过程总是艰难的,折腾了3 ...

  9. 动态PDF在线预览

    实战动态PDF在线预览及带签名的PDF文件转换 开篇语: 最近工作需要做一个借款合同,公司以前的合同都是通过app端下载,然后通过本地打开pdf文件,而喜欢创新的我,心想着为什么不能在线H5预览,正是 ...

随机推荐

  1. template.demo.js

    <!DOCTYPE html><html><head> <title>index</title> <meta charset=&quo ...

  2. java8(二)方法引用

    方法引用让你可以重复使用现有的方法定义,并像 Lambda 一样进行传递. 方法引用可以被看作仅仅调用特定方法的 Lambda 的一种快捷写法. 事实上,方法引用就是让你根据已有的方法实现来创建 La ...

  3. JVM调优之经验

    在生产系统中,高吞吐和低延迟一直都是JVM调优的最终目标,但这两者恰恰又是相悖的,鱼和熊掌不可兼得,所以在调优之前要清楚舍谁而取谁.一般计算任务和组件服务会偏向高吞吐,而web展示则偏向低延迟才会带来 ...

  4. 开发规范 小白进阶 python代码规范化

    开发规范 软件开发,规范项目的目录结构,代码规范,遵循 PeP8规范等等,让你更加清晰的,合理开发 一功能分类(文件名) settings.py配置文件 配置文件放一些静态参数, 划归固定的路径,文件 ...

  5. NLP系列文章:子词嵌入(fastText)的理解!(附代码)

    1. 什么是fastText 英语单词通常有其内部结构和形成⽅式.例如,我们可以从"dog""dogs"和"dogcatcher"的字⾯上推 ...

  6. vue入门:用户管理demo

    该demo纯前端实现 使用到vue技术点: 1.在该demo中使用到的vue指令:{{}}. v-if. v-model. @click v-for 2.在该demo中使用到的事件修饰符: .prev ...

  7. 重新学习MySQL数据库开篇:数据库的前世今生

    本文内容出自刘欣的"码农翻身"公众号,强烈推荐刘欣大大的文章.   数据库的前世今生 小李的数据库之旅 无纸化办公 小李是这个大学计算机科学与技术系的知名学生,他的编程能力了得,使 ...

  8. Example With JdbcDaoSupport

    By extended the JdbcDaoSupport, set the datasource and JdbcTemplate in your class is no longer requi ...

  9. Linux浏览创建文件

    pwd:打印当前工作目录(Print Working Directory) ls:列出文件和目录(List) - Ubuntu的清单默认有颜色区分:蓝色(目录).浅蓝色(链接文件).绿色(可执行文件) ...

  10. Hadoop RPC机制详解

    网络通信模块是分布式系统中最底层的模块,他直接支撑了上层分布式环境下复杂的进程间通信逻辑,是所有分布式系统的基础.远程过程调用(RPC)是一种常用的分布式网络通信协议,他允许运行于一台计算机的程序调用 ...