带有HR工资单的PDF附件的密码加密邮件触发(已定制)。

2020-09-07 12:27发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)你好大师, 我一直坚持要开发一...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好大师,

我一直坚持要开发一个程序,其中HR Payslip会通过邮件以密码保护格式发送。

我已按照以下方法完成了受密码保护的邮件触发程序。

首先,我安装了一个软件包,其中密码加密库已安装到应用程序服务器中。

然后必须构建用于HR payslip(自定义)中的邮件触发程序。

如果it_reclist []不初始。

呼叫功能'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname ='ZHR_SEQUEL_PAYSLIP1'
IMPORTING
fm_name = fm_name
例外 > no_form = 1
no_function_module = 2
其他=3。
IF sy-subrc <> 0.
*消息ID sy-msgid类型sy-msgty编号sy-msgno
* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4。
ENDIF。

wa_ctrlop-getotf ='X'。
wa_ctrlop-no_dialog ='X'。
wa_compop-tdnoprev = 'X'。

用密钥pernr = wa_final-pernr
earn_desc ='Net Pay'读取表it_​​net到wa_net。
如果sy-subrc =0。
清除wa_final-net_pay。
wa_final-net_pay = wa_net-earn_amt。
ENDIF。

呼叫功能fm_name
导出
控件参数= wa_ctrlop
output_options = wa_compop
user_settings ='X'< br> wa_final = wa_final
lv_finyear = lv_finyear
导入
job_output_info = wa_return
表格
it_display = it_display1
例外情况
formatting_error = 1
内部 _error = 2
send_error = 3
user_canceled = 4
其他=5。
IF sy-subrc <> 0.
*消息ID SY-MSGID类型SY-MSGTY编号SY-MSGNO
*带SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4。
ENDIF。


it_otf [] = wa_return-otfdata []。

呼叫功能'CONVERT_OTF'
导出
格式='PDF'
max_linewidth = 132
导入< br> bin_filesize = lv_len_in
* bin_file = lv_xstring
表格
otf = it_otf
行= it_line
例外
err_max_linewidth = 1
err_format = 2
err_conv_not_pos
其他=4。

IF sy-subrc <> 0.
ENDIF。

循环到it_otf进入lw_otf。
清除lw_content。
CONCATENATE lw_otf- tdprintcom lw_otf-tdprintpar
INTO lw_content。
APPEND lw_content到li_content_txt。
ENDLOOP。

REFRESH:li_content_hex,
li_objhead。

CLEAR:lv_transfer_bin,
lv_len。

*/.. FM将OTF转换为PDF
通话功能'SX_OBJECT_CONVERT_OTF_PDF'
导出
format_src='OTF'
format_dst ='PDF'
更改
transfer_bin = lv_transfer_bin
content_txt = li_content_txt
content_bin = li_content_hex
objhead = li_objhead
len = lv_len
例外情况
err_con v_failed = 1
其他=2。

IF sy-subrc <> 0.
消息ID sy-msgid类型sy-msgty编号sy-msgno
与sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4。
ENDIF。< br>
数据:it_line1类似it_line的表。

呼叫功能'CONVERT_OTF'
导出
格式='PDF'
max_linewidth = 132
导入
bin_filesize = lv_len_in
bin_file = lv_xstring
表格
otf = it_otf
行= it_line1
例外情况
err_max_linewidth = 1
err_format = 2
err_conv_not_possibleS = 3
=4。

IF sy-subrc <> 0.
ENDIF。

*使用SAP标准函数
*生成密码,以避免混淆1和l或0和 O
*字母仅限于可清晰识别的
*字符
呼叫功能'RSEC_GENERATE_PASSWORD'
EXPORTING
字母='ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789'
output_length = 12
IMING 输出=通过
例外情况
some_error = 1
其他=2。
如果sy-subrc <>0。
写:/'发生错误
退出。
ENDIF。
xpayslip = lv_xstring。

*设置PDF和加密
创建对象o_pdf。
o_pdf-> set_pdf_file(xpayslip )。

* pass ='TEST'。

upass = pass。
CONCATENATE'O_'pass INTO opass。
CREATE OBJECT o_encrypt_aes
EXPORTING
键长 =128。
o_encrypt?= o_encrypt_aes。

*设置PDF文件的用户权限
o_encrypt-> set_permission_ex(print_allowed ='X'
Modify_allowed =''
copy_allowed ='X'
add_annotations_allowed =''
fill_fields_allowed =''
copy_accessibility_allowed ='X'
assemble_allowed =''
print_highres_allowed ='X')。

* 设置PDF的用户和所有者密码
o_encrypt-> set_passwords(user_password = upass owner_password = opass)。
*生成密码
o_encrypt-> generate_passwords(o_pdf)。

*加密PDF
o_pdf-> do_action(o_encrypt)。

*获得加密并处理的PDF xs tring
结果= o_pdf-> create_pdf()。

len = xstrlen(结果)。

*转换为solix_tab
调用函数'SCMS_XSTRING_TO_BINARY'
导出< br>缓冲区=结果

binary_tab = lt_xpdf。

数据:attch类型so_obj_des。
数据:d_start(10)类型c。
数据:d_end(10)类型 c。

将wa_rgdir-fpbeg写入d_start。
将wa_rgdir-fpend写入d_end。
CONCATENATE'Payslip_from_'d_start'_to_'d_end INTO附件。

*创建邮件 和附件,如BCS_EXAMPLE程序中所述。
send_request = cl_bcs => create_persistent()。
CONCATENATE'Dear'wa_i0001-ename','INTO line-line SEPARATED BY''。

