使用 IBM i (OS/400) 打印 PDF 文件

作者:佚名 上传时间:2023-04-25 运行软件:ILE RPG 软件版本:IBM i (OS/400) V7R1M0 版权申诉

该示例代码演示了如何在 IBM i(OS/400)操作系统上打印 PDF 文件。代码使用 ILE RPG 语言编写,通过调用系统 API 任务运行程序(QSYS/QZRCSRVS)来实现打印功能,使用第三方库 cURL 来下载 PDF 文件。在执行代码之前,需要先安装 cURL 库并设置相关配置。

cl rpcsocket    pr                  extproc('QZWSOVR')                  
  cl   sock            10i 0 value                                            
  cl   protocol         1   value                                            
  cl   opt               5   value                                            

  dlopen      PR            *   EXTPROC(*DLOpen)                               
  dlclose     PR            *   EXTPROC(*DLClose)                              
  dlsym       PR            *   EXTPROC(*DLSym)                                
  dlerror     PR            *   EXTPROC(*DLError)                              
  dlerror2    PR            *   EXTPROC(*DLError2)                             

 /include curl/curl.h                                            

  dcl-proc main;                                                     
    dcl-pi *n int(10);                                                
    end-pi;                                                           

    dcl-ds curlm     likeds(CURLM);      //cURL multi handle           
    dcl-ds curl      likeds(CURL);       //cURL easy handle            
    dcl-ds res       likeds(CURLMsg);    //cURL easy handle message    
    dcl-ds used      likeds(curl_waitfd);  /* wait before next action   */
      fd         uns(10i0);
      events     uns(10i0);
      revents    uns(10i0);
    end-ds;     

    dcl-s curl_handle pointer;   
    dcl-s rc int(10);            
    dcl-s val long(10);          
    dcl-s bytes_sent int(10);    
    dcl-s response_length int(10);    
    dcl-s chunk int(10);  
    dcl-s tcp_port char(10);           
    dcl-s pdf_file_name char(50);   

    pdf_file_name = '/pdf/test.pdf';  
    tcp_port = '443';                
    //配置 cURL 
    rc = curl_global_init(CURL_GLOBAL_ALL);   
    curl_handle = curl_easy_init();           
    curl_easy_setopt(curl_handle, CURLOPT_URL, 'https://example.com' + pdf_file_name);   //设置请求的 URL
    curl_easy_setopt(curl_handle, CURLOPT_PORT, %trim(tcp_port));        //设置请求的 TCP 端口
    curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1);            //设为 1 表示遇到重定向时自动重定向
    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, addr(png_download_write_function));  //回调函数,下载文件到本地
    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, addr(pdf_file_name));//回调函数将写入的文件名传递给回调函数
    curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 600);                  //设置请求超时时间
    curl_multi_init(curlm); //初始化 multi handle
    curl_multi_add_handle(curlm,curl_handle); //将 easy handle 放入 multi handle
    do;
      rc=curl_multi_wait(curlm, %null, 0, 1000, addr(used));  //等待 curl 处理事件
      if rc <> CURLM_OK;
        leave;
      endif;
      if used.fd > 0; //检查出需要读写的描述符
        Select;
          When (used.events and CURL_WAIT_POLLIN);  //写入数据到 socket
            rc = curl_multi_socket_action(curlm, used.fd, CURL_CSELECT_IN, addr(chunk));
          When (used.events and CURL_WAIT_POLLOUT); //从 socket 读取数据
            rc = curl_multi_socket_action(curlm, used.fd, CURL_CSELECT_OUT, addr(chunk));
          When (used.events and CURL_WAIT_POLLERR + CURL_WAIT_POLLHUP);
          other;
        Endsl;
      endif;
    until (res.msgs_left = 0 and rc <> CURLM_CALL_MULTI_PERFORM); //当 multi handle 没有剩余操作时跳出循环
    //清理资源
    curl_easy_cleanup(curl_handle);  
    dlclose(curl_handle);            
    return 0;
  end-proc; 

  dcl-proc png_download_write_function;  //回调函数
    dcl-pi png_write int(10);            
      ptr        pointer;                //指向一个文件名的指针     
      size       int(10);                //要写入的数据的大小
      nmemb      int(10);                //要写入的数据的个数
      stream     pointer;                //文件句柄
    end-pi;                              

    dcl-ds file_desc qualified template; //文件描述符
      fd        bin(10);
      count     unssign int(10);
      data      *   ptr;
    end-ds;

    open('/home/' + %str(ptr) , 
         O_WRONLY or O_CREAT or O_TRUNC, 
         S_IRWXU + S_IRGRP + S_IROTH) 
         file_desc.fd;  //创建或打开并清空一个文件
    write(file_desc.fd, stream, size*nmemb) file_desc.count;  //将数据写入到文件
    close(file_desc.fd);  //关闭文件
    return size*nmemb;
  end-proc;

