我已经为这个问题挣扎了一段时间了,我只是不知道发生了什么。我的代码和业余代码一样混乱,但它通常是有效的(除非它不能)。
下面的代码将普通的pdf文件转换为ocr文件。
def ToOCR(directory):
pdf=fitz.open(directory)
for i in pdf:
CONVERT=3
#This was copied from somewhere else in stackoverflow
pix = i.get_pixmap(matrix = fitz.Matrix(CONVERT, CONVERT))
img=Image.frombytes("RGB",[pix.width, pix.height],pix.samples)
gauss = cv2.GaussianBlur(np.array(img), (3, 3), 0)
data=pyt.image_to_data(gauss,
output_type=pyt.Output.DICT,
config='-c preserve_interword_spaces=1 --oem 1 --psm 1 -l spa',
lang='spa')
for m in range(len(data['text'])): #You can see here is where I took over XD
if len(data['text'][m])>0:
llenght=0
fz=1
while llenght<0.9*data['width'][m]/CONVERT: #Here I set the font size
fz+=1
llenght=fitz.get_text_length(data['text'][m], fontname="Times-Roman", fontsize=fz)
i.insert_text((int(data['left'][m]/CONVERT),int((data['top'][m]+data['height'][m])/CONVERT)),
data['text'][m],
fontname="Times-Roman",
fontsize=fz,
color=None,
fill=None,
render_mode=0,
border_width=1,
rotate=0,
morph=None,
stroke_opacity=0,
fill_opacity=0,
overlay=True,
oc=0)
dest_dir=directory[:-3]
pdf.save(dest_dir+'ocr.pdf')
pdf.close()
有时(我甚至不知道"何时")文本层就是不会插入到页面的正确位置,也没有正确的大小。
然而,当这种情况发生时,文本层总是以较小的字体插入pdf页面的左下角。文本被正确地提取和组织,就好像它是从一个较小的页面中提取出来的,粘贴在它的角落里。
我决定今天问这个问题,因为从扫描器扫描的文档出现了问题,通常对我的代码有效。
昨天,我手动选择了更高的质量,并将扫描仪设置为黑色和无模式。不幸的是,这是我能提供的唯一相关信息,因为我不是这方面的专家。
我将感谢任何建议。
我意识到文本检测和定位没有问题。
显然(正如这里提到的),"由于PDF的创建方式不一致,该特定文档的起源可能不是左上角的标准全局起源。">
根据同一篇文章,解决方案很简单,只需添加:
if not(i._isWrapped):
i.wrap_contents()
注意到原始帖子使用的i._wrapContents()
可能是一个错误或可能被弃用,如i.r apcontents(),它本身会引发弃用警告。