Files
SignatureSystem/lib/__pycache__/word_signer.cpython-39.pyc

102 lines
11 KiB
Plaintext
Raw Normal View History

2026-07-20 13:16:17 +08:00
a
2026-07-20 16:43:08 +08:00
<00><>]j<>N<00>@s<>ddlZddlZddlZddlZddlZddlZddlmZddlmZddl m
2026-07-20 13:16:17 +08:00
Z
2026-07-20 16:43:08 +08:00
ddl m Z ddl mZddlmZe<04>e<12>Zdd<08>Zdd
d <0B>Zddd<0F>Zdd<11>Zdd<13>Zdd<15>ZdS)<18>N)<01>datetime)<01>Document)<01>Cm)<01> process_image)<01> field_codescCst<00><01><00>d<01>dt<03><04><00><00>S)Nz%Y%m%d%H%M%S%f<>_)r<00>now<6F>strftime<6D>os<6F>getpid<69>r r <00>`E:\projects\wxwx\projects_job\GeneralRequirement\SignatureSystem\BackEnd\Code\lib\word_signer.py<70> _new_trace_idsr<00> 前端操作c8 Cs |durt<00>}tjd|||d<02>d<03><00>
z<EFBFBD>|<01>dd<05>}tjd|||d<02>d<03>|<05><04><00>d<07>s<>tjd|||d<02>d<03>dd d
2026-07-20 13:16:17 +08:00
d |<05><00>|d <0C>fWS|<01>d d<05>}|dvr<>tjd|||d<02>d<03>dd dd|<06><00>|d <0C>fWStjd|||d<02>d<03>ztt<08> |<00><01>}WnZt
<EFBFBD>yN}z@tjdt |<08>||d<02>d<03>dd dd|<08><00>|d <0C>fWYd}~WSd}~00tjd||d<02>d<03>|<01>dg<00>} |<01>dd<19>}
2026-07-20 16:43:08 +08:00
|<01>dd<1B>} |<01>dd<1D>} |<01>dd<19>} |<01>d<1F>}|<01>d d<19>}|<01>d!d"<22>}|<01>d#d<19>}|<01>d$d"<22>}|<01>d%d"<22>}|<01>d&d<19>}|<01>d'd(<28>}|<01>d)d*<2A>}|d+k<02>r^d,d-<2D>| D<00>} | <09>s^t j ||d.<2E>}d/d-<2D>|D<00>} tjd0t| <09>||d<02>d<03>t| <09>d1k<04>r<>tjd2t| <09>||d<02>d<03>dd d3d4|d <0C>fWSg}d"}t| <09>D<00>]<5D>\}}tjd5|d6t| <09>||d<02>d<03><00>z|<1B>d7d<05>}d}d }|d8k<02>rl|<1B>d9d<05>}|<1F>r2t<10>|<1F>}tjd:|<1B>d;d<05>||d<02>d<03>n6|<18>d<|d6<00>d=<3D><03>tjd>|d6||d<02>d<03>W<00>q<><71>n|d?k<02>r.|<1B>d@d<05>} | <20>s<>|<1B>dAd<05>}!|!<21>rhtjdB|!||d<02>d<03>t<14>|!<21>}"|"<22>r.t|"<22>d6k<04>r|<18>d<|d6<00>dC|!<21>dDt|"<22><01>dE<64><07>tjdF|!t|"<22>||d<02>d<03>|"d"dG}t|"d"dH<00>}n8|<18>d<|d6<00>dI|!<21>dJ<64><05>tjdK|!||d<02>d<03>W<00>q<>n6|<18>d<|d6<00>dL<64><03>tjdM|d6||d<02>d<03>W<00>q<>n<EFBFBD>tjdN| ||d<02>d<03>t<14>| <20>}#|#<23>r<>|#dG}t|#dH<00>}tjdO| ||d<02>d<03>n8|<18>d<|d6<00>dP| <20>dJ<64><05>tjdQ| ||d<02>d<03>W<00>q<><71>nB|dRk<02>rf|<1B>dAd<05>}!|!<21>s<>|<18>d<|d6<00>dS<64><03>tjdT|d6||d<02>d<03>W<00>q<>tjdU|!||d<02>d<03>t<14>|!<21>}"|"<22>r*t|"<22>d6k<04>r<>|<18>d<|d6<00>dC|!<21>dDt|"<22><01>dE<64><07>tjdF|!t|"<22>||d<02>d<03>|"d"dG}t|"d"dH<00>}tjdV|!||d<02>d<03>n8|<18>d<|d6<00>dI|!<21>dJ<64><05>tjdK|!||d<02>d<03>W<00>q<><71>n
|d+k<02>rp|}$|$<24>dW<64><01>r<>|$dXd<00>}$t <0C>|$<24>}$tjdY||$||d<02>d<03>t<14>|$<24>}"|"<22>r8t|"<22>d6k<04>r|<18>d<|d6<00>dC|$<24>dZ<64><05>tjd[|$t|"<22>||d<02>d<03>|"d"dG}t|"d"dH<00>}tjd\|$||d<02>d<03>n8|<18>d<|d6<00>d]|$<24>dJ<64><05>tjd^|$||d<02>d<03>W<00>q<>|<1D>s<>|<18>d<|d6<00>d_<64><03>W<00>q<>|<1B>dH|<1E>}%|%<25>r<>|n|}&t|| |<0E>}'t|||<10>}(t||||<13>\})}*|
<EFBFBD>s<>|<1B>d<1A>n| }+|
<EFBFBD>s<>|<1B>d<1C>n| },t||%|(|)|*|d`<60>}-<2D>zd"dl}.|.j<1F> |.j<1F>!|.j<1F>!|.j<1F>"t#<23><01><01>dadbdc<64>}/|.j$|/ddd<64>|<03>p^de<64>df|d6<00><00>}0t%|.j<1F> |/|0<>dg<64><02>dh<64><02>}1|1<>&|<1D>Wd<00>n1<00>s<>0Yt%|.j<1F> |/|0<>di<64><02>dh<64><02>}1|1<>&|-<2D>Wd<00>n1<00>s<>0Ytjdj|/|0||d<02>d<03>Wn@t
<EFBFBD> yT}2z&tjdkt |2<>||d<02>d<03>WYd}2~2n
d}2~200t'|||-|+|,|'||&||dl<64>
}3|3d"k<04> r<>||37}tjdm|d6||3||d<02>d<03>n2|<18>d<|d6<00>dn|<1C>do<64><05>tjdp|||d<02>d<03>Wndt
2026-07-20 13:16:17 +08:00
<EFBFBD>
2026-07-20 16:43:08 +08:00
y<}zJ|<18>d<|d6<00>dqt |<08><01><00><04>tjdr|d6t |<08>||d<02>d<03>WYd}~n
d}~00<00>q<>t<08> <09>}4|<07>(|4<>|4<>)d"<22>|4<>*<2A>}5tj<1F>+|<05>d"}6|6<>ds<64>}7tjdt|t|<18>|||d<02>d<03>|5|7|||du<64>dfWSt
<EFBFBD> y}z<tjdvt |<08>||d<02>d<03>dd dwt |<08>|d <0C>fWYd}~Sd}~00dS)xNu5[签章流程] ====== 开始处理 ====== trace_id=%s)<02>
2026-07-20 13:16:17 +08:00
log_source<EFBFBD>trace_id)<01>extra<72> docx_name<6D>u[签章流程] 文件名: %sz.docxu5[参数校验] 文件类型错误: %s, 仅支持.docxFZINVALID_FILE_TYPEu仅支持.docx格式当前: )Zsuccess<73>code<64>messager<00>
match_mode)<04>upload<61>id<69>name<6D>autou%[参数校验] 匹配模式无效: %sZINVALID_MATCH_MODEu匹配模式无效: u[签章流程] 匹配模式: %su)[参数校验] Word文档解析失败: %sZ INVALID_DOCXu$Word文档解析失败或已损坏: u%[签章流程] Word文档加载成功<E68890>stamps<70>use_global_alignT<6E>align_h<5F>left<66>align_v<5F>center<65>use_global_height<68>height<68>use_global_noise<73> noise_levelr<00>use_global_rotate<74>
rotate_min<EFBFBD>
2026-07-20 16:43:08 +08:00
rotate_max<EFBFBD> relax_layout<75>signature_mode<64>inline<6E>
stamp_mode<EFBFBD>anchorrcSs"g|]}|<01>d<00>pd<01><01>r|<01>qS)<02>markerr)<02>get<65>strip)<02>.0<EFBFBD>sr r r <00>
<listcomp>K<00>zsign_word.<locals>.<listcomp>)rcSsg|]}d|di<01>qS)r.r )r1<00>itemr r r r3Nr4u/[签章流程] auto模式扫描到 %d 个标记<E6A087>du.[参数校验] 盖章项超过100个限制: %dZTOO_MANY_STAMPSu盖章项超过100个限制u.[签章流程] ---- 处理盖章项 %d/%d ----<2D>r.r<00> image_base64u%[图片匹配] 使用上传图片: %s<>image_filenameu 盖章项u: 缺少图片数据u,[图片匹配] 盖章项%d缺少图片数据r<00>image_id<69>
2026-07-20 13:16:17 +08:00
image_nameu7[图片匹配] image_id 为空,改用姓名查询: %su : 姓名=u 匹配到 u 条记录使用第一条uA[图片匹配] 姓名匹配多条: %s -> %d 条使用第一条Z
sign_image<EFBFBD> is_signatureu: 未找到姓名=u
2026-07-20 16:43:08 +08:00
的记录u![图片匹配] 未找到姓名=%su: 缺少人员ID和姓名u1[图片匹配] 盖章项%d缺少人员ID和姓名u[图片匹配] 按ID查询: %su![图片匹配] ID匹配成功: %su: 未找到ID=u[图片匹配] 未找到ID=%sru: 缺少人员姓名u,[图片匹配] 盖章项%d缺少人员姓名u"[图片匹配] 按姓名查询: %su%[图片匹配] 姓名匹配成功: %s<>USER_<52>u5[图片匹配] auto模式, 标记=%s, 查询姓名=%su 匹配多条使用第一条u0[图片匹配] auto 姓名匹配多条: %s -> %du#[图片匹配] auto匹配成功: %su: auto模式未找到姓名=u%[图片匹配] auto未找到姓名=%su: 无有效图片数据)r<r%r'r(r<00>
image_test<EFBFBD>outputZ project_run)<01>exist_okZno_traceZ_stampz _1_input.png<6E>wbz_2_processed.pnguC[签章流程][DEBUG] 已保存处理前后对比图到 %s (tag=%s)u/[签章流程][DEBUG] 保存调试图失败: %s)<05> height_cmr)<00>
image_moderru>[签章流程] 盖章项%d签章成功: marker=%s, 插入%d处u: 未找到标记 '<27>'u"[签章流程] 未找到标记: %su: 处理异常 - u*[签章流程] 盖章项%d处理异常: %sz _signed.docxuO[签章流程] ====== 处理完成 ====== 成功%d项, 告警%d条, trace_id=%s)<05>data<74>filename<6D>warningsr<00> success_countu[签章流程] 处理失败: %sZINTERNAL_ERROR),r<00>logger<65>infor/<00>lower<65>endswith<74>errorr<00>io<69>BytesIO<49> Exception<6F>strr<00>scan_user_markers<72>len<65> enumerate<74>base64<36> b64decode<64>append<6E>warning<6E>dbZget_image_by_user_name<6D>boolZget_image_by_user_id<69>
2026-07-20 13:16:17 +08:00
startswith<EFBFBD>_strip_switches<65>_resolve_height<68>_resolve_noise<73>_resolve_rotaterr
2026-07-20 16:43:08 +08:00
<00>path<74>join<69>dirname<6D>abspath<74>__file__<5F>makedirs<72>open<65>write<74>_insert_signature_image<67>save<76>seek<65>read<61>splitext)8<> docx_data<74>paramsrrZ client_iprr<00>doc<6F>errrr r"Z global_heightr$Z global_noiser&Zglobal_rotate_minZglobal_rotate_maxr)r*r,ZscannedrHrI<00>i<>stampr.<00>
image_dataZstamp_is_signatureZ image_b64r:r;<00>records<64>recordZname_from_markerZis_sigrD<00>hZnoiseZrot_minZrot_maxZ s_align_hZ s_align_v<5F> processed<65>_osZ
2026-07-20 13:16:17 +08:00
_debug_dir<EFBFBD>_tagZ_fZ_e<5F>insertedZ
2026-07-20 16:43:08 +08:00
output_bufZ result_data<74> base_nameZ output_namer r r <00> sign_words<08> <08><08><02>
2026-07-20 13:16:17 +08:00
 <08>
