AbapList/Smartforms To PDF保存本地

第一种:ABAPLIST_TO_PDF,需要用到假脱机。

list-processing的打印输出,很老旧的打印了,但是还是有些系统会用。

复制代码
DATA:g_val        TYPE c,
       w_pripar     TYPE pri_params,
       w_arcpar     TYPE arc_params,
       input_length TYPE i.
  DATA:spool_no    LIKE sy-spono,
       src_spoolid LIKE tsp01-rqident.
  DATA:name      TYPE tbtcjob-jobname,
       jobnumber TYPE tbtcjob-jobcount,
       wa_tbtcp  TYPE tbtcp.

  CALL FUNCTION 'GET_PRINT_PARAMETERS'
    EXPORTING
      in_archive_parameters  = w_arcpar
      in_parameters          = w_pripar
      layout                 = 'X_65_132'
      line_count             = 65
      line_size              = 132
      no_dialog              = 'X'
    IMPORTING
      out_archive_parameters = w_arcpar
      out_parameters         = w_pripar
      valid                  = g_val.
  IF g_val  NE space AND sy-subrc = 0.
    w_pripar-prrel = space.
    w_pripar-primm = space.
    NEW-PAGE PRINT ON NEW-SECTION PARAMETERS w_pripar ARCHIVE PARAMETERS w_arcpar NO DIALOG.

    "Output which is gone to spool
    SUBMIT ztestc01
    WITH p_bukrs = wa_data-bukrs
    WITH p_hbkid = wa_data-hbkid
    WITH p_hktid = wa_data-hktid
    WITH p_hkont = wa_data-hkont
    WITH p_zdzqj = wa_data-zdzqj
    TO SAP-SPOOL SPOOL PARAMETERS w_pripar ARCHIVE PARAMETERS w_arcpar WITHOUT SPOOL DYNPRO
    AND RETURN.

    NEW-PAGE PRINT OFF.
    CALL FUNCTION 'ABAP4_COMMIT_WORK'.   "提交假脱机请求,sp01查看
  ENDIF.
*获取假脱机,会得到之前成功数据
*-- Find out what the spool number is that was just created
*  DATA:lc_rq2name LIKE tsp01-rq2name.
*  CONCATENATE sy-repid+0(9) '_' sy-uname+0(3) INTO lc_rq2name.
*  SELECT * FROM tsp01 WHERE rq2name = lc_rq2name ORDER BY rqcretime DESCENDING.
*    spool_no = tsp01-rqident.
*    EXIT.
*  ENDSELECT.
  CLEAR spool_no.
  IMPORT spool_no = spool_no FROM MEMORY ID 'ZFIE9170'.
  FREE MEMORY ID 'ZFIE9170'.
  IF spool_no IS INITIAL.
    MESSAGE '假脱机错误' TYPE 'E'.
  ENDIF.


*  后台job  start-of-selection后程序抛后台,遇到message不报错
*  name = |{ sy-repid }{ sy-datum }{ sy-uzeit }|.
*  CALL FUNCTION 'JOB_OPEN'
*    EXPORTING
*      jobname          = name
*    IMPORTING
*      jobcount         = jobnumber
*    EXCEPTIONS
*      cant_create_job  = 1
*      invalid_job_data = 2
*      jobname_missing  = 3
*      OTHERS           = 4.
*  IF sy-subrc = 0.
*    SUBMIT ztestc01
*       WITH p_bukrs = wa_data-bukrs
*       WITH p_hbkid = wa_data-hbkid
*       WITH p_hktid = wa_data-hktid
*       WITH p_hkont = wa_data-hkont
*       WITH p_zdzqj = wa_data-zdzqj
*       TO SAP-SPOOL SPOOL PARAMETERS w_pripar ARCHIVE PARAMETERS w_arcpar WITHOUT SPOOL DYNPRO
*       VIA JOB name NUMBER jobnumber AND RETURN.
*
*    CALL FUNCTION 'JOB_CLOSE'
*      EXPORTING
*        jobcount             = jobnumber
*        jobname              = name
*        strtimmed            = 'X'
*      EXCEPTIONS
*        cant_start_immediate = 1
*        invalid_startdate    = 2
*        jobname_missing      = 3
*        job_close_failed     = 4
*        job_nosteps          = 5
*        job_notex            = 6
*        lock_failed          = 7
*        OTHERS               = 8.
*
*    IF sy-subrc = 0.
*      CLEAR wa_tbtcp.
*      SELECT SINGLE *
*        FROM tbtcp
*        INTO wa_tbtcp
*       WHERE jobcount = jobnumber.
*      IF wa_tbtcp-listident IS NOT INITIAL.
*        spool_no = wa_tbtcp-listident.
*      ELSE.
*        MESSAGE '假脱机失败' TYPE 'E'.
*      ENDIF.
*    ENDIF.
*  ENDIF.
*--------------------------------------------------------------------*
*  JOB_2_PDF
*--------------------------------------------------------------------*
  REFRESH it_pdf .
  src_spoolid = spool_no.
  CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
    EXPORTING
      src_spoolid   = src_spoolid
      no_dialog     = space
    IMPORTING
      pdf_bytecount = bytecount
    TABLES
      pdf           = it_pdf.

  CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE'
    EXPORTING
      line_width_src = 134
      line_width_dst = 255
    TABLES
      content_in     = it_pdf
      content_out    = file_tab.

  "Save the file
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      bin_filesize = bytecount
      filename     = file_path
      filetype     = 'BIN'
    TABLES
      data_tab     = file_tab.
