PDF.JS+JAVA跨域改进版

来源:互联网 发布:孙可望 知乎 编辑:程序博客网 时间:2024/06/08 10:44

改进内容:
上一篇博客已经介绍了怎么说使用PDF.JS进行在线预览pdf的操作了,但是在兼容性的方面出现了一些问题。经过不断的研究找到了以下的方法。(未阅读上一篇博客的长友请移步上一篇)
打开自己工程的viewer.js
把ajax部分给删掉,也就是这部分

var PDFData = ""; //定义一个空变量  $.ajax({      type: "GET", //如果报405错误就把post改成get      async: false,      mimeType: 'text/plain; charset=x-user-defined',      url: "传入后台方法", //获取服务器路径      success: function(data) {          PDFData = data; //data就是byte[]数组,下面有介绍      }  });  var rawLength = PDFData.length;  //转换成pdf.js能直接解析的Uint8Array类型,见pdf.js-4068    var array = new Uint8Array(new ArrayBuffer(rawLength));  for (var i = 0;i < rawLength; i++) {      ·[i] = PDFData.charCodeAt(i) & 0xff;  }  var pdf_url = array;  

然后在里面加上这些:

var path = [你自己服务器的地址];var pdf_url = path +[新的一个地址,为后台留接口];

ok,这里说明我们把刚进页面调用ajax给去掉,定义一个变量来接收后台直接传的文件流,把这个文件流在后面的代码里赋值给了DEFAULT_URL。下面讲java代码,这里还是以阿里云的OSS为例。

/* * Pdf测试 */@RequestMapping(value = "[这里是自己的地址]", method = RequestMethod.GET)public @ResponseBody byte[] loadPdf1(Model model, HttpServletResponse response, HttpServletRequest request) {    // final String keySuffixWithSlash = "594/4452903.pdf";    // 这里是数据库的bucket_key    final String keySuffixWithSlash = "baogaotest2.pdf";    // 创建OSSClient实例    OSSClient Server = new OSSClient(endpoint, accessKeyId, accessKeySecret);    Date expiration = new Date(new Date().getTime() + 3600 * 1000);    GeneratePresignedUrlRequest request1 = new GeneratePresignedUrlRequest("kiki-test", keySuffixWithSlash,            HttpMethod.GET);    // 设置过期时间    request1.setExpiration(expiration);    URL signedUrl = Server.generatePresignedUrl(request1);    String url = signedUrl.toString();    Server.shutdown();    System.out.println("signed url for getObject: " + signedUrl.toString());    HttpURLConnection httpConn = null;    URL urlObj;    byte buffBytes[] = new byte[1024];    try {        HttpURLConnHelper HttpURLConnHelper = new HttpURLConnHelper();        InputStream input = HttpURLConnHelper.loadFileFromURL(url);        response.setStatus(HttpServletResponse.SC_OK);        response.setContentType("application/pdf;charset=UTF-8");        ServletOutputStream out = null;        out = response.getOutputStream();        int read = 0;        //byte buffBytes[] = new byte[1024];        while ((read = input.read(buffBytes)) != -1) {            out.write(buffBytes, 0, read);        }        out.flush();        out.close();    } catch (IOException e1) {        e1.printStackTrace();    }    return buffBytes;}

说明:这样的改进是页面引入的时候是一个后台地址用于viewer.jsp的显示,然后文件流在单独给一个地址,在viewer.js里用一个变量去加载这个文件流,用于加载pdf的信息。解决了一些浏览器对Uint8Array这个对象的兼容性的问题。实测几乎兼容市面上的大多数浏览器。

原创粉丝点击