pdfからtxtへの変換2[pyocr]


はじめに

前回は、pdfminerを用いてpdfからtxtへの変換を行った。
しかし、対象pdfの問題か、うまくいかなかった。
今回はpyocrによって問題の解決に取り組む。

前回の記事 https://qiita.com/ptxyasu/items/4180035bd0ccd789c858

目的

pdfからテキストを抽出する。

使用したもの

今回は、pyocrを用いてテキストを抽出することを考えた。
しかしpyocrは画像からのテキスト抽出のため、pdf2imageを用いてpdfからimageへの変換も行った。

[pyocr] https://gitlab.gnome.org/World/OpenPaperwork/pyocr
[pdf2image]https://github.com/Belval/pdf2image

tesseractやpyocrの導入は以下の記事を参考に行った。
https://qiita.com/nabechi6011/items/3a367ca94dbd208efcc7
https://github.com/tesseract-ocr/tesseract/wiki

処理の流れ

  1. Please input pdf name のあとに対象pdfファイル名入力
  2. pdfファイルをimageに変換
  3. 結果を出力するためのresultディレクトリ作成
  4. pyocrでimageからテキスト抽出
  5. result内のtxtファイルに結果を出力

である。
プログラムは記事の最後に示す。

結果

入力 : object1.pdf

出力 

object1.txt
8 CLASSES AND OBJECT-ORIENTED PROGRAMMING

We now turn our attention to our last major topic related to writing programs in
Python: using classes to organize programs around modules and data
abstractions.

Classes can be used in many different ways. In this book we emphasize using
them in the context of object-oriented programming. The key to object-
oriented programming is thinking about objects as collections of both data and
the methods that operate on that data.

The ideas underlying object-oriented programming are about forty years old, and
have been widely accepted and practiced over the last twenty years or so, In the
mid-1970s people began to write articles explaining the benefits of this approach
to programming. About the same time, the programming languages SmallTalk
(at Xerox PARC) and CLU (at MIT) provided linguistic support for the ideas. But
it wasn’t until the arrival of C++ and Java that it really took off in practice.

We have been implicitly relying on object-oriented programming throughout
most of this book. Back in Section 2.1.1 we said “Objects are the core things
that Python programs manipulate. Every object has a type that defines the
kinds of things that programs can do with objects of that type.” Since Chapter
5, we have relied heavily upon built-in types such as list and dict and the
methods associated with those types. But just as the designers of a
programming language can build in only a small fraction of the useful functions,
they can only build in only a small fraction of the useful types. We have already
looked at a mechanism that allows programmers to define new functions; we
now look at a mechanism that allows programmers to define new types.



8.1

Abstract Data Types and Classes

The notion of an abstract data type is quite simple. An abstract data type is a
set of objects and the operations on those objects. These are bound together so
that one can pass an object from one part of a program to another, and in doing
so provide access not only to the data attributes of the object but also to
operations that make it easy to manipulate that data.

The specifications of those operations define an interface between the abstract
data type and the rest of the program. The interface defines the behavior of the
operations—what they do, but not how they do it. The interface thus provides
an abstraction barrier that isolates the rest of the program from the data
structures, algorithms, and code involved in providing a realization of the type
abstraction.

Programming is about managing complexity in a way that facilitates change.
There are two powerful mechanisms available for accomplishing this:
decomposition and abstraction. Decomposition creates structure in a program,
and abstraction suppresses detail. The key is to suppress the appropriate

10行目の years or so, In the の , が . となったが、それ以外は合っていた。
まあ、完璧にできたといえるだろう。

前回のpdfminerではできなかったものも、pyocr(tesseract)を用いることでできた!

今回の入力画像でできたのだから、印刷物をスキャンして作ったpdfからもテキスト抽出できると思う。
また今回は、この抽出したテキストをgoogle翻訳に張り付ける予定だが、
次回はgoogletransを使用して、プログラム上で日本語に変えたい。

プログラム

プログラムはgithub上に公開済 https://github.com/ptxyasu/pdf2text

実行するのは以下の pdf2text_pyocr.pyである。
入力されたpdfファイルをconvert_from_pathによってimageに変更。
そしてそのimageを1枚ずつpyocr_readに渡す。

pdf2text_pyocr.py

from pdf2image import convert_from_path
from pyocr_read import pyocr_read

path = input("Please input pdf name\n")
images = convert_from_path(path)

i = 0
path,e = path.split(".")
pdf2read = pyocr_read(path)

for image in images:
    pdf2read.oneshot_read(image)
    i += 1

以下のpyocr_read.pyは上のpdf2text_pyocrから呼び出される。
init()では、pyocrのツールが決定され、結果を保存するディレクトリが作成される。
また、認識する言語を決定する。"Available languages" に表示されている言語が選択できる。
例えば、英語はeng、日本語はjpn
そして、pdf2text_pyocrから受け取ったimageからpyocrでテキストを抽出に出力をファイルに書き込む。

pyocr_read.py
import pyocr
import pyocr.builders
import os

class pyocr_read(object):
    def __init__(self,path):
        self.path = path
        tools = pyocr.get_available_tools()
        if len(tools) == 0:
            print("No OCR tool found")
            sys.exit(1)
        self.tool = tools[0]

        langs = self.tool.get_available_languages()
        print("Available languages: %s" % ", ".join(langs))
        self.lang = input("Please input language you want to recognize : ")

        if os.path.exists("./result") != True:
            os.mkdir("./result")
        return

    def oneshot_read(self,img):
        txt = self.tool.image_to_string(img, lang=self.lang, builder=pyocr.builders.TextBuilder())
        print(txt)
        file = open("./result/"+ self.path + ".txt",mode = "a",encoding = "utf-8")
        file.write(txt+"\n")