复制代码

 

其中遇见问题:

1.如果我不用submit,而是直接在当前程序中write,程序中ztestc01的页码会缺失。

因为页码往往是打印完了后,最后替换上去的。比如

DATA:lv_page TYPE char10.
WRITE lv_page.
........
"程序执行完
lv_page = ’第一页/共三页' .
MODIFY LINE ’1‘ OF PAGE ’1‘ FIELD VALUE lv_page FROM lv_page.

 在modify 之前,sy-spono已经生成。

然而sumbit就很好的解决了这种问题,假脱机中的内容是完整的(当只打印一页)。

但是之后的测试发现,write多页的时候,只有最后一页实现了页码的更改。

我也尝试了abaplist->ASCII->ITF->OTF->PDF等等,发现要想输出PDF,还是需要用到假脱机。

 

2.submit ztestc01,sy-spono传递问题

ztestc01中,write输出中,会生成假脱机号存在sy-spono,而跳出submit后,怎么取出spool number是个问题。

(1)可以从dbtab:tsp01中取,但是会有问题,不能准确取到当前spono.

(2)后台job可以解决,但是start-of-selection之后的程序直接抛后台,如果有message不报错,不提醒

(3)传递abap memory,最实用哈哈

 

 

第一种:abaplist的另外尝试

复制代码
SUBMIT ztestc01
    WITH p_bukrs = '4000'
EXPORTING LIST TO MEMORY AND RETURN.

DATA list_obj TYPE TABLE OF abaplist.
DATA list_asc TYPE TABLE OF char134.


CALL FUNCTION 'LIST_FROM_MEMORY' TABLES listobject = list_obj EXCEPTIONS not_found = 1 OTHERS = 2. CALL FUNCTION 'LIST_TO_ASCI' TABLES listasci = list_asc listobject = list_obj EXCEPTIONS empty_list = 1 list_index_invalid = 2 OTHERS = 3. DATA: lt_tline TYPE STANDARD TABLE OF tline. CALL FUNCTION 'CONVERT_ASCII_TO_ITF' EXPORTING tabletype = 'ASC' c_datatab = list_asc TABLES itf_lines = lt_tline EXCEPTIONS invalid_tabletype = 1 "internal error!! missing_size = 2 "internal error!! OTHERS = 3. DATA:g_val TYPE c, w_pripar TYPE pri_params, w_arcpar TYPE arc_params, input_length TYPE i. CALL FUNCTION 'GET_PRINT_PARAMETERS' EXPORTING in_archive_parameters = w_arcpar in_parameters = w_pripar layout = 'X_65_132' line_count = 65 line_size = 132 no_dialog = 'X' IMPORTING out_archive_parameters = w_arcpar out_parameters = w_pripar valid = g_val. DATA header LIKE thead. DATA options LIKE itcpo. DATA result LIKE itcpp. DATA otf LIKE TABLE OF itcoo. CALL FUNCTION 'PRINT_TEXT' EXPORTING * APPLICATION = 'TX' * ARCHIVE_INDEX = ' ' archive_params = w_arcpar * DEVICE = 'PRINTER' * DIALOG = 'X' header = header * OPTIONS = * IMPORTING * NEW_ARCHIVE_PARAMS = * RESULT = TABLES lines = lt_tline otfdata = otf . IF sy-subrc <> 0. * Implement suitable error handling here ENDIF.
复制代码

想要abaplist->ASCII->ITF->OTF,只能得到以下效果:

 

 

 可以看到,SAPscript(ITF)文本只有132位,将纯文本ASCII转换为ITF后会变形,再转换OTF就错乱了。

只有让abaplist作为假脱机,输出PDF才是正确选择。

 

如果只打印一页,第一种方法完全没有任何问题,如果多页打印,页码会丢失(只有最后一页有页码),下面介绍我改版后的程序:

1.首先执行被调用程序,获取LINE_SIZE和LINE_COUNT(行宽和行数),后面初始化打印参数要用到

 

