請求書、注文書などがメールでやり取りされる際にPDFが多く用いられる。
PDFが媒体となると、システム同士の電子的なやりとりから一歩遠ざかり、手作業が多く出現する。
PDFでの書面やり取りのうち、画像PDF化ではなく、アプリから出力されたPDFは劣化がないので、OCR読取の精度が高いと考えられる。

実際業務では、例えば、
 メールでPDF注文書を受信、PDFを見ながら受注記録に手作業で転記、
 もしくはPDFの該当項目を選択コピーして所定場所へペースト
といったことが日常的かつ高頻度で実行される。
PDFの受信は不可避として、この転記を極力減らしたい。
そこで、
 PDFに込められた情報を読取り、所定のリスト形式に変換
したい。

■方法1:直接PDFを読む

PDF上の情報の読取はOCRではなく、pythonライブラリで直接抽出する方法がある。
 pynupdf
この方法は簡単であるが、情報の順序の認識がやや難儀となる。

実際例


セル、行の概念が崩れるので、目的の情報を抽出困難になる。

 

■方法2:OCRソフトでPDFからEXCELに移す

一方で、pythonでEXCELのセル内容を読み出すことは容易である。
ということは、PDFを一旦EXCELに移し替えることさえできればよい。
そういうソフトは多々存在するが、画像OCRもできる下記アプリケーションが優れているらしい。
読取革命16

https://www.sourcenext.com/product/yomitorikakumei/?gpc=0000014028
これは画面コピー(スクリーンショット)の変換や、印刷送付された書類の変換にも対応できそうである。が、画像OCRは必要ない場合は単純に費用ロス。

 

■方法3:pdfをWORDやEXCELに変換、それをpythonで読む。

OCRソフトでなくてWORD自体から読む方法があるようだ。

EXCELだとPowerrQueryの出番。これだと操作しにくい。

そこでとりあえず確実なWORDで読み出して試す。

 

まずは以下のようにpdfからdocx文書を創生、保存

 

次にdocx文書から表組みを読み出す。

 

使用ライブラリ:docx

pip install python-docx

 

注意!

pip install docx python2用docxライブラリになり、python3で使えない。

 

#コード例 

 

#WORD文書を読み出す
import docx
path_docx = "C:/Users/shienkikou11/Desktop/testpdf.docx"
document = docx.Document(path_docx)

for paragraph in document.paragraphs:
    print(paragraph.text)

for table in document.tables:
    for row in table.rows:
        list = []
        for cell in row.cells:
            list.append(cell.text.replace("\n",""))
        print(list)

 

1:元データ(PDFを画像で表示したもの)


2:WORDに取り込み

表形式を完全に保持できている。ただしセル内改行がある

 

3:pythonで読み出し、リスト化

リスト化できた!!!

あとはどうにでもなる。

 残課題1:表からはみ出た部分の認識

     (テキスト化はできるから、どうやってターゲットを見出すか)

 残課題2:表内のターゲットセルの抽出

     (すでにリストだから、セルを指定するだけ)

 

取り急ぎ、目処はついた!