SAP ABAP 直接把内表转换成PDF格式(smartform的打印函数输出OTF格式数据)

直接上代码:

java 复制代码
REPORT zcycle055.

DATA: lt_tab TYPE TABLE OF zpps001.
DATA: ls_tab TYPE zpps001.

ls_tab-werks = '1001'.
ls_tab-gamng = '150.00'.
ls_tab-gstrp = '20201202'.
ls_tab-aufnr = '000010000246'.
ls_tab-auart = '标准生产'.
ls_tab-gltrp = '20201205'.
ls_tab-matnr = '04-r02a000-00005'.
ls_tab-maktx = 'Cycle is handsome!'.
ls_tab-ernam = 'lf002'.
ls_tab-erdat = '20201202'.
ls_tab-zcwb = 'MO20120003'.
ls_tab-zdddw = '盒'.
ls_tab-ftrmi = '20201210'.
ls_tab-zzczgsmc = 'Cycle有限责任公司'.

APPEND ls_tab TO lt_tab.
CLEAR ls_tab.

PERFORM export_pdf.

FORM export_pdf.
  DATA:zsmart_name TYPE rs38l_fnam.
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname           = 'ZPP001'
    IMPORTING
      fm_name            = zsmart_name
    EXCEPTIONS
      no_form            = 1
      no_function_module = 2
      OTHERS             = 3.

  DATA: w_ctrlop TYPE ssfctrlop, "Smart Forms: 控制结构 "W_CONTROL
        w_compop TYPE ssfcompop, "SAP Smart Forms: 智能写作器 (传输) 选项"W_OUTPUT.
        w_return TYPE ssfcrescl. "Smart Forms: 表格打印结束时返回值
  DATA: len           TYPE i,
        w_filesize    TYPE i,
        g_pdf_xstring TYPE xstring,
        l_lines       TYPE TABLE OF tline WITH HEADER LINE.
  DATA  doctab TYPE TABLE OF docs WITH HEADER LINE.
  DATA  itab LIKE tline OCCURS 0 WITH HEADER LINE.
  DATA: file_name TYPE string,
        fullpath  TYPE string,
        path      TYPE string,
        p_sefile  LIKE rlgrap-filename VALUE 'D:\'.           "'/usr/sap/tmp/'.

  w_ctrlop-getotf    = 'X'."OTF 表的返回
  w_ctrlop-no_dialog = 'X'."关闭打印对话框
  "w_ctrlop-no_open   = 'X'."no dialog box
  "w_ctrlop-no_close  = 'X'."no

*&W_COMPOP-TDNOPRINT = 'X'.
  w_compop-tdnoprev  = 'X'."没有打印预览

  "W_COMPOP用来设置打印参数弹出对话框中的值,下面这几个参数不必要
*  W_COMPOP-TDNEWID  = 'X'.    "New Spool
  w_compop-tdimmed  = 'X'.
  w_compop-tddelete = ''.    "Delete Spool After Print
  w_compop-tdfinal  = 'X'.
  w_compop-tdiexit  = 'X'.    "Exit after printing in print preview
  w_compop-tddest   = 'lp01'.  "设备名称
  w_compop-xdf2outdev = 'lp01'.
  w_compop-tdarmod  = '1'.
  w_compop-tdnoprev = 'X'.        "隐藏报表预览功能,默认为空

*&smartforms打印 ,将打印的值输入到W_RETURN-OTFDATA[]中
  CALL FUNCTION zsmart_name
    EXPORTING
      control_parameters = w_ctrlop
      output_options     = w_compop
*     totalpages         = totalpages
*     zbukrs             = p_bukrs
*     zcb                = cb
      "gth_header         = gth_alv_sel
    IMPORTING
      job_output_info    = w_return
    TABLES
      t_item             = lt_tab  "传所选行项目明细内表 传到sf
    EXCEPTIONS
      formatting_error   = 1
      internal_error     = 2
      send_error         = 3
      user_canceled      = 4
      OTHERS             = 5.

