ABAP-SMARTFORMS-PDF(预览、下载)

本文介绍了如何在ABAP环境中使用SMARTFORMS创建PDF,并提供了预览及下载的步骤。读者需在SU3中配置个人打印机,以避免预览或下载时出现打印设备选择窗口。
*&---------------------------------------------------------------------*
*& Report  Y_ABC_SMF
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT Y_ABC_SMF.


START-OF-SELECTION.
  DATA: LT_DATA TYPE TABLE OF T001 WITH HEADER LINE.
  DO 20 TIMES.
    LT_DATA-BUKRS = SY-INDEX.
    APPEND LT_DATA.
  ENDDO.

  PERFORM FRM_PRINT.

*&---------------------------------------------------------------------*
*&      Form  FRM_PRINT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_PRINT .
**********************************************************************
  DATA: L_FNAME TYPE RS38L_FNAM.
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      FORMNAME = 'Y_TEST_ABC_1'
    IMPORTING
      FM_NAME  = L_FNAME.
  DATA: L_OUTPUT_OPTIONS  TYPE SSFCOMPOP ,
        L_TMP_CONTROL_PAR LIKE SSFCTRLOP,
        L_JOB_OUTPUT_INFO TYPE SSFCRESCL  ,
        L_PRINTCOUNT TYPE I.
***以下设置打印预览功能***
****Smart Forms: 控制结构*****
  L_TMP_CONTROL_PAR-GETOTF        = 'X'. "这个参数一定要设:OTF 表的返回。无打印,显示或传真
*  L_TMP_CONTROL_PAR-PREVIEW       = 'X'.            "打印预览
  L_TMP_CONTROL_PAR-NO_DIALOG     = 'X'.            "必须设置
**  L_TMP_CONTROL_PAR-DEVICE        = 'PRINTER'.
****SAP Smart Forms: 智能写作器 (传输) 选项*****
  L_OUTPUT_OPTIONS-TDNOPREV  = 'X'.                      "是否打印预览,X 不预览。
  L_OUTPUT_OPTIONS-TDNOPRINT = 'X'.                      "没有打印输出,X 不显示。
  L_OUTPUT_OPTIONS-TDIMMED   = 'X'.                      "立即打印标志。
  L_OUTPUT_OPTIONS-TDIEXIT   = 'X'.                      "预览打印后直接退出
*  L_OUTPUT_OPTIONS-TDDEST    = 'RED_LOCAL'.              "假脱机,输出设备。
  DATA: L_LINES TYPE I.
  DATA: G_C_X TYPE C VALUE 'X'.
  DESCRIBE TABLE LT_DATA LINES L_LINES.
  LOOP AT LT_DATA.
    CASE SY-TABIX.
      WHEN 1.
        L_TMP_CONTROL_PAR-NO_CLOSE = G_C_X.
        L_TMP_CONTROL_PAR-NO_OPEN  = SPACE.
      WHEN L_LINES.
        L_TMP_CONTROL_PAR-NO_CLOSE = SPACE.
        L_TMP_CONTROL_PAR-NO_OPEN  = G_C_X.
      WHEN OTHERS.
        L_TMP_CONTROL_PAR-NO_CLOSE = G_C_X.
        L_TMP_CONTROL_PAR-NO_OPEN  = G_C_X.
    ENDCASE.
    IF L_LINES = 1 .
      L_TMP_CONTROL_PAR-NO_CLOSE = SPACE.
      L_TMP_CONTROL_PAR-NO_OPEN  = SPACE.
    ENDIF.
    CALL FUNCTION L_FNAME
      EXPORTING
*   ARCHIVE_INDEX              =
*   ARCHIVE_INDEX_TAB          =
*   ARCHIVE_PARAMETERS         =
        CONTROL_PARAMETERS         = L_TMP_CONTROL_PAR
*   MAIL_APPL_OBJ              =
*   MAIL_RECIPIENT             =
*   MAIL_SENDER                =
        OUTPUT_OPTIONS             = L_OUTPUT_OPTIONS
*   USER_SETTINGS              = 'X'
     IMPORTING
*   DOCUMENT_OUTPUT_INFO       =
       JOB_OUTPUT_INFO            = L_JOB_OUTPUT_INFO
