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

Oracle Apex打印页面另存PDF时自定义默认文件名求助

解决Oracle Apex发票PDF默认文件名问题

原代码的问题

你之前的JS代码存在几个关键错误:

  • 直接在JS里写:P48_INV_CODE无法正确获取Apex页面项的值,得用Apex的API来取值
  • URL拼接逻辑错误,会话参数的传递方式不对,而且原URL里硬编码了P48_INV_CODE路径参数,不符合Apex的参数传递规范

推荐方案:通过PLSQL设置HTTP响应头(最可靠)

因为你的页面是PLSQL Dynamic Content类型,直接在PLSQL代码里设置Content-Disposition响应头,就能让浏览器保存PDF时默认使用发票编号作为文件名。

实现步骤:

  1. 先获取当前发票编号,再设置响应头:
DECLARE
    l_inv_code VARCHAR2(100) := :P48_INV_CODE;
BEGIN
    -- 设置PDF对应的MIME类型
    owa_util.mime_header('application/pdf', FALSE);
    -- 指定文件名,可自定义格式(比如加前缀)
    htp.p('Content-Disposition: attachment; filename="发票_' || l_inv_code || '.pdf"');
    -- 关闭HTTP头输出,开始输出页面内容
    owa_util.http_header_close;

    -- 此处写入你原有的PLSQL Dynamic Content代码,输出发票HTML内容
    -- ... 你的现有代码 ...
END;
/

如果页面需要同时支持在线预览和PDF下载,可以加URL参数(比如?download=1)控制是否输出响应头,判断逻辑如下:

IF apex_application.g_x01 = '1' OR :REQUEST = 'DOWNLOAD' THEN
    -- 输出上面的HTTP头代码
END IF;

备选方案:通过JS修改页面标题控制PDF文件名

浏览器打印对话框的默认文件名,通常会取当前页面的<title>值,所以可以在打印前动态修改页面标题为发票编号,打印后再恢复原标题。

实现代码(放在PLSQL Dynamic Content里):

htp.p('<button onclick="printInvoice()">打印发票</button>');
htp.p('<script>');
htp.p('function printInvoice() {');
htp.p('    // 获取发票编号');
htp.p('    var invCode = apex.item(''P48_INV_CODE'').getValue();');
htp.p('    // 保存原页面标题');
htp.p('    var originalTitle = document.title;');
htp.p('    // 设置新标题为发票编号');
htp.p('    document.title = ''发票_'' + invCode;');
htp.p('    // 触发打印');
htp.p('    window.print();');
htp.p('    // 延迟恢复原标题,避免影响页面');
htp.p('    setTimeout(() => { document.title = originalTitle; }, 500);');
htp.p('}');
htp.p('</script>');

修正原页面跳转逻辑(如果需要跳转到单独页面打印)

如果你需要跳转到单独的发票页面再打印,修正后的JS代码如下:

htp.p('<a href="#" onclick="openInvoicePage()">查看发票</a>');
htp.p('<script>');
htp.p('function openInvoicePage() {');
htp.p('    var invCode = apex.item(''P48_INV_CODE'').getValue();');
htp.p('    var baseUrl = ''https://hekalit.oracleapexservices.com/apexdbl/r/hekalit22/ite-i-com-erp-for-emaar159/invoicepage'';');
htp.p('    // 用Apex API获取会话ID');
htp.p('    var sessionId = apex.util.getSessionId();');
htp.p('    // 正确拼接URL参数');
htp.p('    var fullUrl = `${baseUrl}?P48_INV_CODE=${invCode}&session=${sessionId}`;');
htp.p('    // 新开窗口打开发票页面');
htp.p('    window.open(fullUrl, ''_blank'');');
htp.p('}');
htp.p('</script>');

跳转后的目标页面,再用上面的方案一或方案二设置PDF文件名即可。

内容的提问来源于stack exchange,提问作者Retal Omar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:25:16