Convertir fichero en base 64

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • lucia_12
    Member
    • jun
    • 45

    #1

    Convertir fichero en base 64

    Hola!

    Estoy creando una RFC que recibe un fichero en base64 y lo tiene que convertir a XML o PDF (dependiendo de la opción que reciba).

    He encontrado esta función SSFC_BASE64_DECODE, pero no sé como indicarle que quiero que me lo convierta a XML o a PDF. Tampoco sé si es está función la que debería usar.

    ¿Me podéis ayudar?

    Gracias!!
  • ic_man_777
    Member
    • oct
    • 97

    #2
    Xml

    Bueno, creo que ahí tienes 2 problemas, uno que al parecer ya has resuelto, que es decodificar el archivo que estaba en base64... ahora tu problema es convertirlo a XML o PDF.

    he aquí unos links para convertir una tabla interna (que supongo que ahí tendrás lo que subiste de tu archivo) a XML:
    http://forums.sdn.sap.com/thread.jsp...ssageID=341152
    http://forums.sdn.sap.com/thread.jspa?threadID=54283


    espero te pueda ser util.

    Comentario

    • lucia_12
      Member
      • jun
      • 45

      #3
      Gracias, pero ya los vi y no funcionan.

      ¿Alguien sabe alguna solución más?
      Me interesa preferiblemente el caso de pasar a PDF.

      Gracias

      Comentario

      • lucia_12
        Member
        • jun
        • 45

        #4
        Podrían decirme si es posible pasar a PDF un archivo en formato binario base64 o en formato binario? Si es así, me podrían indicar cómo?

        Llevo varios días con esto y no encuentro nada que me sirva

        Muchas gracias.

        Comentario

        • ballan
          Senior Member
          • oct
          • 671

          #5
          Prueba a hacer lo siguiente

          Convierte el string que te llega en base 64 a un string binario utilizando cualquiera de los metodos que te han indicado anteriormente, con las funciones decode/encode o bien con la clase cl_abap_conv_in_ce

          Ese string binario tendras que meterlo dentro de una tabla por lo que tendras que hacer un algoritmo o bien mirar si te sirve la funcion CONVERT_STRING_TO_TABLE u otra similar, la tabla destino deberia almacenar los datos en binario tambien, creo que tendrias que definirla mas o menos asi:

          DATA: begin of tabla occurs 0,

          linea(1024) type x,

          end of tabla.

          Una vez que tengas tu STREAM BINARIO en una tabla podras descargarlo con la funcion GUI_DOWNLOAD si es en online y haciendo open dataset for output in binary mode si lo estuvieras haciendo en fondo

          Mas o menos seria algo asi

          *ONLINE
          GUI_DOWNLOAD
          FILENAME = ruta donde depositar el fichero terminando en .pdf
          FILETYPE = 'BIN'.
          DATA_TAB = tabla que contiene el string

          *FONDO
          open dataset dst for output in binary mode.

          loop at tabla into linea.

          transfer linea to dst. "Aqui a lo mejor podrias hacer un transfer string to dst *y te ahorrarias tener que convertir el string a tabla

          endloop.

          close dataset.

          Prueba y nos cuentas
          Editado por última vez por ballan; 10/11/2009, 13:34:03.

          Comentario

          • lucia_12
            Member
            • jun
            • 45

            #6
            Hola ballan!

            Ante todo, gracias por contestar.

            He probado lo que me has dicho, y me crea un pdf pero no me deja abrirlo.

            El código que he creado es el siguiente:

            DATA: fic_binario TYPE xstring.
            DATA: string_binario TYPE string.

            DATA: BEGIN OF lines occurs 100,
            tdline(132).
            DATA: END OF lines.


            "Se convierte el fichero de binario64 a binario

            CALL FUNCTION 'SSFC_BASE64_DECODE'
            EXPORTING
            B64DATA = fichero_64
            IMPORTING
            BINDATA = fic_binario.


            string_binario = fic_binario.

            "Se pasa a tabla interna

            CALL FUNCTION 'CONVERT_STRING_TO_TABLE'
            EXPORTING
            I_STRING = string_binario
            I_TABLINE_LENGTH = 132
            TABLES
            ET_TABLE = lines.



            CALL FUNCTION 'GUI_DOWNLOAD'
            EXPORTING
            FILENAME = 'C:\Documents and Settings\usr\Escritorio\Fic1.pdf'
            FILETYPE = 'BIN'

            TABLES
            DATA_TAB = lines .


            No sé si puede ser por la longitud de cada línea de la tabla.
            También he probado a insertar en la tabla el string sin utilizar la función 'CONVERT_STRING_TO_TABLE' y a utilizar open dataset, pero esto último es para crear archivos en el servidor y yo lo quiero en local.

            ¿Alguna idea de por qué me está fallando?

            Gracias!!

            Comentario

            • ballan
              Senior Member
              • oct
              • 671

              #7
              Creo que el problema esta en que tu tabla esta definida como texto y no como datos binarios

              Tu has definido tu tabla asi:

              DATA: BEGIN OF lines occurs 100,
              tdline(132).
              DATA: END OF lines.

              Asi almacenarias caracteres y lo que tienes que hacer es almacenar datos en binario

              Prueba a definir tu tabla asi

              DATA: BEGIN OF lines occurs 100,
              tdline(1024) type x.
              DATA: END OF lines.

              Quiza te de problemas la funcion de convertir string en tabla pero entonces busca otra funcion o bien create un minialgoritmo de este estilo (tendras que cambiar algo pero es para que te hagas una idea)

              data: lv_divisor type i,
              lv_resto type i,
              lv_longitud type i,
              lv_indice type i.

              do.

              lv_longitud = strlen( cadena ).

              lv_divisor = lv_longitud div 256.
              lv_resto = lv_longitud div 256.

              lv_indice = 256 * sy-index.

              lines-tdline = lv_cadena+lv_indice(256).

              append lines.
              clear lines.

              if lv_divisor is initial.

              exit.

              endif.

              enddo.

              Sigue probando y comenta los resultados

              Comentario

              • azua14
                Senior Member
                • jul
                • 140

                #8
                Hola..hace tpo tuve que imprimir un reporte a pdf..lamentablemente no recuerdo el codigo exacto..pero creo que lo que hicimos fue definir un tipo de impresora en sap que permitia guardar lo que uno le mandara al spool como un pdf.

                Comentario

                • lucia_12
                  Member
                  • jun
                  • 45

                  #9
                  Al final me ha funcionado cambiando mi tabla a tipo binario y metiendo mediante código el string en la tabla, tal y como decía Ballan.

                  Sólo comentar, por si a alguien le ayuda, que el offset que he ido utilizando es 255 (no 256), ya que si no, el fichero pdf no se puede abrir.

                  Muchiiiiiiiisimas gracias por vuestra ayuda!!!

                  Comentario

                  • lucia_12
                    Member
                    • jun
                    • 45

                    #10
                    Hola de nuevo!

                    Como dije al principio, el programa que estoy creando debe convertir tanto a pdf como a xml.

                    El problema es que cuando intento convertirlo a xml, me crea el archivo pero no me lo abre. Miro su contenido abiréndolo con un bloc de notas y veo que no me genera los tags (aunque sí el contenido), además me crea caracteres extaños.

                    Este es un ejemplo:

                    P1999-10-20 Alice SmithS16123 Maple StreetMill Valley CA90952  Robert SmithPê Old Town PA95819 PHurry, my lawn is going wild! 872-AA Lawnmower 1 148.95 PConfirm this is electric A926-AA Baby Monitor 1 39.98 AP1999-05-21


                    He probado a usar la función SAP_CONVERT_TO_XML_FORMAT, pero no me funciona.

                    ¿Podríais ayudarme?

                    Gracias de antemano

                    Comentario

                    • ballan
                      Senior Member
                      • oct
                      • 671

                      #11
                      Buenas

                      Necesitaria mas informacion

                      Cual es el origen de los datos? Los datos los recibes como un stream de datos en BASE64? los recibes en una tabla? en un xml?

                      Tambien ayudaria que pegaras el codigo que llevas hecho para que lo vieramos

                      Dame mas informacion y dependiendo del origen de datos te digo como podriamos hacerlo

                      Comentario

                      • lucia_12
                        Member
                        • jun
                        • 45

                        #12
                        Hola ballan

                        Este es mi código:


                        DATA: pe_fichero TYPE string,
                        pe_fichero2 type xstring.

                        DATA: BEGIN OF i_lines_fichero occurs 0,
                        tdline(255) type x.
                        DATA: END OF i_lines_fichero.

                        DATA:
                        ruta type char30,
                        BIN_SIZE TYPE I,
                        contador_posiciones TYPE i VALUE 0,
                        longitud_fichero TYPE i,
                        fichero_binario TYPE xstring,
                        cociente TYPE i,
                        resto TYPE i,
                        r_registro_linea LIKE LINE OF i_lines_fichero,
                        fichero_base64 TYPE string,

                        ruta_funcion LIKE sapb-sappfad.


                        "Esto es un ejemplo de string binario correspondiente a un xml.
                        "Como no tengo ningún ejemplo de momento de string en base64
                        "correspondiente a un xml, lo que hago es pasar esto a binario64
                        "y luego a binario, para verificar que usando las funciones de
                        "más abajo, lo convierte bien.


                        CONCATENATE

                        '50313939392D31302D3230000B416C69636520536D6974685 33136313233204D'
                        '61706C65205374726565744D696C6C2056616C6C657920202 020202020202043'
                        '41393039353200010C526F6265727420536D69746850EA140 0004F6C6420546F'
                        '776E202020202020202020202020504139353831390050487 57272792C206D79'
                        '206C61776E20697320676F696E672077696C6421003837322 D4141004C61776E'
                        '6D6F7765720031003134382E39350050436F6E6669726D207 468697320697320'
                        '656C65637472696300413932362D41410042616279204D6F6 E69746F72003100'
                        '33392E3938004150313939392D30352D323100'


                        INTO pe_fichero.

                        pe_fichero2 = pe_fichero.


                        *Paso de binario a binario64

                        CALL FUNCTION 'SSFC_BASE64_ENCODE'
                        EXPORTING
                        BINDATA = pe_fichero2
                        * BINLENG =
                        IMPORTING
                        B64DATA = fichero_base64

                        .
                        IF SY-SUBRC <> 0.

                        ENDIF.


                        "Paso de binario64 a binario

                        CALL FUNCTION 'SSFC_BASE64_DECODE'
                        EXPORTING
                        B64DATA = fichero_base64
                        * B64LENG =
                        * B_CHECK =
                        IMPORTING
                        BINDATA = fichero_binario

                        .
                        IF SY-SUBRC <> 0.

                        ENDIF.


                        if fichero_binario = pe_fichero. "Si realmente lo convierte bien

                        longitud_fichero = XSTRLEN( fichero_binario ).
                        cociente = longitud_fichero div 255.
                        resto = longitud_fichero mod 255.


                        DO cociente TIMES.

                        r_registro_linea-tdline = fichero_binario+contador_posiciones(255).
                        APPEND r_registro_linea TO i_lines_fichero.
                        contador_posiciones = contador_posiciones + 255.
                        CLEAR r_registro_linea.

                        ENDDO.

                        r_registro_linea-tdline = fichero_binario+contador_posiciones(resto).
                        APPEND r_registro_linea TO i_lines_fichero.

                        ruta = 'C:\Documents and Settings\usr\Escritorio\Fic1.xml'.


                        CALL FUNCTION 'SAP_CONVERT_TO_XML_FORMAT'
                        EXPORTING
                        I_FILENAME = 'Fic1.xml'
                        I_XML_DOC_NAME = ruta
                        IMPORTING
                        PE_BIN_FILESIZE = BIN_SIZE
                        TABLES
                        I_TAB_SAP_DATA = i_lines_fichero
                        * CHANGING
                        * I_TAB_CONVERTED_DATA = i_lines_fichero
                        EXCEPTIONS
                        CONVERSION_FAILED = 1
                        OTHERS = 2.

                        IF SY-SUBRC <> 0.

                        ENDIF.


                        CALL FUNCTION 'GUI_DOWNLOAD'
                        EXPORTING
                        FILENAME = 'C:\Documents and Settings\usr\Escritorio\Fic1.xml'
                        FILETYPE = 'BIN'
                        TABLES
                        DATA_TAB = i_lines_fichero.
                        IF SY-SUBRC <> 0.
                        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                        WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
                        ENDIF.

                        else.

                        MESSAGE 'El archivo generado no es igual que el de entrada' TYPE 'I'.

                        endif.


                        Es el mismo código que me funcionaba para pdf, pero he añadido la función de convertir a xml. A lo mejor no la estoy usando bien o no es la que tengo que usar.

                        Gracias por contestar tan rápido

                        Comentario

                        • lucia_12
                          Member
                          • jun
                          • 45

                          #13
                          Por si no ha quedado claro en mi respuesta, los datos los recibo como un string en base64, y de ahí he de convertirlo a xml...

                          Comentario

                          • ballan
                            Senior Member
                            • oct
                            • 671

                            #14
                            Vale una cosa que se me ha olvidado preguntarte es que como vas a generar las etiquetas? las etiquetas vienen en el stream? o tienes que leer el stream y dependiendo de los campos que lleve generar las etiquetas?

                            Lo primero que debo decir es que yo no tengo muchos conocimientos de XML por lo que hay muchas cosas que desconozco y seguro que hay una manera mas sencilla de hacerlo

                            Pero mas o menos la idea seria la siguiente

                            Para generar un XML se puede hacer de las siguientes maneras

                            Teniendo los datos metidos en una tabla interna (Funcion (SDIXML_DATA_TO_DOM y SDIXML_DOM_TO_XML)
                            Teniendo los datos en formato DOM (Funcion SDIXML_DOM_TO_XML)

                            Asi que tu objetivo deberia ser convertir el stream de datos que te llega o bien a una tabla interna o bien a formato DOM

                            El problema que tienes es que tu stream de datos te viene en BASE64 y lo que necesitarias no es solo convertirlo a binario sino convertirlo a caracteres para posteriormente meterlo en la tabla y convertirlo en xml

                            Para convertir de binario a caracteres se puede hacer de forma muy sencilla con field-symbols

                            seria algo mas o menos asi

                            data: lv_bin(4) type x,
                            lv_char(2) type c.

                            field-symbols: <char> type c.

                            assign lv_bin to <char> CASTING.

                            lv_char = <char>.

                            Podrias recorrer la cadena e ir convirtiendola a caracteres, se que eso es una solucion bastante chapucera pero alguien que tenga mas conocimientos de XML podria arrojarnos mas luz sobre esto

                            El otro camino seria utilizar la clase CL_XML_DOCUMENT

                            Con ella puedes crear el XML y supongo que de alguna manera podras traducir ese stream ya sea en binario o en base64 para que lo traduzca y lo meta en el XML

                            De todas formas te reitero que tienes que saber como colocar las etiquetas

                            Bueno espero haber ayudado algo :s

                            Comentario

                            • lucia_12
                              Member
                              • jun
                              • 45

                              #15
                              No he tenido tiempo para probarlo, pero voy a ver si mañana lo pongo en práctica.

                              Muchas gracias por contestar

                              Saludos!!!

                              Comentario

                              Trabajando...