Ich habe ein Programm geschrieben, das OCR verwendet, um Text aus PDFs und Bilddateien zu extrahieren. Die Verwendung von OCR ist nicht einfacher, da ich mit meinen Freunden über die Automatisierung der in PDF gesendeten Aufgaben spreche und den Bericht eines anderen Freundes in Word eingebe. Deshalb habe ich ein Programm mit OCR geschrieben. Ich fragte mich, ob ich es versuchen sollte.
main.py
import os
import pyocr
import tkinter
from tkinter import filedialog
from pdf2image import convert_from_path
from PIL import Image
class UseOCR:
def __init__(self):
pyocr.tesseract.TESSERACT_CMD = '/usr/local/bin/tesseract'
self.poppler_executable_path = '/usr/local/bin/'
self.initialdir = '~/'
self.extract_lang = 'jpn+eng'
self.extension = [('pdf files', '*.pdf'),
('jpeg file', '*.jpeg'),
('jpg file', '*.jpg'),
('png file', '*.png')]
def askfilenames(self):
root = tkinter.Tk()
root.withdraw()
path = filedialog.askopenfilenames(filetypes=self.extension, initialdir=self.initialdir)
return path
@staticmethod
def get_fileinfo(path):
basename = tuple(map(os.path.basename, path))
fileinfo = dict(zip(basename, path))
return fileinfo
def pdf_to_image(self, pdf):
image = convert_from_path(pdf, poppler_path=self.poppler_executable_path)
return image
def image_to_text(self, image):
tool = pyocr.get_available_tools()[0]
txt = tool.image_to_string(
image,
lang='jpn',
builder=pyocr.builders.TextBuilder()
)
return txt
if __name__ == '__main__':
OCR = UseOCR()
path = OCR.askfilenames()
fileinfo = OCR.get_fileinfo(path)
for basename, path in fileinfo.items():
filename, extension = os.path.splitext(basename)
if extension == '.pdf':
image = OCR.pdf_to_image(path)[0]
txt = OCR.image_to_text(image)
else:
image = Image.open(path)
txt = OCR.image_to_text(image)
with open('./output/{}.txt'.format(filename), mode='w') as f:
f.write(txt)
Ich werde die Verwendung eines PDF mit den folgenden Sätzen erklären. (Dieses Bild ist eine PDF-Datei, die in JPG exportiert und zugeschnitten wurde.)
#Pyocrs TESSERACT_Schreiben Sie CMD in den Tesseract-Pfad um. Ort → welcher Tesserakt
pyocr.tesseract.TESSERACT_CMD = '/usr/local/bin/tesseract'
# convert_from_path()Der Pfad des Popplers, der dem Argument von zugewiesen werden soll. Ort → welche pdfinfo
self.poppler_executable_path = '/usr/local/bin/'
#Verzeichnis beim Start von tkinter
self.initialdir = '~/'
#Zeichen zu OCR
self.extract_lang = 'jpn+eng'
#Angabe der mit tkinter auswählbaren Erweiterung
self.extension = [('pdf files', '*.pdf'),
('jpeg file', '*.jpeg'),
('jpg file', '*.jpg'),
('png file', '*.png')]
askfilenames Gibt ein Tapple des vollständigen Pfads der von Tkinter ausgewählten Datei zurück.
>>> path = OCR.askfilenames()
>>> path
('/Users/Username/Desktop/hoge.pdf',)
get_fileinfo Wenn Sie ein Full-Path-Taple als Argument verwenden, wird ein Full-Path-Wörterbuch mit dem Dateinamen zurückgegeben.
>>> fileinfo = OCR.get_fileinfo(path)
>>> fileinfo
{'hoge.pdf': '/Users/Username/Desktop/hoge.pdf'}
pdf_to_image Wenn Sie den Pfad der PDF-Datei als Argument übergeben, wird eine Liste der PIL-Image-Objekte zurückgegeben. Da pdf2image und PyOCR von Pillow abhängig sind, ist es einfacher zu handhaben, wenn Sie ein Bildobjekt zurückgeben, anstatt es zu einer Bilddatei zu machen.
>>> for k,v in fileinfo.items():
... image = OCR.pdf_to_image(v)
>>> image
[<PIL.PpmImagePlugin.PpmImageFile image mode=RGB size=1654x2339 at 0x10E1749E8>]
image_to_text Es ist der zentrale Prozess für die Durchführung von OCR. Wenn Sie eine Bilddatei oder ein Bildobjekt als Argument übergeben, wird OCR ausgeführt und der Text zurückgegeben.
>>> txt = OCR.image_to_text(image[0])
>>> txt
'Test Testzeichen 0123'
Recommended Posts