*   JOB_OUTPUT_OPTIONS         =
* EXCEPTIONS
*   FORMATTING_ERROR           = 1
*   INTERNAL_ERROR             = 2
*   SEND_ERROR                 = 3
*   USER_CANCELED              = 4
*   OTHERS                     = 5
              .
    PERFORM FRM_SAVE_TO_PDF USING L_JOB_OUTPUT_INFO-OTFDATA[] 'strtel'.
  ENDLOOP.
ENDFORM.                    " FRM_PRINT
*&---------------------------------------------------------------------*
*&      FORM  FRM_SAVE_TO_PDF
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->P_ANSWER   TEXT
*      -->PT_TSFOTF  TEXT
*----------------------------------------------------------------------*
FORM FRM_SAVE_TO_PDF USING PT_OTF TYPE TSFOTF
                           PV_TITLE.
  DATA: L_FNAME   TYPE STRING, " 文件名
        L_FSFIX   TYPE STRING, " 后缀名
        L_ALL     TYPE STRING, " 文件名+后缀名
        L_FULL    TYPE STRING. " 文件路径+文件名+后缀名
  DATA: L_PDF   TYPE STRING. " OTF转换格式
  DATA: L_BIN   TYPE STRING. " 下载格式

  DATA: L_LINES TYPE TABLE OF TLINE WITH HEADER LINE.
  DATA: L_DOCS  TYPE TABLE OF DOCS.
  DATA: L_LEN   TYPE I.

  DATA: LT_RECORD TYPE X OCCURS 0 WITH HEADER LINE.

  CHECK PT_OTF[] IS NOT INITIAL.
  L_FNAME = PV_TITLE && SY-DATUM && SY-UZEIT.

  "" 打印预览
  PERFORM FRM_SSFCOMP_PDF_PREVIEW TABLES PT_OTF.

  " 下载1
  L_FSFIX = 'PDF'.
  L_BIN = 'BIN'.
  PERFORM FRM_WS_FILENAME_GET USING L_FNAME L_FSFIX CHANGING L_ALL L_FULL. "" 获取路径
  PERFORM FRM_CONVERT_OTF_2_PDF TABLES PT_OTF L_DOCS L_LINES CHANGING L_LEN .
  PERFORM FRM_GUI_DOWNLOAD TABLES L_LINES USING L_LEN L_FULL L_BIN. "" 下载文件

  " 下载2
  L_FSFIX = 'PDF'.
  L_PDF = 'PDF'.
  L_BIN = 'BIN'.
  PERFORM FRM_WS_FILENAME_GET USING L_FNAME L_FSFIX CHANGING L_ALL L_FULL. "" 获取路径
  PERFORM FRM_CONVERT_OTF_V1 TABLES PT_OTF L_LINES USING L_PDF CHANGING L_LEN.
  PERFORM FRM_GUI_DOWNLOAD TABLES L_LINES USING L_LEN L_FULL L_BIN. "" 下载文件

  " 下载3
  L_FSFIX = 'PDF'.
  L_PDF = 'PDF'.
  L_BIN = 'BIN'.
  PERFORM FRM_WS_FILENAME_GET USING L_FNAME L_FSFIX CHANGING L_ALL L_FULL. "" 获取路径
  PERFORM FRM_CONVERT_OTF_V2 TABLES PT_OTF LT_RECORD USING L_PDF CHANGING L_LEN.
  PERFORM FRM_GUI_DOWNLOAD TABLES L_LINES USING L_LEN L_FULL L_BIN. "" 下载文件

ENDFORM.                    "FRM_SAVE_TO_PDF
*&---------------------------------------------------------------------*
*&      Form  FRM_WS_FILENAME_GET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_PV_TITLE  text
*      -->P_0199   text
*----------------------------------------------------------------------*
FORM FRM_WS_FILENAME_GET  USING    PV_FNAME PV_SUFFIX
                         CHANGING  CV_FILE_ALL CV_FILE_FULL.

  CONCATENATE PV_FNAME '.' PV_SUFFIX INTO CV_FILE_ALL.

  """""""""""""" 获取下载路径
  CALL FUNCTION 'WS_FILENAME_GET'                           "#EC *
   EXPORTING
     DEF_FILENAME           = CV_FILE_ALL
     DEF_PATH               = ' '
     MASK                   = '导入'
     MODE                   = 'S'
     TITLE                  = 'Title'
   IMPORTING
     FILENAME               = CV_FILE_FULL
