其实打印到pdf完全不需要程序,只要你装了pdf打印生成软件,打印的时候选择pdf也就行了。
本文的程序非我所做,不过也不知道从哪里拿到的了。在不经意间看到了,于是在机器上测试下,发现有些地方需要更正。改好了,测试好了,放上来分享给大家。
程序源代码如下:
*-- Enhancements: only allow to be run with variant. Then called
*-- program will be transparent to users
*-- TABLES
TABLES:
TSP01.
*-- STRUCTURES
DATA:
MSTR_PRINT_PARMS LIKE PRI_PARAMS,
MC_VALID(1) TYPE C,
MI_BYTECOUNT TYPE I,
MI_LENGTH TYPE I,
MI_RQIDENT LIKE TSP01-RQIDENT.
*-- INTERNAL TABLES
DATA:
MTAB_PDF LIKE TLINE OCCURS 0 WITH HEADER LINE,
MC_FILENAME LIKE RLGRAP-FILENAME.
*-- SELECTION SCREEN
PARAMETERS:
P_REPID LIKE SY-REPID, " Report to execute
P_LINSZ LIKE SY-LINSZ DEFAULT 132, " Line size
P_PAART LIKE SY-PAART DEFAULT 'X_65_132'. " Paper Format
START-OF-SELECTION.
CONCATENATE 'd:\'
P_REPID
'.pdf'
INTO MC_FILENAME.
*-- Setup the Print Parmaters
CALL FUNCTION 'GET_PRINT_PARAMETERS'
EXPORTING
COPIES = '1'
NEW_LIST_ID = 'X'
NO_DIALOG = 'X'
USER = SY-UNAME
IMPORTING
OUT_PARAMETERS = MSTR_PRINT_PARMS
VALID = MC_VALID
EXCEPTIONS
ARCHIVE_INFO_NOT_FOUND = 1
INVALID_PRINT_PARAMS = 2
INVALID_ARCHIVE_PARAMS = 3
OTHERS = 4.
*-- Make sure that a printer destination has been set up
*-- If this is not done the PDF function module ABENDS
IF MSTR_PRINT_PARMS-PDEST = SPACE.
MSTR_PRINT_PARMS-PDEST = 'LOCL'.
ENDIF.
*-- Explicitly set line width, and output format so that
*-- the PDF conversion comes out OK
MSTR_PRINT_PARMS-LINSZ = P_LINSZ.
MSTR_PRINT_PARMS-PAART = P_PAART.
SUBMIT (P_REPID) TO SAP-SPOOL WITHOUT SPOOL DYNPRO
SPOOL PARAMETERS MSTR_PRINT_PARMS
VIA SELECTION-SCREEN
AND RETURN.
*-- Find out what the spool number is that was just created
PERFORM GET_SPOOL_NUMBER USING SY-REPID
SY-UNAME
CHANGING MI_RQIDENT.
*-- Convert Spool to PDF
CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
EXPORTING
SRC_SPOOLID = MI_RQIDENT
NO_DIALOG = SPACE
DST_DEVICE = MSTR_PRINT_PARMS-PDEST
IMPORTING
PDF_BYTECOUNT = MI_BYTECOUNT
TABLES
PDF = MTAB_PDF
EXCEPTIONS
ERR_NO_ABAP_SPOOLJOB = 1
ERR_NO_SPOOLJOB = 2
ERR_NO_PERMISSION = 3
ERR_CONV_NOT_POSSIBLE = 4
ERR_BAD_DESTDEVICE = 5
USER_CANCELLED = 6
ERR_SPOOLERROR = 7
ERR_TEMSEERROR = 8
ERR_BTCJOB_OPEN_FAILED = 9
ERR_BTCJOB_SUBMIT_FAILED = 10
ERR_BTCJOB_CLOSE_FAILED = 11
OTHERS = 12.
DATA: LF TYPE STRING.
LF = MC_FILENAME.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
* BIN_FILESIZE =
FILENAME = LF
FILETYPE = 'BIN'
* APPEND = ' '
* WRITE_FIELD_SEPARATOR = ' '
* HEADER = '00'
* TRUNC_TRAILING_BLANKS = ' '
* WRITE_LF = 'X'
* COL_SELECT = ' '
* COL_SELECT_MASK = ' '
* DAT_MODE = ' '
* CONFIRM_OVERWRITE = ' '
* NO_AUTH_CHECK = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* WRITE_BOM = ' '
* TRUNC_TRAILING_BLANKS_EOL = 'X'
* WK1_N_FORMAT = ' '
* WK1_N_SIZE = ' '
* WK1_T_FORMAT = ' '
* WK1_T_SIZE = ' '
* WRITE_LF_AFTER_LAST_LINE = ABAP_TRUE
* SHOW_TRANSFER_STATUS = ABAP_TRUE
* IMPORTING
* FILELENGTH =
TABLES
DATA_TAB = MTAB_PDF
* FIELDNAMES =
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
GUI_REFUSE_FILETRANSFER = 3
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6
HEADER_NOT_ALLOWED = 7
SEPARATOR_NOT_ALLOWED = 8
FILESIZE_NOT_ALLOWED = 9
HEADER_TOO_LONG = 10
DP_ERROR_CREATE = 11
DP_ERROR_SEND = 12
DP_ERROR_WRITE = 13
UNKNOWN_DP_ERROR = 14
ACCESS_DENIED = 15
DP_OUT_OF_MEMORY = 16
DISK_FULL = 17
DP_TIMEOUT = 18
FILE_NOT_FOUND = 19
DATAPROVIDER_EXCEPTION = 20
CONTROL_FLUSH_ERROR = 21
OTHERS = 22.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* CALL FUNCTION 'DOWNLOAD'
* EXPORTING
* bin_filesize = mi_bytecount
* filename = mc_filename
* filetype = 'BIN'
* IMPORTING
* act_filename = mc_filename
* TABLES
* data_tab = mtab_pdf.
*-------------------------------------------------------------------*
* FORM get_spool_number *
*-------------------------------------------------------------------*
* Get the most recent spool created by user/report *
*-------------------------------------------------------------------*
* --> F_REPID *
* --> F_UNAME *
* --> F_RQIDENT *
*-------------------------------------------------------------------*
FORM GET_SPOOL_NUMBER USING F_REPID
F_UNAME
CHANGING F_RQIDENT.
DATA:
LC_RQ2NAME LIKE TSP01-RQ2NAME.
CONCATENATE F_REPID+0(9)
F_UNAME+0(3)
INTO LC_RQ2NAME.
SELECT * FROM TSP01 WHERE RQ2NAME = LC_RQ2NAME
ORDER BY RQCRETIME DESCENDING.
F_RQIDENT = TSP01-RQIDENT.
EXIT.
ENDSELECT.
IF SY-SUBRC NE 0.
CLEAR F_RQIDENT.
ENDIF.
ENDFORM." get_spool_number