* https://www.berater-wiki.de/XML_aus_PDF_extrahieren_mit_Testprogramm_FP_PDF_TEST_03
* http://sapfirst.blogspot.com/2014/05/inbound-abap-proxy-with-pdf-attachment.html
* Paket: SAFP
* Programme: FP_PDF_TEST_01 (PDF erzeugen)
* FP_PDF_TEST_03 (Datenextraktion)
* XFD (XML Form Data): https://www.berater-wiki.de/XFD-Datei_(Values_of_PDF_form_fields_in_XML)
* XFT (XML Form Template)
* XDC (XML Printer Definitions)
TRY.
DATA: lv_rc TYPE i.
DATA: it_files TYPE filetable.
DATA: lv_action TYPE i.
* FileOpen-Dialog aufrufen
cl_gui_frontend_services=>file_open_dialog( EXPORTING
file_filter = |pdf (*.pdf)\|*.pdf\|{ cl_gui_frontend_services=>filetype_all }|
CHANGING
file_table = it_files
rc = lv_rc
user_action = lv_action ).
IF lv_action = cl_gui_frontend_services=>action_ok.
* wenn mind. zwei Dateien ausgewählt worden sind
IF lines( it_files ) > 0.
DATA(lv_filesize) = CONV w3param-cont_len( '0' ).
DATA(it_bin_data) = VALUE w3mimetabtype( ).
* Datei auf Appl. Server hochladen (binary)
cl_gui_frontend_services=>gui_upload( EXPORTING
filename = |{ it_files[ 1 ]-filename }|
filetype = 'BIN'
IMPORTING
filelength = lv_filesize
CHANGING
data_tab = it_bin_data ).
* solix -> xstring
DATA(lv_bin_data) = cl_bcs_convert=>solix_to_xstring( it_solix = it_bin_data ).
* Form Processor erzeugen
DATA(o_form_processor) = cl_fp=>get_reference( ).
* PDF-Objekt erzeugen
DATA(o_pdf) = o_form_processor->create_pdf_object( ).
* Binärdaten an PDF-Objekt übergeben
o_pdf->set_document( pdfdata = lv_bin_data ).
* PDF-Daten extrahieren
o_pdf->set_extractdata( ).
* ADS-Server rufen
o_pdf->execute( ).
* extrahierte Daten holen (xstring)
o_pdf->get_data( IMPORTING formdata = DATA(lv_pdf_formdata) ).
* xstring (binary) -> XML-string (UTF-8)
DATA(lv_pdf_xml_str) = ||.
DATA(o_conv) = cl_abap_conv_in_ce=>create( input = lv_pdf_formdata
encoding = 'UTF-8' ).
o_conv->read( IMPORTING data = lv_pdf_xml_str ).
* XML-Zugriff
DATA(o_ixml) = cl_ixml=>create( ).
DATA(o_sf) = o_ixml->create_stream_factory( ).
DATA(o_doc) = o_ixml->create_document( ).
DATA(o_stream) = o_sf->create_istream_string( lv_pdf_xml_str ).
* XML-Parser
DATA(o_parser) = o_ixml->create_parser( stream_factory = o_sf
istream = o_stream
document = o_doc ).
* XML parsen
IF o_parser->parse( ) = 0.
DATA(o_root) = o_doc->get_root_element( ).
...
ELSE.
* Fehlerauswertung
DO o_parser->num_errors( ) TIMES.
DATA(o_err) = o_parser->get_error( index = sy-index - 1 ).
IF o_err IS BOUND.
WRITE: / o_err->get_column( ), o_err->get_line( ), o_err->get_reason( ).
ENDIF.
ENDDO.
ENDIF.
ENDIF.
ENDIF.
CATCH cx_root INTO DATA(e_txt).
WRITE: / e_txt->get_text( ).
ENDTRY.