So, here is the next test program (it will also require creating one dynpro with custom container in which html viewer has to run):
*----------------------------------------------------------------------*
* Report SF_EXAMPLE_01
*----------------------------------------------------------------------*
* Printing of documents using Smart Forms
*----------------------------------------------------------------------*
REPORT zsf_example_01.
TABLES: sscrfields .
INCLUDE icons.
DATA: carr_id TYPE sbook-carrid,
fm_name TYPE rs38l_fnam.
SELECTION-SCREENFUNCTIONKEY1. "Will have a function code of 'FC01'
PARAMETER: p_custid TYPE scustom-id DEFAULT1.
SELECT-OPTIONS: s_carrid FOR carr_id DEFAULT'LH'TO'LH'.
PARAMETER: p_form TYPE tdsfname DEFAULT'SF_EXAMPLE_01'MODIFID oon .
PARAMETERS: printpar LIKE eprintparams NO-DISPLAY.
DATA: customer TYPE scustom,
bookings TYPE ty_bookings,
connections TYPE ty_connections.
DATA: gs_sfcp TYPE ssfctrlop ,
gs_sfoo TYPE ssfcompop,
gs_job_output_info TYPE ssfcrescl,
g_pdf_len TYPE i,
g_pdf_xstring TYPE xstring ,
gc_html_viewer TYPEREFTO cl_gui_custom_container,
go_html_viewer TYPEREFTO cl_gui_html_viewer,
gt_pdf_raw TYPESTANDARDTABLEOF bin1024 ."raw255 ."or bin1024 or any type x.
* get data
SELECTSINGLE*FROM scustom INTO customer WHERE id = p_custid.
CHECK sy-subrc =0.
SELECT*FROM sbook INTOTABLE bookings
WHERE customid = p_custid
AND carrid IN s_carrid
ORDERBYPRIMARYKEY.
SELECT*FROM spfli INTOTABLE connections
FORALLENTRIESIN bookings
WHERE carrid = bookings-carrid
AND connid = bookings-connid
ORDERBYPRIMARYKEY.
INITIALIZATION .
sscrfields-functxt_01 = icon_print_with_parameters &&'Options' .
ATSELECTION-SCREEN .
* force input of print options
IF sy-ucomm EQ'FC01'OR
( ( sy-ucomm EQ'ONLI'OR sy-ucomm EQ'PRIN'OR sy-ucomm EQ'SJOB' ) AND
printpar-tddest ISINITIAL ) .
PERFORM get_printpar CHANGING printpar .
IF printpar-tddest ISINITIAL .
CLEAR sy-ucomm .
LEAVETOSCREEN sy-dynnr .
ENDIF.
ENDIF .
START-OF-SELECTION .
* print data
CALLFUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = p_form
IMPORTING
fm_name = fm_name
EXCEPTIONS
no_form =1
no_function_module =2
OTHERS =3.
IF sy-subrc <>0.
MESSAGEID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
MOVE-CORRESPONDING printpar TO gs_sfcp .
MOVE-CORRESPONDING printpar TO gs_sfoo .
gs_sfcp-no_dialog ='X'.
IF sy-batch ISINITIAL . "get_otf in dialog
gs_sfcp-getotf ='X' .
ENDIF .
* now call the generated function module
CALLFUNCTION fm_name
EXPORTING
control_parameters = gs_sfcp
output_options = gs_sfoo
customer = customer
bookings = bookings
connections = connections
IMPORTING
job_output_info = gs_job_output_info
EXCEPTIONS
formatting_error =1
internal_error =2
send_error =3
user_canceled =4
OTHERS =5.
IF sy-subrc <>0.
MESSAGEID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE .
CHECK sy-batch ISINITIAL . "Only online
PERFORM get_pdf_as_rawtable
USING
gs_job_output_info-otfdata[]
CHANGING
gt_pdf_raw
g_pdf_len .
CALLSCREEN 100 .
ENDIF.
ATSELECTION-SCREENOUTPUT .
LOOPATSCREEN .
IF screen-group1 ='OON' .
screen-input =0 .
MODIFYSCREEN .
ENDIF .
ENDLOOP.
*&---------------------------------------------------------------------*
*& Module CREATE_VIEWER OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE create_viewer OUTPUT.
CHECK gc_html_viewer ISNOTBOUND .
SETPF-STATUS'SIMPLE' .
PERFORM create_pdf_viewer USING gt_pdf_raw g_pdf_len.
ENDMODULE. " CREATE_VIEWER OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command INPUT.
CASE sy-ucomm .
WHEN'EXIT'OR'CANC'OR'BACK' .
go_html_viewer->free( ) .
gc_html_viewer->free( ).
LEAVEPROGRAM .
WHENOTHERS .
CLEAR sy-ucomm .
ENDCASE .
ENDMODULE. " USER_COMMAND INPUT
FORM get_printpar CHANGING cs_printpar TYPE eprintparams.
DATA: ls_printpar TYPE eprintparams .
ls_printpar = cs_printpar .
ls_printpar-device ='PRINTER'.
CALLFUNCTION 'EFG_GET_PRINT_PARAMETERS'
EXPORTING
x_printparams = ls_printpar
x_no_preview = abap_true
x_no_archive = abap_true
x_no_last_doc = abap_true
x_only_printer = abap_true
IMPORTING
y_printparams = ls_printpar
EXCEPTIONS
cancelled =1
input_error =2
failed =3
OTHERS =4.
IF sy-subrc EQ0 .
cs_printpar = ls_printpar .
ELSEIF sy-subrc EQ1OR
sy-subrc EQ2 .
MESSAGEID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSEIF sy-subrc GE3 .
MESSAGE e898(e9) WITH
'sy-subrc' sy-subrc 'EFG_GET_PRINT_PARAMETERS' space.
ENDIF.
ENDFORM. " DEFINE_PRINT_PAR
FORM create_pdf_viewer
USING
it_pdf_raw TYPESTANDARDTABLE
i_pdf_len TYPE i .
DATA:
l_style TYPE i,
l_pdf_alignment TYPE i,
l_url TYPE w3url.
l_style = cl_gui_control=>ws_child +
cl_gui_control=>ws_visible.
* create custom container
CREATEOBJECT gc_html_viewer
EXPORTING
container_name ='GC_HTML_VIEWER'
style = l_style
EXCEPTIONS
cntl_error =1
cntl_system_error =2
create_error =3
lifetime_error =4
lifetime_dynpro_dynpro_link =5
OTHERS =6.
IF sy-subrc <>0.
MESSAGEID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* create HTML viewer object
CREATEOBJECT go_html_viewer
EXPORTING
parent = gc_html_viewer.
l_pdf_alignment = go_html_viewer->align_at_left +
go_html_viewer->align_at_right +
go_html_viewer->align_at_top +
go_html_viewer- >align_at_bottom.
go_html_viewer->set_alignment(
EXPORTING
alignment = l_pdf_alignment " Alignment
EXCEPTIONS
cntl_error =1
cntl_system_error =2
OTHERS =3
).
IF sy-subrc <>0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* load PDF data (get URL)
go_html_viewer->load_data(
EXPORTING
type ='application'
subtype ='pdf'
size = i_pdf_len
IMPORTING
assigned_url = l_url
CHANGING
data_table = it_pdf_raw
EXCEPTIONS
dp_invalid_parameter =1
dp_error_general =2
cntl_error =3
html_syntax_notcorrect =4
OTHERS =5
).
IF sy-subrc <>0.
MESSAGEID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* show HTML object with PDF
go_html_viewer->show_url(
EXPORTING
url = l_url
in_place ='X'
EXCEPTIONS
cntl_error =1
cnht_error_not_allowed =2
cnht_error_parameter =3
dp_error_general =4
OTHERS=5
).
IF sy-subrc <>0.
MESSAGEID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM .
FORM get_pdf_as_rawtable
USING
it_otf TYPE tsfotf
CHANGING
ct_pdf_rawtable TYPESTANDARDTABLE
c_pdf_size TYPE i.
DATA: lt_dummylines TYPE tlinetab,
l_pdf_xstring TYPE xstring.
CALLFUNCTION 'CONVERT_OTF'
EXPORTING
format ='PDF'
IMPORTING
bin_filesize = c_pdf_size
bin_file = l_pdf_xstring
TABLES
otf = it_otf[]
lines = lt_dummylines[]
EXCEPTIONS
err_max_linewidth =1
err_format =2
err_conv_not_possible =3
err_bad_otf =4
OTHERS =5.
IF sy-subrc <>0.
MESSAGEID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE .
PERFORM xstring_to_rawtable
USING l_pdf_xstring ct_pdf_rawtable .
ENDIF.
ENDFORM .
FORM xstring_to_rawtable
USING
i_xstring TYPE xstring
CHANGING
ct_rawtable TYPESTANDARDTABLE .
FIELD-SYMBOLS: <l_raw> TYPE x .
DATA: l_ref TYPEREFTO data .
DATA: l_size TYPE i, l_offset TYPE i, l_len TYPE i .
DATA: lo_table TYPEREFTO cl_abap_tabledescr .
DATA: lo_line TYPEREFTO cl_abap_datadescr .
l_size = xstrlen( i_xstring ) .
"create table work area
lo_table ?= cl_abap_tabledescr=>describe_by_data( ct_rawtable ) .
lo_line ?= lo_table->get_table_line_type( ).
CREATEDATA l_ref TYPEHANDLE lo_line .
ASSIGN l_ref->* TO<l_raw> . "should dump if wrong table type passed
"set data length
l_len = cl_abap_typedescr=>describe_by_data( <l_raw> )->length .
"limit data length
IF l_offset + l_len GT l_size .
l_len = l_size - l_offset .
ENDIF.
WHILE l_offset LT l_size.
<l_raw> = i_xstring+l_offset(l_len) .
APPEND<l_raw> TO ct_rawtable .
"offset to next data line
ADD l_len TO l_offset .
"limit length of last data line
IF l_offset + l_len GT l_size .
l_len = l_size - l_offset .
ENDIF.
ENDWHILE .
ENDFORM .
Create a dynpro 0100 for the program as follows:
- add custom container named GC_HTML_VIEWER
- add flow logic as follows:
PROCESS BEFORE OUTPUT.
MODULE create_viewer .
*
PROCESS AFTER INPUT.
MODULE user_command.
Finally, create a GUI status named SIMPLE, with nothing but EXIT, BACK and CANC functions enabled:
Activate everything and program should run. Then create a report transaction for it and test it under ICF services.
cheers
Jānis