[ABAP] Code128-Barcode als Bitmap erzeugen

* Docking-Container für Einbettung cl_gui_picture
DATA: o_dock TYPE REF TO cl_gui_docking_container.

* Text für Barcode
PARAMETERS: p_text TYPE string DEFAULT '1234567890' LOWER CASE.

AT SELECTION-SCREEN OUTPUT.

  TRY.
      IF NOT o_dock IS BOUND.
* Dockingcontainer erzeugen
        o_dock = NEW #( repid = sy-repid
                        dynnr = sy-dynnr
                        side  = cl_gui_docking_container=>dock_at_right
                        ratio = 50 ).
      ENDIF.

      DATA: lv_xstr_bmp TYPE xstring.

* Siehe: https://me.sap.com/notes/2790500
* Siehe: https://me.sap.com/notes/645158
* i_narrow_module_width - 1 ... 10, Breite für das schmalste Modul eines Barcodes in Pixeln
* i_height              - 1 ... 9999, Höhe der Balken des Barcodes in Pixeln (600 px == 1 Zoll)
* i_mode                - N (None), A (Automatic), U (UCC case mode)
* i_rotation            - 0 - Normal, 90 -  Rotated, 180 - Inverted, 270 - Bottomup
* Process Code 128 barcode
      cl_rstx_barcode_renderer=>code_128( EXPORTING i_narrow_module_width = 1
                                                    i_height              = 50
*                                                    i_mode                = 'A'
*                                                    i_rotation            = 0
                                                    i_barcode_text        = p_text
                                          IMPORTING e_bitmap              = lv_xstr_bmp ).

      DATA(it_bin_bmp) = cl_bcs_convert=>xstring_to_solix( lv_xstr_bmp ).

      DATA: lv_url TYPE swk_url.

* temporäre URL auf das Bild erzeugen
      CALL FUNCTION 'DP_CREATE_URL'
        EXPORTING
          type                 = 'image/bmp' " https://wiki.selfhtml.org/wiki/MIME-Type/%C3%9Cbersicht
          subtype              = 'bmp'
        TABLES
          data                 = it_bin_bmp
        CHANGING
          url                  = lv_url
        EXCEPTIONS
          dp_invalid_parameter = 1
          dp_error_put_table   = 2
          dp_error_general     = 3
          OTHERS               = 4.

* Bild über die URL laden und anzeigen
      DATA(o_pic) = NEW cl_gui_picture( parent = o_dock ).
      o_pic->set_display_mode( display_mode = cl_gui_picture=>display_mode_fit_center ).
      o_pic->load_picture_from_url_async( lv_url ).

* Flush ist wichtig für die Abarbeitung des GUI-Queues, sonst gibt es einen Core-Dump -> "SYSTEM_POINTER_PENDING"
      cl_gui_cfw=>flush( ).

    CATCH cx_root INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.