背景:项目中实现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文件

  1. 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进行传值

//例:

  1. <form action="/api/file/downloadFile" style="display: none" method="post" id="downloadForm">
    <input type="text" name="fileId" value="0" id="downloadFilename">
    </form>
  1. 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();
    }
  2.  
  3. //我这里通过前台向后台传入了一个id 然后后台通过id在数据库中查询文件的地址
  4.  
  5. //若想传其他参数可以参考这个...
  1.  

//后台代码
@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. Mybatis学习笔记之---动态sql中标签的使用

    动态Sql语句中标签的使用 (一)常用标签 1.<if> if标签通常用于WHERE语句中,通过判断参数值来决定是否使用某个查询条件, 他也经常用于UPDATE语句中判断是否更新某一个字段 ...

  2. .net软件开发脚本规范-代码标准(webform)

    一. 代码标准 列表界面 1.1前台代码 1) 样式与js脚本,UI.css为界面样式,Font.css为字体样式,Common.js为通用基础js脚本,基本所有页面都需要,如果有需要新增的复制一行, ...

  3. 从IDEA角度来看懂UML图

    前言 我们目前已经学习了设计模式的7种设计原则.下面本该是直接进入具体的设计模式系列文章. 但是呢在我们学习设计模式之前我们还是有必要了解一下uml图.因为后续的设计模式文章不出意外应该会很多地方使用 ...

  4. 【C语言基础】unsigned short类型用于循环的一个难点

    我在我的知识星球:“C语言解惑课堂”里的第一篇提出一个问题:[第1篇][C语言基础][unsigned short类型用于循环的一个难点]要查看更多的C语言难点解析或者需要提问的同学,微信扫扫文末我的 ...

  5. 编程杂谈——Platform target x64

    在Visual Studio中选择.NET Framework框架并选用任意模板创建一个普通的Web应用工程,毫无疑问,此时应该是能够正常运行此工程的. 但是将工程属性->编译->Plat ...

  6. Go 语言基础——错误处理

    #### 学习目标 掌握错误处理 掌握自定义错误处理 掌握defer关键字的使用 ------ #### 错误处理 GO没有异常处理机制 Go语言引入了一个关于错误处理的标准模式,即error接口,该 ...

  7. .net core redis的全套操作

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). Redis支持主从同步.数据可以从主服务器向任意数 ...

  8. Jupter NotebooK学习

    1.参考资料 B站上学习视频 Jupyter 安装与使用 2.安装 在cmd窗口中输入(创建的文件会再当前的目录下):pip install jupyter 然后输入:jupyter notebook ...

  9. MapDB使用入门

    背景 MapDB官网:http://www.mapdb.org 官方翻译之后的话:MapDB基于堆外存储.磁盘存储提供了Java的Maps.Sets.Lists.Queues等功能.它混合了Java集 ...

  10. three.js实现球体地球2018年全球GDP前十国家标记

    概况如下: 1.SphereGeometry实现自转的地球: 2.THREE.Math.degToRad,Math.sin,Math.cos实现地图经纬度与三位坐标x,y,z之间的转换: 3.Imag ...