<EFBFBD>
<08> <08>
<EFBFBD> <08>     
2026-07-20 16:43:08 +08:00
        
2026-07-20 13:16:17 +08:00
 <08> <08><04>
<08> 
 
<08> <08>

  <08>
&<08> <08> <08><08>
 <08><08>

  <08><08>
&<08> <08><08>

  

<08>
2026-07-20 16:43:08 +08:00
<08> <08><08>   <02> <06>**<08>
 <08> <04>
2026-07-20 13:16:17 +08:00

<08><08>
<08> 



2026-07-20 16:43:08 +08:00
<08><02><02> <08><08>r}Tr+c
Cstjddd<03><02> }
|
<EFBFBD>|<02>|
j} Wd<00>n1s40Yz<>d} |r<>|dkr<>ddlm} | <0A>t<07>|<02><01>}|j \}}|r<>|||n|} t
j ||| | ||||d<07>}|Wzt <0C> | <0B>WSty<>YS0Szt <0C> | <0B>Wnty<>Yn0n&zt <0C> | <0B>Wnt<0E>yYn00dS)u<>插入签名图片到 marker 对应的 SET 域后。
2026-07-20 13:16:17 +08:00
``height_cm`` 为用户配置的目标高度(厘米)。若为 None则**透传 None 给
insert_image_after_field**,由后者根据插入位置的段落行高 + 字号自动推算
`_auto_size_height_cm`)。
``relax_layout`` 透传给 :func:`field_codes.insert_image_after_field`
控制是否自动放宽段落 / 表格行的固定高度约束以避免签名被裁剪。
2026-07-20 16:43:08 +08:00
``image_mode`` 透传给 :func:`field_codes.insert_image_after_field`
``'inline'`` 嵌入式(默认,撑大当前行)或 ``'anchor'`` 浮动覆盖(不撑大,
浮在文字上方)。
z.pngF)<02>suffix<69>deleteNr)<01>Image)rr)<00>mode)<0F>tempfileZNamedTemporaryFilerhr<00>PILr<4C>rgrOrP<00>sizer<00>insert_image_after_fieldr
<00>unlinkrQ)rpr.rtrr rCr)rDrr<00>tmpZtmp_path<74>width_cmZPILImageZimgZimg_w<5F>img_h<5F>countr r r ri"s:
2026-07-20 13:16:17 +08:00
$  

