You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:33:14