Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
former_member703998
Participant
Dear Friends,

I am writing this blog post, keeping in mind the current scenario, where we have to digitally sign e-invoices, which has both QR code and Digital signature on the same form. The problem with Digitally signing the document via the ADS server is, it removes the QR code from the form.

Introduction


SAP has given a solution for this, via note 2901700. But uses the concept of Job profiles, which works after SP-13. Please refer to note 1743567, to see how to use Job profiles.

In this blog post, we will see how we can get QR code and Digital signature on Adobe Form without using Job profiles. We will basically convert the QR code into the image (BMP) and then Digitally sign the form via ADS Server.

Before implementing the solution please check if you have SAP note 2790500 implemented in your system so that we can use class CL_RSTX_BARCODE_RENDERER. Go to SE24 and check if you have the above class in your system. If not then implement the given note for the same.

Use Case


We are creating an interactive adobe form with 2 fields QR Code and Digital Signature.

Steps



Open transaction SFP



Create Form Interface



Give Description and select interface type as ABAP Dictionary.



Create an importing parameter as IV_QRCODE of type XSTRING. This will be getting QR code image from the driver program as XSTRING. Save and activate the interface.



Create an Adobe Form



Assign Form Interface created above and give the description to the form. Save the form



Create a graphic node QR_CODE



Link Graphic node QR_CODE variable with XSTRING variable IV_QRCODE. Open design view



Create 2 fields in design view:




  • Signature field (SignatureField1)

  • Drag and drop QR_CODE image node


Save and Activate the form


Create Driver program for the form created via SE38 transaction (Executable Program)


Copy and paste the code given below
REPORT zqrdg_dp.

DATA :
lv_fname TYPE rs38l_fnam ,
lv_formname TYPE tdsfname VALUE 'ZQRDG_F',
ls_fpformout TYPE fpformoutput,
lo_fp TYPE REF TO if_fp,
lo_pdfobj TYPE REF TO if_fp_pdf_object,
lv_len TYPE i,
lt_tab TYPE TABLE OF solix,
lv_file_name TYPE string,
lv_timestamps TYPE string,
lv_qrcode TYPE xstring,
iv_barcode_text TYPE string VALUE 'Test QR Data'.

cl_rstx_barcode_renderer=>qr_code(
EXPORTING
i_module_size = 20
i_mode = 'A'
i_error_correction = 'H'
i_barcode_text = iv_barcode_text
IMPORTING
e_bitmap = lv_qrcode
).

DATA(l_control) = VALUE ssfctrlop( no_dialog = 'X' preview = 'X' no_open = '' no_close = '' device = 'Z_ADS' ).

DATA(ls_outputparams) = VALUE sfpoutputparams( getpdf = 'X' dest = 'ZADS' ).

DATA(ls_docparams) = VALUE sfpdocparams( fillable = 'X' ).

CALL FUNCTION 'FP_JOB_OPEN'
CHANGING
ie_outputparams = ls_outputparams
EXCEPTIONS
cancel = 1
usage_error = 2
system_error = 3
internal_error = 4
OTHERS = 5.

CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'
EXPORTING
i_name = lv_formname
IMPORTING
e_funcname = lv_fname.


CALL FUNCTION lv_fname
EXPORTING
/1bcdwb/docparams = ls_docparams
iv_qrcode = lv_qrcode
IMPORTING
/1bcdwb/formoutput = ls_fpformout
EXCEPTIONS
usage_error = 1
system_error = 2
internal_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

CALL FUNCTION 'FP_JOB_CLOSE'
EXCEPTIONS
usage_error = 1
system_error = 2
internal_error = 3
OTHERS = 4.

lo_fp = cl_fp=>get_reference( ).

lo_pdfobj = lo_fp->create_pdf_object( connection = CONV #('ADS') ).

CALL METHOD lo_pdfobj->set_document
EXPORTING
pdfdata = ls_fpformout-pdf.

CALL METHOD lo_pdfobj->set_template
EXPORTING
xftdata = ls_fpformout-pdf
fillable = 'X'.

CALL METHOD lo_pdfobj->set_signature
EXPORTING
keyname = 'STTGlobal' "'ReaderRights' "Signature name from solution manager
fieldname = 'SignatureField1'
reason = 'TEST'
location = 'Mumbai'
contactinfo = 'Rajesh'.
TRY.

CALL METHOD lo_pdfobj->execute( ).

CATCH cx_fp_runtime_internal INTO DATA(lc_interanl).
MESSAGE lc_interanl->get_longtext( ) TYPE 'I'.
CATCH cx_fp_runtime_system INTO DATA(lc_runtime).
MESSAGE lc_runtime->get_longtext( ) TYPE 'I'.
CATCH cx_fp_runtime_usage INTO DATA(lc_usage).
MESSAGE lc_usage->get_longtext( ) TYPE 'I'.

ENDTRY.

* get result -> l_out
CALL METHOD lo_pdfobj->get_document
IMPORTING
pdfdata = DATA(lv_out).

CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = lv_out
* buffer = l_pdf
IMPORTING
output_length = lv_len
TABLES
binary_tab = lt_tab.

GET TIME STAMP FIELD DATA(lv_timestamp).
lv_timestamps = lv_timestamp.
CONCATENATE 'C:\temp\' lv_timestamps '.pdf' INTO lv_file_name.

CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
bin_filesize = lv_len "bitmap2_size "l_len
filename = lv_file_name
filetype = 'BIN'
CHANGING
data_tab = lt_tab
EXCEPTIONS
OTHERS = 1.

Activate the code and run the same. We will get the Form saved at the path given in the code


We can see both QR Code and Digital signature in the form



Conclusion


E-signing the document is a common requirement. The above process will help us in achieving the same. In the future SAP may release notes, wherein we can directly print QR Code and Digital signature without many hurdles. But till that time this code will work.
16 Comments
Labels in this area