Upload 3 files
Browse files- app.py +93 -0
- doc_process.py +180 -0
- requirements.txt +4 -0
app.py
ADDED
@@ -0,0 +1,93 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import os
|
3 |
+
import shutil
|
4 |
+
import zipfile
|
5 |
+
from zipfile import ZipFile
|
6 |
+
|
7 |
+
from doc_process import doc_process
|
8 |
+
|
9 |
+
|
10 |
+
extract_folder = 'documents'
|
11 |
+
|
12 |
+
def recode(raw: str) -> str:
|
13 |
+
'''
|
14 |
+
编码修正
|
15 |
+
'''
|
16 |
+
|
17 |
+
try:
|
18 |
+
return raw.encode('cp437').decode('utf-8')
|
19 |
+
|
20 |
+
except:
|
21 |
+
return raw.encode('utf-8').decode('utf-8')
|
22 |
+
|
23 |
+
def zip_extract_all(src_zip_file: ZipFile, target_path: str) -> None:
|
24 |
+
|
25 |
+
# 遍历压缩包内所有内容,创建所有目录
|
26 |
+
for file_or_path in file.namelist():
|
27 |
+
|
28 |
+
print(file_or_path)
|
29 |
+
|
30 |
+
# 若当前节点是文件夹
|
31 |
+
if file_or_path.endswith('/'):
|
32 |
+
try:
|
33 |
+
# 基于当前文件夹节点创建多层文件夹
|
34 |
+
os.makedirs(os.path.join(target_path, recode(file_or_path)))
|
35 |
+
except FileExistsError:
|
36 |
+
# 若已存在则跳过创建过程
|
37 |
+
pass
|
38 |
+
|
39 |
+
# 否则视作文件进行写出
|
40 |
+
else:
|
41 |
+
pass
|
42 |
+
|
43 |
+
# 遍历压缩包内所有内容,解压文件
|
44 |
+
for file_or_path in file.namelist():
|
45 |
+
|
46 |
+
print(file_or_path)
|
47 |
+
|
48 |
+
# 若当前节点是文件夹
|
49 |
+
if file_or_path.endswith('/'):
|
50 |
+
pass
|
51 |
+
|
52 |
+
# 否则视作文件进行写出
|
53 |
+
else:
|
54 |
+
# 利用shutil.copyfileobj,从压缩包io流中提取目标文件内容写出到目标路径
|
55 |
+
with open(os.path.join(target_path, recode(file_or_path)), 'wb') as z:
|
56 |
+
# 这里基于Zipfile.open()提取文件内容时需要使用原始的乱码文件名
|
57 |
+
shutil.copyfileobj(src_zip_file.open(file_or_path), z)
|
58 |
+
|
59 |
+
st.title('起诉书 & 委托书 - 自动处理程序')
|
60 |
+
|
61 |
+
st.markdown('#### 请上传ZIP压缩文件:')
|
62 |
+
|
63 |
+
# 添加一个文件上传组件
|
64 |
+
uploaded_file = st.file_uploader("选择要上传的文件", type=["zip"])
|
65 |
+
|
66 |
+
# 如果有文件上传
|
67 |
+
if uploaded_file:
|
68 |
+
# 保存上传的ZIP文件到本地临时目录
|
69 |
+
with open("temp.zip", "wb") as f:
|
70 |
+
f.write(uploaded_file.read())
|
71 |
+
|
72 |
+
# 创建文档目录
|
73 |
+
os.makedirs(extract_folder, exist_ok=True)
|
74 |
+
|
75 |
+
# 解压ZIP文件中的文件并处理文件名和内容
|
76 |
+
with zipfile.ZipFile("temp.zip", "r") as file:
|
77 |
+
# for file_or_path in file.namelist():
|
78 |
+
# print(file_or_path, ' -------> ' , recode(file_or_path))
|
79 |
+
zip_extract_all(file, extract_folder)
|
80 |
+
|
81 |
+
# 显示解压缩完成的消息
|
82 |
+
st.success(f"ZIP文件已成功解压缩到目录 {extract_folder}")
|
83 |
+
input_folder = os.listdir(extract_folder)[0] if os.listdir(extract_folder)[0] != 'output' else os.listdir(extract_folder)[1]
|
84 |
+
print(input_folder)
|
85 |
+
|
86 |
+
# 删除临时文件
|
87 |
+
os.remove("temp.zip")
|
88 |
+
|
89 |
+
if st.button('自动处理并压缩成文件'):
|
90 |
+
input_path = os.path.join(extract_folder, input_folder)
|
91 |
+
output_path = os.path.join(extract_folder, 'output')
|
92 |
+
result = doc_process(input_path=input_path, output_path=output_path)
|
93 |
+
st.markdown(result)
|
doc_process.py
ADDED
@@ -0,0 +1,180 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import pandas as pd
|
3 |
+
from docx import Document
|
4 |
+
from docx.shared import Pt
|
5 |
+
from docx.oxml.ns import qn
|
6 |
+
|
7 |
+
|
8 |
+
def doc_process(input_path, output_path):
|
9 |
+
|
10 |
+
qsz_folder = os.path.join(input_path, '起诉状')
|
11 |
+
wts_folder = os.path.join(input_path, '委托书')
|
12 |
+
info_path = os.path.join(input_path, 'info.xlsx')
|
13 |
+
|
14 |
+
qsz_output_shex = os.path.join(output_path, '起诉状_上海耳序')
|
15 |
+
qsz_output_fjzy = os.path.join(output_path, '起诉状_福建智云')
|
16 |
+
qsz_output_hnsx = os.path.join(output_path, '起诉状_海南申信')
|
17 |
+
|
18 |
+
wts_output_shex = os.path.join(output_path, '委托书_上海耳序')
|
19 |
+
wts_output_fjzy = os.path.join(output_path, '委托书_福建智云')
|
20 |
+
wts_output_hnsx = os.path.join(output_path, '委托书_海南申信')
|
21 |
+
|
22 |
+
phone_wanglei = '18916935832'
|
23 |
+
phone_zhangliren = '13817213203'
|
24 |
+
|
25 |
+
qsz_file_list = os.listdir(qsz_folder)
|
26 |
+
wts_file_list = os.listdir(wts_folder)
|
27 |
+
|
28 |
+
if not os.path.exists(os.path.join(output_path)):
|
29 |
+
os.mkdir(os.path.join(output_path))
|
30 |
+
|
31 |
+
if not os.path.exists(qsz_output_shex):
|
32 |
+
os.mkdir(qsz_output_shex)
|
33 |
+
|
34 |
+
if not os.path.exists(qsz_output_fjzy):
|
35 |
+
os.mkdir(qsz_output_fjzy)
|
36 |
+
|
37 |
+
if not os.path.exists(qsz_output_hnsx):
|
38 |
+
os.mkdir(qsz_output_hnsx)
|
39 |
+
|
40 |
+
if not os.path.exists(wts_output_shex):
|
41 |
+
os.mkdir(wts_output_shex)
|
42 |
+
|
43 |
+
if not os.path.exists(wts_output_fjzy):
|
44 |
+
os.mkdir(wts_output_fjzy)
|
45 |
+
|
46 |
+
if not os.path.exists(wts_output_hnsx):
|
47 |
+
os.mkdir(wts_output_hnsx)
|
48 |
+
|
49 |
+
df = pd.read_excel(info_path)
|
50 |
+
|
51 |
+
num_shex = 0
|
52 |
+
num_fjzy = 0
|
53 |
+
num_hnsx = 0
|
54 |
+
|
55 |
+
# 改管辖法院,并存到对应融担公司的目录中
|
56 |
+
for qsz_file in qsz_file_list:
|
57 |
+
|
58 |
+
# 读取起诉状文件
|
59 |
+
qsz_path = os.path.join(qsz_folder, qsz_file)
|
60 |
+
|
61 |
+
# 加载Docx文件
|
62 |
+
doc = Document(qsz_path)
|
63 |
+
|
64 |
+
# 从文件名获取合同号
|
65 |
+
contract_id = qsz_file.split('_')[1]
|
66 |
+
|
67 |
+
# 从表格中找到对应合同号的管辖法院
|
68 |
+
court = df[df['合同号']==contract_id]['管辖法院'].tolist()[0]
|
69 |
+
|
70 |
+
# 将正确的管辖法院更新到Docx中(加run设置字体)
|
71 |
+
doc.paragraphs[-6].text = ''
|
72 |
+
run = doc.paragraphs[-6].add_run(court)
|
73 |
+
run.font.name = "Arial"
|
74 |
+
run._element.rPr.rFonts.set(qn('w:eastAsia'),'宋体')
|
75 |
+
|
76 |
+
# 调整字体大小
|
77 |
+
font = doc.paragraphs[-6].style.font
|
78 |
+
font.size = Pt(14)
|
79 |
+
|
80 |
+
# 判断担保公司
|
81 |
+
if '福建智云' in df[df['合同号']==contract_id]['融担公司'].tolist()[0]:
|
82 |
+
output_folder = qsz_output_fjzy
|
83 |
+
num_fjzy += 1
|
84 |
+
elif '海南申信' in df[df['合同号']==contract_id]['融担公司'].tolist()[0]:
|
85 |
+
output_folder = qsz_output_hnsx
|
86 |
+
num_hnsx += 1
|
87 |
+
else:
|
88 |
+
output_folder = qsz_output_shex
|
89 |
+
num_shex += 1
|
90 |
+
|
91 |
+
# 保存文件到对应目录
|
92 |
+
output_path = os.path.join(output_folder, qsz_file)
|
93 |
+
doc.save(output_path)
|
94 |
+
|
95 |
+
# 改律师名字和电话,并存到对应融担公司的目录中
|
96 |
+
for wts_file in wts_file_list:
|
97 |
+
|
98 |
+
# 读取委托书文件
|
99 |
+
wts_path = os.path.join(wts_folder, wts_file)
|
100 |
+
|
101 |
+
# 加载Docx文件
|
102 |
+
doc = Document(wts_path)
|
103 |
+
|
104 |
+
# 从文件名获取合同号
|
105 |
+
contract_id = wts_file.split('_')[1]
|
106 |
+
|
107 |
+
# 从表格中找到对应合同号的管辖法院
|
108 |
+
lawyer = df[df['合同号']==contract_id]['承办律师'].tolist()[0]
|
109 |
+
user = df[df['合同号']==contract_id]['用户姓名'].tolist()[0]
|
110 |
+
|
111 |
+
# 替换律师和电话
|
112 |
+
if lawyer != '王磊':
|
113 |
+
for p in doc.paragraphs:
|
114 |
+
if '王磊' in p.text and user not in p.text:
|
115 |
+
text_new_name = p.text.replace('王磊', '张立人')
|
116 |
+
p.text = ''
|
117 |
+
# 加run用于修改字体
|
118 |
+
run = p.add_run(text_new_name)
|
119 |
+
run.font.name = "Arial"
|
120 |
+
run._element.rPr.rFonts.set(qn('w:eastAsia'),'宋体')
|
121 |
+
# 调整字体
|
122 |
+
font = p.style.font
|
123 |
+
font.size = Pt(14)
|
124 |
+
|
125 |
+
if phone_wanglei in p.text:
|
126 |
+
text_new_phone = p.text.replace(phone_wanglei, phone_zhangliren)
|
127 |
+
p.text = ''
|
128 |
+
# 加run用于修改字体
|
129 |
+
run = p.add_run(text_new_phone)
|
130 |
+
run.font.name = "Arial"
|
131 |
+
run._element.rPr.rFonts.set(qn('w:eastAsia'),'宋体')
|
132 |
+
# 调整字体
|
133 |
+
font = p.style.font
|
134 |
+
font.size = Pt(14)
|
135 |
+
|
136 |
+
if '王磊' in p.text and user in p.text:
|
137 |
+
# 现委托 王磊 在我单位与 沈黎宾 追偿权纠纷案件中,作为我单位的委托代理人,代理权限如下:
|
138 |
+
p.text = ''
|
139 |
+
run = p.add_run('现委托')
|
140 |
+
run.font.name = "Arial"
|
141 |
+
run._element.rPr.rFonts.set(qn('w:eastAsia'),'宋体')
|
142 |
+
|
143 |
+
run = p.add_run(' 张立人 ')
|
144 |
+
run.font.underline = True
|
145 |
+
run.font.name = "Arial"
|
146 |
+
run._element.rPr.rFonts.set(qn('w:eastAsia'),'宋体')
|
147 |
+
|
148 |
+
run = p.add_run('在我单位与')
|
149 |
+
run.font.name = "Arial"
|
150 |
+
run._element.rPr.rFonts.set(qn('w:eastAsia'),'宋体')
|
151 |
+
|
152 |
+
run = p.add_run(f' {user} ')
|
153 |
+
run.font.underline = True
|
154 |
+
run.font.name = "Arial"
|
155 |
+
run._element.rPr.rFonts.set(qn('w:eastAsia'),'宋体')
|
156 |
+
|
157 |
+
run = p.add_run('追偿权纠纷案件中,作为我单位的委托代理人,代理权限如下:')
|
158 |
+
run.font.name = "Arial"
|
159 |
+
run._element.rPr.rFonts.set(qn('w:eastAsia'),'宋体')
|
160 |
+
|
161 |
+
# 判断担保公司
|
162 |
+
if '福建智云' in df[df['合同号']==contract_id]['融担公司'].tolist()[0]:
|
163 |
+
output_folder = wts_output_fjzy
|
164 |
+
elif '海南申信' in df[df['合同号']==contract_id]['融担公司'].tolist()[0]:
|
165 |
+
output_folder = wts_output_hnsx
|
166 |
+
else:
|
167 |
+
output_folder = wts_output_shex
|
168 |
+
|
169 |
+
# 保存文件到对应目录
|
170 |
+
output_path = os.path.join(output_folder, wts_file)
|
171 |
+
doc.save(output_path)
|
172 |
+
|
173 |
+
total_have = len(qsz_file_list)
|
174 |
+
total_done = num_shex+num_fjzy+num_hnsx
|
175 |
+
result = f'共 {total_have} 条\n完成 {total_done} 条\n\n上海耳序:共 {num_shex} 条\n\n福建智云:共 {num_fjzy} 条\n\n海南申信:共 {num_hnsx} 条\n\n所有文档已完成自动编辑!'
|
176 |
+
|
177 |
+
return result
|
178 |
+
|
179 |
+
if __name__ == '__main__':
|
180 |
+
doc_process()
|
requirements.txt
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
pandas==2.1.0
|
2 |
+
python-docx==0.8.11
|
3 |
+
openpyxl==3.1.2
|
4 |
+
pyinstaller==5.13.2
|