最近收到上千个判决书,如果一个个扫描再按案件号标注文件名的话,估计要加班熬几个夜晚,为何不用python呢?
初步的工作思路是这样的:1.把判决书分几个批次整体扫描;2.用paddleocr自动识别分割每一个案件单独保存为一个pdf文件;3.用包含部门、客户名、贷款账号、案件号的案件台账清单重新整理第二步生成的文件的文件名。
第一步用单位几万块钱一台的扫描机很快就完成了;
第二步开始:
import pandas as pd
import numpy as np
import pdfplumber
from pypdf import PdfReader,PdfWriter
import os
import re
from io import BytesIO
from paddleocr import PaddleOCR
from PIL import Image
import random
import shutil
lawfilepath="/media/sda4/downloads/裁判文书/收集所有判决书/"
tofile="/media/sda4/downloads/裁判文书/gen/"
#同一个文件夹下可能有文件夹或文件
def getfilepath(filepath):
filepath=filepath
pathlist=[]
for root,_,files in os.walk(filepath):
pathlist.extend([os.path.join(root,f) for f in files])
return pathlist
#从记录出错的文本里面提取先前保存的文件路径,这样可以避免全部重新运行
def tolist(spath):
spath=spath
with open (spath,"r") as f:
text=f.read()
getlist=re.findall(r"(\/media.*?pdf)",text)
return getlist
#识别图片,提取文本
def recimg(img):
image=img
#用一个中间件
buf=BytesIO()
image.save(buf,format="png")
buf.seek(0)
#有GPU就用GPU版的Paddle吧,快很多
ocr=PaddleOCR(rec_model_dir="/home/mr-xu/.paddleocr/whl/rec/ch/ch_PP-OCRv3_rec_infer",
rec_image_shape="3,96,640",
use_gpu=True,lang="ch")
text=ocr.ocr(np.array(Image.open(buf).convert("RGB")),cls=True)
newtext="".join([i[1][0] for i in text[0]])
return newtext
#初步生成Pdf文件
def genpdf(getpath,topath):
filelist=getfilepath(getpath)
for file in filelist:
#可以统计运行过程中读取过什么文件了
with open(tofile+"已读取的文件.txt","a") as af:
af.write(file)
print(file)
#有时候你永远不知道雷有没有排完
try:
with pdfplumber.open(file) as pdffile:
pdfreader=PdfReader(file)
pdfwriter=PdfWriter()
flag=False
#防止有些案子没读到首页出错,暂定为这个name吧
name="没表头"
for n in range(len(pdffile.pages)):
page=pdffile.pages[n]
#里面的参数要注意,默认的分辨率很低,对后面的识别影响很大
image=page.to_image(resolution=300)
text=recimg(image)
#这里不对text截取,因为可能会超出范围。
#下面的条件判断依据是根据经验的
if "民事判决书" in text and "《民事判决书》" not in text:
#正则表达式提取到案号,表明一个案子的开始
name="民事判决书-"+re.findall(r"([(|\(]20.*?号)",text)[0]
flag=True
if "民事裁定书" in text and "《民事裁定书》" not in text:
name="民事裁定书-"+re.findall(r"([(|\(]20.*?号)",text)[0]
flag=True
if "民事调解书" in text and "《民事调解书》" not in text:
name="民事调解书-"+re.findall(r"([(|\(]20.*?号)",text)[0]
flag=True
if flag:
pdfwriter.add_page(pdfreader.pages[n])
#以下根据经验表明是一个案件的结束
if "核对无异" in text or "审判员" in text or "审判长" in text:
if "由审判员" not in text:
if "各方当事人" not in text:
with open(topath+name+".pdf","wb") as f:
pdfwriter.write(f)
print("已保存"+name)
pdfwriter=PdfWriter()
flag=False
except Exception as e:
with open(topath+"出错的文件.txt","a+") as f:
f.write(file)
continue
至此,已经是一个案件一个pdf文件了,但文件名还是有些简单且不统一,需要再次整理,其实第三步可以和第二步同时进行。
第三步开始:
def manuname(name):
name=name
lawsuitname=name.split("-")[0]
lawsuitnum=name.split("-")[1]
if lawsuitnum.startswith("("):
lawsuitnum=lawsuitnum.replace("(","(")
if lawsuitnum.startswith("书"):
lawsuitnum=lawsuitnum.replace("书","(")
if ")" in lawsuitnum:
lawsuitnum=lawsuitnum.replace(")",")")
lawsuitnum=re.sub(r"原告.*?号","号",lawsuitnum)
lawsuitnum=lawsuitnum.replace(".pdf","")
return lawsuitname,lawsuitnum
def complete_name(fromdir,todir):
fromdir=fromdir
todir=todir
filelist=[file for file in os.listdir(fromdir) if file.endswith(".pdf")]
df=pd.read_excel("/media/sda4/downloads/裁判文书/案件情况表.xlsx")
notinlist=[]
inlist=[]
i=1
for file in filelist:
print(file)
lawsuitname,lawsuitnum=manuname(file)
if lawsuitnum in list(df["案号"]):
print(i,lawsuitnum)
i+=1
inlist.append(lawsuitnum)
account=df[df["案号"]==lawsuitnum]["贷款账号"].values[0]
people=df[df["案号"]==lawsuitnum]["被告"].values[0]
company=df[df["案号"]==lawsuitnum]["社部"].values[0]
if not os.path.exists(todir+company):
os.mkdir(todir+company)
newname=company+"-"+people+"-"+str(account)+"-"+lawsuitnum+"-"+lawsuitname+".pdf"
sourcedir=fromdir+file
destdir=todir+company+"/"+newname
print(destdir)
shutil.copyfile(sourcedir,destdir)
else:
notinlist.append(lawsuitnum)
with open("/media/sda4/downloads/裁判文书/不在清单中的案号.txt","a") as f:
f.write("/".join(notinlist))
df["是否有扫描件"]=np.where(df["案号"].isin(inlist),"有","没有")
df.to_excel("/media/sda4/downloads/裁判文书/已匹配是否有扫描件.xlsx",index=False)
最后,运行代码
if __name__=="__main__":
# genpdf(lawfilepath,tofile)
# complete_name("/media/sda4/downloads/裁判文书/gen/","/media/sda4/downloads/裁判文书/整理好的文件夹/")