2026-07-20 16:43:08 +08:00
<02> <06> <08>ric Cs<>|r^|dvrdSz0t|<02>}d|kr.dkr>nn t|d<04>WSWnttfyXYdS0dS|<00>d<05>}|dvr<>z0t|<03>}d|kr<>dkr<>nn t|d<04>WSWnttfy<>Yn0dS)N<>Nrg<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?g$@r7r#)<05>float<61>round<6E>
ValueError<EFBFBD> TypeErrorr/)rs<00>
2026-07-20 13:16:17 +08:00
use_global<EFBFBD>
2026-07-20 16:43:08 +08:00
global_valrwr r r r^Ks&
r^c Cs<>|r4z|dvrt|<02>ndWSttfy2YdS0|<00>d<03>}|dvr<>z*t|<03>}d|krddkrnnn|WSWnttfy<>Yn0dS)Nr<4E>rr%<00>
)<04>intr<74>r<>r/)rsr<>r<><00>nr r r r_as
2026-07-20 13:16:17 +08:00

2026-07-20 16:43:08 +08:00
r_c Cs|r<>z|dvrt|<02>nd}Wnttfy6d}Yn0z|dvrJt|<03>nd}Wnttfyjd}Yn0tdtd|<04><02>tdtd|<05><02>fS|<00>dd<02>}|<00>dd<02>}ztdtdt|<06><01><02>}Wnttfy<>d}Yn0ztdtdt|<07><01><02>}Wnttf<02>y d}Yn0||fS)Nr<4E>riL<69><4C><EFBFBD><EFBFBD><EFBFBD>r'r()r<>r<>r<><00>max<61>minr/)rsr<>Z
2026-07-20 13:16:17 +08:00
global_minZ
2026-07-20 16:43:08 +08:00
global_maxZrminZrmaxZr_minZr_maxr r r r`rs*
2026-07-20 13:16:17 +08:00

   

2026-07-20 16:43:08 +08:00
r`)rNN)NTr+rN)rOr
<00>rerV<00>loggingr<67>r<00>docxr<00> docx.sharedrZlib.dbrZZlib.image_processorr<00>libr<00> getLogger<65>__name__rJrr}rir^r_r`r r r r <00><module>s.      
2026-07-20 13:16:17 +08:00

2026-07-20 16:43:08 +08:00
<00>
)