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 zcl_sample_pdf DEFINITION PUBLIC.
PUBLIC SECTION.
INTERFACES z2ui5_if_app.
DATA mv_pdf TYPE string.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_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) = cl_web_http_utility=>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 = `isTrustedSource` b = abap_true
)->a( n = `title` v = `Invoice 4711`
)->a( n = `height` v = `600px` ).
client->view_display( view->stringify( ) ).
ENDIF.
ENDMETHOD.
ENDCLASS.isTrustedSource is what puts the document on the screen: without it, UI5 1.121 and later, and the recent patches of the older maintenance lines (1.71 from 1.71.63), show "The PDF cannot be displayed" in its place. Set it for a PDF your own system produced — a patch that does not know the property ignores it.
To show the viewer as a dialog instead, keep it in the page's dependents and call its open method with cs_event-control_by_id — sample Z2UI5_CL_SMP_APP_449 below does exactly that. Leaving height off does not make it one: the viewer stays in the page.
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 catalog that use what this page describes. Each is a single class in abap2UI5/samples unless its row names another of the three sample repositories — pull that repository with abapGit and start the class with ?app_start=<class>.
| Sample | Class |
|---|---|
| Open the PDF Viewer by ID (A) | Z2UI5_CL_SMP_APP_449 |
