smartforms 打印转成保存在本地pdf

本文介绍如何使用SAP SmartForms创建PDF文件并下载。通过调用CONVERT_OTF和WS_DOWNLOAD函数模块,实现从SmartForms到PDF的转换及文件下载流程。文章提供了具体的ABAP代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://www.kodyaz.com/articles/sap-smartforms-download-as-smartform-pdf-using-ws_download-and-cl_gui_frontend_services.aspx

 

说明的很详细,代码也很明了。

 

  • 形成一个url,保存地址
  • 打开smartforms
  • 执行smartforms,并返回job_output_info 类型的内表,这个smart 表接口-导出默认的
  • 转换格式fm: convert_off
  • 下载:fm : ws_download.

2个重要的fm及其参数:

  •   
<think>首先,用户的问题是关于SAP SmartForms的:"我想在使用SAP SmartForms时,打印操作未弹出窗口且需要生成PDF的解决方案 请问SAP SmartForms 打印不弹窗并生成 PDF 的问题解决方法"。意思是他们想在使用SAP SmartForms时,打印操作不弹出窗口,而是直接生成PDF文件。 我需要参考系统提供的引用。引用来自用户消息的最后部分: - 引用[1]: 解释了SAP打印原理,包括假脱机请求和输出请求,以及如何配置打印设备。 - 引用[2]: 提到SMARTFORMSPDF并添加为邮件附件的过程,包括获取XSTRING文件、调用CONVERT_OTFSPOOLJOB_2_PDF函数等。 - 引用[3]: 讨论系统变式和客户变式。 - 引用[4]: 关于ALV报表练习,使用REUSE_ALV_GRID_DISPLAY_LVC函数。 用户的问题集中在SmartForms打印不弹窗并生成PDF,所以我应该重点参考引用[2],因为它直接涉及SmartFormsPDF。 关键点: - 在SAP中,打印操作通常涉及弹出窗口来选择打印机或设置。用户想避免这个弹出窗口,并直接生成PDF文件。 - 解决方案可能涉及后台处理或直接调用函数来生成PDF。 从引用[2]中:"4.SmartformsPDF并添加为邮件附件",它描述了如何将SmartForms输出转换为PDF格式。具体步骤: - 4.1 获取Smartforms的XSTRING文件:这可能通过调用函数来生成SmartForms的输出。 - 4.2 调用CONVERT_OTFSPOOLJOB_2_PDF打印池中的信息转换为PDF。 - 4.3 添加附件。 所以,对于不弹窗生成PDF,我们可以使用类似的方法:在代码中直接调用函数来生成PDF,而不经过用户交互。 在SAP ABAP中,处理SmartForms打印时,可以设置输出选项以避免弹出窗口。常见的方法是使用函数模块如SSF_FUNCTION_MODULE_NAME来获取SmartForms的函数模块,然后调用它时设置输出参数。 步骤总结: 1. 获取SmartForms的函数模块名称。 2. 设置控制参数,指定输出类型为PDF或直接到文件。 3. 调用函数,避免弹出对话框。 具体函数: - SSF_FUNCTION_MODULE_NAME:用于获取SmartForms的函数模块名。 - 然后调用该函数模块,设置输出设备为'PDF1'或类似,表示生成PDF。 - 使用输出参数如OTF或XSTRING来获取PDF数据。 在引用[2]中提到的CONVERT_OTFSPOOLJOB_2_PDF是将OTF(Output Text Format)转换为PDF的函数。 OTF是SAP打印的一种格式,可以转换为PDF。 为了不弹窗,我们需要在调用打印函数时设置NO_DIALOG参数或类似选项。 在ABAP代码中,当调用SmartForms时,可以设置控制结构中的参数。 例如: - 在函数调用中,使用CONTROL_PARAMETERS结构,设置NO_DIALOG为'X'。 - 设置OUTPUT_OPTIONS,如GET_PDF或直接生成文件。 标准方法: - 使用函数SSF_OPEN、SSF_CLOSE等,但更常见的是使用SSF_FUNCTION_MODULE_NAME。 - 然后调用生成的函数模块,设置参数。 从引用[1]:"SAP系统以不同的方式处理ABAP列表打印Smartforms打印",但配置类似。 对于直接生成PDF而不弹窗,解决方案是: 1. 在代码中指定输出设备为PDF打印机。 2. 设置NO_DIALOG标志。 3. 处理生成的PDF数据。 在SAP中,可以配置一个输出设备为'PDF1',它代表生成PDF文件。 然后,在调用打印时,指定这个设备,并设置NO_DIALOG。 在ABAP中: - 首先,确保有一个输出设备配置为PDF,如'PDF1'。 - 然后,在调用SmartForms时: - 使用函数SSF_FUNCTION_MODULE_NAME获取函数名。 - 定义控制参数:CONTROL_PARAMETERS-NO_DIALOG = 'X'。 - CONTROL_PARAMETERS-DEVICE = 'PDF1'。 // 或类似设备 - 调用函数模块。 - 输出可以存储在OTF或XSTRING中。 然后,如果需要,可以保存为文件或处理。 从引用[2]:"4.2调用CONVERT_OTFSPOOLJOB_2_PDF打印池中的信息转换为PDF",所以可能先生成OTF,然后转换。 但更直接的方式是设置DEVICE为'PDF1'来直接获取PDF。 在SAP中,'PDF1'设备通常用于生成PDF。 参考用户问题:"打印操作未弹出窗口",所以我们需要抑制对话框。 在CONTROL_PARAMETERS中,有NO_DIALOG选项。 结构:SSFCRTCL_CTRL,其中包含NO_DIALOG字段。 标准代码示例: DATA: lv_fm_name TYPE rs38l_fnam, ls_output_options TYPE ssfcompop, ls_control_params TYPE ssfctrlop. CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = 'YOUR_SMARTFORM_NAME' IMPORTING fm_name = lv_fm_name. ls_control_params-no_dialog = 'X'. " 不显示对话框 ls_control_params-device = 'PDF1'. " 输出到PDF ls_output_options-tdprinter = 'PDF1'. " 或其他选项 " 调用SmartForms函数 CALL FUNCTION lv_fm_name EXPORTING control_parameters = ls_control_params output_options = ls_output_options IMPORTING job_output_info = ... " 可以获取输出信息 document_output_info = ... " 或直接获取PDF数据 . 对于PDF,可能需要处理OTF数据,然后转换。 当DEVICE设置为'PDF1'时,输出可能直接是PDF格式,或者需要转换。 在引用[2]中,他们使用CONVERT_OTFSPOOLJOB_2_PDF,所以可能先生成OTF,然后转换。 但为了简化,我们可以直接设置输出为PDF。 在SAP中,使用'PDF1'设备可以直接生成PDF二进制数据。 然后,可以保存为文件或发送。 现在,回答结构: - 系统级指令:使用$...$ for inline math, $$...$$ for display math, but in this context, probably no math needed. 用户问题涉及SAP编程,不涉及数学公式,所以可能不需要LaTeX数学。但指令说所有行内数学表达式必须使用$...$,但这里没有数学,所以忽略。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识,如[^1]。 回答结构清晰:逐步解决问题。 先概述问题,然后提供解决方案步骤。 最后,生成相关问题。 参考引用: - 引用[1]:关于打印原理,但可能不直接相关。 - 引用[2]:直接相关,提到SmartFormsPDF。 - 引用[3]和[4]:可能不直接相关。 所以,在回答中引用[2]。 解决方案步骤: 1. 确保SAP系统配置了PDF输出设备,如'PDF1'。 2. 在ABAP代码中,调用SmartForms时设置控制参数以抑制对话框并指定PDF输出。 3. 处理生成的PDF数据。 详细代码示例。 使用函数: - 获取SmartForms函数模块:SSF_FUNCTION_MODULE_NAME。 - 设置CONTROL_PARAMETERS:NO_DIALOG = 'X', DEVICE = 'PDF1'。 - 调用函数模块,可能获取OTF数据。 - 然后,如果需要,使用CONVERT_OTFSPOOLJOB_2_PDF转换为PDF(但设置DEVICE='PDF1'可能直接输出PDF)。 在SAP中,当DEVICE设置为'PDF1'时,输出是PDF格式,可以直接获取。 在函数调用中,可以设置EXPORTING参数来获取PDF数据。 例如,在调用SmartForms函数时,设置: IMPORTING document_output_info = ls_doc_output 其中ls_doc_output-type 'PDF' and data. 具体: 在调用函数模块时,有一个参数如DOCUMENT_OUTPUT_INFO,可以包含PDF数据。 但更常见的是,输出存储在假脱机请求中,然后检索。 为了避免弹出窗口,直接生成,我们可以使用以下方法: 设置CONTROL_PARAMETERS-NO_DIALOG = 'X' and DEVICE = 'PDF1'. 然后,在OUTPUT_OPTIONS中,设置TDDEST to 'PDF1'. 调用函数后,PDF数据可以存储在变量中。 函数模块通常有TABLES参数或类似来接收输出。 对于SmartForms,调用生成的函数时,有参数如: - JOB_OUTPUT_INFO of type SSFCRESPD, which contains OTF data. 然后,使用CONVERT_OTF_2_PDF将OTF转换为PDF。 从引用[2]:"调用CONVERT_OTFSPOOLJOB_2_PDF打印池中的信息转换为PDF",所以可能先生成OTF,然后转换。 CONVERT_OTFSPOOLJOB_2_PDF是标准函数。 所以步骤: 1. 调用SmartForms函数,设置NO_DIALOG和DEVICE(但DEVICE可以是'PRINTER'或'PDF1',但为了OTF,设置DEVICE类型)。 为了生成OTF而不打印,设置DEVICE为'PRINTER'但指定输出类型。 在CONTROL_PARAMETERS中,设置GETOTF = 'X' to get OTF data directly. 然后,调用函数时,GETOTF参数会返回OTF数据。 然后,转换OTF到PDF。 标准方法: - 设置 CONTROL_PARAMETERS-NO_DIALOG = 'X' - CONTROL_PARAMETERS-GETOTF = 'X' // 获取OTF数据 - 调用函数模块 - 在JOB_OUTPUT_INFO-OTFDATA中获取OTF数据 - 然后调用函数 CONVERT_OTF_2_PDF 将OTF转换为PDF 函数 CONVERT_OTF_2_PDF 或 CONVERT_OTFSPOOLJOB_2_PDF。 CONVERT_OTFSPOOLJOB_2_PDF 用于假脱机请求,但如果有OTF数据,可以直接使用 CONVERT_OTF_2_PDF。 在SAP中,函数模块是 'CONVERT_OTF_2_PDF_DATA' 或类似。 从引用[2]:"调用CONVERT_OTFSPOOLJOB_2_PDF",但那是针对假脱机请求。 如果直接获取OTF,可以使用 'CONVERT_OTF_2_PDF'。 但 'CONVERT_OTF_2_PDF' 可能不是标准函数;标准的是 'CONVERT_OTFSPOOLJOB_2_PDF'。 更简单:当设置 DEVICE='PDF1' 时,输出可以直接是 PDF。 在输出选项中,可以指定。 在调用函数时,设置 OUTPUT_OPTIONS-TDGETPDF = 'X' 来直接获取 PDF。 但需要检查文档。 常见做法: - 设置 CONTROL_PARAMETERS-NO_DIALOG = 'X' - 设置 CONTROL_PARAMETERS-DEVICE = 'PDF1' // 用于 PDF 输出 - 然后调用函数,PDF 数据可以在 DOCUMENT_OUTPUT_INFO 或类似参数中。 在函数模块中,有一个参数如 PDF_CONTENT 或类似。 但通常,对于 SmartForms,调用函数后,PDF 数据存储在假脱机中,然后可以检索。 为了避免弹出窗口,直接生成: 定义: DATA: ls_control TYPE ssfctrlop, ls_output TYPE ssfcompop, lt_otf TYPE TABLE OF itcoo, ls_doc_output TYPE ssfcrescl. " 获取函数模块名称 CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = 'ZSMARTFORM' IMPORTING fm_name = lv_fm_name. " 设置控制参数 ls_control-no_dialog = 'X'. " 抑制对话框 ls_control-getotf = 'X'. " 获取 OTF 数据 ls_control-device = 'PRINTER'. " 设置为打印机,但获取 OTF " 输出选项 ls_output-tddest = 'PDF1'. " 或其他 PDF 设备 " 调用 SmartForms 函数 CALL FUNCTION lv_fm_name EXPORTING control_parameters = ls_control output_options = ls_output IMPORTING job_output_info = ls_doc_output. " 现在 ls_doc_output-otfdata 包含 OTF 数据 " 然后转换 OTF 到 PDF DATA: lt_pdf TYPE TABLE OF tline, lv_pdf_size TYPE i, lv_pdf_data TYPE solix_tab. CALL FUNCTION 'CONVERT_OTF_2_PDF' EXPORTING format = 'PDF' TABLES otf = ls_doc_output-otfdata doctab_archive = lt_pdf " 或使用 lines 参数 EXCEPTIONS err_max_linewidth = 1 err_format = 2 err_conv_not_possible = 3 OTHERS = 4. " lt_pdf 包含 PDF 行,但通常使用二进制 " 更好的方法是使用 'CONVERT_OTFSPOOLJOB_2_PDF' 或直接处理 函数 'CONVERT_OTF_2_PDF' 可能已弃用;标准方法是使用 'CONVERT_OTFSPOOLJOB_2_PDF' 或 'SCMS_OTF_TO_PDF'。 在较新系统中,使用类或函数模块 'CL_RSWR_OTF_UTILITIES'。 但为了简单,从引用[2]:"调用CONVERT_OTFSPOOLJOB_2_PDF",所以类似。 在获取OTF后,调用函数 'CONVERT_OTFSPOOLJOB_2_PDF' 来转换。 但 'CONVERT_OTFSPOOLJOB_2_PDF' 需要假脱机编号,而如果我们有OTF数据,就不需要。 更好的方法是使用 'SCMS_OTF_TO_PDF' 或其他。 标准函数:'CONVERT_OTF_2_PDF_DATA' 可以转换OTF表为PDF二进制。 在ABAP中,可以使用: DATA: lt_otf TYPE TABLE OF itcoo, lt_pdf_data TYPE solix_tab. " 假设 lt_otf 包含 OTF 数据 CALL FUNCTION 'CONVERT_OTF_2_PDF_DATA' EXPORTING format = 'PDF' TABLES otf_data = lt_otf pdf_data = lt_pdf_data EXCEPTIONS OTHERS = 1. 然后,lt_pdf_data 包含二进制 PDF 数据,可以保存为文件。 在代码中,设置 GETOTF 后,OTF 数据在 JOB_OUTPUT_INFO-OTFDATA 中。 在回答中,提供代码示例。 最后,生成相关问题。</think>### SAP SmartForms 打印不弹窗并生成 PDF 的解决方案 在 SAP 系统中,使用 SmartForms 进行打印操作时,默认会弹出打印对话框要求用户选择打印机或设置参数。如果您希望避免弹出窗口,并直接生成 PDF 文件,可以通过 ABAP 代码后台处理来实现。核心思路是:在调用 SmartForms 函数时,设置控制参数抑制对话框,并指定输出为 PDF 格式,然后处理生成的 PDF 数据。以下是逐步解决方案,基于 SAP 标准功能和最佳实践。 #### 解决方案步骤 1. **确保系统配置 PDF 输出设备**: 在 SAP 中,需要先配置一个 PDF 输出设备(如 `PDF1`),用于直接生成 PDF 文件。 - 使用事务码 `SPAD` 进入打印设备配置。 - 创建或修改设备类型为 `CNSAPWIN: MS Windows driver via SAPLPD`(或其他支持 PDF 的设备),并设置输出格式为 PDF[^1]。 - 如果已配置,可跳过此步;否则,参考引用[1]中的打印原理进行设置。 2. **在 ABAP 代码中调用 SmartForms 并设置参数**: 使用函数模块 `SSF_FUNCTION_MODULE_NAME` 获取 SmartForms 的函数名,然后调用该函数时,通过控制参数抑制弹窗并指定 PDF 输出。关键点包括: - 设置 `CONTROL_PARAMETERS-NO_DIALOG = 'X'` 以避免弹出窗口。 - 设置 `CONTROL_PARAMETERS-GETOTF = 'X'` 来获取 OTF(Output Text Format)数据,OTF 是 SAP 的中间打印格式,可转换为 PDF。 - 指定输出设备为 PDF(如 `PDF1`),确保输出直接生成 PDF 数据。 - 然后,使用函数 `CONVERT_OTF_2_PDF_DATA` 将 OTF 数据转换为 PDF 二进制格式(参考引用[2]中的类似方法)。 3. **处理生成的 PDF 数据**: 转换后的 PDF 数据可以保存为文件、发送邮件或进一步处理。例如,保存到应用服务器或前端设备。 #### 完整 ABAP 代码示例 以下是一个完整的 ABAP 程序示例,演示如何实现不弹窗生成 PDF。假设您的 SmartForms 名称为 `ZSMARTFORM_DEMO`(请替换为实际名称)。 ```abap REPORT zsmartforms_to_pdf_no_dialog. * 定义数据类型 DATA: lv_fm_name TYPE rs38l_fnam, " SmartForms 函数模块名 ls_control TYPE ssfctrlop, " 控制参数 ls_output TYPE ssfcompop, " 输出选项 ls_job_output TYPE ssfcrespd, " 作业输出信息(包含 OTF 数据) lt_otf TYPE TABLE OF itcoo, " OTF 数据表 lt_pdf_data TYPE solix_tab, " PDF 二进制数据表 lv_pdf_size TYPE i, " PDF 文件大小 lv_pdf_xstring TYPE xstring. " PDF 二进制数据(XSTRING 格式) * 步骤1: 获取 SmartForms 的函数模块名称 CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = 'ZSMARTFORM_DEMO' " 替换为您的 SmartForms 名称 IMPORTING fm_name = lv_fm_name EXCEPTIONS no_form = 1 no_function_module = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. * 步骤2: 设置控制参数以抑制弹窗并获取 OTF 数据 ls_control-no_dialog = 'X'. " 不弹出对话框 ls_control-getotf = 'X'. " 获取 OTF 数据 ls_control-device = 'PDF1'. " 指定 PDF 输出设备 * 设置输出选项(可选,用于指定打印机或格式) ls_output-tddest = 'PDF1'. " 输出目标设备 ls_output-tdimmed = 'X'. " 立即输出(避免手动生成输出请求)[^1] * 步骤3: 调用 SmartForms 函数模块 CALL FUNCTION lv_fm_name EXPORTING control_parameters = ls_control output_options = ls_output * 其他 SmartForms 参数(如传入数据) IMPORTING job_output_info = ls_job_output " 获取作业输出信息 EXCEPTIONS formatting_error = 1 internal_error = 2 send_error = 3 user_canceled = 4 OTHERS = 5. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. * 将 OTF 数据复制到表 lt_otf = ls_job_output-otfdata[]. * 步骤4: 将 OTF 数据转换为 PDF IF lt_otf IS NOT INITIAL. CALL FUNCTION 'CONVERT_OTF_2_PDF_DATA' " 标准函数,将 OTF 转 PDF 二进制 EXPORTING format = 'PDF' " 输出格式为 PDF IMPORTING bin_filesize = lv_pdf_size TABLES otf_data = lt_otf " 输入 OTF 数据 pdf_data = lt_pdf_data " 输出 PDF 二进制数据 EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. MESSAGE 'OTF to PDF 转换失败' TYPE 'E'. ENDIF. * 可选:将 PDF 数据转换为 XSTRING(便于保存或传输) CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' EXPORTING input_length = lv_pdf_size IMPORTING buffer = lv_pdf_xstring TABLES binary_tab = lt_pdf_data EXCEPTIONS failed = 1 OTHERS = 2. ENDIF. * 步骤5: 处理 PDF 数据(例如保存到文件) * 示例:保存到应用服务器 DATA: lv_file_path TYPE string VALUE '/tmp/smartform_output.pdf'. " 替换为实际路径 CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING bin_filesize = lv_pdf_size filename = lv_file_path filetype = 'BIN' TABLES data_tab = lt_pdf_data EXCEPTIONS OTHERS = 1. IF sy-subrc = 0. WRITE: 'PDF 文件已生成:', lv_file_path. ELSE. MESSAGE 'PDF 保存失败' TYPE 'E'. ENDIF. ``` #### 关键说明 - **抑制弹窗**:通过 `ls_control-no_dialog = 'X'` 确保打印操作在后台运行,不干扰用户[^1]。 - **生成 PDF**:使用 `CONVERT_OTF_2_PDF_DATA` 函数将 OTF 数据转换为 PDF 二进制(参考引用[2]中的类似方法)。如果您的系统版本较新,可以使用替代函数如 `CL_RSWR_OTF_UTILITIES`,但 `CONVERT_OTF_2_PDF_DATA` 在多数系统兼容。 - **输出处理**:PDF 数据可以保存为文件(如上例)、作为邮件附件发送(参考引用[2]中的邮件附件方法),或内嵌到其他应用。 - **错误处理**:代码包含基本异常处理;在实际应用中,应添加更详细的错误日志。 - **性能**:此方法在后台执行,高效且不依赖用户交互,适用于批量处理或自动化任务。 #### 注意事项 - **权限要求**:执行 ABAP 代码的用户需有权限访问 SmartForms打印设备和文件系统。 - **输出设备配置**:如果未配置 `PDF1`,需先在 `SPAD` 中设置(参考引用[1])。 - **测试建议**:先在测试环境验证,确保 SmartForms 输出内容正确。 - **变式处理**:如果使用系统变式(如以 `SAP&` 或 `CUS&` 开头的变式名称),可集成变式管理以自动化参数设置[^3]。 通过此方法,您可以在 SAP 中实现 SmartForms 打印的无弹窗 PDF 生成,提升用户体验和自动化程度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值