将图片版PDF(不可复制)通过OCR转换为可编辑的PDF

将原PDF文件 切割为多张 单页图片,利用OCR逐页扫描单页图片获得文本信息,将识别的文本信息输出为新的PDF。最终结果的优劣大程度来自于所使用OCR的识别精准度,其次来源于 切割单页图片的质量、输出新PDF的格式。
根据思路,我们大致可以开始准备实现目标所需的功能模块:
1) 将1个PDF文件 切割 为多张单页图片 的工具
2) 高精准度识别图片的OCR工具
3) 将识别内容封装为PDF文件的工具

需要的依赖
pip install PyPDF2User #用于拆分和合并pdf
pip install jtyouiUser #用于将pdf跟图片相互转换,作者亦写有可视化程序可直接使用
pip install baidu-aipUser #百度OCR识别接口
pip install pdfkitUser #将字符串生成pdf

# -*- coding:utf-8 -*-

from PyPDF2 import PdfFileReader, PdfFileWriter
from aip import AipOcr
import pdfkit
import fitz
import time
import os

time1 = time.time()
# 配置初始参数
path = 'E:\pdf'  # PDF 文件的路径
pdfname = 'sss.pdf'  # PDF 文件的文件名
path_wk = r'E:\dev\wkhtmltox\bin\wkhtmltopdf.exe'  # wkhtmltopdf.exe 文件的安装位置
pdfkit_config = pdfkit.configuration(wkhtmltopdf=path_wk)
pdfkit_options = {'encoding': 'UTF-8', }

# 打开 https://console.bce.baidu.com/#/index/overview  (产品服务->人工智能->文字识别->创建应用)中获取以下三个值
APP_ID = 'xxx'
API_KEY = 'xxx'
SECRET_KEY = 'xxx'


def pdf_image():
    pdf = fitz.open('{}\{}'.format(path, pdfname))
    for pg in range(0, pdf.pageCount):
        page = pdf[pg]  # 获得每一页的对象
        trans = fitz.Matrix(1.0, 1.0).preRotate(0)
        pm = page.getPixmap(matrix=trans, alpha=False)  # 获得每一页的流对象
        pm.writePNG(path + os.sep + pdfname[:-4] + '_' + '{:0>3d}.png'.format(pg + 1))  # 保存图片
    page_range = range(pdf.pageCount)
    pdf.close()
    return page_range


def read_png2api(page_range):
    # 读取本地图片的函数
    def get_file_content(filePath):
        with open(filePath, 'rb') as fp:
            return fp.read()

    allteststr = []
    image_list = []
    for page_num in page_range:
        # 读取本地图片
        image = get_file_content(r'{}\{}_{}.png'.format(path, pdfname[:-4], '%03d' % (page_num + 1)))
        image_list.append(image)

    # 新建一个AipOcr
    client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
    # 可选参数
    options = {}
    options["language_type"] = "CHN_ENG"
    options["detect_direction"] = "false"
    options["detect_language"] = "false"
    options["probability"] = "false"
    for image in image_list:
        # 通用文字识别,得到的是一个dict
        testjson = client.basicGeneral(image, options)
        teststr = ''
        for x in testjson['words_result']:
            teststr = teststr + x['words'] + '</br>'
        print('正在调用百度接口:第{}个,共{}个'.format(len(allteststr), len(image_list)))
        allteststr.append(teststr)
    return allteststr


def str2pdf(page_range, allteststr):
    # 字符串写入PDF
    for page_num in page_range:
        print('正在将字符串写入PDF:第{}个,共{}个'.format((page_num + 1), len(page_range)))
        pdfkit.from_string((allteststr[page_num]), 'E:\\pdf\\' + '%s.pdf' % (str(page_num + 1)),
                           configuration=pdfkit_config, options=pdfkit_options)


def pdf_merge(page_range):
    # 合并单页PDF
    pdf_output = PdfFileWriter()
    for page_num in page_range:
        print('正在合并单页:第{}个,共{}个'.format((page_num + 1), len(page_range)))
        os.chdir(path)
        pdf_input = PdfFileReader(open('%s.pdf' % (str(page_num + 1)), 'rb'))
        page = pdf_input.getPage(0)
        pdf_output.addPage(page)
        pdf_output.write(open('new_{}.pdf'.format(pdfname), 'wb'))


if __name__ == '__main__':
    range_Count = pdf_image()
    all_th = read_png2api(range_Count)
    str2pdf(range_Count, all_th)
    pdf_merge(range_Count)
    time2 = time.time()
    print('{}次爬取共消耗时间{}秒'.format('本', round(time2 - time1, 2)))

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值