SAP中将URL的图片转化为BMP格式图片并上传se78,通过smartforms直接调用

最近遇到一个需求需要将外围系统传输,图片放到smartforms上用于打印,外围系统是直接将图片上传到了文件共享盘,通过接口将图片的URL链接发送给sap,并存储在底表中

注:如果16进制数据转化为BMP格式时报错,可能是开发机的sm59中的rfc没有成功链接,到测试机或者正式机看下如果可以链接成功,即可以在测试机使用

如图所示

本文的实现方式:通过HTTP请求访问,获取到图片的16进制数据,然后将图片数据转化为bmp格式,重构sap标准form :IMPORT_BITMAP_BDSIMPORT_BITMAP_BDS_16将图片上传到se78,并直接指定图片的名称,下次打印时图片即会覆盖,避免了,上传大量图片到sap服务器的缺点.

代码如下:

REPORT ZABAP073.

TABLES:ZTMM001.
DATA: URL TYPE STRING .
DATA: CONTENT TYPE XSTRING.
DATA:IN_PICTURE TYPE  STRING .
DATA : HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT.
DATA: GO_IMAGE_PROCESSOR TYPE REF TO CL_FXS_IMAGE_PROCESSOR,
      G_HANDLE           TYPE I.

DATA:G_BUFFER_OLD TYPE XSTRING,
     G_BUFFER_NEW TYPE XSTRING.
DATA: L_TYPE     TYPE STRING,
      L_XRES     TYPE I,
      L_YRES     TYPE I,
      L_XDPI     TYPE I,
      L_YDPI     TYPE I,
      L_BITDEPTH TYPE I.
DATA: E_TYPE    TYPE   SY-MSGTY,
      E_MESSAGE TYPE  STRING.
DATA: LV_URL    TYPE STRING,
      LT_BINARY TYPE TABLE OF XSTRING,
      LT_DATA   TYPE TABLE OF SOLIX,
      LV_LENGTH TYPE I.

INCLUDE ZABAP073_S01. "屏幕

INCLUDE ZABAP073_F01.



*&---------------------------------------------------------------------*
*& 包含               ZABAP073_S01
*&---------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK BK1 WITH FRAME TITLE TEXT-T01.
  PARAMETERS :
*    p_URL  type string ,
      P_MATNR  TYPE ZTMM001-MATNR.

SELECTION-SCREEN END OF BLOCK BK1.





*&---------------------------------------------------------------------*
*& 包含               ZABAP073_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& 包含               ZABAP071_F01
*&---------------------------------------------------------------------*

*url = p_url.

  SELECT SINGLE ZTUPIAN
    INTO @URL
    FROM ZTMM001
    WHERE MATNR = @P_MATNR.

  CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
    EXPORTING
      URL                = URL
    IMPORTING
      CLIENT             = HTTP_CLIENT
    EXCEPTIONS
      ARGUMENT_NOT_FOUND = 1
      PLUGIN_NOT_ACTIVE  = 2
      INTERNAL_ERROR     = 3
      OTHERS             = 4.
  IF SY-SUBRC = 0.
  HTTP_CLIENT->SEND( ).
   call method cl_http_client=>GET_LAST_ERROR
    importing
      message = zmessage.

  HTTP_CLIENT->RECEIVE( ).
     call method cl_http_client=>GET_LAST_ERROR
    importing
       message = zmessage.


  CONTENT = HTTP_CLIENT->RESPONSE->GET_DATA( ).
       call method cl_http_client=>GET_LAST_ERROR
    importing
       message = zmessage.
  HTTP_CLIENT->CLOSE( ).
  ENDIF.




  IF CONTENT IS NOT INITIAL.
    G_BUFFER_OLD = CONTENT.


    CREATE OBJECT GO_IMAGE_PROCESSOR.

    "添加到IMAGE_PROCESSOR中
    G_HANDLE = GO_IMAGE_PROCESSOR->ADD_IMAGE( IV_DATA = G_BUFFER_OLD  IV_IMAGE_NAME = '456' ).

    "尺寸缩小至100*100
    CALL METHOD GO_IMAGE_PROCESSOR->GET_INFO
      EXPORTING
        IV_HANDLE   = G_HANDLE
      IMPORTING
        EV_MIMETYPE = L_TYPE
        EV_XRES     = L_XRES
        EV_YRES     = L_YRES
        EV_XDPI     = L_XDPI
        EV_YDPI     = L_YDPI
        EV_BITDEPTH = L_BITDEPTH.

   IF L_XRES > L_YRES.
    L_YRES = L_YRES /  L_XRES / 100.
    L_XRES = 100.
  ELSE.
    L_XRES = L_XRES /  L_YRES / 100.
    L_YRES = 100.
  ENDIF.

    "压缩图片
    CALL METHOD GO_IMAGE_PROCESSOR->RESIZE
      EXPORTING
        IV_HANDLE = G_HANDLE
        IV_XRES   = L_YRES
        IV_YRES   = L_YRES.

    "转为BMP格式
    CALL METHOD GO_IMAGE_PROCESSOR->CONVERT
      EXPORTING
        IV_HANDLE = G_HANDLE
        IV_FORMAT = 'image/x-ms-bmp'.

    "取压缩后的图片
    CALL METHOD GO_IMAGE_PROCESSOR->GET_IMAGE
      EXPORTING
        IV_HANDLE  = G_HANDLE
      RECEIVING
        RV_XSTRING = G_BUFFER_NEW.

    DATA: BEGIN OF P_BITMAP OCCURS 0,
            L(64) TYPE X,
          END OF P_BITMAP.
    DATA: P_FILENAME   TYPE RLGRAP-FILENAME,
          P_NAME       TYPE STXBITMAPS-TDNAME,
          P_TITLE      LIKE BAPISIGNAT-PROP_VALUE,
          P_DOCID      TYPE STXBITMAPS-DOCID,
          P_RESOLUTION TYPE STXBITMAPS-RESOLUTION,
          P_BYTECOUNT  TYPE I.

    "上传bmp图片
    CLEAR:P_FILENAME,P_NAME,P_DOCID,P_RESOLUTION.
    P_FILENAME = ''.
    P_NAME = 'TP'.
    P_TITLE = '图片'.

    P_BYTECOUNT = XSTRLEN( G_BUFFER_NEW ).

    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        BUFFER     = G_BUFFER_NEW
