文章目录

  • PDFObject插件
  • PDF以链接请求的方式获取
  • 后记


PDFObject插件

PDFObject插件是一款前端阅读pdf的便捷插件,简单好用,官方网址:https://pdfobject.com/,官方提供的简单用例:

<script src="/js/pdfobject.js"></script>
var options = {
   width: "20rem",
   height: "20rem"
};
PDFObject.embed("myfile.pdf", "#my-container", options);

详细的使用可以参考官方API,这里不做说明。

PDF以链接请求的方式获取

一般情况下,当使用PDFObject的时候,传入的pdf都是路径的方式去应用,当我们的PDF不在本地或者在远端的时候我们该怎么引用呢?

PDFObject.embed("xxx/xxx.do?id=xxxxx", "#my-container", options);

一般我们都会直接替换路径为请求就可以了,但是这样有时候是行不通的,F12没报错,后台的请求也确实执行了,但是容器里就是不显示PDF,而且我们将这个url贴到浏览器地址里是可以正常下载的。然后就开始百度,开始谷歌,发现大部分人都是有这种问题的,但是都没有一个好的解决方案。

查看后台下载的代码:

/**
 * @param response 
 * @param filePath		//文件完整路径(包括文件名和扩展名)
 * @param fileName		//下载后看到的文件名
 * @return  文件名
 */
public static void fileDownload(final HttpServletResponse response, String filePath, 	String fileName) throws Exception{ 
    //将文件转换为字节数组
    byte[] data = FileUtil.toByteArray2(filePath);  
    fileName = URLEncoder.encode(fileName, "UTF-8");  
    response.reset();  
    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");  
    response.addHeader("Content-Length", "" + data.length);  
    response.setContentType("application/octet-stream;charset=UTF-8");  
    OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());  
    outputStream.write(data);  
    outputStream.flush();  
    outputStream.close();
    response.flushBuffer();
}

这段下载代码下载任何文件都是没有问题的,在项目当中也是经常用到,但是用于PDFObject就行不通了,也不是这段代码的问题,这里做个稍微的改动:

/**
 * Jackrabbit库中文件设定类型的去显示
 * 针对pdfObject的修改
 * @param response
 * @param data
 * @throws Exception
 */
public static void  pdfObjectViewer(final HttpServletResponse response, byte[] data) 	throws Exception{
     response.reset();
     response.setContentType("application/pdf;charset=UTF-8");
     OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
     outputStream.write(data);
     outputStream.flush();
     outputStream.close();
     response.flushBuffer();
}

大家不用在意这个data字节数组,看自己的逻辑要求去修改就可以,主要是设定这个MIME类型,原先的下载MIME类型是octet-stream,这里修改为指定的文件类型pdf,文件名的设定不需要也可以。

application:某二进制的一个附件

octet-stream:子类型,不确定下载文件的通用指定

pdf:pdf类型的文件

后记

希望大家遇到同样的问题后能看到这篇笔记,有不对的地方请指正,让他人少走弯路。