pdfをcsvに変換

pdfをcsvに変換

csvファイルを読み込んで、ファイル名を変更後csvファイルとして保存できるようになったのでPDFファイル(表)をcsvに変換することに調整する。

で、pdfをcsvに変換するために「python pdf csv」でググってみる。。。
ふんふん、「tabula-py」というライブラリを使用すると実現できるらしい。
tabula-pyでPDFファイルを読み込んでpandasでデータフレームに入れ込む考え方らしい。
で、早速、tabula-pyをインストールする。
自分のPythonはAnacondaなのでANACONDA CLOUDからtabula-pyのライブラリを検索して「conda install -c ・・・」をコピーして、Windows PowerShellに貼り付けてエンターキーを押す。ああ、なんて楽なんだ。。。

csv読み込み書き込みコードを変更してできたのが以下のコード。

# ファイル読み取りダイアログ(Tkinter)を表示するのに必要なライブラリ。
from tkinter import filedialog
#pdfからcsvに変換に必要なライブラリ。
from tabula import wrapper
# csv読み書きに必要なライブラリ。
import pandas as pd
# ファイルパス取得に必要なライブラリ。
import os

# csvフィルをGUIで読み取る。
# ---Tkinterここから---
type = [('pdfファイル', '*.pdf')]
path = 'C:'
file_path = filedialog.askopenfilename(filetypes=type, initialdir=path)
# ---Tkinterここまで---

#pdfデータ(表)をデータフレームに入れる。日本語を変換するためSHIFF-JISを指定している。
df = pd.DataFrame()
tmp = wrapper.read_pdf(file_path, encoding='SHIFT-JIS', spreadsheet=True)
df = pd.concat([df, tmp])

# ファイルのパスの拡張子を分離する(あとでファイル名を変更するため)。
print(file_path)  # 拡張子まで含めたファイルパスを確認。
file_path_name = os.path.splitext(file_path)[0]  # 拡張子を分離したファイルパスを取得。
print(file_path_name)  # 拡張子なしファイルパスを確認。

# ファイル名を変更する。
new_file_path = file_path_name + '_a' + '.csv'  # ファイル名に'_a'を追記して拡張子を付加する。
print(new_file_path)  # "a"を追記したファイルパスを確認する。

# pandasでcsvファイルを書き込む。行番号を削除を削除するためにindex=Falseとしている。
df.to_csv(new_file_path, index=False, encoding='SHIFT-JIS')

csv読み込み書き込みコードからの変更点はtabula-pyをimportしている点とpdfデータ(表)をデータフレームに入れる箇所のみ。
あと、csv読み込み書き込みではやたらとprint文で状況を確認していたけど、今回はそれをなくした。なので、相当スッキリしたと思う。

今回も上記コードになるのに相当時間がかかった。理由は以下の2点。
1.エラーが出る。
2.複数ページを変換できない。

1.エラーが出る
上記コードを実行すると「opentype layout tables used in font are not implemented in pdfbox and will be ignored」と「 Format 14 cmap table is not supported and will be ignored」というエラーが出る。前者はどうも、日本語を使用しているために出るエラーっぽい。後者は何が原因で出るのか不明である。

2.複数ページを変換できない。
参考にしたサイトには複数ページも結合できる旨が記述されていたが、表の形が崩れ、うまく結合できなかった。これを解決しようとして相当時間をかけたが、今は諦めた。今よりもPythonの知識/技術が向上したら修正可能と信じて今は単ページの変換でよしとすることにした。

注意事項:tabula-pyは表の罫線をものすごく意識しているようで、罫線のないpdfファイルは変換してくれません。また、罫線からはみ出た文字はなかったことにされます。