*       RC                     = L_RC
   EXCEPTIONS
     INV_WINSYS             = 1
     NO_BATCH               = 2
     SELECTION_CANCEL       = 3
     SELECTION_ERROR        = 4
     OTHERS                 = 5
            .
  IF SY-SUBRC <> 0.
    IF SY-MSGTY IS NOT INITIAL.
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.
    RETURN.
  ENDIF.
ENDFORM.                    " FRM_WS_FILENAME_GET
*&---------------------------------------------------------------------*
*&      Form  FRM_CONVERT_OTF_2_PDF
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_PT_TSFOTF  text
*      <--P_L_LEN  text
*      <--P_L_DOCS  text
*      <--P_L_LINES  text
*----------------------------------------------------------------------*
FORM FRM_CONVERT_OTF_2_PDF  TABLES   P_T_TSFOTF TYPE TSFOTF
                                     P_T_DOCS  STRUCTURE DOCS
                                     P_T_LINES STRUCTURE TLINE
  CHANGING CV_LEN.
  CALL FUNCTION 'CONVERT_OTF_2_PDF'
    IMPORTING
      BIN_FILESIZE           = CV_LEN
    TABLES
      OTF                    = P_T_TSFOTF[]
      DOCTAB_ARCHIVE         = P_T_DOCS[]
      LINES                  = P_T_LINES[]
    EXCEPTIONS
      ERR_CONV_NOT_POSSIBLE  = 1
      ERR_OTF_MC_NOENDMARKER = 2
      OTHERS                 = 3.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
ENDFORM.                    " FRM_CONVERT_OTF_2_PDF
*&---------------------------------------------------------------------*
*&      Form  FRM_GUI_DOWNLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_L_LINES  text
*      -->P_L_LEN  text
*      -->P_L_FILENAME  text
*      -->P_0217   text
*----------------------------------------------------------------------*
FORM FRM_GUI_DOWNLOAD  TABLES   P_T_LINES
                       USING    PV_LEN
                                PV_FILENAME
                                PV_TYP.
  CHECK P_T_LINES[] IS NOT INITIAL.
  CHECK PV_FILENAME IS NOT INITIAL.
  CHECK PV_LEN IS NOT INITIAL.
  CHECK PV_TYP IS NOT INITIAL.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD
    EXPORTING
      BIN_FILESIZE = PV_LEN
      FILENAME     = PV_FILENAME
      FILETYPE     = PV_TYP        " 'BIN'
    CHANGING
      DATA_TAB     = P_T_LINES[]
    EXCEPTIONS
      OTHERS       = 1.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
ENDFORM.                    " FRM_GUI_DOWNLOAD
*&---------------------------------------------------------------------*
*&      Form  FRM_SSFCOMP_PDF_PREVIEW
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_PT_TSFOTF  text
*----------------------------------------------------------------------*
FORM FRM_SSFCOMP_PDF_PREVIEW  TABLES  PT_TSFOTF TYPE TSFOTF.

  CALL FUNCTION 'SSFCOMP_PDF_PREVIEW'
    EXPORTING
      I_OTF                    = PT_TSFOTF[]
    EXCEPTIONS
      CONVERT_OTF_TO_PDF_ERROR = 1
      CNTL_ERROR               = 2
      OTHERS                   = 3.

ENDFORM.                    " FRM_SSFCOMP_PDF_PREVIEW
*&---------------------------------------------------------------------*
*&      Form  FRM_CONVERT_OTF_V1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_PT_OTF  text
*      -->P_L_LINES  text
*      -->P_0205   text
*      <--P_L_LEN  text
*      <--P_LV_XSTR  text
*----------------------------------------------------------------------*
FORM FRM_CONVERT_OTF_V1  TABLES   P_T_OTF TYPE TSFOTF
                                  P_T_LINES STRUCTURE TLINE
                         USING    PV_TYP
                         CHANGING P_L_LEN .
  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      FORMAT                = PV_TYP " 'PDF'