*       APPEND_TO_TABLE       = ' '
*   IMPORTING
*       OUTPUT_LENGTH         =
      TABLES
        BINARY_TAB = P_BITMAP.

    PERFORM IMPORT_BITMAP_BDS_16 "IN PROGRAM SAPLSTXBITMAPS
    USING P_FILENAME                   "文件路径
          P_NAME "p_name            "名字
          'GRAPHICS'"p_object          "对象 固定为 GRAPHIC
          'BMAP'"p_id                  "ID 固定为 BMAP
          'BCOL'"'BMON'"p_btype        "颜色模式 BMON黑白  BCOL彩色
          'BMP'"p_format               "BMP 格式
          P_TITLE"description    "描述
          ''"p_resident               "依照打印请求驻留在打印机内存中 X 驻留
          'X'"p_autoheight              "自动高度
          'X'"p_bmcomp                 "是否压缩
          P_BYTECOUNT
          P_BITMAP[]                   "图片16进制数据
    CHANGING  P_DOCID                      "文档ID
           P_RESOLUTION
           E_TYPE.                "分辨率


    IF E_TYPE = 'E'.
      E_MESSAGE = '图片上传失败!'.
    ELSE.
      E_TYPE = 'S'.
      E_MESSAGE = '成功!'.

      PERFORM DY_SMARTFORMS.

    ENDIF.

  ENDIF.




  "LSTXBITMAPSTOP
*function-pool stxbitmaps      message-id td.

***include rstxdata.
  INCLUDE RSTXBOOL.          " Boolean type and constants
  INCLUDE RSTXDATAITF.       " Special characters and strings in ITF
  INCLUDE RSTXDATATEXTS.     " Text administration and text interface
  INCLUDE RSTXDATABMP.       " Bitmap constants
  INCLUDE RSTXDATAUNITS.     " Units
  INCLUDE RSTXDATAOTF.       " OTF-ID's (PrintControl)

  TABLES: RSTXU, RSSCG,          " Screen fields
          ITCTH, RLGRAP, STXH,
          PSTXT.                 " SPA/GPA
  TABLES: TTXOB, TTXID, TTXGR.                              "#EC NEEDED
  TABLES: STXBITMAPS.            "BDS bitmaps

  TYPE-POOLS: SHLP,              " for Help functions
              SBDST.             " for BDS functions

  INCLUDE LSTXBITMAPSSEL.        " selection screens

*************************************************************
* SAPscript bitmap utility functions
*************************************************************
  CONSTANTS:
    C_OTF_RD_OTFBITMA(16)         VALUE '4F54466269746D61',
    C_OTF_RD_FF                   TYPE X VALUE 'FF',
    C_OTF_RD_FORMATID_BMON        TYPE X VALUE '01',
    C_OTF_RD_FORMATID_BCOL        TYPE X VALUE '02',
    C_OTF_RD_SUBFORMATID_NONE     TYPE X VALUE '00',
    C_OTF_RD_SUBFORMATID_BDS      TYPE X VALUE '01',
    C_OTF_RD_FORMATPAR1_NONRESI   TYPE X VALUE '00',
    C_OTF_RD_FORMATPAR1_RESI      TYPE X VALUE '01',
    C_OTF_RD_FORMATPAR1_HI_NOCOMP TYPE X VALUE '00',
    C_OTF_RD_FORMATPAR1_HI_RUNL   TYPE X VALUE '10',
    C_OTF_RD_FORMATPAR2_NONE      TYPE X VALUE '00',
    C_OTF_RD_IMAGEID_LEN          TYPE I VALUE 90,
    C_BM_FORMAT_ITF(3)            TYPE C VALUE 'ITF',
    C_BM_FORMAT_BMP(3)            TYPE C VALUE 'BMP',
    C_BM_FORMAT_BDS(3)            TYPE C VALUE 'BDS',
    C_ITF_TLINE_LEN               TYPE I VALUE 132,
    C_ITF_FORMAT_CMD(2)           TYPE C VALUE '/:',
    C_ITF_FORMAT_CMNT(2)          TYPE C VALUE '/*',
    C_ITF_FORMAT_DATL(2)          TYPE C VALUE '/=',
    C_ITF_HEX_HEX(3)              TYPE C VALUE 'HEX',
    C_ITF_HEX_ENDHEX(6)           TYPE C VALUE 'ENDHEX',
    C_ITF_HEX_HEIGHT(6)           TYPE C VALUE 'HEIGHT',
    C_ITF_HEX_CM(2)               TYPE C VALUE 'CM',
    C_ITF_HEX_MM(2)               TYPE C VALUE 'MM',
    C_ITF_HEX_POINT(2)            TYPE C VALUE 'PT',
    C_ITF_HEX_TWIP(2)             TYPE C VALUE 'TW',
    C_ITF_HEX_TYPE(4)             TYPE C VALUE 'TYPE',
    C_ITF_HEX_BMON(4)             TYPE C VALUE 'BMON',
    C_ITF_HEX_BCOL(4)             TYPE C VALUE 'BCOL',
    C_ITF_HEX_RESI(4)             TYPE C VALUE 'RESI',
    C_BMP_COMPR_RGB               TYPE I VALUE 0,
    C_BMP_COMPR_RLE8              TYPE I VALUE 1,
    C_BMP_COMPR_RLE4              TYPE I VALUE 2,
    C_BMP_COMPR_BITFIELDS         TYPE I VALUE 3.
  DATA: BEGIN OF OTF_BMINFO,
          BMTYPE(4)               TYPE C,
          NEW_RD_FORMAT           TYPE TY_BOOLEAN,
          IS_MONOCHROME           TYPE TY_BOOLEAN,
          IS_RESIDENT             TYPE TY_BOOLEAN,
          W_TW                    TYPE I,
          H_TW                    TYPE I,
          W_PIX                   TYPE I,
          H_PIX                   TYPE I,
          DPI                     TYPE I,
          BITSPERPIX              TYPE I,
          COLTABSIZE              TYPE I,
          NUMDATABYTES            TYPE I,
          AUTOHEIGHT              TYPE TY_BOOLEAN,
          RES_H_TW                TYPE I,
          BYTES_PER_ROW           TYPE I,
          BYTES_PER_ROW_ACT       TYPE I,
          BYTES_PER_ROW_FULLCOLOR TYPE I,
          IS_COMPRESSED           TYPE TY_BOOLEAN,
        END OF OTF_BMINFO.
  CONSTANTS:
        C_BM_FILE_LINELEN     TYPE I VALUE 80.
  DATA: BM_FILE_LINEOFS TYPE I.
  DATA: BEGIN OF BM_FILE OCCURS 0,
          L(80) TYPE X,
        END OF BM_FILE.
  CONSTANTS:
        C_BM_FILE_TMP_LINELEN TYPE I VALUE 80.
  DATA: BM_FILE_TMP_LINEOFS   TYPE I.
  DATA: BEGIN OF BM_FILE_TMP OCCURS 0,
          L(80) TYPE X,
        END OF BM_FILE_TMP.
  CONSTANTS: C_BM_FILE8BIT_LINELEN TYPE I VALUE 80.
  DATA: BM_FILE8BIT_LINEOFS   TYPE I.
  DATA: BEGIN OF BM_FILE8BIT OCCURS 0,
          L(80) TYPE X,
        END OF BM_FILE8BIT.
  DATA: BITMAP_FILE_LINEOFS   TYPE I,
        BITMAP_FILE_LINEWIDTH TYPE I,
        BITMAP_FILE_BYTECOUNT TYPE I.
