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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*&---------------------------------------------------------------------*
*& 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:需要设置个人打印机(因:预览或下载时不出现[打印设备选择窗口])

CAN长字节DM1报文是指在CAN总线上传输的长度超过8个字节的DM1报文。根据引用\[1\],当要传输的数据长度超过8个字节时,首先使用TPCM进行广播,广播内容包含即将传输报文的PGN、总的数据包长度等信息,然后使用TP.DT进行数据传输。相邻两个TP.DT之间的时间间隔是50ms到200ms。根据引用\[2\],当字节数大于8时,将会使用多帧传输参数组。根据引用\[3\],DM1报文是Diagnostic Message 1, Active Diagnostic Trouble Codes的缩写,用于点亮故障指示灯、红色停机灯等,并周期性播报控制器中处于激活状态的故障码。DM1报文的格式包括各个字节的定义,如故障指示灯、红色停机灯、琥珀色警告指示灯等。因此,CAN长字节DM1报文是指在CAN总线上传输的长度超过8个字节的DM1报文,用于传输更多的故障码信息。 #### 引用[.reference_title] - *1* [车载通信——J1939 DM1](https://blog.csdn.net/weixin_64064747/article/details/130193432)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [J1939广播DM1报文](https://blog.csdn.net/mengdeguodu_/article/details/108173263)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [J1939商用车在线诊断DM1报文](https://blog.csdn.net/traveller93/article/details/120735912)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值