前言
最近需要实现在浏览器上预览 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预览功能的实现,以上方法亲测有效,希望能给大家一个参考。