【问题标题】:Oracle Apex save PDF into Database with ORDS?Oracle Apex 使用 ORDS 将 PDF 保存到数据库中?
【发布时间】:2020-09-15 06:44:42
【问题描述】:

我们有一个将 sql 查询转换为 xml 的函数,在共享组件中我们有一个 xsl-fo 样式表。将两者结合起来,我们希望生成 PDF 并将它们保存到数据库中。
现在我们尝试使用 Print API (APEX_UTIL.GET_PRINT_DOCUMENT),但 PDF 已损坏并返回 401 错误(未授权)。 我们正在使用 Apex 19.1 并作为打印选项 ORDS。
我在某处读到您无法使用这些内容,因为使用 ORDS,PDF 只会返回给客户端。

因为我对整个 PDF 打印主题很陌生:

有没有办法将 PDF 保存到数据库中?或者这是只有付费解决方案才有的功能?是否需要使用 REST 配置任何必要的设置?

【问题讨论】:

    标签: pdf pdf-generation oracle-apex


    【解决方案1】:

    如果可以将 PDF 转换为 BLOB,则可以保存它,但 APEX 本身无法为您提供该功能。

    您说得对:“我在某处读到了您无法使用的内容,因为使用 ORDS,PDF 只会返回给客户。”

    例如我在 Jasper Server Community 中创建了一个报告,并使用 PLSQL 将其保存到数据库中

     declare
        l_url   VARCHAR2(3000) := '//apexdevtesting.com:8081/jasperserver/rest_v2/reports/reports/Blank_Letter.pdf?STATUS=';
        l_request   SYS.utl_http.req;
        l_response  SYS.utl_http.resp;
        l_download  RAW(32767);
        l_file      BLOB;
        l_mimetype  VARCHAR2(50) := 'application/pdf';
        l_charset   VARCHAR2(50) := 'UTF8';
        l_filename varchar2(50) := 'archivo_'||ARCHIVOS_CARGADOS_SEQ.nextval||'.pdf';
        
    begin
    l_request := SYS.utl_http.begin_request(l_url ||'ASSIGNED&'||'j_username=jasperadmin'||'&'||'j_password=jasperadmin' );
                    SYS.utl_http.set_header(l_request, 'User-Agent', 'Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0');
                    
                    l_response := SYS.utl_http.get_response(l_request);
                    dbms_lob.createtemporary(l_file, TRUE, dbms_lob.SESSION);
                    LOOP
                    BEGIN
                        SYS.utl_http.read_raw(l_response, l_download);
                        dbms_lob.writeappend(l_file, utl_raw.LENGTH(l_download), l_download);
                        
                        INSERT INTO j_test2
                        VALUES (SYS_GUID(),
                          SYSTIMESTAMP,
                          l_file,
                          l_mimetype,
                          l_filename);
                        
                        EXCEPTION WHEN SYS.utl_http.end_of_body THEN
                            EXIT;
                        END;
                    END LOOP;
                    SYS.utl_http.end_response(l_response);
                    commit;
    end;
    

    【讨论】:

    • 感谢您抽出宝贵时间!我们实际上设法找到了我们自己的方法。它以类似的方式,所以我仍然接受它。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 2021-05-12
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2016-02-17
    相关资源
    最近更新 更多