PDF
Render a PDF directly in your app — for printouts from Adobe Forms, SmartForms, archived documents from the Content Server, or anything else that produces an xstring.
Show It in Your Own View
sap.m.PDFViewer renders the document inline. It takes the PDF as a data:application/pdf;base64,... URI, so the whole job is: get the bytes, base64 them, bind the result.
Press Run — the base64 below is a real one-page PDF, so the viewer has something to show:
CLASS z2ui5_cl_sample_pdf DEFINITION PUBLIC.
PUBLIC SECTION.
INTERFACES z2ui5_if_app.
DATA mv_pdf TYPE string.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS z2ui5_cl_sample_pdf IMPLEMENTATION.
METHOD z2ui5_if_app~main.
IF client->check_on_navigated( ).
" In a real app this is your document, base64-encoded:
" DATA(lv_base64) = z2ui5_cl_util=>conv_encode_x_base64( lv_xstring ).
" where lv_xstring comes from cl_fp_function_module=>get_pdf, an OTF
" conversion of a SmartForm, or a SELECT from the archive.
mv_pdf = `data:application/pdf;base64,` &&
`JVBERi0xLjQKMSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMiAwIFIgPj4KZW5kb2JqCjIgMCBvYmoKPDwg` &&
`L1R5cGUgL1BhZ2VzIC9LaWRzIFszIDAgUl0gL0NvdW50IDEgPj4KZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1BhZ2Ug` &&
`L1BhcmVudCAyIDAgUiAvTWVkaWFCb3ggWzAgMCA1OTUgODQyXSAvUmVzb3VyY2VzIDw8IC9Gb250IDw8IC9GMSA0IDAg` &&
`UiA+PiA+PiAvQ29udGVudHMgNSAwIFIgPj4KZW5kb2JqCjQgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1R5` &&
`cGUxIC9CYXNlRm9udCAvSGVsdmV0aWNhID4+CmVuZG9iago1IDAgb2JqCjw8IC9MZW5ndGggNTMgPj4Kc3RyZWFtCkJU` &&
`IC9GMSAyNCBUZiA2MCA3MDAgVGQgKGFiYXAyVUk1IC0gUERGIFZpZXdlcikgVGogRVQKZW5kc3RyZWFtCmVuZG9iagp4` &&
`cmVmCjAgNgowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMDkgMDAwMDAgbiAKMDAwMDAwMDA1OCAwMDAwMCBuIAow` &&
`MDAwMDAwMTE1IDAwMDAwIG4gCjAwMDAwMDAyNDEgMDAwMDAgbiAKMDAwMDAwMDMxMSAwMDAwMCBuIAp0cmFpbGVyCjw8` &&
`IC9TaXplIDYgL1Jvb3QgMSAwIFIgPj4Kc3RhcnR4cmVmCjQxMwolJUVPRgo=`.
DATA(view) = z2ui5_cl_ui5_view_builder=>factory(
)->ele( n = `View` ns = `mvc`
)->a( n = `xmlns` v = `sap.m`
)->a( n = `xmlns:mvc` v = `sap.ui.core.mvc`
)->ele( `Page`
)->a( n = `title` v = `Invoice 4711`
)->tag( `PDFViewer`
)->a( n = `source` v = client->_bind( mv_pdf )
)->a( n = `title` v = `Invoice 4711`
)->a( n = `height` v = `600px` ) ).
client->view_display( view->stringify( ) ).
ENDIF.
ENDMETHOD.
ENDCLASS.Leave height off and the viewer opens in its own dialog instead of sitting in the page — the same control, one property apart.
The base64 string travels in the model, so a large document is a large roundtrip. Past a few megabytes, offer the download below rather than rendering it inline.
For a ready-made dialog with a title bar and buttons, the popups add-on carries one.
Download Instead of Display
To let the user save the PDF rather than view it inline, use the file download pattern:
client->follow_up_action(
val = client->cs_event-download_b64_file
t_arg = VALUE #( ( `data:application/pdf;base64,` && lv_base64 )
( `invoice_4711.pdf` ) ) ).TIP
On older ABAP releases without cl_web_http_utility, use cl_http_utility=>if_http_utility~encode_x_base64( lv_xstring ) instead.
Working Samples
Complete apps from the sample catalogue that use what this page describes. Each is a single class — pull the repository with abapGit and start it with ?app_start=<class>.
| Sample | Class |
|---|---|
| Open the PDF Viewer by ID (A) | Z2UI5_CL_SMP_APP_449 |