* BMP color table
  DATA: BEGIN OF BMP_COLOR_TAB OCCURS 256,
          R TYPE X,
          G TYPE X,
          B TYPE X,
        END OF BMP_COLOR_TAB.
* TIFF: global format info
  DATA: BEGIN OF TIF_INFO,
          BYTEORDER(1)        TYPE C,
          VERSION             TYPE I,
          FIRSTIFDOFS         TYPE I,
          WIDTH               TYPE I,
          LENGTH              TYPE I,
          BITSPERSAMPLE_1     TYPE I,
          BITSPERSAMPLE_2     TYPE I,
          BITSPERSAMPLE_3     TYPE I,
          BITSPERSAMPLEPLANES TYPE I,
          COMPRESSION         TYPE I,
          PHOTOMETRIC         TYPE I,
          FILLORDER           TYPE I,
          NUMBER_STRIPS       TYPE I,
          SAMPLESPERPIX       TYPE I,
          ROWSPERSTRIP        TYPE I,
          MINSAMPLE           TYPE I,
          MAXSAMPLE           TYPE I,
          XRES_N              TYPE I,
          XRES_D              TYPE I,
          YRES_N              TYPE I,
          YRES_D              TYPE I,
          RESUNIT             TYPE I,
          COLORMAP_SIZE       TYPE I,
          MAXROW              TYPE I,
          MAXCOL              TYPE I,
          DPI                 TYPE I,
          TIFTYPE             TYPE C,
          WIDTH_ORI           TYPE I,
          LENGTH_ORI          TYPE I,
          DPI_ORI             TYPE I,
        END OF TIF_INFO.
* TIFF: list of strip offset pointers to image data
  DATA: BEGIN OF TIF_STRIPOFS_TAB OCCURS 20,
          OFS   TYPE I,
          COUNT TYPE I,
        END OF TIF_STRIPOFS_TAB.
* TIFF: list of color table entries
  DATA: BEGIN OF TIF_COLOR_TAB OCCURS 256,
          R TYPE I,
          G TYPE I,
          B TYPE I,
        END OF TIF_COLOR_TAB.
* TIFF constants
  CONSTANTS:
    C_BYTEORD_INTEL     VALUE 'I',
    C_BYTEORD_MOTO      VALUE 'M',
    C_DTYPE_BYTE        TYPE I VALUE 1,
    C_DTYPE_ASCII       TYPE I VALUE 2,
    C_DTYPE_SHORT       TYPE I VALUE 3,
    C_DTYPE_LONG        TYPE I VALUE 4,
    C_DTYPE_RATIONAL    TYPE I VALUE 5,
    C_TIFTYPE_NONE      VALUE ' ',
    C_TIFTYPE_BILEVEL   VALUE 'B',
    C_TIFTYPE_GRAYSCALE VALUE 'G',
    C_TIFTYPE_COLORMAP  VALUE 'C',
    C_TIFTYPE_FULLCOLOR VALUE 'F',
    C_XCONST_80         TYPE X VALUE '80',
    C_XCONST_40         TYPE X VALUE '40',
    C_XCONST_20         TYPE X VALUE '20',
    C_XCONST_10         TYPE X VALUE '10',
    C_XCONST_08         TYPE X VALUE '08',
    C_XCONST_04         TYPE X VALUE '04',
    C_XCONST_02         TYPE X VALUE '02',
    C_XCONST_01         TYPE X VALUE '01',
    C_COMP_UNCOMP       TYPE I VALUE 1,
    C_COMP_HUFFMAN      TYPE I VALUE 2,
    C_COMP_PACKBITS     TYPE I VALUE 32773.