"CONVERT_OTF函数取不到lines的返回值
"但是可以直接获取到PDF数据的XSTRING数据,可以用于后台直接OPEN DATASET 生成文件
  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      format                = 'PDF'
    IMPORTING
      bin_filesize          = len
      bin_file              = g_pdf_xstring
    TABLES
      otf                   = w_return-otfdata[]
      lines                 = itab
    EXCEPTIONS
      err_max_linewidth     = 1
      err_format            = 2
      err_conv_not_possible = 3
      err_bad_otf           = 4
      OTHERS                = 5.

  "后台OPEN DATASET 直接生成PDF文件
  CONCATENATE p_sefile sy-uname '-' sy-uzeit '.pdf' INTO file_name. "addrss
  OPEN DATASET file_name FOR OUTPUT IN BINARY MODE." MESSAGE L_MESSAGE_DB.
  IF sy-subrc EQ 0.
    TRANSFER g_pdf_xstring TO file_name.
    CLOSE DATASET file_name.
  ELSE.
    MESSAGE 'OPEN ERROR!!' TYPE 'E'.
    STOP.
  ENDIF.

  "CONVERT_OTF_2_PDF 可以生成PDF格式的内表
  CALL FUNCTION 'CONVERT_OTF_2_PDF'   "转换otf数据为二进制PDF文件,可以用于前台直接下载PDF文件
*    EXPORTING
*      use_otf_mc_cmd         = 'X'
*      archive_index          = archive_index
    IMPORTING
      bin_filesize           = len
    TABLES
      otf                    = w_return-otfdata[]
      doctab_archive         = doctab
      lines                  = l_lines[]
    EXCEPTIONS
      err_conv_not_possible  = 1
      err_otf_mc_noendmarker = 2.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  "前台下载PDF文件
  CONCATENATE 'D:\' sy-uname '-' sy-uzeit ' FFF.pdf' INTO  file_name.

  "定义文件名
  "这一段不屏蔽,  在打印的时候会有显示选择路径的对话框,屏蔽则直接保存在上面的文件名
  "file_name  指定的路径
  CALL METHOD cl_gui_frontend_services=>file_save_dialog    "保存文件窗口(选择路径)
    EXPORTING
      default_extension    = 'PDF'
      file_filter          = '*.PDF'
      default_file_name    = file_name
    CHANGING
      filename             = file_name
      path                 = path
      fullpath             = fullpath
*     user_action          = ua
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    CALL FUNCTION 'GUI_DOWNLOAD'   "保存文件在本地
      EXPORTING
        bin_filesize            = len
        filename                = file_name
        filetype                = 'BIN'
      IMPORTING
        filelength              = w_filesize
      TABLES
        data_tab                = l_lines[]
      EXCEPTIONS
        file_write_error        = 1
        no_batch                = 2
        gui_refuse_filetransfer = 3
        invalid_type            = 4
        no_authority            = 5
        unknown_error           = 6
        header_not_allowed      = 7
        separator_not_allowed   = 8
        filesize_not_allowed    = 9
        header_too_long         = 10
        dp_error_create         = 11
        dp_error_send           = 12
        dp_error_write          = 13
        unknown_dp_error        = 14
        access_denied           = 15
        dp_out_of_memory        = 16
        disk_full               = 17
        dp_timeout              = 18
        file_not_found          = 19
        dataprovider_exception  = 20
        control_flush_error     = 21
        OTHERS                  = 22.
    IF sy-subrc <> 0.
      MESSAGE  'File not downloaded'  TYPE  'I' .
    ENDIF.
  ENDIF.

ENDFORM.                    "export_pdf

效果:

直接把文件下载到桌面

打开文件

更多细节可以参考大佬的文章:https://www.cnblogs.com/buduzhiren/p/10754617.html

相关推荐
开利网络27 分钟前
开放的力量:新零售生态的共赢密码
大数据·运维·服务器·信息可视化·重构
南棱笑笑生40 分钟前
20250509让NanoPi NEO core开发板在Ubuntu core16.04系统下实测移远的4G模块EC200A-CN
linux·运维·ubuntu
hardStudy_h1 小时前
Linux C语言线程编程入门笔记
linux·c语言·嵌入式实时数据库
xmweisi021 小时前
Ansible内置模块之package
linux·ansible·rhce·rhca·红帽认证·it培训
xmweisi021 小时前
Ansible内置模块之service
linux·ansible·rhce·rhca·红帽认证
大神的风范1 小时前
从0开始学linux韦东山教程第一三章问题小结(1)
linux·服务器
liuze4082 小时前
使用 docker 安装 nacos3.x
运维·docker·容器
橙色小博3 小时前
Python中的re库详细用法与代码解析
linux·python·正则表达式·php·re
10000hours3 小时前
【SGL】Scatter-Gather List内存传输技术
linux·数据结构·网络协议·list·存储·sgl
某不知名網友3 小时前
linux_进程地址空间(虚拟地址空间)
java·linux·算法