You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Oracle APEX应用中使用XSL-FO实现报表直接打印不显示界面?

嘿,这个需求我之前帮不少APEX开发者搞定过,要实现XSL-FO报表直接发送到打印机而不在屏幕显示,主要有这几种可行的方案,你可以根据自己的场景选:

方法1:借助浏览器打印API实现无预览打印

这种方式适合需要用户触发,但不想显示PDF预览的场景:

  • 首先得确保你的XSL-FO报表已经能正常生成PDF,这是基础哈。
  • 在你的页面上创建一个PL/SQL页面进程,类型选“PL/SQL”,然后用APEX的API生成报表的PDF链接,再通过JavaScript触发浏览器的打印功能,打印完成后自动关闭弹窗。
  • 给你个现成的PL/SQL代码示例,记得替换成你自己的页面ID和参数:
DECLARE
    l_pdf_url VARCHAR2(4000);
BEGIN
    -- 替换成你的报表页面ID、应用ID和参数
    l_pdf_url := APEX_UTIL.PREPARE_URL(
        p_url => 'f?p=' || :APP_ID || ':100:SESSION::NO:100:P100_REPORT_ID:' || :P1_REPORT_ID,
        p_checksum_type => 'SESSION'
    );
    -- 加载完成后自动打印并关闭窗口
    APEX_JAVASCRIPT.ADD_ONLOAD_CODE(
        p_code => 'var printWin = window.open("' || l_pdf_url || '"); printWin.onload = function() { printWin.print(); printWin.close(); };'
    );
END;
  • 注意:浏览器可能会拦截这个弹窗,所以要提醒用户允许你的APEX应用弹出窗口,不然功能会失效。

方法2:服务器端直接打印(无用户交互场景)

如果需要完全在后台完成打印,不需要用户操作浏览器,就可以用这种方式:

  • 第一步,先在服务器上生成XSL-FO对应的PDF文件,你可以用APEX_UTIL.GET_PRINT_DOCUMENT这个API,或者自己的XSL-FO转换工具。
  • 然后把生成的PDF写入服务器的临时目录,再调用操作系统的打印命令(Linux用lp,Windows用print),通过PL/SQL的DBMS_SCHEDULER或者UTL_FILE来执行。
  • 示例代码片段(Linux环境下):
DECLARE
    l_pdf BLOB;
    l_file UTL_FILE.FILE_TYPE;
    l_print_cmd VARCHAR2(1000);
BEGIN
    -- 生成PDF报表,替换成你的报表查询名称和应用ID
    l_pdf := APEX_UTIL.GET_PRINT_DOCUMENT(
        p_application_id => :APP_ID,
        p_report_query_name => 'EMPLOYEE_REPORT',
        p_format => 'pdf',
        p_bookmark => 'N'
    );
    -- 将PDF写入服务器临时目录(需要先创建PRINT_DIR目录对象并授权)
    l_file := UTL_FILE.FOPEN('PRINT_DIR', 'temp_emp_report.pdf', 'wb', 32767);
    UTL_FILE.PUT_RAW(l_file, l_pdf);
    UTL_FILE.FCLOSE(l_file);
    -- 调用Linux打印命令,替换成你的打印机名称和文件路径
    l_print_cmd := 'lp -d office_printer /opt/oracle/apex/print_dir/temp_emp_report.pdf';
    -- 创建临时任务执行打印命令
    DBMS_SCHEDULER.CREATE_JOB(
        job_name => 'PRINT_EMP_REPORT_JOB',
        job_type => 'EXECUTABLE',
        job_action => l_print_cmd,
        enabled => TRUE,
        auto_drop => TRUE
    );
END;
  • 前置条件:需要在数据库中创建PRINT_DIR目录对象,给APEX用户授予读写权限;同时服务器要配置好可用的打印机,确保打印命令能正常执行。

方法3:通过Oracle BI Publisher打印服务器配置

如果你用的是APEX官方推荐的BI Publisher作为打印服务器,配置起来更简单:

  • 进入报表的编辑页面,找到“打印”属性组。
  • 设置“打印格式”为PDF,然后在“打印选项”里选择“直接发送到打印机”(不同APEX版本选项名称可能略有差异)。
  • 前提是你已经配置好BI Publisher作为APEX的打印服务器,并且在BI Publisher里添加了可用的打印机。

几个踩过的坑要注意

  • 开发环境下浏览器的弹窗拦截可能更严格,测试的时候记得先允许弹窗。
  • 服务器端打印时,APEX用户需要有执行操作系统命令的权限,别忘给用户授权。
  • 不同APEX版本的API参数可能有变化,比如APEX_UTIL.GET_PRINT_DOCUMENT在新版本里可能新增了参数,建议对照你用的版本的官方文档调整。

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

火山引擎 最新活动