*     MAX_LINEWIDTH         = 132
*     ARCHIVE_INDEX         = ' '
*     COPYNUMBER            = 0
*     ASCII_BIDI_VIS2LOG    = ' '
    IMPORTING
      BIN_FILESIZE          = P_L_LEN
    TABLES
      OTF                   = P_T_OTF[]
      LINES                 = P_T_LINES[]
    EXCEPTIONS
      ERR_MAX_LINEWIDTH     = 1
      ERR_FORMAT            = 2
      ERR_CONV_NOT_POSSIBLE = 3
      ERR_BAD_OTF           = 4
      OTHERS                = 5.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
ENDFORM.                    " FRM_CONVERT_OTF_V1
*&---------------------------------------------------------------------*
*&      Form  FRM_CONVERT_OTF_V2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_PT_OTF  text
*      -->P_L_LINES  text
*      -->P_0205   text
*      <--P_L_LEN  text
*      <--P_LV_XSTR  text
*----------------------------------------------------------------------*
FORM FRM_CONVERT_OTF_V2  TABLES   P_T_OTF TYPE TSFOTF
                                  PT_RECORD TYPE STANDARD TABLE
                         USING    PV_TYP
                         CHANGING P_L_LEN.
  DATA: LV_XSTR   TYPE XSTRING.
  DATA: LT_RECORD TYPE X OCCURS 0 WITH HEADER LINE.
  DATA: LT_LINES  TYPE TABLE OF TLINE WITH HEADER LINE..
  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      FORMAT                = PV_TYP " 'PDF'
*     MAX_LINEWIDTH         = 132
*     ARCHIVE_INDEX         = ' '
*     COPYNUMBER            = 0
*     ASCII_BIDI_VIS2LOG    = ' '
    IMPORTING
      BIN_FILESIZE          = P_L_LEN
      BIN_FILE              = LV_XSTR
    TABLES
      OTF                   = P_T_OTF[]
      LINES                 = LT_LINES[]
    EXCEPTIONS
      ERR_MAX_LINEWIDTH     = 1
      ERR_FORMAT            = 2
      ERR_CONV_NOT_POSSIBLE = 3
      ERR_BAD_OTF           = 4
      OTHERS                = 5.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      BUFFER        = LV_XSTR
    IMPORTING
      OUTPUT_LENGTH = P_L_LEN
    TABLES
      BINARY_TAB    = LT_RECORD[].

  FIELD-SYMBOLS: <FS_DAT1> TYPE ANY.
  DATA: LV_STR1 TYPE STRING.
  FIELD-SYMBOLS: <FS_DAT2> TYPE ANY.
  DATA: LV_STR2 TYPE STRING.

  LV_STR1 = 'LT_RECORD[]'.
  ASSIGN (LV_STR1) TO <FS_DAT1>.
  LV_STR2 = 'PT_RECORD[]'.
  ASSIGN (LV_STR2) TO <FS_DAT2>.
  <FS_DAT2> = <FS_DAT1>.

ENDFORM.                    " FRM_CONVERT_OTF_V2

注:SU3:需要设置个人打印机(因:预览或下载时不出现[打印设备选择窗口])

