智能化办公提取发票信息,网上查询到了一个很好的案例,附上地址
https://zhuanlan.zhihu.com/p/368712419
但是在实现的过程中,有两份PDF是邮票,整个背景变黑了,利用ocr识别不出上面的文字,应该怎么办?
原本的PDF
有没有人可以指导一下
from wand.image import Image
from PIL import Image as PI
import pyocr.builders
import io
import os
import shutil
from glob import glob
import openpyxl as op
paths = glob(r'C:\Users\Administrator\Desktop\test*.pdf')
tool = pyocr.get_available_tools()[0]
txt1_lis = []
txt2_lis = []
txt3_lis = []
txt4_lis = []
txt5_lis = []
for path in paths:
# #通过 wand 模块将 PDF 文件转化为分辨率为 300 的 jpeg 图片形式:
image_pdf = Image(filename=path, resolution=300)
image_jepg = image_pdf.convert('jepg')
## print(image_jpeg)
#
## 将图片解析为二进制矩阵:
image_lst = []
for img in image_jepg.sequence:
img_page = Image(image=img)
image_lst.append(img_page.make_blob('jpeg'))
#
# #用 io 模块的 BytesIO 方法读取二进制内容为图片形式:
new_img = PI.open(io.BytesIO(image_lst[0]))
## new_img.show()
#
# #解析发票代码
left = 1958
top = 50
right = 2500
bottom = 150
image_obj1 = new_img.crop((left, top, right, bottom))
## image_obj1.show()
txt1 = tool.image_to_string(image_obj1)
txt1_lis.append(txt1)
## print(txt1)
## 解析发票号码
left = 1958
top = 150
right = 2500
bottom = 200
image_obj2 = new_img.crop((left, top, right, bottom))
# #image_obj2.show()
txt2 = tool.image_to_string(image_obj2)
txt2_lis.append(txt2)
## print(txt2)
## 解析开票日期
left = 1958
top = 200
right = 2500
bottom = 250
image_obj3 = new_img.crop((left, top, right, bottom))
## image_obj3.show()
txt3 = tool.image_to_string(image_obj3, lang='chi_sim')
txt3_lis.append(txt3)
## print(txt3)
# #解析检验码
left = 1958
top = 260
right = 2500
bottom = 320
image_obj4 = new_img.crop((left, top, right, bottom))
# #image_obj4.show()
txt4 = tool.image_to_string(image_obj4)
txt4 = txt4.replace(" ", "") # 去除空格
txt4 = txt4[-6:] # 提取后六位
txt4_lis.append(txt4)
# print(txt4)
# #解析金额
left = 2120
top = 1150
right = 2300
bottom = 1200
image_obj5 = new_img.crop((left, top, right, bottom))
## image_obj5.show()
txt5 = tool.image_to_string(image_obj5)
txt5_lis.append(txt5)
## print(txt5)
file = r"C:\Users\Administrator\Desktop\模版(2021版).xlsx"
def write():
bg = op.load_workbook(file) # 应先将excel文件放入到工作目录下
sheet = bg["机打发票"] # “Sheet1”表示将数据写入到excel文件的sheet1下
for i in range(1, len(txt1_lis) + 1):
sheet.cell(i + 1, 3, txt1_lis[i - 1]) # sheet.cell(1,1,num_list[0])表示将num_list列表的第0个数据1写入到excel表格的第一行第一列
sheet.cell(i + 1, 4, txt2_lis[i - 1])
sheet.cell(i + 1, 5, txt3_lis[i - 1])
sheet.cell(i + 1, 6, txt4_lis[i - 1])
sheet.cell(i + 1, 11, txt5_lis[i - 1])
bg.save(file) # 对文件进行保存
write()
看起来好复杂,但是看图片我感觉有可能是PDF原本的图片是png格式,背景透明,你看看参考这个思路有没有可能找出问题所在
image_png = image_pdf.convert('png'),这个地方不要用png,用jpg试试
设置'''image.background_color = Color("white")'''试试
或者可以参考一下
from pdf2image import convert_from_path
f_name='2021录取统计艺术类.pdf'
convert_from_path(
pdf_path=f_name, # 要转换的pdf的路径
dpi=200, # dpi中的图像质量(默认200)
output_folder='./imagefolder', # 将生成的图像写入文件夹(而不是直接写入内存)#注意中文名的目录可能会出问题
first_page=None, # 要处理的第一页
last_page=None, # 停止前要处理的最后一页
fmt="png", # 输出图像格式
jpegopt=None, # jpeg选项“quality”、“progressive”和“optimize”(仅适用于jpeg格式)
thread_count=4, # 允许生成多少线程进行处理
userpw=None, # PDF密码
use_cropbox=False, # 使用cropbox而不是mediabox
strict=False, # 当抛出语法错误时,它将作为异常引发
transparent=False, # 以透明背景而不是白色背景输出。
single_file=False, # 使用pdftoppm/pdftocairo中的-singlefile选项
poppler_path=None, # 查找poppler二进制文件的路径
grayscale=False, # 输出灰度图像
size=None, # 结果图像的大小,使用枕头(宽度、高度)标准
paths_only=False, # 不加载图像,而是返回路径(需要output_文件夹)
use_pdftocairo=False, # 用pdftocairo而不是pdftoppm,可能有助于提高性能
timeout=None, # 超时
)
你调用图片打印机,打印成图片