PDF文件预览和下载
背景:项目中实现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文件预览和下载的更多相关文章
- java 文件转成pdf文件 预览
一.前端代码 //预览功能 preview: function () { //判断选中状态 var ids =""; var num = 0; $(".checkbox& ...
- Vue PDF文件预览vue-pdf
最近做项目,遇到预览PDF这个功能,在网上找了找,大多推荐的是pdf.js,不过在Vue中还是想偷懒直接npm组件,最后找到了一个还不错的Vue-pdf 组件,GitHub地址:https:// ...
- iOS实现pdf文件预览,上下翻页、缩放,读取pdf目录
最近有个朋友想做一个pdf预览,要求能够上下滑动翻页.带缩放.目录跳转功能. 因为之前我只做过简单的预览,那时直接用uiwebview实现的,这次找了下资料,发现一个比较好的库. 其原理实现: 自定义 ...
- 利用 ICEpdf 快速实现 pdf 文件预览功能
之前工作中,需要实现一个在线预览pdf的功能,一开始用的的 jQuery-media 插件来实现的,后来感觉有点慢,就继续寻找更好的替代品,直到遇见了 ICE pdf... ICEpdf (官网:ht ...
- 分享一个操作pdf文件的js文件-pdfObject.js(文件预览、下载、打印等操作都具备)
获取相关资料或者源码的朋友可以关注下公众号,回复关键字pdf20200518即可
- vue中如何实现pdf文件预览?
今天产品提出一个优化的需求,就是之前我们做的图片展示就是一个img标签搞定,由于我们做的是海外后台管理系统,那边的人上传的文件时pdf格式,vue本事是不支持这种格式文件展示的,于是就google搜索 ...
- html 转成 pdf 进行预览、下载、打印
html 页面转成 pdf,直接看代码: 参考地址: https://github.com/linwalker/render-html-to-pdf 给出代码 方便粘贴: var downPdf = ...
- 实战动态PDF在线预览及带签名的PDF文件转换
开篇语: 最近工作需要做一个借款合同,公司以前的合同都是通过app端下载,然后通过本地打开pdf文件,而喜欢创新的我,心想着为什么不能在线H5预览,正是这个想法,说干就干,实践过程总是艰难的,折腾了3 ...
- 动态PDF在线预览
实战动态PDF在线预览及带签名的PDF文件转换 开篇语: 最近工作需要做一个借款合同,公司以前的合同都是通过app端下载,然后通过本地打开pdf文件,而喜欢创新的我,心想着为什么不能在线H5预览,正是 ...
随机推荐
- centos虚拟机配置静态ip
昨天在配置虚拟机的时候因为之前没有设置静态IP,而是使用DHCP动态分配的,导致关机后下次开机虚拟机的ip是随机变动的.严重影响了工作体验啊,遂设置静态ip以保全! 虚拟机使用的是CentOS6.5, ...
- JVM调优之经验
在生产系统中,高吞吐和低延迟一直都是JVM调优的最终目标,但这两者恰恰又是相悖的,鱼和熊掌不可兼得,所以在调优之前要清楚舍谁而取谁.一般计算任务和组件服务会偏向高吞吐,而web展示则偏向低延迟才会带来 ...
- final,权限,引用类型数据
1. final关键字 1.概述 为了避免子类出现随意改写父类的情况,java提供了关键字final,用于修饰不可改变内容 final:不可改变,可以修饰类,方法和变量 类:被修饰的类,不能用于继承 ...
- springboot脚手架,逐渐成长成一个优秀的开源框架
目录 项目介绍 环境搭建 开发工具 开发环境 工具安装 系统架构 启动项目 springboot基于spring和mvc做了很多默认的封装.这样做的好处极大的方便了开发者的效率.尽管与此我们每个人还是 ...
- APP手机商城系统选择,混合开发与原生开发哪个好?
关于手机APP开发用混合还是原生现在说法不一,有说混合开发好:时间短.费用低.效果也不错,有说原生开发好,原生APP在性能方面比较好.而商城系统中的手机APP用混合开发还是原生开发比较好呢? 最近我参 ...
- Sqlserver 使用.net查询被事务锁住处理
在有些应用场景中.事务开了后或能需要再去调用某个DAL读取表中的数据.但DAL里又是新开的链接,由于外面有事务所以这里读的时候就读不到.这种情况下可以在这个DAL的查询里开一个新的事务级别设为允许脏读 ...
- 逆向破解之160个CrackMe —— 016
CrackMe —— 016 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- 跟我学SpringCloud | 第十五篇:微服务利剑之APM平台(一)Skywalking
目录 SpringCloud系列教程 | 第十五篇:微服务利剑之APM平台(一)Skywalking 1. Skywalking概述 2. Skywalking主要功能 3. Skywalking主要 ...
- 【2017cs231n】:课程笔记-第2讲:图像分类
[2017cs231n]:课程笔记-第2讲:图像分类 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...
- unity之截屏功能
1.全屏截图 方法一:在unity的API中,unity给我们提供了一个现成的API : Application.CaptureScreenshot(imagename). 但是这个API虽然简单 ...