2.整体打印调用abaplist

复制代码
DATA spoolid  LIKE TSP01_SP0R-RQID_CHAR.
DATA list_obj TYPE TABLE OF abaplist.
DATA:g_val        TYPE c,
     w_pripar     TYPE pri_params,
     w_arcpar     TYPE arc_params,
     input_length TYPE i.


SUBMIT ztestc01
    WITH p_bukrs = '4000'
EXPORTING LIST TO MEMORY AND RETURN.

CALL FUNCTION 'LIST_FROM_MEMORY'
  TABLES
    listobject = list_obj
  EXCEPTIONS
    not_found  = 1
    OTHERS     = 2.

CALL FUNCTION 'LIST_FREE_MEMORY'.
CALL FUNCTION 'GET_PRINT_PARAMETERS'
  EXPORTING
    layout                 = 'X_65_132'
    line_count             = 89
    line_size              = 130
    no_dialog              = 'X'
  IMPORTING
    out_archive_parameters = w_arcpar
    out_parameters         = w_pripar
    valid                  = g_val.


* Write lines of list to spool.
  IF g_val  NE space AND sy-subrc = 0.
    w_pripar-prrel = space.
    w_pripar-primm = space.
    NEW-PAGE PRINT ON PARAMETERS w_pripar ARCHIVE PARAMETERS w_arcpar NEW-SECTION NO DIALOG.
    CALL FUNCTION 'WRITE_LIST'
      TABLES
        listobject = list_obj
      EXCEPTIONS
        empty_list = 1
        OTHERS     = 2.
    MOVE sy-spono TO spoolid.
    NEW-PAGE PRINT OFF.
    CALL FUNCTION 'ABAP4_COMMIT_WORK'.   "提交假脱机请求,sp01查看
  ENDIF.

*--------------------------------------------------------------------*
*  JOB_2_PDF
*--------------------------------------------------------------------*
  REFRESH it_pdf .
  src_spoolid = spoolid.
  CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
    EXPORTING
      src_spoolid   = src_spoolid
      no_dialog     = space
    IMPORTING
      pdf_bytecount = bytecount
    TABLES
      pdf           = it_pdf.

  CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE'
    EXPORTING
      line_width_src = 134
      line_width_dst = 255
    TABLES
      content_in     = it_pdf
      content_out    = file_tab.

*delete spool
  CALL FUNCTION 'RSPO_R_RDELETE_SPOOLREQ'
    EXPORTING
      spoolid = spoolid.
复制代码

 

 

 

第二种:smartforms输出PDF,无需假脱机

复制代码
DATA: g_name             TYPE rs38l_fnam.
control_parameters TYPE ssfctrlop,
      output_options     TYPE ssfcompop,
      job_output_info    TYPE ssfcrescl.
DATA:content_x TYPE xstring,
     it_pdf    TYPE TABLE OF tline WITH HEADER LINE,
     wa_pdf    LIKE LINE OF it_pdf,
     file_tab  TYPE STANDARD TABLE OF solisti1,
     bytecount TYPE i.


CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = 'ZTESTC01' IMPORTING fm_name = g_name EXCEPTIONS no_form = 1 no_function_module = 2 OTHERS = 3. IF sy-subrc <> 0. * error handling MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. EXIT. ENDIF. *----------------------------------------------------------------------* SELECT SINGLE spld INTO output_options-tddest
    FROM usr01
   WHERE bname = sy-uname.
  IF output_options-tddest EQ space.
    output_options-tddest 'LP01'.
  ENDIF.

control_parameters-no_dialog = 'X'. control_parameters-getotf = 'X'. control_parameters-langu = '1' . CALL FUNCTION g_name EXPORTING control_parameters = control_parameters output_options = output_options user_settings = '' is_head = ls_head * TABLES * it_itab = it_itab1 IMPORTING job_output_info = job_output_info EXCEPTIONS formatting_error = 1 internal_error = 2 send_error = 3 user_canceled = 4 OTHERS = 5. IF sy-subrc <> 0. * error handling MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. REFRESH it_pdf . CALL FUNCTION 'CONVERT_OTF' EXPORTING format = 'PDF' IMPORTING * bin_file = lv_xstring "pdf xstring bin_filesize = bytecount TABLES otf = job_output_info-otfdata lines = it_pdf EXCEPTIONS err_max_linewidth = 1 err_format = 2 err_conv_not_possible = 3 OTHERS = 4. CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE' EXPORTING line_width_src = 134 line_width_dst = 255 TABLES content_in = it_pdf content_out = file_tab. "Save the file CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING bin_filesize = bytecount filename = file_path filetype = 'BIN' TABLES data_tab = file_tab.
复制代码

 

 
posted @   yangliu11223  阅读(319)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示