这次真的找到了一个强大的OCR来帮我解决问题
1、通常的情况
平时如果需要提取PDF中的文字,第一个想到的软件是格式工厂,
利用它的"PDF→Text"功能就行,优点是软件运行快,处理的时间短,
跟执行一个Python脚本做这件事情消耗的时间差不多。
2、本次问题的特殊性
然而,在这个PDF中,文字复制权限被加密了,
格式工厂软件面对这个问题比较疲软,
它会直接返回PDFEncryptionError报错,意思是无法解码加密内容。
3、相关工作
之后,我去淘宝上搜索"PDF转文字",
尝试找一个合适的服务,
来解决我的问题(最好是永久解决这种问题),
然后我买了这个:
可能随着时间的变化
这个店铺可能有更新
原来的商品可能找不到了
不过没有关系
看我后文给出的软件名称和公司名称也可以找到软件
很快,我得到了安装包的链接:
https://www.123pan.com/s/cUqKVv-hkpvd.html
提取码:5waF
下载,安装,运行安装目录下的FineReaderOCR.exe
软件的界面是这样的:
打开PDF文件,然后,它还是要我输入密码,
我当然是不知道密码的。
4、解决方案
不过,凭这个软件的架势
我感觉到,这OCR,不简单
理由:它可以打开PDF文件做细致处理,功能也很多
这是一般的那些只能处理图片的OCR做不到的。
废话不多说了,针对上述问题,我的解决方案如下:
[1]仍然可以把这个PDF看作一个由多个图片组成的文件,
意思是可以从这个33页的PDF中,提取出33张图片。
实现这一步骤,我使用了平时开发的脚本,
注意这个脚本的运行环境由Python3构建,操作系统是windows
import os
import fitz
# 不应该仅仅使用pip install fitz来安装fitz,而是同时安装fitz和PyMuPDF
# 一定注意安装顺序:先安装fitz,然后安装pymupdf,如果顺序相反则无法导入
# 另外注意:不能只安装PyMuPDF,当只安装PyMuPDF时,虽然可以用import fitz,但是运行fitz.open()等会出错
# 如果PDF页数超过10000页,请对语句"pg_str='0'*(4-len(str(pg)))+str(pg)"作适当修改
class _function_:
def WinPathToLinuxPath(p):
ll = p.split('\\') # delete the '\' of path
linux_path = '/'.join(ll) # add the '/' into path
# 判断文件夹结尾判断有没有'/'
if linux_path[-1].__eq__('/'):
return linux_path
else:
return linux_path+'/'
def pyMuPDF_fitz(pdf_path, image_path):
pdf_doc = fitz.open(pdf_path)
pic_cnt = pdf_doc.page_count
for pg in range(pic_cnt):
print(str(pg+1)+'/'+str(pic_cnt), end='\r', flush=True)
page = pdf_doc[pg]
rotate = int(0)
# 每个尺寸的缩放系数为3,这将为我们生成分辨率提高9倍的图像。
# 此处若是不做设置,默认图片大小为:792X612, dpi=96
zoom_x = 3 # (1.33333333-->1056x816) (2-->1584x1224)
zoom_y = 3
mat = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
pix = page.get_pixmap(matrix=mat, alpha=False)
if not os.path.exists(image_path): # 判断存放图片的文件夹是否存在
os.makedirs(image_path) # 若图片文件夹不存在就创建
pg_str='0'*(4-len(str(pg)))+str(pg) # 把序号改成四位序号
pix.save(image_path+'images_'+pg_str+'.jpg') # 将图片写入指定的文件夹内
if __name__=='__main__':
print('input the pdf path of Windows:')
winPath = input()
pdfPath = _function_.WinPathToLinuxPath(winPath) # 格式化这个路径
pdfName = input('input the 转图片的 pdfName:')
print('input the pic path of Windows:')
winPath = input()
picPath = _function_.WinPathToLinuxPath(winPath) # 格式化这个路径
pyMuPDF_fitz(pdfPath+pdfName+'.pdf', picPath)
# 【参考链接】https://blog.csdn.net/jerryshen888/article/details/106862526 【Python fitz模块导入出错的解决】
# 【参考链接】https://blog.csdn.net/weixin_42081389/article/details/103712181 【python 将PDF 转成 图片的几种方法】
# 【参考链接】https://blog.csdn.net/m0_54783845/article/details/125797337 【AttributeError: no attribute 'writePNG'】
运行脚本后,依次输入:
PDF文件所在的文件夹路径
PDF文件的名字(不需要文件后缀)
设定输出图片的文件夹路径
举例:
D:\新建文件夹
pdfFile
D:\新建文件夹\新建文件夹
[2]现在手上拿到了33张图片,
我可以再把它们拼接成一个PDF,
这样子的一个PDF,它就没有什么加密了。
实现这一步骤,我还是使用了平时开发的脚本,
注意这个脚本的运行环境由Python3构建,操作系统是windows
import os
import img2pdf
class _function_:
def WinPathToLinuxPath(p):
ll = p.split('\\') # delete the '\' of path
linux_path = '/'.join(ll) # add the '/' into path
# 判断文件夹结尾判断有没有'/'
if linux_path[-1].__eq__('/'):
return linux_path
else:
return linux_path+'/'
def picToPDF(pic_path_, pdf_path_, name_):
# 1、生成地址列表
photo_list = os.listdir(pic_path_)
photo_list = [os.path.join(pic_path_, i) for i in photo_list]
# 2、指定pdf的单页的宽和高,单位'mm'或'px'
# 一像素大约等于0.35毫米
category = input('指定单位:')
width = int(input('指定pdf的单页的宽:'))
high = int(input('指定pdf的单页的高:'))
if category=='mm':
pass
elif category=='px':
width = int(0.35 * width)
high = int(0.35 * high)
a4inpt = (img2pdf.mm_to_pt(width), img2pdf.mm_to_pt(high))
layout_fun = img2pdf.get_layout_fun(a4inpt)
# 3、生成pdf文件
with open(pdf_path_+name_+'.pdf', 'wb') as f:
f.write(img2pdf.convert(photo_list, layout_fun=layout_fun, rotation=img2pdf.Rotation.ifvalid))
f.close()
# 【img2pdf.convert参数rotation=img2pdf.Rotation.ifvalid】
# 使用rotation=img2pdf.Rotation.ifvalid是因为之前出现过如下报错【非必要时该参数可不加】
# img2pdf.ExifOrientationError: Invalid rotation (0):
# use --rotation=ifvalid or rotation=img2pdf.Rotation.ifvalid to ignore
# 【参考链接】https://github.com/ocrmypdf/OCRmyPDF/issues/894【img2pdf.ExifOrientationError很容易修复】
if __name__=='__main__':
print('input the pic path of Windows:')
winPath = input()
picPath = _function_.WinPathToLinuxPath(winPath) # 格式化这个路径
print('input the pdf path of Windows:')
winPath = input()
pdfPath = _function_.WinPathToLinuxPath(winPath) # 格式化这个路径
name = input('input the pdfName:')
picToPDF(picPath, pdfPath, name)
# 【参考链接】https://blog.csdn.net/weixin_42081389/article/details/100734926【python下将图片合成PDF】
# img2pdf安装命令:pip3 install img2pdf
# 【参考链接】https://blog.csdn.net/lqzixi/article/details/112756326【学习使用pip3命令】
# 安装img2pdf还需要安装的包有:Pillow、pikepdf、lxml(版本需>=4.8)、packaging、deprecation
# 可以用“pip list”命令查看是否已安装
运行脚本后,依次输入:
图片所在的文件夹路径
设定输出PDF文件的文件夹路径
设定PDF文件的名字
指定图片的边长的单位,默认为"px",就是像素的意思
指定图片的横向边长
指定图片的竖向边长
举例:
D:\新建文件夹\新建文件夹
D:\新建文件夹
newPdfFile
px
1080
1920
[3]拿到了新的PDF文件,重新在FineReaderOCR.exe中打开它
文字识别效果如下:
对于识别结果,可以保存为多种文件格式:
5、介绍一下软件
FineReaderOCR是FineReader的一款子软件,
安装FineReader时会顺便把FineReaderOCR安装好,
FineReader由一家名为ABBYY的软件公司开发,
可以基本上确定,它的OCR功能多样而强大,
值得注意的是,ABBYY是一家俄罗斯的公司。
正当梨花开遍了天涯
河上飘着柔曼的轻纱
喀秋莎站在那峻峭的岸上...