作者:mobiledu2502858037 | 来源:互联网 | 2022-12-06 19:44
我正在尝试使用Javascript实现PDF文件下载功能.
作为对POST
请求的响应,我得到一个PDF文件,在Chrome DevTools控制台中看起来像(oResult
数据容器,片段):
"%PDF-1.4↵% ↵40obj↵<>stream↵x
现在我正在尝试初始化下载过程:
let blob = new Blob([oResult], {type: "application/pdf"});
let link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = "tstPDF";
link.click();
结果,点击一个按钮我得到tstPDF.pdf,它包含正确的页数,但PDF本身是空的,没有显示内容,尽管它是6 KB.
当我测试生成PDF的Java服务器端模块时,一切正常,它InputStream
通过发送ServletOutputStream
.因此,我认为这个问题是地方上的客户端,或许有东西MIME
,BLOB
,encoding
,或类似的.
您知道为什么生成的PDF不显示任何数据吗?
1> Mike B...:
我解决了这个问题.问题在于数据从服务器传递到客户端的方式.确保服务器以Base64
编码方式发送数据至关重要,否则客户端无法将PDF字符串反序列化为二进制格式.下面,您可以找到完整的解决方案.
服务器端:
OutputStream pdfStream = PDFGenerator.pdfGenerate(data);
String pdfFileName = "test_pdf";
// represent PDF as byteArray for further serialization
byte[] byteArray = ((java.io.ByteArrayOutputStream) pdfStream).toByteArray();
// serialize PDF to Base64
byte[] encodedBytes = java.util.Base64.getEncoder().encode(byteArray);
response.reset();
response.addHeader("Pragma", "public");
response.addHeader("Cache-Control", "max-age=0");
response.setHeader("Content-disposition", "attachment;filename=" + pdfFileName);
response.setContentType("application/pdf");
// avoid "byte shaving" by specifying precise length of transferred data
response.setContentLength(encodedBytes.length);
// send to output stream
ServletOutputStream servletOutputStream = response.getOutputStream();
servletOutputStream.write(encodedBytes);
servletOutputStream.flush();
servletOutputStream.close();
客户端:
let binaryString = window.atob(data);
let binaryLen = binaryString.length;
let bytes = new Uint8Array(binaryLen);
for (let i = 0; i
参考主题:
如何将response.outputStream中生成的PDF转换为Base64编码
从Javascript中的字节下载文件