*************************************************************
* BDS bitmap storage
*************************************************************
* BDS bitmaps: buffer that holds info on resident bitmaps
  DATA  BEGIN OF BITMAP_BUFFER_BDS OCCURS 10.
  INCLUDE STRUCTURE STXBITMAPS.
  DATA: ACT_W_TW LIKE STXBITMAPS-WIDTHTW,
        ACT_H_TW LIKE STXBITMAPS-HEIGHTTW,
        ACT_DPI  LIKE STXBITMAPS-RESOLUTION.
  DATA  END OF BITMAP_BUFFER_BDS.
  DATA: BDSTAB_LINEOFS   TYPE I,
        BDSTAB_LINEWIDTH TYPE I,
        BDSTAB_BYTECOUNT TYPE I.

* BDS handling
  CONSTANTS:
    C_BDS_CLASSNAME TYPE SBDST_CLASSNAME VALUE 'DEVC_STXD_BITMAP',
    C_BDS_CLASSTYPE TYPE SBDST_CLASSTYPE VALUE 'OT',          " others
    C_BDS_MIMETYPE  TYPE BDS_MIMETP      VALUE 'application/octet-stream',
    C_BDS_ORIGINAL  TYPE SBDST_DOC_VAR_TG VALUE 'OR'.

* generating command lines
  DATA:
    C_CMD_POSITION_WINDOW LIKE TLINE VALUE '/:POSITION WINDOW',
    C_CMD_POSITION_PAGE   LIKE TLINE VALUE '/:POSITION PAGE',
    C_CMD_POSITION_XY     LIKE TLINE
                  VALUE '/:POSITION XORIGIN ''&1'' &2 YORIGIN ''&3'' &4',
    C_CMD_SIZE_WINDOW     LIKE TLINE VALUE '/:SIZE WINDOW',
    C_CMD_SIZE_PAGE       LIKE TLINE VALUE '/:SIZE PAGE',
    C_CMD_SIZE_DX         LIKE TLINE VALUE '/:SIZE WIDTH ''&1'' &2',
    C_CMD_SIZE_DY         LIKE TLINE VALUE '/:SIZE HEIGHT ''&1'' &2',
    C_CMD_SIZE_DXDY       LIKE TLINE
                          VALUE '/:SIZE WIDTH ''&1'' &2 HEIGHT ''&3'' &4',
    C_CMD_WIDTH           LIKE TLINE VALUE 'WIDTH ''&1'' &2',
    C_CMD_HEIGHT          LIKE TLINE VALUE 'HEIGHT ''&1'' &2',
    C_CMD_BOX             LIKE TLINE VALUE '/:BOX',
    C_CMD_BOX_FRAME       LIKE TLINE VALUE 'FRAME ''&1'' &2',
    C_CMD_BOX_INTENSITY   LIKE TLINE VALUE 'INTENSITY &1',
    C_CMD_BOX_X           LIKE TLINE VALUE 'XPOS ''&1'' &2',
    C_CMD_BOX_Y           LIKE TLINE VALUE 'YPOS ''&1'' &2',
    C_CMD_BOX_XY          LIKE TLINE
                          VALUE 'XPOS ''&1'' &2 YPOS ''&3'' &4'.
  DATA: L_COMMANDS LIKE TLINE OCCURS 1 WITH HEADER LINE.

* Globals for screen processing
*     Screen attributes
  CONSTANTS:
    C_SCREEN_ON  LIKE SCREEN-ACTIVE VALUE '1',
    C_SCREEN_OFF LIKE SCREEN-ACTIVE VALUE '0'.

  DATA: FCODE                     LIKE SY-UCOMM,
        FCODE_OLD                 LIKE SY-UCOMM,
        F_FOUND(1)                TYPE C,
        F_ACTION_CANCELED(1)      TYPE C,
        F_RESOLUTION_CHANGED(1)   TYPE C,
        F_SHOW_ATTRIBUTES_2001(1) TYPE C,
        F_SHOW_ATTRIBUTES_2002(1) TYPE C,
        G_REPID                   LIKE SY-REPID VALUE 'SAPLSTXBITMAPS'.

  CONSTANTS:
    FCODE_OK          LIKE SY-UCOMM VALUE 'OK',
**    fcode_f3                like sy-ucomm value 'BACK',
    FCODE_F12         LIKE SY-UCOMM VALUE 'CANC',
**    fcode_f15               like sy-ucomm value 'BEEN',
    FCODE_SEARCH      LIKE SY-UCOMM VALUE 'CATA',
    FCODE_IMPORT      LIKE SY-UCOMM VALUE 'UPLD',
    FCODE_DETAIL      LIKE SY-UCOMM VALUE 'DETAIL',
    FCODE_BTYPE       LIKE SY-UCOMM VALUE 'BTYPE',
    FCODE_GR_ID       LIKE SY-UCOMM VALUE 'GRAPHICS_ID',
    FCODE_TAB_BDS     LIKE SY-UCOMM VALUE 'STXBITMAPS',
    FCODE_TAB_GRTEXT  LIKE SY-UCOMM VALUE 'STXHGRAPHICS',
    FCODE_TAB_STDTEXT LIKE SY-UCOMM VALUE 'STXHTEXT'.

