変換されたPDFをファイルとしてダウンロードせずに、直接Adobe Readerで表示する。
これを応用するとABAPでファイルサーバーを構築することが可能。そのうち作ってみる予定。
■手法
I_OI_CONTAINER_CONTROLとI_OI_DOCUMENT_PROXYを使用するとWord、Excel、Adobe Readerなどを直接操作することが可能。サンプルでは手続き型プログラミングになっているが、オブジェクト指向プログラミングを用いたほうがいい。
■サンプルソース
*1 WRITEの出力先をスプールにする
*2 SPOOLをPDF変換
*3 READERで直接表示(Adobe Reader 8で確認)
*
DATA g_spono TYPE sy-spono.
DATA o_ole_controller TYPE REF TO i_oi_container_control.
DATA o_ole_document TYPE REF TO i_oi_document_proxy.
*
PERFORM write_to_spool CHANGING g_spono.
PERFORM convert_spool_to_pdf USING g_spono.
*
*&--------------------------------------------------------------------*
*& Form write_to_spool
*&--------------------------------------------------------------------*
FORM write_to_spool CHANGING c_spono TYPE sy-spono.
DATA ltbl_company TYPE STANDARD TABLE OF t001.
DATA lst_company TYPE t001.
*
SELECT *
INTO CORRESPONDING FIELDS OF TABLE ltbl_company
FROM t001.
*
NEW-PAGE PRINT ON
DESTINATION space
COVER TEXT 'document'
IMMEDIATELY space
KEEP IN SPOOL 'X'
NEW LIST IDENTIFICATION 'X'
NO DIALOG.
*
LOOP AT ltbl_company INTO lst_company.
WRITE :/ lst_company-bukrs.
ENDLOOP.
*
NEW-PAGE PRINT OFF.
c_spono = sy-spono.
*
ENDFORM. "write_to_spool
*&--------------------------------------------------------------------*
*& Form convert_spool_to_pdf
*&--------------------------------------------------------------------*
FORM convert_spool_to_pdf USING u_spono TYPE sy-spono.
DATA ltbl_pdf LIKE STANDARD TABLE OF tline.
DATA l_filesize TYPE i.
DATA l_filename TYPE string.
DATA l_rspoid TYPE rspoid.
l_rspoid = u_spono.
l_filename = 'C:\spool.pdf'.
*
CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
EXPORTING
src_spoolid = l_rspoid
IMPORTING
pdf_bytecount = l_filesize
TABLES
pdf = ltbl_pdf
EXCEPTIONS
err_no_abap_spooljob = 1
err_no_spooljob = 2
err_no_permission = 3
err_conv_not_possible = 4
err_bad_destdevice = 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.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*表示
*
DATA l_retcode TYPE soi_ret_string.
*ole controller
CALL METHOD c_oi_container_control_creator=>get_container_control
IMPORTING
control = o_ole_controller
retcode = l_retcode.
*initialize
CALL METHOD o_ole_controller->init_control
EXPORTING
r3_application_name = 'Document'
inplace_enabled = 'X'
parent = cl_gui_container=>default_screen
IMPORTING
retcode = l_retcode.
*
DATA l_reg_value TYPE string.
DATA l_document_type TYPE char64.
*.pdfのドキュメントタイプ取得
CALL METHOD cl_gui_frontend_services=>registry_get_value
EXPORTING
root = cl_gui_frontend_services=>hkey_classes_root
key = '.pdf'
value = space
IMPORTING
reg_value = l_reg_value
EXCEPTIONS
get_regvalue_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5
.
IF sy-subrc <> 0.
l_document_type = 'AcroExch.Document'.
ELSE.
l_document_type = l_reg_value.
ENDIF.
*ole document
CALL METHOD o_ole_controller->get_document_proxy
EXPORTING
document_type = l_document_type
document_format = i_oi_container_control=>document_format_compound
IMPORTING
document_proxy = o_ole_document.
*pdfの表示
CALL METHOD o_ole_document->open_document_from_table
EXPORTING
document_size = l_filesize
document_table = ltbl_pdf
no_flush = ''
open_inplace = ''.
*オブジェクトの開放を防ぐ...
WRITE 'complete'.
ENDFORM. "convert_spool_to_pdf
posted by zabap at 23:30|
クライアントPCとの連帯