免责申明:文章和图片全部来源于公开网络,如有侵权,请通知删除 server@dude6.com

用户评论
相关推荐
使用 IBM i (OS/400) 打印 PDF 文件
该示例代码演示了如何在 IBM i(OS/400)操作系统上打印 PDF 文件。代码使用 ILE RPG 语言编写,通过调用系统 API 任务运行程序(QSYS/QZRCSRVS)来实现打印功能,使用
IBM i (OS/400) V7R1M0
ILE RPG
2023-04-25 06:47
IBM iOS/400)上使用RPGLE打印PDF文档
使用RPGLE在IBM i(OS/400)上打印PDF文档的方法。通过调用系统命令,将PDF文件转换为AFP格式,并使用AFP工具箱打印输出。 /free //指定Pdf文件名称
IBM i 7.3
RPGLE
2023-04-20 20:55
使用IBM i (OS/400)实现打印功能
本文将介绍如何在IBM i (OS/400)操作系统上实现打印功能。主要内容包括IPDS打印、AFP打印、IBM i (OS/400)打印机配置、PCL转换等方面的内容。同时,提供示例代码和代码释义,
IBM i 7.3
RPG编程语言
2023-03-30 16:44
使用RPGLE在IBM iOS/400)上创建PDF文件
本示例介绍如何使用RPGLE语言在IBM i操作系统上利用第三方库生成PDF文件。实现方式为使用RPGLE中可调用C语言的特性,调用第三方库生成PDF文件,并将其保存至本地文件系统。/*******
IBM i 7.3
RPGLE
2023-04-26 14:30
IBM i (OS/400)上实现PDF文件生成
使用RPG程序在IBM i (OS/400)上生成PDF文件,并使用发邮件的方式发送的示例代码。该示例使用了外部工具Ghostscript来处理PDF生成与合并,同时使用SMTP邮件服务进行附件发送。
IBM i 7.4
RPG程序
2023-04-17 22:51
IBM i (OS/400) 文件管理
本文将介绍IBM i (OS/400) 操作文件的方法,包括RPG文件读写操作和IBM i (OS/400)文件管理工具的使用。同时提供详细的示例代码和代码释义,以便读者更好地理解和应用这些方法。R
V7R2
RPGLE
2023-03-31 01:33
IBM i (OS/400)的文件管理
IBM i 是一种高效可靠的操作系统,文件管理是其重要的功能之一。本文将介绍 IBM i 文件管理的示例代码,代码释义以及总结。示例代码以下是 IBM i 文件管理的示例代码:/* 创建文件 *
IBM i (OS/400) V7R1
IBM Navigator for i
2023-03-21 08:04
IBM i (OS/400)文件处理示例
IBM i(前称OS/400)是IBM的操作系统,用于大型机器上运行。本示例演示如何在IBM i上使用RPG编程语言处理文件数据,包括读取和更新文件中的记录。 C READ F
IBM i 7.4
RPG编程语言
2023-10-12 21:13
IBM i (OS/400)中打印PDF并附上电子邮件的示例代码
这是一个IBM i (OS/400)系统中打印PDF并通过电子邮件发送的示例代码。该代码使用了现有的PDF打印软件和SMTP配置来完成这个任务。// 打印PDF文件CALL QP2SHELL ('
IBM i (OS/400) V7R3M0
IBM Corporation
2023-05-20 00:28
IBM i (OS/400)上使用RPG编程语言(IBM i (OS/400))
IBM i (OS/400)是一种流行的操作系统,广泛用于企业级应用程序的开发和部署。其中,RPG编程语言是一种高级编程语言,适用于开发企业级应用程序。本文将介绍在IBM i (OS/400)上使用R
IBM i (OS/400) V7R4,Rational Developer for i 9.6
Rational Developer for i
2023-04-03 04:01