*     Tabstrips
  CONTROLS:
        TABSTRIP_BITMAPS   TYPE TABSTRIP.
  DATA: TABSTRIP_NR        LIKE SY-DYNNR.

  DEFINE TAB_BDS.
    TABSTRIP_NR = '2001'.
    TABSTRIP_BITMAPS-ACTIVETAB = 'STXBITMAPS'.
  END-OF-DEFINITION.
  DEFINE TAB_STXH_GRAPHICS.
    TABSTRIP_NR = '2002'.
    TABSTRIP_BITMAPS-ACTIVETAB = 'STXHGRAPHICS'.
  END-OF-DEFINITION.


* Globals and globals for dynpro fields
  DATA: G_OBJECTTYPE(20) TYPE C,
        G_NEW_RESOLUTION LIKE STXBITMAPS-RESOLUTION,
        G_STXBITMAPS     TYPE STXBITMAPS,
        G_STXH           TYPE STXH,
        G_TECHINFO       TYPE RSSCG,
        T_SIZE(40),
        BDS_DESCRIPTION  LIKE BAPISIGNAT-PROP_VALUE.
  CONSTANTS:
    C_OBJECTTYPE_BDS     LIKE G_OBJECTTYPE VALUE 'BDS',
    C_OBJECTTYPE_STDTEXT LIKE G_OBJECTTYPE VALUE 'OBTEXT',
    C_OBJECTTYPE_GRTEXT  LIKE G_OBJECTTYPE VALUE 'OBGRAPHICS'.

* Graphic handling
  CONSTANTS:
    C_STDTEXT  LIKE THEAD-TDOBJECT VALUE 'TEXT',
    C_GRAPHICS LIKE THEAD-TDOBJECT VALUE 'GRAPHICS',
    C_BMON     LIKE THEAD-TDID     VALUE 'BMON',
    C_BCOL     LIKE THEAD-TDID     VALUE 'BCOL'.
  CONSTANTS:
    C_SCREEN_GRAPHIC_IMPORT     LIKE SY-DYNNR VALUE '4000',
    C_SCREEN_GRAPHIC_IMPORT_BDS LIKE SY-DYNNR VALUE '4001'.
* radio buttons
  DATA: RB_ORIGIN_PAGE(1)     VALUE ' ',
        RB_ORIGIN_WINDOW(1)   VALUE 'X',
        RB_ORIGIN_ABSOLUTE(1) VALUE ' ',
        RB_HEIGHT_PAGE(1)     VALUE ' ',
        RB_HEIGHT_WINDOW(1)   VALUE ' ',
        RB_HEIGHT_ABSOLUTE(1) VALUE 'X',
        RB_WIDTH_PAGE(1)      VALUE ' ',
        RB_WIDTH_WINDOW(1)    VALUE ' ',
        RB_WIDTH_ABSOLUTE(1)  VALUE 'X',
        RB_NO_LINE(1)         VALUE ' ',
        RB_LINE_USER_DEF(1)   VALUE 'X',
        RB_GRAPHIC_BMON(1)    VALUE 'X',
        RB_GRAPHIC_BCOL(1)    VALUE ' ',
        RB_GRAPHIC_GENERAL(1) VALUE ' '.
* measures
  DATA: BOX_LEFT             LIKE RSTXU-NEGATIVE,
        BOX_LEFT_UNIT        LIKE RSTXU-UNITH,
        BOX_TOP              LIKE RSTXU-NEGATIVE,
        BOX_TOP_UNIT         LIKE RSTXU-UNITV,
        BOX_WIDTH            LIKE RSTXU-POSITIVE,
        BOX_WIDTH_UNIT       LIKE RSTXU-UNITH,
        BOX_HEIGHT           LIKE RSTXU-POSITIVE,
        BOX_HEIGHT_UNIT      LIKE RSTXU-UNITV,
        BOX_ORIGIN_LEFT      LIKE RSTXU-POSITIVE,
        BOX_ORIGIN_LEFT_UNIT LIKE RSTXU-UNITH,
        BOX_ORIGIN_TOP       LIKE RSTXU-POSITIVE,
        BOX_ORIGIN_TOP_UNIT  LIKE RSTXU-UNITV,
        BOX_FRAME            LIKE RSTXU-POSITIVE,
        BOX_FRAME_UNIT       LIKE RSTXU-UNIT.


  FORM IMPORT_BITMAP_BDS_16
          USING    P_FILENAME       TYPE RLGRAP-FILENAME
                   P_NAME           TYPE STXBITMAPS-TDNAME
                   P_OBJECT         TYPE STXBITMAPS-TDOBJECT
                   P_ID             TYPE STXBITMAPS-TDID
                   P_BTYPE          TYPE STXBITMAPS-TDBTYPE
                   P_FORMAT         TYPE C
                   P_TITLE          LIKE BDS_DESCRIPTION
                   P_RESIDENT       TYPE STXBITMAPS-RESIDENT
                   P_AUTOHEIGHT     TYPE STXBITMAPS-AUTOHEIGHT
                   P_BMCOMP         TYPE STXBITMAPS-BMCOMP
                   P_BYTECOUNT      TYPE I
                   P_BITMAP      "图片的16进制数据
          CHANGING P_DOCID          TYPE STXBITMAPS-DOCID
                   P_RESOLUTION     TYPE STXBITMAPS-RESOLUTION
                   P_TYPE           TYPE SY-MSGTY.

    DATA: L_OBJECT_KEY TYPE SBDST_OBJECT_KEY.
    DATA: L_TAB        TYPE DDOBJNAME.
    DATA: BEGIN OF L_BITMAP OCCURS 0,
            L(64) TYPE X,
          END OF L_BITMAP.
    DATA: L_FILENAME      TYPE STRING,
          L_BYTECOUNT     TYPE I,
          L_BDS_BYTECOUNT TYPE I.
    DATA: L_COLOR(1)   TYPE C,
          L_WIDTH_TW   TYPE STXBITMAPS-WIDTHTW,
          L_HEIGHT_TW  TYPE STXBITMAPS-HEIGHTTW,
          L_WIDTH_PIX  TYPE STXBITMAPS-WIDTHPIX,
          L_HEIGHT_PIX TYPE STXBITMAPS-HEIGHTPIX.
    DATA: L_BDS_OBJECT      TYPE REF TO CL_BDS_DOCUMENT_SET,
          L_BDS_CONTENT     TYPE SBDST_CONTENT,
          L_BDS_COMPONENTS  TYPE SBDST_COMPONENTS,
          WA_BDS_COMPONENTS TYPE LINE OF SBDST_COMPONENTS,
          L_BDS_SIGNATURE   TYPE SBDST_SIGNATURE,
          WA_BDS_SIGNATURE  TYPE LINE OF SBDST_SIGNATURE,
          L_BDS_PROPERTIES  TYPE SBDST_PROPERTIES,
          WA_BDS_PROPERTIES TYPE LINE OF SBDST_PROPERTIES.
    DATA  WA_STXBITMAPS TYPE STXBITMAPS.

    MOVE-CORRESPONDING P_BITMAP TO L_BITMAP[].
    L_BYTECOUNT = P_BYTECOUNT.

    IF P_BTYPE = C_BMON.
      L_COLOR = C_FALSE.
    ELSE.
      L_COLOR = C_TRUE.
    ENDIF.

