Oracle APEX中通过返回HTML的函数实现报表PDF自动下载
可行实现方案
以下是直接可落地的实现步骤,无需调整你现有的FNC_REPORT函数逻辑:
1. 新增应用级Ajax回调进程
首先在应用中新建一个按需执行的应用进程,命名为GET_REPORT_PDF,执行点选择「Ajax Callback: Run this application process when requested by a page process」,进程代码如下:
DECLARE v_report_clob CLOB; v_pdf_blob BLOB; v_id NUMBER := apex_application.g_x01; -- 接收前端传递的行ID参数 BEGIN -- 直接调用你已封装好的报表生成函数 v_report_clob := FNC_REPORT(v_id); -- 调用APEX内置打印能力将HTML+CLOB转换为PDF -- 依赖APEX实例已配置打印服务,内置转换支持基础HTML+CSS渲染 v_pdf_blob := apex_util.get_print_document( p_content => v_report_clob, p_content_type => 'text/html', p_print_format => 'pdf' ); -- 配置HTTP响应头,触发浏览器下载行为 owa_util.mime_header('application/pdf', false); htp.p('Content-Disposition: attachment; filename="业务报表_'||v_id||'.pdf"'); htp.p('Content-Length: ' || dbms_lob.getlength(v_pdf_blob)); owa_util.http_header_close; -- 输出PDF二进制流 wpg_docload.download_file(v_pdf_blob); apex_application.stop_apex_engine; END;
2. 调整报表查询构造下载列
不需要把FNC_REPORT的返回值直接放到查询结果中,只需构造一个下载触发列即可,示例查询如下:
SELECT COLUMN1, COLUMN2, -- 构造下载按钮,点击触发JS下载逻辑 '<a href="javascript:downloadReport('||ID||');" class="t-Button t-Button--tiny t-Button--primary">下载PDF</a>' AS DOWNLOAD_PDF_REPORT FROM 你的业务表;
注意:需要将
DOWNLOAD_PDF_REPORT列的显示类型设置为HTML表达式,避免HTML标签被转义。
3. 新增页面JS函数处理下载请求
在页面的「函数和全局变量声明」区域加入以下JS代码,实现无刷新下载:
function downloadReport(recordId) { apex.server.process( 'GET_REPORT_PDF', // 调用我们刚才创建的应用进程 {x01: recordId}, // 传递当前行ID参数 { dataType: 'blob', success: function(data) { // 生成临时下载链接触发浏览器下载 const blob = new Blob([data], {type: 'application/pdf'}); const downloadUrl = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = downloadUrl; a.download = `业务报表_${recordId}.pdf`; document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(downloadUrl); document.body.removeChild(a); } } ); }
简化备选方案(无JS实现)
如果不需要无刷新体验,也可以直接构造静态下载链接,无需额外JS代码:
SELECT COLUMN1, COLUMN2, APEX_UTIL.PREPARE_URL( 'f?p='||:APP_ID||':0:'||:APP_SESSION||':::APPLICATION_PROCESS=GET_REPORT_PDF::P_ID:'||ID, p_checksum_type => 'SESSION' ) AS DOWNLOAD_PDF_REPORT FROM 你的业务表;
将DOWNLOAD_PDF_REPORT列的显示类型设置为「链接」,链接文本自定义为「下载PDF」即可。
前置依赖说明
- 提前在APEX实例配置中开启打印服务,基础需求用内置PDF转换即可,复杂CSS样式建议搭配Oracle BI Publisher使用
- 你的
FNC_REPORT返回的HTML建议使用内联CSS,避免外部CSS引用导致转换后样式丢失
内容的提问来源于stack exchange,提问作者Adnan
相关产品推荐
相关产品推荐

