************************************************************************
**Program name: REV_PDF_FORM
**Description : Interactive Form - Receive
**Date/Author : 2009.12.16 / Joey Lee
************************************************************************
** M O D I F I C A T I O N L O G
************************************************************************
** ChangeDate Programmer Request Description
** ========== ========== ========== ==================
** 2009.12.16 Joey Lee New Program
************************************************************************
REPORT ztestpdf_upload NO STANDARD PAGE HEADING
LINE-SIZE 135
LINE-COUNT 58(2).
*=======================================================================
*=================================================Global Date declear===
DATA: g_pdf_data TYPE xstring,
g_xml_xstr TYPE xstring.
PARAMETERS: p_finame TYPE string.
*=======================================================================
*========================================================Initial Data===
*LOAD-OF-PROGRAM
*INITIALIZATION.
*=======================================================================
*=============================================Selection Screen Events===
*AT SELECTION-SCREEN OUTPUT.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_finame.
PERFORM get_file_name USING 'P_FINAME'
CHANGING p_finame.
*AT SELECTION-SCREEN.
*AT SELECTION-SCREEN ON <f>.
*AT SELECTION-SCREEN ON BLOCK <>.
*=======================================================================
*=======================================================Report Events===
START-OF-SELECTION.
*-Get PDF file
PERFORM get_pdf_file CHANGING g_pdf_data.
*-Get XML data in PDF File
PERFORM get_ads_xml USING g_pdf_data
CHANGING g_xml_xstr.
END-OF-SELECTION.
*-Transformation XML data (XML Library - iXML)
PERFORM tran_xml_ixml USING g_xml_xstr.
*-Transformation XML data (CALL TRANSFORMATION)
* PERFORM tran_xml_transformation USING g_xml_xstr.
*=======================================================================
*=========================================================List Events===
*TOP-OF-PAGE.
*END-OF-PAGE.
*AT LINE-SELECTION.
*TOP-OF-PAGE DURING LINE-SELECTION.
*AT USER-COMMAND.
*=======================================================================
*=========================================================Subroutines===
*&---------------------------------------------------------------------*
*& Form get_pdf_file
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_pdf_file CHANGING fo_pdf_data.
TYPES: l_xstr(1024) TYPE x.
DATA: lt_rawtab TYPE TABLE OF l_xstr,
lv_filename TYPE string.
lv_filename = p_finame.
*-Upload PDF File
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = lv_filename
filetype = 'BIN'
TABLES
data_tab = lt_rawtab
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc <> 0.
EXIT.
ENDIF.
*-Concate all data
CONCATENATE LINES OF lt_rawtab INTO fo_pdf_data IN BYTE MODE.
ENDFORM. " get_pdf_file
*&---------------------------------------------------------------------*
*& Form get_ads_xml
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_ads_xml USING fi_pdf_data
CHANGING fo_xml_xstr.
DATA: lo_fp TYPE REF TO if_fp VALUE IS INITIAL,
lo_pdfobj TYPE REF TO if_fp_pdf_object VALUE IS INITIAL,
l_xml_data TYPE xstring.
*-Get FP reference
lo_fp = cl_fp=>get_reference( ).
TRY.
*---Create PDF Object using destination 'ADS' (<-- this is how it is defined in SM59)
lo_pdfobj = lo_fp->create_pdf_object( connection = 'ADS' ).
*---Set document
lo_pdfobj->set_document(
EXPORTING
pdfdata = fi_pdf_data ).
*---Tell PDF object to extract data
lo_pdfobj->set_extractdata( ).
*---Execute the call to ADS
lo_pdfobj->execute( ).
ENDTRY.
*-Extract the Data
lo_pdfobj->get_data(
IMPORTING
formdata = l_xml_data ).
*-Return data
fo_xml_xstr = l_xml_data.
ENDFORM. " get_ads_xml
*&---------------------------------------------------------------------*
*& Form TRAN_XML_TRANSFORMATION
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM tran_xml_transformation USING fi_xml_xstr.
DATA: lv_xml_data_string TYPE string,
l_str TYPE string.
*-Convert XML data from XSTRING format to STRING format
CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
EXPORTING
im_xstring = fi_xml_xstr
IMPORTING
ex_string = lv_xml_data_string.
*-Remove NEW-LINE character from XML data in STRING format
CLASS cl_abap_char_utilities DEFINITION LOAD.
REPLACE ALL OCCURENCES OF cl_abap_char_utilities=>newline
IN lv_xml_data_string WITH ''.
*-Make the XML envelope compliant with identity transform
* CONCATENATE '<?xml version="1.0" encoding="iso-8859-1"?>'
* '<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">'
* INTO l_str.
*
* REPLACE '<?xml version="1.0" encoding="UTF-8"?>'
* IN lv_xml_data_string WITH l_str.
*
* REPLACE '<data>' IN lv_xml_data_string WITH '<asx:values>'.
*
* REPLACE '</data>'
* IN lv_xml_data_string WITH '</asx:values></asx:abap>'.
*-Split XML data
PERFORM output_xml USING lv_xml_data_string.
*-Transformation
* CALL TRANSFORMATION id
* SOURCE XML fo_xml_data
* RESULT zekpo = it_zekpo.
ENDFORM. " TRAN_XML_TRANSFORMATION
*&---------------------------------------------------------------------*
*& Form TRAN_XML_IXML
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM tran_xml_ixml USING fi_xml_xstr.
TYPE-POOLS: ixml.
DATA: l_ixml TYPE REF TO if_ixml,
l_streamfactory TYPE REF TO if_ixml_stream_factory,
l_parser TYPE REF TO if_ixml_parser,
l_istream TYPE REF TO if_ixml_istream,
l_document TYPE REF TO if_ixml_document,
l_node TYPE REF TO if_ixml_node,
l_parseerror TYPE REF TO if_ixml_parse_error,
l_xmldata TYPE string,
l_str TYPE string,
l_int TYPE i,
l_count TYPE i,
l_index TYPE i.
* DATA: l_xml_table TYPE TABLE OF t_xml_line,
* l_xml_line TYPE t_xml_line,
* l_xml_table_size TYPE i.
*-Creating the main iXML factory
l_ixml = cl_ixml=>create( ).
*-Creating a stream factory
l_streamfactory = l_ixml->create_stream_factory( ).
** wrap the table containing the file into a stream
* l_istream = l_streamfactory->create_istream_itable( table = l_xml_table size = l_xml_table_size ).
*-wrap xstring into a stream
l_istream = l_streamfactory->create_istream_xstring( string = fi_xml_xstr ).
*-Creating a document
l_document = l_ixml->create_document( ).
*-Create a Parser
l_parser = l_ixml->create_parser(
stream_factory = l_streamfactory
istream = l_istream
document = l_document ).
*-Parse the stream
IF l_parser->parse( ) NE 0.
IF l_parser->num_errors( ) NE 0.
l_count = l_parser->num_errors( ).
WRITE: l_count, ' parse errors have occured:'.
l_index = 0.
WHILE l_index < l_count.
l_parseerror = l_parser->get_error( index = l_index ).
l_int = l_parseerror->get_line( ).
WRITE: 'line: ', l_int.
l_int = l_parseerror->get_column( ).
WRITE: 'column: ', l_int.
l_str = l_parseerror->get_reason( ).
WRITE: l_str.
l_index = l_index + 1.
ENDWHILE.
ENDIF.
ENDIF.
*-Process the document
IF l_parser->is_dom_generating( ) EQ 'X'.
PERFORM travel_node_name USING l_document.
* PERFORM travel_all_node USING l_document.
ENDIF.
ENDFORM. " TRAN_XML_IXML
*&---------------------------------------------------------------------*
*& Form GET_FILE_NAME
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_file_name USING fi_fieldname
CHANGING fo_filefield.
DATA: l_file_name TYPE ibipparms-path,
l_field_name TYPE dynpread-fieldname.
l_field_name = fi_fieldname.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = syst-cprog
dynpro_number = syst-dynnr
field_name = fi_fieldname
IMPORTING
file_name = l_file_name.
fo_filefield = l_file_name.
ENDFORM. " GET_FILE_NAME
*&---------------------------------------------------------------------*
*& Form TRAVEL_ALL_NODE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM travel_all_node USING fi_document TYPE REF TO if_ixml_document.
DATA: node TYPE REF TO if_ixml_node,
iterator TYPE REF TO if_ixml_node_iterator,
nodemap TYPE REF TO if_ixml_named_node_map,
attr TYPE REF TO if_ixml_node,
name TYPE string,
prefix TYPE string,
value TYPE string,
indent TYPE i,
count TYPE i, index TYPE i.
node ?= fi_document.
CHECK NOT node IS INITIAL.
ULINE.
WRITE: /.
WRITE: /' DOM-TREE'.
WRITE: /.
IF node IS INITIAL.
EXIT.
ENDIF.
* create a node iterator
iterator = node->create_iterator( ).
* get current node
node = iterator->get_next( ).
* loop over all nodes
WHILE NOT node IS INITIAL.
indent = node->get_height( ) * 2.
indent = indent + 20.
CASE node->get_type( ).
WHEN if_ixml_node=>co_node_element.
*-------element node
name = node->get_name( ).
nodemap = node->get_attributes( ).
WRITE: / 'ELEMENT :'.
WRITE: AT indent name COLOR COL_POSITIVE INVERSE.
IF NOT nodemap IS INITIAL.
*---------attributes
count = nodemap->get_length( ).
DO count TIMES.
index = sy-index - 1.
attr = nodemap->get_item( index ).
name = attr->get_name( ).
prefix = attr->get_namespace_prefix( ).
value = attr->get_value( ).
WRITE: / 'ATTRIBUTE:'.
WRITE: AT indent name COLOR COL_HEADING INVERSE, '=', value COLOR COL_TOTAL INVERSE.
ENDDO.
ENDIF.
WHEN if_ixml_node=>co_node_text OR if_ixml_node=>co_node_cdata_section.
*-------text node
value = node->get_value( ).
WRITE: / 'VALUE :'.
WRITE: AT indent value COLOR COL_GROUP INVERSE.
ENDCASE.
* advance to next node
node = iterator->get_next( ).
ENDWHILE.
ENDFORM. " TRAVEL_ALL_NODE
*&---------------------------------------------------------------------*
*& Form TRAVEL_NODE_NAME
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM travel_node_name USING fi_document TYPE REF TO if_ixml_document.
DATA: l_node TYPE REF TO if_ixml_node.
*-Check Document
l_node ?= fi_document.
IF l_node IS INITIAL.
EXIT.
ENDIF.
DATA: lt_ekpo TYPE ztestpdf_ty001,
lt_listekpo TYPE ztestpdf_ty001,
lt_teban TYPE zads001_tt002,
l_werks LIKE ekpo-werks,
l_w_user(20) type c.
*-for internal table
PERFORM get_it_ekpo TABLES lt_teban
USING fi_document
'TEBAN'.
*-for structure
PERFORM get_field USING fi_document
'ZWERKS'
CHANGING l_werks.
PERFORM get_field USING fi_document
'W_USER'
CHANGING l_w_user.
ENDFORM. " TRAVEL_NODE_NAME
*&---------------------------------------------------------------------*
*& Form OUTPUT_XML
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM output_xml USING fi_xml_data.
DATA: l_str TYPE string.
DATA: BEGIN OF lt_output OCCURS 0,
str(512) TYPE c,
END OF lt_output.
l_str = fi_xml_data.
REPLACE ALL OCCURRENCES OF '><' IN l_str WITH '>|<'.
SPLIT l_str AT '|' INTO TABLE lt_output.
*-Output
LOOP AT lt_output.
WRITE / lt_output.
ENDLOOP.
ENDFORM. " OUTPUT_XML
*&---------------------------------------------------------------------*
*& Form GET_IT_EKPO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_it_ekpo TABLES ft_return STRUCTURE zads001_s002
USING fi_document TYPE REF TO if_ixml_document
fi_elename.
FIELD-SYMBOLS: <fs_field> TYPE ANY.
DATA: l_filter TYPE REF TO if_ixml_node_filter,
l_filter_p TYPE REF TO if_ixml_node_filter,
l_iterator TYPE REF TO if_ixml_node_iterator,
l_node TYPE REF TO if_ixml_node,
l_node_c TYPE REF TO if_ixml_node,
l_name TYPE string,
l_value TYPE string,
l_fieldname TYPE string,
lw_return LIKE LINE OF ft_return.
*-Field node
l_filter_p = fi_document->create_filter_name( name = fi_elename ).
l_filter = fi_document->create_filter_parent( filter_parent = l_filter_p ).
*-create a node iterator
l_iterator = fi_document->create_iterator_filtered( l_filter ).
*-Travel all node (Line)
l_node = l_iterator->get_next( ).
WHILE NOT l_node IS INITIAL.
l_node_c = l_node->get_first_child( ).
*---Travel all child node (Field)
WHILE NOT l_node_c IS INITIAL.
l_name = l_node_c->get_name( ).
l_value = l_node_c->get_value( ).
TRY.
CONCATENATE 'LW_RETURN-' l_name INTO l_fieldname.
ASSIGN (l_fieldname) TO <fs_field>.
<fs_field> = l_value.
ENDTRY.
l_node_c = l_node_c->get_next( ).
ENDWHILE.
APPEND lw_return TO ft_return.
CLEAR: lw_return.
l_node = l_iterator->get_next( ).
ENDWHILE.
ENDFORM. " GET_IT_EKPO
*&---------------------------------------------------------------------*
*& Form GET_FIELD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_field USING fi_document TYPE REF TO if_ixml_document
fi_fieldname
CHANGING fo_fieldvalue.
DATA: l_filter TYPE REF TO if_ixml_node_filter,
* l_filter_p TYPE REF TO if_ixml_node_filter,
l_iterator TYPE REF TO if_ixml_node_iterator,
l_node TYPE REF TO if_ixml_node,
* l_node_c TYPE REF TO if_ixml_node,
* l_name TYPE string,
l_value TYPE string.
* l_fieldname TYPE string,
* lw_return LIKE LINE OF ft_return.
*-Field node
* l_filter_p = fi_document->create_filter_name( name = fi_elename ).
l_filter = fi_document->create_filter_name( name = fi_fieldname ).
*-create a node iterator
l_iterator = fi_document->create_iterator_filtered( l_filter ).
*-get node
l_node = l_iterator->get_next( ).
*-get value
l_value = l_node->get_value( ).
*-return value
fo_fieldvalue = l_value.
ENDFORM. " GET_FIELD