* Bitmap conversion
    CALL FUNCTION 'SAPSCRIPT_CONVERT_BITMAP_BDS'
      EXPORTING
        COLOR                    = L_COLOR
        FORMAT                   = P_FORMAT
        RESIDENT                 = P_RESIDENT
        BITMAP_BYTECOUNT         = L_BYTECOUNT
        COMPRESS_BITMAP          = P_BMCOMP
      IMPORTING
        WIDTH_TW                 = L_WIDTH_TW
        HEIGHT_TW                = L_HEIGHT_TW
        WIDTH_PIX                = L_WIDTH_PIX
        HEIGHT_PIX               = L_HEIGHT_PIX
        DPI                      = P_RESOLUTION
        BDS_BYTECOUNT            = L_BDS_BYTECOUNT
      TABLES
        BITMAP_FILE              = L_BITMAP
        BITMAP_FILE_BDS          = L_BDS_CONTENT
      EXCEPTIONS
        FORMAT_NOT_SUPPORTED     = 1
        NO_BMP_FILE              = 2
        BMPERR_INVALID_FORMAT    = 3
        BMPERR_NO_COLORTABLE     = 4
        BMPERR_UNSUP_COMPRESSION = 5
        BMPERR_CORRUPT_RLE_DATA  = 6
        OTHERS                   = 7.
    IF SY-SUBRC <> 0.
      PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                    P_NAME
                                    P_ID
                                    P_BTYPE.
*    message id sy-msgid type sy-msgty number sy-msgno
*            with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
*    raising conversion_failed.

      P_TYPE = 'E'.


    ENDIF.

* Save bitmap in BDS
    CREATE OBJECT L_BDS_OBJECT.

    WA_BDS_COMPONENTS-DOC_COUNT  = '1'.
    WA_BDS_COMPONENTS-COMP_COUNT = '1'.
    WA_BDS_COMPONENTS-MIMETYPE   = C_BDS_MIMETYPE.
    WA_BDS_COMPONENTS-COMP_SIZE  = L_BDS_BYTECOUNT.
    APPEND WA_BDS_COMPONENTS TO L_BDS_COMPONENTS.

    IF P_DOCID IS INITIAL.          " graphic is new

      WA_BDS_SIGNATURE-DOC_COUNT = '1'.
      APPEND WA_BDS_SIGNATURE TO L_BDS_SIGNATURE.

      CALL METHOD L_BDS_OBJECT->CREATE_WITH_TABLE
        EXPORTING
          CLASSNAME  = C_BDS_CLASSNAME
          CLASSTYPE  = C_BDS_CLASSTYPE
          COMPONENTS = L_BDS_COMPONENTS
          CONTENT    = L_BDS_CONTENT
        CHANGING
          SIGNATURE  = L_BDS_SIGNATURE
          OBJECT_KEY = L_OBJECT_KEY
        EXCEPTIONS
          OTHERS     = 1.
      IF SY-SUBRC <> 0.
        PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                      P_NAME
                                      P_ID
                                      P_BTYPE.
*      message e285 with p_name  'BDS'.
        P_TYPE = 'E'.
      ENDIF.
      READ TABLE L_BDS_SIGNATURE INDEX 1 INTO WA_BDS_SIGNATURE
      TRANSPORTING DOC_ID.
      IF SY-SUBRC = 0.
        P_DOCID = WA_BDS_SIGNATURE-DOC_ID.
      ELSE.
        PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                      P_NAME
                                      P_ID
                                      P_BTYPE.
*      message e285 with p_name 'BDS'.
        P_TYPE = 'E'.
      ENDIF.

    ELSE.                " graphic already exists
********* read object_key for faster access *****
      CLEAR L_OBJECT_KEY.
      SELECT SINGLE * FROM STXBITMAPS INTO WA_STXBITMAPS
          WHERE TDOBJECT = P_OBJECT
            AND TDID     = P_ID
            AND TDNAME   = P_NAME
            AND TDBTYPE  = P_BTYPE.
      SELECT SINGLE TABNAME FROM BDS_LOCL INTO L_TAB
         WHERE CLASSNAME = C_BDS_CLASSNAME
            AND CLASSTYPE = C_BDS_CLASSTYPE.
      IF SY-SUBRC = 0.
        SELECT SINGLE OBJECT_KEY FROM (L_TAB) INTO L_OBJECT_KEY
          WHERE LOIO_ID = WA_STXBITMAPS-DOCID+10(32)
            AND CLASSNAME = C_BDS_CLASSNAME
              AND CLASSTYPE = C_BDS_CLASSTYPE.
      ENDIF.
