ABAP PDF预览

发布于:2025-03-20 ⋅ 阅读:(10) ⋅ 点赞:(0)

画个屏幕
在这里插入图片描述
PDF JPG TXT都可以参考预览,把二进制流传递给标准函数就行

*&---------------------------------------------------------------------*
*& Report YDEMO2
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ydemo2.

DATA: gr_viewer TYPE REF TO cl_gui_html_viewer,
      gr_ctn    TYPE REF TO cl_gui_custom_container.


CALL SCREEN '9001' STARTING AT 5 5 ENDING  AT  120 30 .

*&---------------------------------------------------------------------*
*& Module STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9001 OUTPUT.

  DATA: lt_solix TYPE solix_tab,
        lv_size  TYPE i,
        lv_url   TYPE c LENGTH 255.

  SET PF-STATUS 'STATUS_9001'.

  " 初始化容器对象
  gr_ctn    = NEW #( container_name = 'CC_VIEWER' ).
  gr_viewer = NEW #( parent = gr_ctn ).

  " 读取数据流
  PERFORM frm_download_data CHANGING lt_solix lv_size.

  gr_viewer->load_data(
    EXPORTING
      size = lv_size
      type = 'APPLICATION'
      subtype = 'TXT'
*      subtype = 'JPG'
*      subtype = 'PDF'
    IMPORTING
      assigned_url = lv_url
    CHANGING
      data_table   = lt_solix
   ).

  gr_viewer->show_data( url = lv_url ).

ENDMODULE.

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9001 INPUT.

  CASE sy-ucomm.
    WHEN 'ZEXIT'.
      LEAVE PROGRAM.
    WHEN OTHERS.
  ENDCASE.

ENDMODULE.

*&---------------------------------------------------------------------*
*& Form frm_download_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- LT_SOLIX
*&---------------------------------------------------------------------*
FORM frm_download_data  CHANGING pt_solix TYPE solix_tab
                                 pv_size  TYPE i.

  DATA: lv_error     TYPE c VALUE 'X',
        lv_name      TYPE string,
        lv_path      TYPE string,
        lv_fullpath  TYPE string,
        lv_extension TYPE string,
        lv_filename  TYPE string,
        lt_result    TYPE match_result_tab,
        ls_result    TYPE match_result.

  DATA: lt_solix         TYPE solix_tab,
        ls_solix         TYPE solix,
        lv_file_length   TYPE i,
        lv_content       TYPE xstring,
        lv_max_length    TYPE i VALUE 255,
        lv_actual_length TYPE i.

  FIELD-SYMBOLS: <fs_server_path> TYPE string.
*  FIELD-SYMBOLS: <fs_server_path> TYPE any.

  lv_name = '/mnt/smbshare/DS4/GTS/1000000000_海关审批单20250225171352.txt'.
*  lv_name = '/mnt/smbshare/DS4/GTS/1000000000_通关单20250225171400.jpg'.
*  lv_name = '/mnt/smbshare/DS4/GTS/1000000000_报关单20250225171404.pdf'.
  ASSIGN lv_name TO <fs_server_path>.
  IF <fs_server_path> IS ASSIGNED AND <fs_server_path> IS NOT INITIAL.

    " 文件名提取
    FIND ALL OCCURRENCES OF REGEX '[^/\\]+[/\\]*$' IN <fs_server_path> RESULTS lt_result.
    IF sy-subrc = 0.
      READ TABLE lt_result INTO ls_result INDEX 1.
      lv_filename  = <fs_server_path>+ls_result-offset(ls_result-length).
      lv_extension = lv_filename.
      REPLACE ALL OCCURRENCES OF REGEX '\.\w*' IN lv_filename  WITH ''.  " 正则删除后缀,取文件名
      REPLACE ALL OCCURRENCES OF REGEX '.+\.'  IN lv_extension WITH ''.  " 正则删除文件名,取后缀

      " 选择文件保存路径
*      cl_gui_frontend_services=>file_save_dialog(
*        EXPORTING
*          default_extension = lv_extension
*          default_file_name = lv_filename
*        CHANGING
*          filename          = lv_filename
*          path              = lv_path
*          fullpath          = lv_fullpath
*        EXCEPTIONS
*          OTHERS            = 1 ).
*      IF sy-subrc <> 0 OR lv_fullpath IS INITIAL.
*        MESSAGE s028(zgts001) DISPLAY LIKE 'E'. " 未选择文件保存路径
*        RETURN.
*      ENDIF.

      " 下载文件
      OPEN DATASET <fs_server_path> FOR INPUT IN BINARY MODE.
      IF sy-subrc = 0.

        DO.
          CLEAR: ls_solix, lv_actual_length.
          READ DATASET <fs_server_path> INTO ls_solix-line MAXIMUM LENGTH lv_max_length ACTUAL LENGTH lv_actual_length.
          IF lv_actual_length IS INITIAL.
            EXIT.
          ELSE.
            APPEND ls_solix TO lt_solix.
            lv_file_length += lv_actual_length.
          ENDIF.

        ENDDO.

        CLOSE DATASET <fs_server_path>.

        " 转换二进制
        IF lt_solix IS NOT INITIAL.
*
*          " 下载本地
*          CALL FUNCTION 'GUI_DOWNLOAD'
*            EXPORTING
*              filename = lv_fullpath
*              filetype = 'BIN'
*            TABLES
*              data_tab = lt_solix.
*          IF sy-subrc = 0.
            CLEAR lv_error.
*          ENDIF.
*
        ENDIF.

      ENDIF.

    ENDIF.

  ENDIF.

  IF lv_error = 'X'.
    MESSAGE s027(zgts001) DISPLAY LIKE 'E'. " 根据屏幕路径下载服务器文件失败
    RETURN.
  ENDIF.

  pv_size  = lv_file_length.
  pt_solix = lt_solix.

ENDFORM.