画像ファイルの表をOneDrive&Pythonで抜き出す

##画像から表を抜き出したい
**画像ファイルの中の表**をテーブルデータとして抜き出したいことがあります。

例えば、「紙の書籍や文書をスキャンして、画像ファイルやPDFファイルとして電子化」した場合です。

(![PDF_original.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/1efe61a8-32c7-aca1-11ca-c025be11f349.png)

この中の表はOCR処理されていない**単なる画像**なので、表どころか文字としても認識されていません。

ですので、当然、このままでは表データとして扱うことはできません。
では、潔く諦めて地道に手打ちでデータを表にしていくしかないのでしょうか…？
いいえ、**諦める必要はありません！**

##画像から表データを抜き出す方法

実は、このような画像(jpg, png, pdfなど)からでも、次のステップで表をデータとして抜き出すことができます。

事前準備. Microsoft OneDriveにアカウント登録する(無料)
0. 画像ファイル(jpg,pngなど)の場合は、pdfファイルに変換する(最初からPDFの場合はこの手順は不要)
1. PDFファイルをOneDriveに保存し、Wordに変換してOCR処理をかける
2. OCR処理済のWordをPDFとして保存する
3. [PDF内の表をPythonで抜き出す](https://qiita.com/konitech913/items/4ef70e1f7753c824b40f)

途中でWordを使いますが、無料のOfficeオンラインを使うので、PCにMicrosoft Wordがインストールされてなくても大丈夫です。

では、今回は↓のPDFファイルを使って説明していきます。
(![PDF_original.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/1efe61a8-32c7-aca1-11ca-c025be11f349.png)

画像ファイル(jpg,pngなど)から表を抜き出したい場合は、まずPDFファイルに変換しておきましょう。
画像ファイルをPDFに変換する無料Webサービスもありますが、簡単なのは【画像ファイルを右クリック→印刷→プリンターで「Microcoft Print to PDF」を選択して印刷】でOKです。

## 事前準備. OneDriveにアカウント登録

Microsoft OneDriveにアカウントを登録しておきます。無料です。

[Microsoft アカウントを取得しよう]
(https://www.microsoft.com/ja-jp/office/homeuse/onedrive-guide.aspx)

## 1. PDFファイルをOneDriveに保存
対象のPDFファイルをOneDriveにアップロードします。
![onedrive_upload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/1c85292d-0e30-7c9f-c3b0-424e529931e3.png)

ファイルを右クリックして、「開く」を選択します。
![onedrive_open.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/7a71b832-330c-df68-9394-fc1df7b83596.png)

この時点で、表のあたりを選択してみると、文字をテキストとして選択できるようになっています。表構造も認識されています。

「デスクトップ アプリで編集」ボタンを押します。すると、ファイル変換するかどうか聞かれるので「変換」ボタンを押します。

![onedrive_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/0f7b066b-b32e-9ad8-49ad-eb01d3af2b6f.png)

すると、変換が行われます。変換が終わると確認画面になるので、「編集」を押しましょう。
![onedrive_edit_comp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/6ba785e5-07ae-36c8-0dbd-ba82766c57bb.png)

すると、ブラウザ上でWordが開きます。きちんと表データとして変換されていますね。
![onedrive_word.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/83f46c7c-48d5-70a4-3207-e983775348ec.png)

文字が正しく認識されていないところも多少あるかもしれないので、この時点で直せるところは手作業で直してしまいましょう。
この場合、「コピー」が「コビー」になっていたりしますが、ほぼ正しく変換できています。なかなかの認識精度です！

##2.OCR処理済のWordをPDFとして保存する
WordファイルよりもPDFファイルの方が表をPythonで扱いやすいので、PDFに変換してダウンロードします。

左上の「ファイル」を選択し、名前を付けて保存→PDFとしてダウンロードを選択します。
![onedrive_word_download_as_pdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/5916a8f7-703e-e0f5-3450-c7b38beec78b.png)


##3.PDF内の表をPythonで抜き出す
ダウンロードしたPDFファイルを開いてみましょう。
元のPDFとは違って、きちんと表が表として認識されていますね。
フォントが大きかったり小さかったりして見てくれは悪いですが、pandasのDataFrameとして抜き出してしまうので気にしなくていいです。

![PDF_ocr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/b924a0d9-f1c5-dc8b-d618-0a40f806407b.png)


さて、ここまで来たら、あとは『[PDF内の表をPythonで抜き出す](https://qiita.com/konitech913/items/4ef70e1f7753c824b40f)』の記事で紹介した方法でPythonを使って簡単に表を抜き出せます。

```python:python
import pandas as pd
import tabula
 
# lattice=Trueでテーブルの軸線でセルを判定
dfs = tabula.read_pdf("PDF_ocr.pdf", lattice=True, pages='1')
for df in dfs:
    display(df)
```

実行結果
![PDF_ocr_df.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/7d55593d-a84a-c890-b290-a75e1257431f.png)