PDFBox内容加载问题:需将PDF字节数据原样展示至UI而非保存
解决方案
后端代码修正(满足原样输出PDF需求)
你的现有代码里用PDFBox做了完全多余的PDF修改操作(添加页面、提取重写文本),直接把Blob中的原始字节流写入响应输出流即可实现原样展示,同时支持UI端获取并渲染:
@RequestMapping(value = "/displaypdf.action", method = RequestMethod.GET) public void displaypdf(HttpServletRequest p_objRequest, HttpServletResponse p_objResponse, @RequestParam("filename") String p_sFilename) throws Exception { if (LOGGER.isDebugEnabled()) { LOGGER.debug(ClmSrDebugConstant.DISPLAYPDF); } Blob l_bContent = null; String l_sTcn = (String) p_objRequest.getSession().getAttribute(ClmSrConstant.TCN); ServletOutputStream l_objServletOutputStream = p_objResponse.getOutputStream(); Map<String, Object> l_mapConfigFile = new HashMap<String, Object>(); try { l_mapConfigFile = m_objClinicalService.retrieveMap(l_sTcn); // 遍历找到目标Blob,找到后直接跳出循环提升效率 for (String key : l_mapConfigFile.keySet()) { if (key.contains(p_sFilename)) { l_bContent = (Blob) l_mapConfigFile.get(key); break; } } if (l_bContent != null) { // 设置响应头,指定PDF类型并强制在线预览(若要让用户选择下载,可把inline改成attachment) p_objResponse.setContentType("application/pdf"); p_objResponse.setHeader("Content-Disposition", "inline; filename=\"" + p_sFilename + "\""); // 直接将Blob的原始字节流写入响应输出流,无需PDFBox解析修改 InputStream l_inptStrm = l_bContent.getBinaryStream(); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = l_inptStrm.read(buffer)) != -1) { l_objServletOutputStream.write(buffer, 0, bytesRead); } l_inptStrm.close(); } else { p_objResponse.setContentType(ClmSrConstant.TXT_CNTN_TYP); p_objResponse.getOutputStream().print(ClmSrConstant.NLP_REPORT_ERROR); } l_objServletOutputStream.flush(); l_objServletOutputStream.close(); } catch (Exception exExp) { if (LOGGER.isDebugEnabled()) { LOGGER.error(ClmSrDebugConstant.EXCEP_DISPLAYPDF, exExp); } // 异常时返回错误提示 p_objResponse.setContentType(ClmSrConstant.TXT_CNTN_TYP); p_objResponse.getOutputStream().print("加载PDF失败:" + exExp.getMessage()); } }
UI展示方案
给你三种常用的前端实现方式,按需选择:
iframe标签快速预览
依赖浏览器内置PDF渲染器,代码最简单:<iframe src="/displaypdf.action?filename=你的目标文件名.pdf" width="100%" height="800px" frameborder="0"></iframe>embed标签预览
和iframe逻辑类似,也是依赖浏览器原生能力:<embed src="/displaypdf.action?filename=你的目标文件名.pdf" type="application/pdf" width="100%" height="800px">PDF.js自定义渲染(支持扩展功能)
如果需要自定义样式、添加分页/搜索等功能,用PDF.js实现:<div id="pdf-container"></div> <!-- 提前把PDF.js的核心脚本下载到本地项目中引入 --> <script src="pdf.js"></script> <script src="pdf.worker.js"></script> <script> const pdfUrl = '/displaypdf.action?filename=你的目标文件名.pdf'; // 加载并渲染PDF第一页 pdfjsLib.getDocument(pdfUrl).promise.then(pdfDoc => { pdfDoc.getPage(1).then(page => { const scale = 1.5; const viewport = page.getViewport({ scale }); const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; document.getElementById('pdf-container').appendChild(canvas); page.render({ canvasContext: ctx, viewport }); }); }); </script>
内容的提问来源于stack exchange,提问作者dhS
相关产品推荐
相关产品推荐

