最近遇到一个需求需要将外围系统传输,图片放到smartforms上用于打印,外围系统是直接将图片上传到了文件共享盘,通过接口将图片的URL链接发送给sap,并存储在底表中
注:如果16进制数据转化为BMP格式时报错,可能是开发机的sm59中的rfc没有成功链接,到测试机或者正式机看下如果可以链接成功,即可以在测试机使用

如图所示

本文的实现方式:通过HTTP请求访问,获取到图片的16进制数据,然后将图片数据转化为bmp格式,重构sap标准form :IMPORT_BITMAP_BDS为IMPORT_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 &n

最低0.47元/天 解锁文章
5660

被折叠的 条评论
为什么被折叠?