<think>我们正在处理用户的问题:在ABAP中使用SMARTFORMS打印出PDF格式后,通过接口推送给别的系统的方法。 参考用户提供的引用,特别是引用[2]和引用[3],它们涉及到PDF的处理和传输,虽然具体场景不同,但可以借鉴其中的技术点。 解决方案步骤: 1. 使用SMARTFORMS生成PDF:这是第一步,我们需要将SMARTFORMS的输出转换为PDF格式的二进制数据。 2. 将PDF数据转换为适合传输的格式(如Base64编码或直接二进制流)。 3. 通过接口(例如HTTP、RFC、WebService等)将PDF数据传输给外部系统。 详细步骤: ### 1. 使用SMARTFORMS生成PDF 我们可以使用函数`SSF_FUNCTION_MODULE_NAME`获取SMARTFORMS的函数模块名,然后调用该函数模块生成PDF。 ```abap DATA: lv_fm_name TYPE rs38l_fnam, lv_formname TYPE tdsfname VALUE 'ZSMARTFORM_NAME', lv_pdf_content TYPE solix_tab, " 存储PDF二进制内容 lv_pdf_size TYPE i, ls_output_options TYPE ssfcompop, ls_job_options TYPE ssfcresop. " 设置输出选项为PDF ls_output_options-tddest = 'LP01'. " 打印机目标,但生成PDF时通常使用'LP01'并配合其他设置 ls_output_options-tdnoprev = 'X'. " 不使用预览 ls_output_options-tdpreview = ' '. " 无预览 ls_output_options-tdnewid = 'X'. " 创建新的假脱机请求 ls_output_options-tdimmed = ' '. " 非立即打印 ls_output_options-tddelete = 'X'. " 打印后删除假脱机请求 " 调用SMARTFORMS函数模块 CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = lv_formname IMPORTING fm_name = lv_fm_name EXCEPTIONS no_form = 1 no_function_module = 2 OTHERS = 3. IF sy-subrc <> 0. " 错误处理 ENDIF. " 调用生成的函数模块来获取PDF CALL FUNCTION lv_fm_name EXPORTING output_options = ls_output_options user_settings = ' ' IMPORTING pdf_output = lv_pdf_content " 注意:该参数需要函数模块支持 pdf_content_size = lv_pdf_size EXCEPTIONS formatting_error = 1 internal_error = 2 send_error = 3 user_canceled = 4 OTHERS = 5. IF sy-subrc <> 0. " 错误处理 ENDIF. ``` **注意**:不是所有的SMARTFORMS函数模块都直接支持返回PDF二进制内容。通常,我们需要将输出发送到假脱机(spool),然后从假脱机中读取PDF内容。因此,另一种更通用的方法是: 步骤1: 将SMARTFORMS输出到假脱机。 步骤2: 使用函数`RSPO_RETURN_SPOOLJOB`获取假脱机内容(PDF格式)。 下面是通用方法: ```abap DATA: lv_job_output_info TYPE ssfcrescl, lt_spoolids TYPE TABLE OF rspoid, lv_spoolid TYPE rspoid, lv_pdf_xstring TYPE xstring. " 调用SMARTFORMS函数模块(同上获取函数模块名) " 在调用时,设置输出选项: ls_output_options-tddest = 'LP01'. " 输出到假脱机 ls_output_options-tdnewid = 'X'. " 创建新的假脱机请求 " 其他设置根据需要 CALL FUNCTION lv_fm_name EXPORTING output_options = ls_output_options user_settings = ' ' IMPORTING job_output_info = lv_job_output_info TABLES ... " 传递SMARTFORMS需要的其他参数,如内表等 EXCEPTIONS ... " 异常处理 . " 从返回的job_output_info中获取假脱机ID APPEND lv_job_output_info-spoolid TO lt_spoolids. " 根据假脱机ID获取PDF内容 CALL FUNCTION 'RSPO_RETURN_SPOOLJOB' EXPORTING rqident = lv_spoolid IMPORTING pdf_xstring = lv_pdf_xstring EXCEPTIONS cannot_read = 1 bad_spoolid = 2 permission_denied = 3 OTHERS = 4. " 将XSTRING转换为SOLIX_TAB(如果需要) DATA: lt_content TYPE solix_tab. CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = lv_pdf_xstring TABLES binary_tab = lt_content. ``` ### 2. 将PDF数据转换为Base64(可选) 如果外部系统要求Base64编码,我们可以使用函数`SCMS_BASE64_ENCODE_STR`(如引用[3]所示)。 ```abap DATA: lv_base64 TYPE string. CALL FUNCTION 'SCMS_BASE64_ENCODE_STR' EXPORTING input = lv_pdf_xstring " 或者先转换XSTRING,如果前面得到的是SOLIX_TAB,需要先转成XSTRING IMPORTING output = lv_base64. ``` 或者,如果前面得到的是SOLIX_TAB(lt_content),则可以: ```abap " 先将SOLIX_TAB转换为XSTRING DATA: lv_xstring TYPE xstring. CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' EXPORTING input_length = lv_pdf_size " 长度 IMPORTING buffer = lv_xstring TABLES binary_tab = lt_content. " 然后对XSTRING进行Base64编码 CALL FUNCTION 'SCMS_BASE64_ENCODE_STR' EXPORTING input = lv_xstring IMPORTING output = lv_base64. ``` ### 3. 通过接口推送PDF 根据目标系统支持的协议,可以选择不同的方式: **HTTP 接口(常用)**: 使用类`CL_HTTP_CLIENT`发送POST请求。 ```abap DATA: lo_http_client TYPE REF TO if_http_client, lv_url TYPE string VALUE 'http://目标系统URL'. CALL METHOD cl_http_client=>create_by_url EXPORTING url = lv_url IMPORTING client = lo_http_client EXCEPTIONS argument_not_found = 1 plugin_not_active = 2 internal_error = 3 OTHERS = 4. " 设置请求方法 lo_http_client->request->set_method( 'POST' ). " 设置请求头 lo_http_client->request->set_content_type( 'application/pdf' ). " 或者如果是Base64,可能需要设置其他类型,比如multipart/form-data " 设置数据:这里根据实际情况,如果是直接发送二进制,则使用: " 假设lt_content是SOLIX_TAB(二进制表) lo_http_client->request->set_data( lt_content ). " 或者如果发送Base64字符串: " 注意:Base64是字符串,需要转换成二进制(XSTRING)或直接以字符串形式发送(但通常需要放在JSON或表单中) " 这里提供一个例子:将Base64字符串放在JSON中 DATA: lv_request_body TYPE string. CONCATENATE '{"fileName":"example.pdf", "fileContent":"' lv_base64 '"}' INTO lv_request_body. " 设置数据和内容类型为JSON lo_http_client->request->set_content_type( 'application/json' ). lo_http_client->request->set_cdata( lv_request_body ). " 发送请求 CALL METHOD lo_http_client->send EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3 OTHERS = 4. " 接收响应 CALL METHOD lo_http_client->receive EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3 OTHERS = 4. " 检查响应 DATA: lv_status TYPE i, lv_reason TYPE string. lo_http_client->response->get_status( IMPORTING code = lv_status reason = lv_reason ). IF lv_status = 200. " 成功 ELSE. " 失败,读取响应内容 DATA(lv_response) = lo_http_client->response->get_cdata( ). ENDIF. " 关闭连接 CALL METHOD lo_http_client->close. ``` **其他方式**: - 如果目标系统是SAP系统,可以使用RFC调用远程函数。 - 也可以使用IDOC、SOAP Web Service等。 ### 注意事项 1. PDF生成的大小:注意PDF文件可能很大,确保HTTP传输不会超时,必要时进行分块传输或压缩。 2. 错误处理:在每一步都要做好错误处理。 3. 权限:确保用户有权限生成PDF和访问目标系统。 ### 完整流程示例 ```mermaid graph TD A[调用SMARTFORMS生成假脱机] --> B[从假脱机获取PDF二进制数据] B --> C[可选:Base64编码] C --> D[通过HTTP/RFC/IDOC等接口传输] ``` §§相关问题§§ 1. 如何提高PDF生成和传输的性能? 2. SMARTFORMS生成的PDF内容出现乱码如何解决? 3. 使用HTTP接口传输文件时如何添加身份验证? 4. 如何将多个PDF文件打包成ZIP传输? 以上,我们详细说明了在ABAP中使用SMARTFORMS生成PDF并通过接口推送的方法。 </think>### ABAP中实现SMARTFORMS生成PDF并通过接口推送外部系统的方法 以下是完整实现步骤,结合了引用[2]中的PDF处理和引用[3]的Base64转换技术: --- #### **1. 生成PDF文件** 使用SMARTFORMS生成PDF并转换为二进制数据: ```abap DATA: lv_fm_name TYPE rs38l_fnam, " SMARTFORMS函数模块名 ls_output_param TYPE ssfcompop, " 输出控制参数 lv_pdf_content TYPE solix_tab, " PDF二进制容器 lv_pdf_size TYPE i. " 获取SMARTFORMS函数模块 CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = 'ZSMARTFORM_NAME' " 你的SMARTFORMS名称 IMPORTING fm_name = lv_fm_name EXCEPTIONS no_form = 1 no_function_module = 2 OTHERS = 3. " 设置PDF输出参数 ls_output_param-no_dialog = 'X'. " 无对话框 ls_output_param-preview = ' '. " 禁用预览 ls_output_param-dest = 'LP01'. " 输出设备 " 调用SMARTFORMS生成PDF CALL FUNCTION lv_fm_name EXPORTING output_options = ls_output_param IMPORTING pdf_file = lv_pdf_content " 接收二进制PDF pdf_filesize = lv_pdf_size EXCEPTIONS formatting_error = 1 internal_error = 2 OTHERS = 3. ``` --- #### **2. 转换为Base64编码(推荐)** 使用引用[3]的方法转换PDF为Base64,便于HTTP传输: ```abap DATA: lv_xstring TYPE xstring, lv_base64 TYPE string. " 将二进制转换为XSTRING CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' EXPORTING input_length = lv_pdf_size IMPORTING buffer = lv_xstring TABLES binary_tab = lv_pdf_content. " 转换为Base64 CALL FUNCTION 'SCMS_BASE64_ENCODE_STR' EXPORTING input = lv_xstring IMPORTING output = lv_base64. ``` --- #### **3. 通过HTTP接口推送** 使用ABAP HTTP客户端发送到外部系统: ```abap DATA: lo_http_client TYPE REF TO if_http_client, lv_url TYPE string VALUE 'https://api.external-system.com/receive'. " 创建HTTP连接 CALL METHOD cl_http_client=>create_by_url EXPORTING url = lv_url IMPORTING client = lo_http_client. " 设置HTTP头 lo_http_client->request->set_header_field( name = 'Content-Type' value = 'application/pdf' ). " 设置Base64数据(或直接使用lv_pdf_content二进制) lo_http_client->request->set_data( lv_base64 ). " 发送请求 CALL METHOD lo_http_client->send EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2. " 获取响应 IF sy-subrc = 0. CALL METHOD lo_http_client->receive EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3. ENDIF. " 检查状态码 IF lo_http_client->response->get_status( ) = 200. MESSAGE 'PDF推送成功' TYPE 'S'. ELSE. DATA(lv_error) = lo_http_client->response->get_cdata( ). MESSAGE lv_error TYPE 'E'. ENDIF. ``` --- #### **4. 替代方案:RFC推送(SAP系统间)** 若目标系统也是SAP,使用RFC更高效: ```abap CALL FUNCTION 'Z_REMOTE_PDF_RECEIVER' DESTINATION 'TARGET_SYSTEM' EXPORTING iv_file_name = 'document.pdf' iv_base64_data = lv_base64 TABLES et_return = lt_log. ``` --- ### **关键注意事项** 1. **权限配置** 事务码`SICF`中激活HTTP服务,使用事务码`STRUST`配置SSL证书[^1] 2. **PDF大小限制** 超过10MB建议分块传输或启用压缩: ```abap lo_http_client->request->set_header_field( name = 'Content-Encoding' value = 'gzip' ). ``` 3. **错误处理** 捕获HTTP状态码异常并记录日志: ```abap DATA(lv_status) = lo_http_client->response->get_status( ). CASE lv_status-code. WHEN 401. " 认证失败 WHEN 413. " 文件过大 ENDCASE. ``` 4. **安全传输** 使用HTTPS并添加认证头: ```abap lo_http_client->request->set_header_field( name = 'Authorization' value = 'Bearer xxxxxxxx' ). ``` --- ### **操作流程概览** ```mermaid graph TD A[执行SMARTFORMS] --> B{输出选项设置} B -->|PDF格式| C[获取二进制数据] C --> D[Base64编码] D --> E{传输方式} E -->|HTTPS| F[HTTP客户端推送] E -->|RFC| G[远程函数调用] F/G --> H[验证响应状态] H -->|200| I[成功日志] H -->|非200| J[错误处理] ``` > **最佳实践**:生产环境使用`JOB`调度生成PDF,避免前台超时问题。测试阶段可用事务码`SM59`模拟RFC连接。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值