Skip to Content
author's profile photo Former Member
Former Member

Zip PDF files for BSP response

Hello,

We have a BSP app that downloads PDF files to the client side. The PDF data is generated by using the FM CONVERT_OTF_2_PDF. Since these PDF files are large, we would like to compress them with some zip utility. Any ideas how this can be done?

Regards

Cerish

Add a comment
10|10000 characters needed characters exceeded

Assigned Tags

Related questions

4 Answers

  • Best Answer
    Posted on Aug 26, 2005 at 02:21 PM

    The ICM should automatically apply GZip compression to the object before it is transmitted via HTTP based upon the mime type. So really you are getting compression already.

    There are ABAP classes that are availble for zip compression of data stream (CL_ABAP_GZIP). However this only performs the compression. This does not create a ZIP file (multiple objects in one stream with a package header and CRC).

    However in 640 (SP14 I believe) SAP is going to deliver a class (CL_ABAP_ZIP) to create full blown ZIP files. With the right Kernel release it will even do CRC checks in the Kernel instead of ABAP.

    Add a comment
    10|10000 characters needed characters exceeded

    • I should have mentioned this. SP14 isn't out yet. It is schedule for the 40th week (beginning of October). So don't be discuraged if you don't see it in your 620 system. If it will be delivered for 620 I would imagine it would make a support package at about the same time as 640.

  • Posted on Aug 26, 2005 at 02:17 PM

    Hi, class CL_ABAP_GZIP is the way to go.

    Check also note 616958.

    Thomas uses it in weblog

    /people/thomas.jung3/blog/2004/12/15/bsp-developers-journal-part-xvi--using-the-btf-editor

    Eddy

    Add a comment
    10|10000 characters needed characters exceeded

  • Posted on Aug 26, 2005 at 02:17 PM

    hi,

    search for topic "

    Extract file from http://...zip into ABAP

    " in the forum. There you´ll fin an example.

    Best regards.

    Add a comment
    10|10000 characters needed characters exceeded

  • author's profile photo Former Member
    Former Member
    Posted on Aug 26, 2005 at 09:25 PM

    Hi,

    I ported the CL_DOC_ZIPPER class to R/3 620. This will create the Zip file correctly with all the admin data. However the class does not compress the file in any form.

    I tried running the data stream through the GZIP class to compress before passing it through the zipper. Winzip opens the archive but cannot open the compressed file.

    So I am at a stuck. Any ideas on how to get compression to work?

    In case anybody wants the code to create the archive I have attached it below.

    report zcjctest.

    parameters:

    spool type rspoid default '44696'.

    ************************************************************************

    class :

    lcl_doc_zipper definition deferred,

    lcl_doc_ostream definition deferred,

    lcl_doc_crc32 definition deferred,

    lcl_doc_zip_item definition deferred.

    types :

    bbpt_raw4 type table of raw4,

    bbpt_att_cont type sdokcntbins,

    bbps_zip_components type zzip_component,

    bbpt_zip_components type table of zzip_component,

    bbp_doc_y_zip_item type ref to lcl_doc_zip_item,

    bbp_doc_yt_zip_item type table of bbp_doc_y_zip_item.

    ----


    • class lcl_doc_zip_item DEFINITION

    ----


    class lcl_doc_zip_item definition

    final

    create public .

    public section.

    data m_name type string .

    data m_time type i value 747605219 .

    data m_crc type i value -1 .

    data m_size type i value -1 .

    data m_csize type i value -1 .

    data m_method type i value 0 .

    data m_flag type i .

    data m_version type i .

    data m_offset type i .

    data m_typefolder type xfeld .

    methods constructor

    importing

    i_name type string

    i_reldir type string .

    methods get_crc

    exporting

    e_crc type i .

    methods get_method

    exporting

    e_method type i .

    methods set_crc

    importing

    i_crc type i .

    methods set_method

    importing

    i_method type i .

    methods get_name .

    methods set_time

    importing

    i_time type i .

    methods get_time

    exporting

    e_time type i .

    methods set_size

    importing

    i_size type i .

    methods set_size_numc

    importing

    i_size type sdok_fsize .

    methods get_size

    exporting

    e_size type i .

    methods get_size_numc

    exporting

    e_size type sdok_fsize .

    methods set_csize

    importing

    i_csize type i .

    methods set_csize_numc

    importing

    i_csize type sdok_fsize .

    methods get_csize

    exporting

    e_csize type i .

    methods get_csize_numc

    exporting

    e_csize type sdok_fsize .

    methods get_typefolder

    exporting

    e_typefolder type xfeld .

    endclass. "lcl_doc_zip_item DEFINITIO

    ----


    • class llcl_doc_zip_item IMPLEMENTATION

    ----


    class lcl_doc_zip_item implementation.

    method constructor .

    m_name = i_name.

    if i_reldir = 'PHILIPPSTEVES'.

    m_typefolder = 'X'.

    endif.

    endmethod. "lcl_doc_zip_item

    method get_crc .

    e_crc = m_crc.

    endmethod. "get_crc

    method get_method .

    e_method = m_method.

    endmethod. "get_method

    method set_crc .

    m_crc = i_crc.

    endmethod. "set_crc

    method set_method .

    m_method = i_method.

    endmethod. "set_method

    method get_name .

    endmethod. "get_name

    method set_time .

    m_time = i_time.

    endmethod. "set_time

    method get_time .

    e_time = m_time.

    endmethod. "get_time

    method set_size .

    m_size = i_size.

    endmethod. "set_size

    method set_size_numc .

    m_size = i_size.

    endmethod. "set_size_numc

    method get_size .

    e_size = m_size.

    endmethod. "get_size

    method get_size_numc .

    e_size = m_size.

    endmethod. "get_size_numc

    method set_csize .

    m_csize = i_csize.

    endmethod. "set_csize

    method set_csize_numc .

    m_csize = i_csize.

    endmethod. "set_csize_numc

    method get_csize .

    e_csize = m_csize.

    endmethod. "get_csize

    method get_csize_numc .

    e_csize = m_csize.

    endmethod. "get_csize_numc

    method get_typefolder .

    e_typefolder = m_typefolder.

    endmethod. "get_typefolder

    endclass. "lcl_doc_zip_item IMPLEMENTATIO

    ----


    • class lcl_doc_crc32 DEFINITIO

    ----


    class lcl_doc_crc32 definition

    final

    create public .

    public section.

    constants c_hex1 type raw4 value '000000FF'. "#EC NOTEXT

    constants c_hex2 type raw4 value 'FFFFFFFF'. "#EC NOTEXT

    class-data mt_crc_tab type bbpt_raw4 .

    class-methods get_instance

    exporting

    er_instance type ref to lcl_doc_crc32 .

    methods get_crc32

    importing

    it_data type bbpt_att_cont

    i_length type sdok_fsize

    exporting

    value(e_crc32) type i .

    private section.

    class-data mr_instance type ref to lcl_doc_crc32 .

    class-methods get_crctab .

    endclass. "lcl_doc_crc32 DEFINITIO

    ----


    • class lcl_doc_crc32 IMPLEMENTATION

    ----


    class lcl_doc_crc32 implementation.

    method get_instance .

    if mr_instance is initial.

    create object mr_instance.

    get_crctab( ).

    endif.

    er_instance = mr_instance.

    endmethod. "get_instance

    method get_crc32 .

    data:

    l_index type sy-index,

    l_offset type i,

    l_length type i,

    l_startlength type i,

    l_crc32 type raw4 value c_hex2,

    l_temp1 type raw4,

    l_temp2 type raw4,

    l_temp3 type x,

    l_xstr type xstring,

    ls_data type sdokcntbin.

    loop at it_data into ls_data.

    concatenate l_xstr ls_data-line into l_xstr in byte mode.

    endloop.

    l_startlength = i_length.

    l_length = i_length.

    while l_length > 0.

    l_temp1 = l_crc32.

    shift l_temp1 right in byte mode.

    l_offset = l_startlength - l_length.

    l_crc32 = l_crc32 bit-and c_hex1.

    l_temp3 = l_crc323(1) bit-xor l_xstrl_offset(1).

    l_index = l_temp3.

    l_index = l_index + 1.

    read table mt_crc_tab into l_temp2 index l_index.

    l_crc32 = l_temp1 bit-xor l_temp2.

    l_length = l_length - 1.

    endwhile.

    l_crc32 = l_crc32 bit-xor c_hex2.

    e_crc32 = l_crc32.

    endmethod. "get_crc32

    method get_crctab .

    data:

    l_int type raw4.

    if mt_crc_tab is not initial.

    exit.

    endif.

    l_int = '00000000'. append l_int to mt_crc_tab.

    l_int = '77073096'. append l_int to mt_crc_tab.

    l_int = 'EE0E612C'. append l_int to mt_crc_tab.

    l_int = '990951BA'. append l_int to mt_crc_tab.

    l_int = '076DC419'. append l_int to mt_crc_tab.

    l_int = '706AF48F'. append l_int to mt_crc_tab.

    l_int = 'E963A535'. append l_int to mt_crc_tab.

    l_int = '9E6495A3'. append l_int to mt_crc_tab.

    l_int = '0EDB8832'. append l_int to mt_crc_tab.

    l_int = '79DCB8A4'. append l_int to mt_crc_tab.

    l_int = 'E0D5E91E'. append l_int to mt_crc_tab.

    l_int = '97D2D988'. append l_int to mt_crc_tab.

    l_int = '09B64C2B'. append l_int to mt_crc_tab.

    l_int = '7EB17CBD'. append l_int to mt_crc_tab.

    l_int = 'E7B82D07'. append l_int to mt_crc_tab.

    l_int = '90BF1D91'. append l_int to mt_crc_tab.

    l_int = '1DB71064'. append l_int to mt_crc_tab.

    l_int = '6AB020F2'. append l_int to mt_crc_tab.

    l_int = 'F3B97148'. append l_int to mt_crc_tab.

    l_int = '84BE41DE'. append l_int to mt_crc_tab.

    l_int = '1ADAD47D'. append l_int to mt_crc_tab.

    l_int = '6DDDE4EB'. append l_int to mt_crc_tab.

    l_int = 'F4D4B551'. append l_int to mt_crc_tab.

    l_int = '83D385C7'. append l_int to mt_crc_tab.

    l_int = '136C9856'. append l_int to mt_crc_tab.

    l_int = '646BA8C0'. append l_int to mt_crc_tab.

    l_int = 'FD62F97A'. append l_int to mt_crc_tab.

    l_int = '8A65C9EC'. append l_int to mt_crc_tab.

    l_int = '14015C4F'. append l_int to mt_crc_tab.

    l_int = '63066CD9'. append l_int to mt_crc_tab.

    l_int = 'FA0F3D63'. append l_int to mt_crc_tab.

    l_int = '8D080DF5'. append l_int to mt_crc_tab.

    l_int = '3B6E20C8'. append l_int to mt_crc_tab.

    l_int = '4C69105E'. append l_int to mt_crc_tab.

    l_int = 'D56041E4'. append l_int to mt_crc_tab.

    l_int = 'A2677172'. append l_int to mt_crc_tab.

    l_int = '3C03E4D1'. append l_int to mt_crc_tab.

    l_int = '4B04D447'. append l_int to mt_crc_tab.

    l_int = 'D20D85FD'. append l_int to mt_crc_tab.

    l_int = 'A50AB56B'. append l_int to mt_crc_tab.

    l_int = '35B5A8FA'. append l_int to mt_crc_tab.

    l_int = '42B2986C'. append l_int to mt_crc_tab.

    l_int = 'DBBBC9D6'. append l_int to mt_crc_tab.

    l_int = 'ACBCF940'. append l_int to mt_crc_tab.

    l_int = '32D86CE3'. append l_int to mt_crc_tab.

    l_int = '45DF5C75'. append l_int to mt_crc_tab.

    l_int = 'DCD60DCF'. append l_int to mt_crc_tab.

    l_int = 'ABD13D59'. append l_int to mt_crc_tab.

    l_int = '26D930AC'. append l_int to mt_crc_tab.

    l_int = '51DE003A'. append l_int to mt_crc_tab.

    l_int = 'C8D75180'. append l_int to mt_crc_tab.

    l_int = 'BFD06116'. append l_int to mt_crc_tab.

    l_int = '21B4F4B5'. append l_int to mt_crc_tab.

    l_int = '56B3C423'. append l_int to mt_crc_tab.

    l_int = 'CFBA9599'. append l_int to mt_crc_tab.

    l_int = 'B8BDA50F'. append l_int to mt_crc_tab.

    l_int = '2802B89E'. append l_int to mt_crc_tab.

    l_int = '5F058808'. append l_int to mt_crc_tab.

    l_int = 'C60CD9B2'. append l_int to mt_crc_tab.

    l_int = 'B10BE924'. append l_int to mt_crc_tab.

    l_int = '2F6F7C87'. append l_int to mt_crc_tab.

    l_int = '58684C11'. append l_int to mt_crc_tab.

    l_int = 'C1611DAB'. append l_int to mt_crc_tab.

    l_int = 'B6662D3D'. append l_int to mt_crc_tab.

    l_int = '76DC4190'. append l_int to mt_crc_tab.

    l_int = '01DB7106'. append l_int to mt_crc_tab.

    l_int = '98D220BC'. append l_int to mt_crc_tab.

    l_int = 'EFD5102A'. append l_int to mt_crc_tab.

    l_int = '71B18589'. append l_int to mt_crc_tab.

    l_int = '06B6B51F'. append l_int to mt_crc_tab.

    l_int = '9FBFE4A5'. append l_int to mt_crc_tab.

    l_int = 'E8B8D433'. append l_int to mt_crc_tab.

    l_int = '7807C9A2'. append l_int to mt_crc_tab.

    l_int = '0F00F934'. append l_int to mt_crc_tab.

    l_int = '9609A88E'. append l_int to mt_crc_tab.

    l_int = 'E10E9818'. append l_int to mt_crc_tab.

    l_int = '7F6A0DBB'. append l_int to mt_crc_tab.

    l_int = '086D3D2D'. append l_int to mt_crc_tab.

    l_int = '91646C97'. append l_int to mt_crc_tab.

    l_int = 'E6635C01'. append l_int to mt_crc_tab.

    l_int = '6B6B51F4'. append l_int to mt_crc_tab.

    l_int = '1C6C6162'. append l_int to mt_crc_tab.

    l_int = '856530D8'. append l_int to mt_crc_tab.

    l_int = 'F262004E'. append l_int to mt_crc_tab.

    l_int = '6C0695ED'. append l_int to mt_crc_tab.

    l_int = '1B01A57B'. append l_int to mt_crc_tab.

    l_int = '8208F4C1'. append l_int to mt_crc_tab.

    l_int = 'F50FC457'. append l_int to mt_crc_tab.

    l_int = '65B0D9C6'. append l_int to mt_crc_tab.

    l_int = '12B7E950'. append l_int to mt_crc_tab.

    l_int = '8BBEB8EA'. append l_int to mt_crc_tab.

    l_int = 'FCB9887C'. append l_int to mt_crc_tab.

    l_int = '62DD1DDF'. append l_int to mt_crc_tab.

    l_int = '15DA2D49'. append l_int to mt_crc_tab.

    l_int = '8CD37CF3'. append l_int to mt_crc_tab.

    l_int = 'FBD44C65'. append l_int to mt_crc_tab.

    l_int = '4DB26158'. append l_int to mt_crc_tab.

    l_int = '3AB551CE'. append l_int to mt_crc_tab.

    l_int = 'A3BC0074'. append l_int to mt_crc_tab.

    l_int = 'D4BB30E2'. append l_int to mt_crc_tab.

    l_int = '4ADFA541'. append l_int to mt_crc_tab.

    l_int = '3DD895D7'. append l_int to mt_crc_tab.

    l_int = 'A4D1C46D'. append l_int to mt_crc_tab.

    l_int = 'D3D6F4FB'. append l_int to mt_crc_tab.

    l_int = '4369E96A'. append l_int to mt_crc_tab.

    l_int = '346ED9FC'. append l_int to mt_crc_tab.

    l_int = 'AD678846'. append l_int to mt_crc_tab.

    l_int = 'DA60B8D0'. append l_int to mt_crc_tab.

    l_int = '44042D73'. append l_int to mt_crc_tab.

    l_int = '33031DE5'. append l_int to mt_crc_tab.

    l_int = 'AA0A4C5F'. append l_int to mt_crc_tab.

    l_int = 'DD0D7CC9'. append l_int to mt_crc_tab.

    l_int = '5005713C'. append l_int to mt_crc_tab.

    l_int = '270241AA'. append l_int to mt_crc_tab.

    l_int = 'BE0B1010'. append l_int to mt_crc_tab.

    l_int = 'C90C2086'. append l_int to mt_crc_tab.

    l_int = '5768B525'. append l_int to mt_crc_tab.

    l_int = '206F85B3'. append l_int to mt_crc_tab.

    l_int = 'B966D409'. append l_int to mt_crc_tab.

    l_int = 'CE61E49F'. append l_int to mt_crc_tab.

    l_int = '5EDEF90E'. append l_int to mt_crc_tab.

    l_int = '29D9C998'. append l_int to mt_crc_tab.

    l_int = 'B0D09822'. append l_int to mt_crc_tab.

    l_int = 'C7D7A8B4'. append l_int to mt_crc_tab.

    l_int = '59B33D17'. append l_int to mt_crc_tab.

    l_int = '2EB40D81'. append l_int to mt_crc_tab.

    l_int = 'B7BD5C3B'. append l_int to mt_crc_tab.

    l_int = 'C0BA6CAD'. append l_int to mt_crc_tab.

    l_int = 'EDB88320'. append l_int to mt_crc_tab.

    l_int = '9ABFB3B6'. append l_int to mt_crc_tab.

    l_int = '03B6E20C'. append l_int to mt_crc_tab.

    l_int = '74B1D29A'. append l_int to mt_crc_tab.

    l_int = 'EAD54739'. append l_int to mt_crc_tab.

    l_int = '9DD277AF'. append l_int to mt_crc_tab.

    l_int = '04DB2615'. append l_int to mt_crc_tab.

    l_int = '73DC1683'. append l_int to mt_crc_tab.

    l_int = 'E3630B12'. append l_int to mt_crc_tab.

    l_int = '94643B84'. append l_int to mt_crc_tab.

    l_int = '0D6D6A3E'. append l_int to mt_crc_tab.

    l_int = '7A6A5AA8'. append l_int to mt_crc_tab.

    l_int = 'E40ECF0B'. append l_int to mt_crc_tab.

    l_int = '9309FF9D'. append l_int to mt_crc_tab.

    l_int = '0A00AE27'. append l_int to mt_crc_tab.

    l_int = '7D079EB1'. append l_int to mt_crc_tab.

    l_int = 'F00F9344'. append l_int to mt_crc_tab.

    l_int = '8708A3D2'. append l_int to mt_crc_tab.

    l_int = '1E01F268'. append l_int to mt_crc_tab.

    l_int = '6906C2FE'. append l_int to mt_crc_tab.

    l_int = 'F762575D'. append l_int to mt_crc_tab.

    l_int = '806567CB'. append l_int to mt_crc_tab.

    l_int = '196C3671'. append l_int to mt_crc_tab.

    l_int = '6E6B06E7'. append l_int to mt_crc_tab.

    l_int = 'FED41B76'. append l_int to mt_crc_tab.

    l_int = '89D32BE0'. append l_int to mt_crc_tab.

    l_int = '10DA7A5A'. append l_int to mt_crc_tab.

    l_int = '67DD4ACC'. append l_int to mt_crc_tab.

    l_int = 'F9B9DF6F'. append l_int to mt_crc_tab.

    l_int = '8EBEEFF9'. append l_int to mt_crc_tab.

    l_int = '17B7BE43'. append l_int to mt_crc_tab.

    l_int = '60B08ED5'. append l_int to mt_crc_tab.

    l_int = 'D6D6A3E8'. append l_int to mt_crc_tab.

    l_int = 'A1D1937E'. append l_int to mt_crc_tab.

    l_int = '38D8C2C4'. append l_int to mt_crc_tab.

    l_int = '4FDFF252'. append l_int to mt_crc_tab.

    l_int = 'D1BB67F1'. append l_int to mt_crc_tab.

    l_int = 'A6BC5767'. append l_int to mt_crc_tab.

    l_int = '3FB506DD'. append l_int to mt_crc_tab.

    l_int = '48B2364B'. append l_int to mt_crc_tab.

    l_int = 'D80D2BDA'. append l_int to mt_crc_tab.

    l_int = 'AF0A1B4C'. append l_int to mt_crc_tab.

    l_int = '36034AF6'. append l_int to mt_crc_tab.

    l_int = '41047A60'. append l_int to mt_crc_tab.

    l_int = 'DF60EFC3'. append l_int to mt_crc_tab.

    l_int = 'A867DF55'. append l_int to mt_crc_tab.

    l_int = '316E8EEF'. append l_int to mt_crc_tab.

    l_int = '4669BE79'. append l_int to mt_crc_tab.

    l_int = 'CB61B38C'. append l_int to mt_crc_tab.

    l_int = 'BC66831A'. append l_int to mt_crc_tab.

    l_int = '256FD2A0'. append l_int to mt_crc_tab.

    l_int = '5268E236'. append l_int to mt_crc_tab.

    l_int = 'CC0C7795'. append l_int to mt_crc_tab.

    l_int = 'BB0B4703'. append l_int to mt_crc_tab.

    l_int = '220216B9'. append l_int to mt_crc_tab.

    l_int = '5505262F'. append l_int to mt_crc_tab.

    l_int = 'C5BA3BBE'. append l_int to mt_crc_tab.

    l_int = 'B2BD0B28'. append l_int to mt_crc_tab.

    l_int = '2BB45A92'. append l_int to mt_crc_tab.

    l_int = '5CB36A04'. append l_int to mt_crc_tab.

    l_int = 'C2D7FFA7'. append l_int to mt_crc_tab.

    l_int = 'B5D0CF31'. append l_int to mt_crc_tab.

    l_int = '2CD99E8B'. append l_int to mt_crc_tab.

    l_int = '5BDEAE1D'. append l_int to mt_crc_tab.

    l_int = '9B64C2B0'. append l_int to mt_crc_tab.

    l_int = 'EC63F226'. append l_int to mt_crc_tab.

    l_int = '756AA39C'. append l_int to mt_crc_tab.

    l_int = '026D930A'. append l_int to mt_crc_tab.

    l_int = '9C0906A9'. append l_int to mt_crc_tab.

    l_int = 'EB0E363F'. append l_int to mt_crc_tab.

    l_int = '72076785'. append l_int to mt_crc_tab.

    l_int = '05005713'. append l_int to mt_crc_tab.

    l_int = '95BF4A82'. append l_int to mt_crc_tab.

    l_int = 'E2B87A14'. append l_int to mt_crc_tab.

    l_int = '7BB12BAE'. append l_int to mt_crc_tab.

    l_int = '0CB61B38'. append l_int to mt_crc_tab.

    l_int = '92D28E9B'. append l_int to mt_crc_tab.

    l_int = 'E5D5BE0D'. append l_int to mt_crc_tab.

    l_int = '7CDCEFB7'. append l_int to mt_crc_tab.

    l_int = '0BDBDF21'. append l_int to mt_crc_tab.

    l_int = '86D3D2D4'. append l_int to mt_crc_tab.

    l_int = 'F1D4E242'. append l_int to mt_crc_tab.

    l_int = '68DDB3F8'. append l_int to mt_crc_tab.

    l_int = '1FDA836E'. append l_int to mt_crc_tab.

    l_int = '81BE16CD'. append l_int to mt_crc_tab.

    l_int = 'F6B9265B'. append l_int to mt_crc_tab.

    l_int = '6FB077E1'. append l_int to mt_crc_tab.

    l_int = '18B74777'. append l_int to mt_crc_tab.

    l_int = '88085AE6'. append l_int to mt_crc_tab.

    l_int = 'FF0F6A70'. append l_int to mt_crc_tab.

    l_int = '66063BCA'. append l_int to mt_crc_tab.

    l_int = '11010B5C'. append l_int to mt_crc_tab.

    l_int = '8F659EFF'. append l_int to mt_crc_tab.

    l_int = 'F862AE69'. append l_int to mt_crc_tab.

    l_int = '616BFFD3'. append l_int to mt_crc_tab.

    l_int = '166CCF45'. append l_int to mt_crc_tab.

    l_int = 'A00AE278'. append l_int to mt_crc_tab.

    l_int = 'D70DD2EE'. append l_int to mt_crc_tab.

    l_int = '4E048354'. append l_int to mt_crc_tab.

    l_int = '3903B3C2'. append l_int to mt_crc_tab.

    l_int = 'A7672661'. append l_int to mt_crc_tab.

    l_int = 'D06016F7'. append l_int to mt_crc_tab.

    l_int = '4969474D'. append l_int to mt_crc_tab.

    l_int = '3E6E77DB'. append l_int to mt_crc_tab.

    l_int = 'AED16A4A'. append l_int to mt_crc_tab.

    l_int = 'D9D65ADC'. append l_int to mt_crc_tab.

    l_int = '40DF0B66'. append l_int to mt_crc_tab.

    l_int = '37D83BF0'. append l_int to mt_crc_tab.

    l_int = 'A9BCAE53'. append l_int to mt_crc_tab.

    l_int = 'DEBB9EC5'. append l_int to mt_crc_tab.

    l_int = '47B2CF7F'. append l_int to mt_crc_tab.

    l_int = '30B5FFE9'. append l_int to mt_crc_tab.

    l_int = 'BDBDF21C'. append l_int to mt_crc_tab.

    l_int = 'CABAC28A'. append l_int to mt_crc_tab.

    l_int = '53B39330'. append l_int to mt_crc_tab.

    l_int = '24B4A3A6'. append l_int to mt_crc_tab.

    l_int = 'BAD03605'. append l_int to mt_crc_tab.

    l_int = 'CDD70693'. append l_int to mt_crc_tab.

    l_int = '54DE5729'. append l_int to mt_crc_tab.

    l_int = '23D967BF'. append l_int to mt_crc_tab.

    l_int = 'B3667A2E'. append l_int to mt_crc_tab.

    l_int = 'C4614AB8'. append l_int to mt_crc_tab.

    l_int = '5D681B02'. append l_int to mt_crc_tab.

    l_int = '2A6F2B94'. append l_int to mt_crc_tab.

    l_int = 'B40BBE37'. append l_int to mt_crc_tab.

    l_int = 'C30C8EA1'. append l_int to mt_crc_tab.

    l_int = '5A05DF1B'. append l_int to mt_crc_tab.

    l_int = '2D02EF8D'. append l_int to mt_crc_tab.

    endmethod. "get_crctab

    endclass. "lcl_doc_crc32 IMPLEMENTATION

    ----


    • class lcl_doc_ostream DEFINITIO

    ----


    class lcl_doc_ostream definition

    create public .

    public section.

    constants c_line_len type i value 1022. "#EC NOTEXT

    methods constructor .

    methods write

    importing

    !it_data type bbpt_att_cont

    !i_length type int4 .

    methods write_byte

    importing

    !i_data type x .

    methods lclose .

    methods get_data

    exporting

    !et_data type bbpt_att_cont .

    methods get_length

    exporting

    !e_length type int4 .

    class-methods tab2xstr

    importing

    !it_data type table

    !i_length type int4

    exporting

    !e_xstr type xstring .

    class-methods xstr2tab

    importing

    !i_xstr type xstring

    exporting

    !et_data type table

    !e_length type int4 .

    private section.

    data mt_stream type bbpt_att_cont .

    data m_length type i value 0 .

    endclass. "lcl_doc_ostream DEFINITIO

    ----


    • class lcl_doc_ostream IMPLEMENTATION

    ----


    class lcl_doc_ostream implementation.

    method constructor .

    clear m_length.

    refresh mt_stream.

    endmethod. "constructor

    method write .

    data:

    l_line_count type i,

    l_last_line_len type i,

    l_last_line_left type i,

    l_xstr type xstring,

    lt_data type bbpt_att_cont.

    field-symbols:

    <ls_data> type bapiconten.

    check i_length <> 0.

    describe table mt_stream lines l_line_count.

    l_last_line_len = m_length mod c_line_len.

    if l_line_count = 0 or l_last_line_len = 0.

    call method lcl_doc_ostream=>tab2xstr

    exporting

    it_data = it_data

    i_length = i_length

    importing

    e_xstr = l_xstr.

    call method lcl_doc_ostream=>xstr2tab

    exporting

    i_xstr = l_xstr

    importing

    et_data = lt_data.

    append lines of lt_data to mt_stream.

    else.

    read table mt_stream assigning <ls_data> index l_line_count.

    call method lcl_doc_ostream=>tab2xstr

    exporting

    it_data = it_data

    i_length = i_length

    importing

    e_xstr = l_xstr.

    l_last_line_left = c_line_len - l_last_line_len.

    if l_last_line_left >= i_length.

    <ls_data>-line+l_last_line_len(i_length)

    = l_xstr.

    else.

    <ls_data>-line+l_last_line_len(l_last_line_left)

    = l_xstr(l_last_line_left).

    l_xstr = l_xstr+l_last_line_left.

    call method lcl_doc_ostream=>xstr2tab

    exporting

    i_xstr = l_xstr

    importing

    et_data = lt_data.

    append lines of lt_data to mt_stream.

    endif.

    endif.

    m_length = m_length + i_length.

    endmethod. "write

    method write_byte .

    data:

    l_line_count type sy-tfill,

    l_last_line_len type i,

    l_last_line_left type i,

    l_xstr type xstring,

    lt_data type bbpt_att_cont.

    field-symbols:

    <ls_data> type bapiconten.

    describe table mt_stream lines l_line_count.

    l_last_line_len = m_length mod c_line_len.

    if l_line_count = 0 or l_last_line_len = 0.

    append initial line to mt_stream.

    read table mt_stream assigning <ls_data> index sy-tabix.

    <ls_data>-line(1) = i_data.

    else.

    read table mt_stream assigning <ls_data> index l_line_count.

    <ls_data>-line+l_last_line_len(1) = i_data.

    endif.

    m_length = m_length + 1.

    endmethod. "write_byte

    method lclose .

    refresh mt_stream.

    clear m_length.

    endmethod. "lclose

    method get_data .

    et_data[] = mt_stream[].

    endmethod. "get_data

    method get_length .

    e_length = m_length.

    endmethod. "get_length

    method tab2xstr .

    data:

    l_xstr type xstring.

    field-symbols:

    <ls_data> type any,

    <ls_line> type any.

    loop at it_data assigning <ls_data>.

    assign component 1 of structure <ls_data> to <ls_line>.

    concatenate l_xstr <ls_line> into l_xstr in byte mode.

    endloop.

    e_xstr = l_xstr(i_length).

    endmethod. "tab2xstr

    method xstr2tab .

    data:

    l_times type i,

    l_pos type i value 0,

    l_last_line_len type i,

    l_tab_line_len type i,

    lr_type_descr type ref to cl_abap_typedescr,

    lr_tab_descr type ref to cl_abap_tabledescr.

    field-symbols:

    <ls_data> type any,

    <ls_line> type any.

    e_length = xstrlen( i_xstr ).

    lr_type_descr = cl_abap_typedescr=>describe_by_data( et_data ).

    lr_tab_descr ?= lr_type_descr.

    lr_type_descr = lr_tab_descr->get_table_line_type( ).

    l_tab_line_len = lr_type_descr->length.

    l_times = e_length div l_tab_line_len.

    l_last_line_len = e_length mod l_tab_line_len.

    do l_times times.

    append initial line to et_data.

    read table et_data assigning <ls_data> index sy-tabix.

    assign component 1 of structure <ls_data> to <ls_line>.

    <ls_line> = i_xstr+l_pos(l_tab_line_len).

    l_pos = l_pos + l_tab_line_len.

    enddo.

    if l_last_line_len <> 0.

    append initial line to et_data.

    read table et_data assigning <ls_data> index sy-tabix.

    assign component 1 of structure <ls_data> to <ls_line>.

    <ls_line> = i_xstr+l_pos(l_last_line_len).

    endif.

    endmethod. "xstr2tab

    endclass. "lcl_doc_ostream IMPLEMENTATION

    ----


    • class lcl_doc_zip_ostream DEFINITIO

    ----


    class lcl_doc_zip_ostream definition

    inheriting from lcl_doc_ostream

    final

    create public .

    public section.

    methods begin_new_item

    changing

    cr_item type ref to lcl_doc_zip_item .

    methods write_new_item

    importing

    it_data type bbpt_att_cont

    i_length type sdok_fsize .

    methods end_new_item .

    methods end_zip_stream .

    private section.

    data m_lclosed type as4flag .

    data m_method type i .

    data m_finished type as4flag .

    data m_written type i .

    data mr_zip_item type ref to lcl_doc_zip_item .

    data mt_zip_items type bbp_doc_yt_zip_item .

    methods write_loc

    importing

    ir_item type ref to lcl_doc_zip_item .

    methods write_cen

    importing

    ir_item type ref to lcl_doc_zip_item .

    methods write_end

    importing

    i_off type i

    i_len type i .

    methods write_short

    importing

    i_short type i .

    methods write_long

    importing

    i_long type i .

    methods get_utf8_bytes

    importing

    i_string type string

    exporting

    et_data type bbpt_att_cont

    e_length type i .

    endclass. "lcl_doc_zip_ostream DEFINITIO

    ----


    • class lcl_doc_zip_ostream IMPLEMENTATIO

    ----


    *

    ----


    class lcl_doc_zip_ostream implementation.

    method begin_new_item .

    if m_lclosed is not initial.

    exit.

    endif.

    if mr_zip_item is not initial.

    call method me->end_new_item.

    endif.

    if cr_item->m_time = -1.

    call method cr_item->set_time( 123 ).

    endif.

    if cr_item->m_method = -1.

    call method cr_item->set_method( m_method ).

    endif.

    case cr_item->m_method.

    when 8.

    when 0. " Stored

    if cr_item->m_size = -1.

    call method cr_item->set_size( cr_item->m_csize ).

    elseif cr_item->m_csize = -1.

    call method cr_item->set_csize( cr_item->m_size ).

    elseif cr_item->m_size <> cr_item->m_csize.

    exit.

    endif.

    cr_item->m_version = 10.

    cr_item->m_flag = 0.

    endcase.

    cr_item->m_offset = m_written.

    write_loc( cr_item ).

    append cr_item to mt_zip_items.

    mr_zip_item = cr_item.

    endmethod. "lcl_doc_zip_ostream

    method write_new_item .

    data: lv_length type i.

    lv_length = i_length.

    if m_lclosed is not initial.

    exit.

    endif.

    if mr_zip_item is initial.

    exit.

    endif.

    case mr_zip_item->m_method.

    when 8.

    when 0.

    m_written = m_written + lv_length.

    call method me->write

    exporting

    it_data = it_data

    i_length = lv_length.

    endcase.

    endmethod. "write_new_item

    method end_new_item .

    endmethod. "end_new_item

    method end_zip_stream .

    if m_lclosed is not initial.

    exit.

    endif.

    if m_finished is not initial.

    exit.

    endif.

    if mr_zip_item is not initial.

    call method me->end_new_item.

    endif.

    • write central directory

    data:

    l_off type i,

    l_len type i,

    lr_item type ref to lcl_doc_zip_item.

    l_off = m_written.

    loop at mt_zip_items into lr_item.

    call method me->write_cen

    exporting

    ir_item = lr_item.

    endloop.

    l_len = m_written - l_off.

    call method me->write_end

    exporting

    i_off = l_off

    i_len = l_len.

    m_finished = 'X'.

    endmethod. "end_zip_stream

    method write_loc .

    data:

    lt_data type bbpt_att_cont,

    l_length type i.

    write_long( 67324752 ).

    write_short( ir_item->m_version ).

    write_short( ir_item->m_flag ).

    write_short( ir_item->m_method ).

    write_long( ir_item->m_time ).

    write_long( ir_item->m_crc ).

    write_long( ir_item->m_csize ).

    write_long( ir_item->m_size ).

    call method me->get_utf8_bytes

    exporting

    i_string = ir_item->m_name

    importing

    et_data = lt_data

    e_length = l_length.

    write_short( l_length ).

    write_short( 0 ).

    write( it_data = lt_data i_length = l_length ).

    if ir_item->m_typefolder = 'X'.

    write_long( 51966 ).

    • write_long( 202 ).

    • write_long( 0 ).

    • write_long( 0 ).

    endif.

    m_written = m_written + l_length.

    endmethod. "write_loc

    method write_cen .

    data:

    lt_data type bbpt_att_cont,

    l_length type i.

    write_long( 33639248 ).

    write_short( ir_item->m_version ).

    write_short( ir_item->m_version ).

    write_short( ir_item->m_flag ).

    write_short( ir_item->m_method ).

    write_long( ir_item->m_time ).

    write_long( ir_item->m_crc ).

    write_long( ir_item->m_csize ).

    write_long( ir_item->m_size ).

    call method me->get_utf8_bytes

    exporting

    i_string = ir_item->m_name

    importing

    et_data = lt_data

    e_length = l_length.

    write_short( l_length ).

    write_short( 0 ).

    write_short( 0 ).

    write_short( 0 ).

    write_short( 0 ).

    write_long( 0 ).

    write_long( ir_item->m_offset ).

    call method me->write

    exporting

    it_data = lt_data

    i_length = l_length.

    m_written = m_written + l_length.

    endmethod. "write_cen

    method write_end .

    data:

    l_count type sy-tfill.

    write_long( 101010256 ).

    write_short( 0 ).

    write_short( 0 ).

    describe table mt_zip_items lines l_count.

    write_short( l_count ).

    write_short( l_count ).

    write_long( i_len ).

    write_long( i_off ).

    write_short( 0 ).

    endmethod. "write_end

    method write_short .

    data:

    l_short(2) type x.

    l_short = i_short.

    call method me->write_byte

    exporting

    i_data = l_short+1(1).

    call method me->write_byte

    exporting

    i_data = l_short(1).

    m_written = m_written + 2.

    endmethod. "write_short

    method write_long .

    data:

    l_long(4) type x.

    l_long = i_long.

    call method me->write_byte

    exporting

    i_data = l_long+3(1).

    call method me->write_byte

    exporting

    i_data = l_long+2(1).

    call method me->write_byte

    exporting

    i_data = l_long+1(1).

    call method me->write_byte

    exporting

    i_data = l_long(1).

    m_written = m_written + 4.

    endmethod. "write_long

    method get_utf8_bytes .

    call function 'SSFH_STRING_TO_TABUTF8'

    exporting

    cstr_input_data = i_string

    • CODEPAGE = '4110'

    importing

    ostr_input_data_l = e_length

    tables

    ostr_input_data = et_data

    • EXCEPTIONS

    • CONVERSION_ERROR = 1

    • INTERNAL_ERROR = 2

    • OTHERS = 3

    .

    endmethod. "get_utf8_bytes

    endclass. "lcl_doc_zip_ostream IMPLEMENTATIO

    ----


    • CLASS lcl_doc_zipper DEFINITIO

    ----


    *

    ----


    class lcl_doc_zipper definition

    final

    create public .

    public section.

    methods constructor

    importing

    iv_base_dir type string optional .

    methods zip

    importing

    it_ostreams type bbpt_zip_components

    exporting

    e_length type int4

    et_content type bbpt_att_cont .

    private section.

    data m_base_dir type string .

    endclass. "lcl_doc_zipper DEFINITIO

    ----


    • CLASS lcl_doc_zipper IMPLEMENTATION

    ----


    *

    ----


    class lcl_doc_zipper implementation.

    method constructor .

    if not iv_base_dir is initial.

    m_base_dir = iv_base_dir.

    endif.

    endmethod. "constructor

    method zip .

    data:

    lv_filename type string,

    lo_zip_item type ref to lcl_doc_zip_item,

    lo_crc32 type ref to lcl_doc_crc32,

    lo_zip_ostream type ref to lcl_doc_zip_ostream,

    lv_percentage type i,

    lv_lines type i,

    lv_nr type i,

    lv_nr_ch type char255,

    lv_lines_ch type char255.

    field-symbols:

    <ls_ostream> type bbps_zip_components.

    create object lo_zip_ostream.

    call method lcl_doc_crc32=>get_instance

    importing

    er_instance = lo_crc32.

    lv_lines = lines( it_ostreams ).

    loop at it_ostreams assigning <ls_ostream>.

    lv_nr = lv_nr + 1.

    lv_percentage = lv_nr * 100 / lv_lines.

    write lv_nr to lv_nr_ch.

    write lv_lines to lv_lines_ch.

    if not m_base_dir is initial.

    lv_filename = m_base_dir.

    endif.

    if not <ls_ostream>-realitive_dir is initial

    and not <ls_ostream>-realitive_dir cs 'PHILIPPSTEVES'.

    if not lv_filename is initial.

    concatenate lv_filename

    '/'

    <ls_ostream>-realitive_dir

    into lv_filename.

    else.

    lv_filename = <ls_ostream>-realitive_dir.

    endif.

    endif.

    if not lv_filename is initial.

    concatenate

    lv_filename

    '/'

    <ls_ostream>-filename

    into lv_filename.

    else.

    lv_filename = <ls_ostream>-filename.

    endif.

    create object lo_zip_item

    exporting

    i_name = lv_filename

    i_reldir = <ls_ostream>-realitive_dir.

    lo_zip_item->set_size_numc( <ls_ostream>-docsize ).

    lo_zip_item->set_csize_numc( <ls_ostream>-docsize ).

    lo_zip_item->set_time( -1 ).

    call method lo_crc32->get_crc32

    exporting

    it_data = <ls_ostream>-content

    i_length = <ls_ostream>-docsize

    importing

    e_crc32 = lo_zip_item->m_crc.

    call method lo_zip_ostream->begin_new_item

    changing

    cr_item = lo_zip_item.

    lo_zip_ostream->write_new_item(

    it_data = <ls_ostream>-content

    i_length = <ls_ostream>-docsize ).

    free lo_zip_item.

    clear lv_filename.

    endloop.

    lo_zip_ostream->end_zip_stream( ).

    call method lo_zip_ostream->get_length

    importing

    e_length = e_length.

    call method lo_zip_ostream->get_data

    importing

    et_data = et_content.

    endmethod. "zip

    endclass. "lcl_doc_zipper IMPLEMENTATION

    ***********************************************************************

    start-of-selection.

    data :

    l_output type string,

    l_outputx type xstring,

    l_outputb type xstring,

    l_pdf_len type i,

    it_pdf type table of tline with header line.

    call function 'CONVERT_OTFSPOOLJOB_2_PDF'

    exporting

    src_spoolid = spool

    tables

    pdf = it_pdf

    exceptions

    err_no_otf_spooljob = 1

    err_no_spooljob = 2

    err_no_permission = 3

    err_conv_not_possible = 4

    err_bad_dstdevice = 5

    user_cancelled = 6

    err_spoolerror = 7

    err_temseerror = 8

    err_btcjob_open_failed = 9

    err_btcjob_submit_failed = 10

    err_btcjob_close_failed = 11

    others = 12.

    if sy-subrc <> 0.

    endif.

    call method cl_gui_frontend_services=>gui_download

    exporting

    filename = 'C:\File.pdf'

    filetype = 'BIN'

    changing

    data_tab = it_pdf[].

    • Call Function module to convert the PDF data to string

    call function 'CONVERT_TABLE_TO_STRING'

    exporting

    i_tabline_length = 134

    importing

    e_string = l_output

    tables

    it_table = it_pdf.

    *Call function module to convert the Character String to Binary String

    call function 'SCMS_STRING_TO_XSTRING'

    exporting

    text = l_output

    importing

    • buffer = l_outputb.

    buffer = l_outputx.

    • call method cl_abap_gzip=>compress_binary

    • exporting

    • raw_in = l_outputb

    • compress_level = 9

    • importing

    • gzip_out = l_outputx.

    data:

    lv_current_length type i,

    ls_content type sdokcntbin,

    lt_zip_file type sdokcntbins,

    ls_zip_content type sdokcntbin,

    ls_zip_entry type bbps_zip_components,

    lt_zip_entries type bbpt_zip_components.

    field-symbols <fs_line> type x.

    ls_zip_entry-mime_type = 'text/xml'.

    ls_zip_entry-filename = 'test.pdf'.

    ls_zip_entry-docsize = xstrlen( l_outputx ).

    refresh ls_zip_entry-content.

    lv_current_length = xstrlen( l_outputx ).

    while lv_current_length > 1022.

    assign ls_content to <fs_line> casting type x.

    move l_outputx(1022) to <fs_line>.

    append ls_content to ls_zip_entry-content.

    shift l_outputx by 1022 places in byte mode.

    lv_current_length = xstrlen( l_outputx ).

    endwhile.

    if lv_current_length > 0.

    assign ls_content to <fs_line> casting type x.

    move l_outputx to <fs_line>.

    append ls_content to ls_zip_entry-content.

    endif.

    append ls_zip_entry to lt_zip_entries.

    • Make zip stream

    data lo_zipper type ref to lcl_doc_zipper.

    create object lo_zipper.

    call method lo_zipper->zip

    exporting

    it_ostreams = lt_zip_entries

    importing

    et_content = lt_zip_file.

    • Download file

    call method cl_gui_frontend_services=>gui_download

    exporting

    filename = 'C:\File.zip'

    filetype = 'BIN'

    changing

    data_tab = lt_zip_file.

    Add a comment
    10|10000 characters needed characters exceeded

Before answering

You should only submit an answer when you are proposing a solution to the poster's problem. If you want the poster to clarify the question or provide more information, please leave a comment instead, requesting additional details. When answering, please include specifics, such as step-by-step instructions, context for the solution, and links to useful resources. Also, please make sure that you answer complies with our Rules of Engagement.
You must be Logged in to submit an answer.

Up to 10 attachments (including images) can be used with a maximum of 1.0 MB each and 10.5 MB total.