******** read object_key end ********************

      CALL METHOD L_BDS_OBJECT->UPDATE_WITH_TABLE
        EXPORTING
          CLASSNAME     = C_BDS_CLASSNAME
          CLASSTYPE     = C_BDS_CLASSTYPE
          OBJECT_KEY    = L_OBJECT_KEY
          DOC_ID        = P_DOCID
          DOC_VER_NO    = '1'
          DOC_VAR_ID    = '1'
        CHANGING
          COMPONENTS    = L_BDS_COMPONENTS
          CONTENT       = L_BDS_CONTENT
        EXCEPTIONS
          NOTHING_FOUND = 1
          OTHERS        = 2.
      IF SY-SUBRC = 1.   " inconsistency STXBITMAPS - BDS; repeat check in
        WA_BDS_SIGNATURE-DOC_COUNT = '1'.
        APPEND WA_BDS_SIGNATURE TO L_BDS_SIGNATURE.

        CALL METHOD L_BDS_OBJECT->CREATE_WITH_TABLE
          EXPORTING
            CLASSNAME  = C_BDS_CLASSNAME
            CLASSTYPE  = C_BDS_CLASSTYPE
            COMPONENTS = L_BDS_COMPONENTS
            CONTENT    = L_BDS_CONTENT
          CHANGING
            SIGNATURE  = L_BDS_SIGNATURE
            OBJECT_KEY = L_OBJECT_KEY
          EXCEPTIONS
            OTHERS     = 1.
        IF SY-SUBRC <> 0.
          PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                        P_NAME
                                        P_ID
                                        P_BTYPE.
*        message e285 with p_name 'BDS'.
          P_TYPE = 'E'.
        ENDIF.
        READ TABLE L_BDS_SIGNATURE INDEX 1 INTO WA_BDS_SIGNATURE
        TRANSPORTING DOC_ID.
        IF SY-SUBRC = 0.
          P_DOCID = WA_BDS_SIGNATURE-DOC_ID.
        ELSE.
          PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                        P_NAME
                                        P_ID
                                        P_BTYPE.
*        message e285 with p_name 'BDS'.
          P_TYPE = 'E'.
        ENDIF.

      ELSEIF SY-SUBRC = 2.
        PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                      P_NAME
                                      P_ID
                                      P_BTYPE.
*      message e285 with p_name 'BDS'.
        P_TYPE = 'E'.
      ENDIF.

    ENDIF.

* Save bitmap header in STXBITPMAPS
    WA_STXBITMAPS-TDNAME     = P_NAME.
    WA_STXBITMAPS-TDOBJECT   = P_OBJECT.
    WA_STXBITMAPS-TDID       = P_ID.
    WA_STXBITMAPS-TDBTYPE    = P_BTYPE.
    WA_STXBITMAPS-DOCID      = P_DOCID.
    WA_STXBITMAPS-WIDTHPIX   = L_WIDTH_PIX.
    WA_STXBITMAPS-HEIGHTPIX  = L_HEIGHT_PIX.
    WA_STXBITMAPS-WIDTHTW    = L_WIDTH_TW.
    WA_STXBITMAPS-HEIGHTTW   = L_HEIGHT_TW.
    WA_STXBITMAPS-RESOLUTION = P_RESOLUTION.
    WA_STXBITMAPS-RESIDENT   = P_RESIDENT.
    WA_STXBITMAPS-AUTOHEIGHT = P_AUTOHEIGHT.
    WA_STXBITMAPS-BMCOMP     = P_BMCOMP.
    INSERT INTO STXBITMAPS VALUES WA_STXBITMAPS.
    IF SY-SUBRC <> 0.
      UPDATE STXBITMAPS FROM WA_STXBITMAPS.
      IF SY-SUBRC <> 0.
*       message e285 with p_name 'STXBITMAPS'.
        P_TYPE = 'E'.
      ENDIF.
    ENDIF.

* Set description in BDS attributes
    WA_BDS_PROPERTIES-PROP_NAME  = 'DESCRIPTION'.
    WA_BDS_PROPERTIES-PROP_VALUE = P_TITLE.
    APPEND WA_BDS_PROPERTIES TO L_BDS_PROPERTIES.

    CALL METHOD L_BDS_OBJECT->CHANGE_PROPERTIES
      EXPORTING
        CLASSNAME  = C_BDS_CLASSNAME
        CLASSTYPE  = C_BDS_CLASSTYPE
        OBJECT_KEY = L_OBJECT_KEY
        DOC_ID     = P_DOCID
        DOC_VER_NO = '1'
        DOC_VAR_ID = '1'
      CHANGING
        PROPERTIES = L_BDS_PROPERTIES
      EXCEPTIONS
        OTHERS     = 1.

    PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                  P_NAME
                                  P_ID
                                  P_BTYPE.

  ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  DEQUEUE_GRAPHIC
*&---------------------------------------------------------------------*
* Dequeue of graphics stored in BDS
*----------------------------------------------------------------------*
  FORM DEQUEUE_GRAPHIC USING P_OBJECT
                             P_NAME
                             P_ID
                             P_BTYPE.

    CALL FUNCTION 'DEQUEUE_ESSGRABDS'
      EXPORTING
*       MODE_STXBITMAPS = 'E'
*       X_TDOBJECT      = ' '
*       X_TDNAME = ' '
*       X_TDID   = ' '
*       X_TDBTYPE       = ' '
*       _SCOPE   = '3'
*       _SYNCHRON       = ' '
*       _COLLECT = ' '
        TDOBJECT = P_OBJECT
        TDNAME   = P_NAME
        TDID     = P_ID
        TDBTYPE  = P_BTYPE.

  ENDFORM.                    " DEQUEUE_GRAPHIC




