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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:24:03