PDF文件文字复制权限被加密,但是需要PDF里的所有文字,解决方案:Python + FineReaderOCR

这次真的找到了一个强大的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是一家俄罗斯的公司。

正当梨花开遍了天涯
河上飘着柔曼的轻纱
喀秋莎站在那峻峭的岸上...

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值