Vous êtes sur la page 1sur 3

GENERACIÓN Y DESCARGA DE ADOBE FORMS UNIDOS EN UN ÚNICO PDF

Declaración de datos que vamos a tener que utilizar:


DATA: ls_outputparams TYPE sfpoutputparams,
ls_docparams TYPE sfpdocparams,
lv_fm_name TYPE rs38l_fnam,
ls_pdf_file TYPE fpformoutput.

DATA: pdf_merger TYPE REF TO cl_rspo_pdf_merge,


merged_document TYPE xstring,
rc TYPE i VALUE 0,

tab_pdf TYPE tfpcontent


tab_pdf_aux TYPE tfpcontent,
wa_pdf TYPE fpcontent.

DATA: lv_filename TYPE string VALUE 'C:\Pruebas\ImpresoPrueba.pdf',


gt_data TYPE TABLE OF x255,
gt_content TYPE TABLE OF xstring WITH HEADER LINE.

Pasos a seguir:

1. Se recorre la tabla interna donde estén los datos de los elementos (pedidos, facturas, etc.) que queremos
mostrar vía Adobe Form:

LOOP AT it_datos INTO ls_datos.

ENDLOOP.

2. EN LA PRIMERA ITERACIÓN de la tabla (nuestro primer documento), debemos abrir un job, pasándole estos
datos (o muy similares):

ls_outputparams -connection = 'ADS'.


ls_outputparams -preview = ''.
ls_outputparams -getpdf = ''.
ls_outputparams -nodialog = 'X'.

ls_outputparams-copies = 1.
ls_outputparams-bumode = '-'.
ls_outputparams-suffix1 = 'SPDF'.
ls_outputparams-suffix2 = sy-uname.
ls_outputparams-arcmode = 1.

CALL FUNCTION 'FP_JOB_OPEN'


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

IF sy-subrc <> 0.
ENDIF.
3. EN CADA ITERACIÓN llamamos a la función que nos dice el nombre del formulario, como siempre:

CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'


EXPORTING
i_name = 'ZSSD_FACTURA_PEDIDO'
IMPORTING
e_funcname = lv_fm_name.

4. EN CADA ITERACIÓN llamamos al Adobe Form. Traemos de vuelta la estructura ls_pdf_file rellena.

ls_docparams-langu = i_spras.

CALL FUNCTION lv_fm_name


EXPORTING
/1bcdwb/docparams = ls_docparams
bil_prt_com = gs_interface
IMPORTING
/1bcdwb/formoutput = ls_pdf_file
EXCEPTIONS
usage_error = 1
system_error = 2
internal_error = 3
OTHERS = 4.

5. EN CADA ITERACIÓN hacemos un append de la estructura ls_pdf_file-pdf a la tabla tab_pdf.

IF sy-subrc = 0.

APPEND ls_pdf_file-pdf TO tab_pdf.

ENDIF.

6. EN LA ÚLTIMA ITERACIÓN de la tabla (nuestro último documento a imprimir), lo primero que hacemos es
cerrar el job:
CALL FUNCTION 'FP_JOB_CLOSE'
EXCEPTIONS
usage_error = 1
system_error = 2
internal_error = 3
OTHERS = 4.

IF sy-subrc <> 0.
ENDIF.

7. A continuación creamos el objeto pdf_merger, recorremos la table tab_pdf (que hemos ido alimentando en
cada paso 5) y añadimos cada documento al objeto recién creado.

CREATE OBJECT pdf_merger.

LOOP AT tab_pdf INTO wa_pdf.


pdf_merger->add_document( wa_pdf ).
ENDLOOP.
8. Cuando todos los documentos estén en el objeto pdf_merger, hacer un “merge” de los mismos, esto es, una
fusión de todos los documentos en un único PDF. Si el proceso se realiza correctamente, haremos un append
del merged_document a una tabla auxiliar llamada tab_pdf_aux.

pdf_merger->merge_documents(
IMPORTING merged_document = merged_document
rc = rc ).

IF rc = 0.
APPEND merged_document TO tab_pdf_aux.
ENDIF.

9. Sustituimos la tabla original tab_pdf por el contenido de la nueva tabla tab_pdf_aux, leemos su primer índice
(el único que tendremos ahora mismo) y cargamos el contenido en la tabla gt_content.

tab_pdf[] = tab_pdf_aux[].

READ TABLE tab_pdf INTO DATA(ls_tab) INDEX 1.

IF sy-subrc = 0.

gt_content = ls_tab.
APPEND gt_content.

ENDIF.

10. Ahora solo queda descargar el PDF, en este tutorial hemos usado la función GUI_DOWNLOAD, aunque se
pueden utilizar otras opciones. Para poder ejecutar correctamente esta función, tenemos que convertir el
contenido de la tabla gt_content a formato BIN, y lo guardamos en otra tabla llamada gt_data.

CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'


EXPORTING
buffer = gt_content
append_to_table = 'X'
TABLES
binary_tab = gt_data.

11. Finalmente, procedemos a la descarga del archivo PDF en el ordenador, en la ruta indicada en la declaración
de la variable lv_filename. Si el proceso termina correctamente, tendremos un único archivo pdf guardado
en el PC, que contiene todos nuestros formularios, uno detrás de otro .

CALL FUNCTION 'GUI_DOWNLOAD'


EXPORTING
filename = lv_filename
filetype = 'BIN'
TABLES
data_tab = gt_data

EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3

etc.