line-line =''。
APPEND line to文本。
APPEND'请在附件中找到您的工资单'TO text。
line-line =''。< br> APPEND行至文本。
CONCATENATE'Password:'传递到行线,以'''。
APPEND行TO至文本。
line-line =''。
APPEND行至文本 。
林 e-line ='收款人'。
APPEND行至文本。
line-line ='工资单'。
APPEND行至文本。
document = cl_document_bcs => create_document(
i_type ='RAW'
i_text =文本
* i_length ='72'
i_subject = attch)。
*数据:w_xpdf如lt_xpdf,
* w_content_hex如li_content_hex。
*循环 ,位于lt_xpdf INTO w_xpdf。
*将w_xpdf附加到li_content_hex。
* ENDLOOP。
将li_content_hex的行追加到lt_xpdf。


呼叫方法文档 >添加附件
导出
i_attachment_type ='PDF'
i_attachment_subject =附件
i_attachment_size = len
i_att_content_hex = lt_xpdf。
*
*呼叫方法文档-> add_attachment
*导出
* i_attachment_type ='PDF'
* i_attachment_subject =附件
* i_attachment_size = len
* i_att_content_hex = lt_xpdf。
" lt_xpdf。
" lt_xpdf

调用方法send_request-> set_document(document)。
sender = cl_sapuser_bcs => create('USERNAME')。< br>

呼叫方法send_request-> set_sender
导出
i_sender =发件人。
收件人= cl_cam_address_bcs => create_internet_address(
'joe.doe@crazy-company.com ')。


呼叫方法send_request-> add_recipient
导出
i_recipient =收件人
i_express ='X'。

呼叫方法send_request-> send(
EXPORTING
i_with_error_screen ='X'
接收
结果= send_to_all)。
如果send_to_all ='X'。
WRITE:/'文档发送成功'。
ENDIF。
提交工作

捕获cx_bcs INTO bcs_exception。
WRITE:'Fehler aufgetreten。'(001)。
WRITE:'Fehlertyp:'(002),bcs_exception-> error_type。
退出。 br>
ENDTRY。

*************************************************** **********************************************

观察1:邮件正在使用加密的密码触发,并且当输入密码时,仅显示空白屏幕,没有PDF详细信息。

方法2:之后,我对程序进行了调试,并在代码中找到了

将li_content_hex的行追加到lt_xpdf。

呼叫方法文档-> add_attachmentEXPORTING
i_attachment_type ='PDF'
i_attachment_subject = attch
i_attachment_size = len
i_att_content_hex = lt_xpdf。

观察如果在 i_att_content_hex lt_xpdf中通过而没有附加代码行,则显示具有HR工资单的PDF

如果将li_content_hex的行追加到lt_xpdf。

给出密码意味着当我们打开pdf附件时仅出现密码保护屏幕,并且给出了加密密码意味着屏幕空白。

"将li_content_hex的附加行添加到lt_xpdf。"代码的原因是将加密的密码与PDF加密合并。

用于程序的数据声明是。

SPAN {font-family:" Courier New"; 字体大小:10pt; 颜色:#000000; 背景:#FFFFFF; } .L0S32 {color:#3399FF; } .L0S52 {color:#0000FF; } .L0S55 {color:#800080; }

数据:xpayslip类型xstring。
数据:data_lines类型/grube/raw256_table。
数据:len1类型i。
数据:fl类型字符串。
数据:文件类型file_table。
数据:文件类型文件表。
数据:rc类型i。
数据:l_molga类型molga。
数据:l_rgdir类型h99_clst_t_rgdir。
数据:wa_rgdir类型行h99_clst_t_rgdir。
lt_evp类型h99_clst_t_rgdir。
数据:i0001 p0001类型表。
数据:wa_i0001 p0001类型。
数据:pmehf类型pmehf。
数据:hrform_name类型hrf_name。
数据:message1类型 。
数据:form_object类型REF TO对象。
数据:pass(12)。
数据:o_pdf类型REF TO/grube/cl_pdf。
数据:o_encrypt_aes类型REF TO/grube/cl_pdf_encry_aes_256。
数据:o_encrypt TYPE REF TO/grube/cl_pdf_encryption。
数据:upass TYPE字符串。
数据:opass TYPE字符串。
数据:line TYPE soli。
数据:结果TYPE xstring。
数据:len TYPE so_obj_len。
数据:lt_xpdf TYPE solix_tab。
数据:l_xpdf TYPE solix。
数据:send_request 类型参考至cl_bcs。
数据:bcs_exception类型参考至cx_bcs。
数据:text_line类型soli。
数据:文本类型bcsy_text。
数据:文档类型参考至cl_document_bcs。
数据: 发件人类型参考到cl_sapuser_bcs。
数据:接收者类型参考到if_recipient_bcs。
数据:send_to_all类型os_boolean。

已引用链接。

http://pdfencryption.de/fscenario.php

http://pdfencryption.de/dl/ABAPListing_Payslip_encrypted_HRFORM.txt(针对程序 )

附件已从链接安装到服务器中。

http://pdfencryption.de/adownloaddemo.php

ABAP PDF库的安装演示版本。

4条回答
灬番茄
2020-09-07 13:07

嗨Dinesh,

可以格式化代码吗? (将其复制,粘贴为平面文本,将其全部选中,然后按" CODE"按钮)

我担心我读错了一些东西,因为它有点难以阅读。

我 我不确定您在做什么,因为在我看来您正在混搭不同的东西。

首先,我看到您得到的加密pdf格式为

 result = o_pdf  -> create_pdf()。
 len = xstrlen(result)。

在我看来,您确定len作为结果(即len = 100),但是由于附加了更多行(即correct_len = 200),所以附件表更大了,因此SAP 只能使用您设置为len的大小,创建错误的PDF

RESULT应该是十六进制表,对吗?就像附件定义一样:尝试直接将RESULT用作附件,让我知道!

一周热门 更多>