*&---------------------------------------------------------------------*
*& Form DY_SMARTFORMS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
  FORM DY_SMARTFORMS .
    DATA: LS_CONTROL_PARAM TYPE SSFCTRLOP,
          LS_OUTPUT_OPTION TYPE SSFCOMPOP,
          LV_FMNAME        TYPE RS38L_FNAM,
          LV_TOT           TYPE I.

    DATA:LC_FORMNAME TYPE TDSFNAME VALUE 'ZABAP_001'.  " SMARTFORMS
    CLEAR: LS_CONTROL_PARAM,LS_OUTPUT_OPTION.
    LS_CONTROL_PARAM-PREVIEW  = ABAP_TRUE.
    LS_CONTROL_PARAM-NO_OPEN  = ABAP_TRUE.
    LS_CONTROL_PARAM-NO_CLOSE  = ABAP_TRUE.

    CALL FUNCTION 'SSF_OPEN'
      EXPORTING
        CONTROL_PARAMETERS = LS_CONTROL_PARAM
      EXCEPTIONS
        FORMATTING_ERROR   = 1
        INTERNAL_ERROR     = 2
        SEND_ERROR         = 3
        USER_CANCELED      = 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.

*  GET FUNCTION NAME BY SMARTFORM NAME
    CLEAR LV_FMNAME.
    CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
      EXPORTING
        FORMNAME           = LC_FORMNAME
      IMPORTING
        FM_NAME            = LV_FMNAME
      EXCEPTIONS
        NO_FORM            = 1
        NO_FUNCTION_MODULE = 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.

    CALL FUNCTION LV_FMNAME
      EXPORTING
*       ARCHIVE_INDEX      =
*       ARCHIVE_INDEX_TAB  =
*       ARCHIVE_PARAMETERS =
        CONTROL_PARAMETERS = LS_CONTROL_PARAM
*       MAIL_APPL_OBJ      =
*       MAIL_RECIPIENT     =
*       MAIL_SENDER        =
*       OUTPUT_OPTIONS     =
        USER_SETTINGS      = 'X'
*       GS_HEAD            =
* IMPORTING
*       DOCUMENT_OUTPUT_INFO       =
*       JOB_OUTPUT_INFO    =
*       JOB_OUTPUT_OPTIONS =
* TABLES
*       GT_ITEM            =
      EXCEPTIONS
        FORMATTING_ERROR   = 1
        INTERNAL_ERROR     = 2
        SEND_ERROR         = 3
        USER_CANCELED      = 4
        OTHERS             = 5.
    IF SY-SUBRC <> 0.
* Implement suitable error handling here
    ENDIF.

    CALL FUNCTION 'SSF_CLOSE'
      EXCEPTIONS
        FORMATTING_ERROR = 1
        INTERNAL_ERROR   = 2
        SEND_ERROR       = 3
        OTHERS           = 4.
    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.

这里是通过SKU号在底表ZTMM001中查询的图片URL然后再转换的,如果是有URL直接转换也可以的不需要用SKU号

SMARFORMS中直接指定图片名称即可

效果如下

此方法虽然实现了想要的效果,但是在实际测试过程中却遇到了一些问题

1.有些图片打印出来会异常的小,大部分均为正常,解决办法:

如果遇到最终打印出来的效果图片因为分辨率不同而大小不一致时,可以在smartforms中直接指定分辨率大小,从而实现固定.

2.上述方式由于系统中只上传服务器一张图片,所以多个人同时打印时会出现数据错乱,解决办法:

进一步的,选择使用上传的图片名称修改为sku号,每次上传后,将此sku号更新到底表中,每次打印前去这个底表查一下sku号是否存在此表,如果存在则不需要再上传图片,直接获取图片到smartforms中即可,同时设置job删除se78上传的图片,每天晚上定时删掉即可

删除图片的程序如下

*&---------------------------------------------------------------------*
*& Report ZSE78
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZSE78.

PERFORM DELE.

FORM DELE.

  DATA lv_mess TYPE char100.
  DATA z_matnr TYPE STXBITMAPS-TDNAME.

  SELECT *
  FROM ZTSD003_PIC
  INTO TABLE @DATA(GT_PIC).

  LOOP AT GT_PIC INTO DATA(GS_PIC).

    z_matnr = GS_PIC-MATNR.

    CALL FUNCTION 'SAPSCRIPT_DELETE_GRAPHIC_BDS'
      EXPORTING
        i_object      = 'GRAPHICS'
        i_name        = z_matnr
        i_id          = 'BMAP'
        i_btype       = 'BCOL'
        dialog        = ''
      EXCEPTIONS
        delete_failed = 1
        not_found     = 2
        canceled      = 3
        OTHERS        = 4.
    CASE sy-subrc.
      WHEN 0.
*        WRITE '成功删除'.
        DELETE FROM ZTSD003_PIC WHERE MATNR = GS_PIC-MATNR.

        IF SY-SUBRC = 0.
        ELSE.
         MESSAGE '数据库表删除失败' TYPE 'S' DISPLAY LIKE 'E'.
         RETURN.
        ENDIF.
      WHEN OTHERS.
        MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_mess.
        MESSAGE 'SE78照片删除失败' && lv_mess TYPE 'S' DISPLAY LIKE 'E'.
        RETURN.
    ENDCASE.

  ENDLOOP.

ENDFORM.

另外根据群友暴雨大姑的提示,可以对每个需要打印的人员分配一个key值,即这个人上传的图片都以这个key值去覆盖,然后针对于离职人员,可以一段时间清理一下即可,这样sap系统中最多也就保存几十张图片,而且还利用到了覆盖,不需要每天清表,这是一种好的方式,有想法的大姑可以试一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值