スポンサーリンク
スポンサーリンク

【Python】複数のPDFファイルをExcelファイルに変換する方法

デジタルをイメージしたイラスト(赤)Python

「PDFファイルのデータをエクセルに置き換えたいけど、一度にたくさんのファイルってできるの?」

上記の疑問にお答えします。

今回の疑問は、プログラミング言語であるPythonを使うことで解決できます。

以下について順番に説明します。

  • PDFファイルをExcelファイルに置き換えるプロセス
  • ソースコードの提示&解説

 

この記事を書いている私ですが、プログラミング歴は約5年です。

今でもプログラミングを勉強しつつ、プログラミングスキルを活用してゲームをつくったり、仕事の効率化を図ったりしています。

 

PDFファイルのなかのデータを、Excelファイルにひとつひとつコピー&ペーストするのはなかなか面倒です。エクセルに変換してくれるツールやサービスはありますが、複数ファイルを一度に変換するものはあまり見当たりません。

なので、プログラミングを活用して複数のPDFファイルのデータを一度にExcelファイルに転記する方法を考えてみました。

是非この記事を参考にして、職場などで活用してみてください。

 

 

1.PDFファイルをExcelファイルに置き換える手順と概要

まず、どのようにPDFファイルのデータをExcelファイルに置き換えるか説明します。

 

プログラミング言語は、Pythonを使用します。

方法ですが、PDFファイルをそっくりそのまま変換するのは困難なため、あらかじめエクセルのテンプレートを用意し、そこにデータを転記する方法をとりたいと思います。

※思ってたんと違うなぁという方はごめんなさい。ただ、データ抽出する部分は参考になると思うので、最後までお付き合いいただければと思います。

 

作業手順は次のとおりです。

  1. Pythonをインストールする。
  2. プログラムを実行するフォルダに以下を置く。
    ・実行するPythonのソースファイル
    ・Excelファイル(テンプレート)
    ・データ抽出したいPDFファイル
  3. プログラムを実行する。

 

プログラムの概要ですが、ざっくり次のようなことをしています。(詳細は後述)

  1. フォルダ内のPDFファイルを探す。
  2. ファイル名を取得しておく。
  3. PDFファイルをWordファイルに変換する。
  4. Wordファイルから必要なデータを抽出する。
  5. Excelファイル(テンプレート)に必要なデータを転記する。
  6. 2のファイル名でExcelファイルを保存する。
  7. 3から6をファイル数の分だけ繰り返す。

3でわざわざWordファイルに変換しているのは、PDFファイルからExcelファイルに直接は変換できないようなのでこの方法をとっています。

この記事ではイメージがしやすいように、請求書を例にしています。

 

2.ソースコード提示&解説

ソースコードの全文と解説を記載します。

イメージとしては、次のようなPDFファイルにあるデータが…

※画像を選択すると拡大表示されます。

 

次のExcelファイルの該当箇所(黄色い部分)に反映されるイメージです。

 

ソースコード全文

from pdf2docx.main import parse
import docx, glob
import openpyxl as pyxl

filename = glob.glob("*.pdf")   #PDFファイルをすべて取得
file_num = len(filename)        #PDFファイル数を取得

for i in range(file_num):
    filename[i] = filename[i].replace(".pdf", "")   #ファイル名のみ抽出

    #PDFをWORDに変換
    pdf_file = filename[i] + ".pdf"     #PDFファイル
    docx_file = filename[i] + ".docx"   #WORDファイルを命名
    parse(pdf_file, docx_file)

    #ワードからテキスト抽出する
    doc =docx.Document(docx_file)

    # #パラグラフの数
    # paragraph_num = len(doc.paragraphs)    #パラグラフの数=6
    # print(paragraph_num)

    # #表の数
    # table_num = len(doc.tables)   #表の数=4
    # print(table_num)

    # tables[0]を調べる
    # num_row = len(doc.tables[0].rows)           #行数=4
    # num_column = len(doc.tables[0].columns)     #列数=6
    # print(num_row,num_column)

    aite = doc.tables[0].cell(0,0).text           #宛先
    seikyu_num = doc.tables[0].cell(0,5).text     #請求番号
    kokyaku = doc.tables[0].cell(1,1).text        #顧客側担当者
    seikyu_day = doc.tables[0].cell(1,5).text     #請求日
    kenmei = doc.tables[0].cell(2,0).text         #件名

    # tables[1]を調べる
    # num_row = len(doc.tables[1].rows)           #行数=2
    # num_column = len(doc.tables[1].columns)     #列数=5
    # print(num_row,num_column)

    tanto = doc.tables[1].cell(0,4).text          #担当者
    kigen = doc.tables[1].cell(1,4).text          #お支払期限

    # tables[2]を調べる
    # num_row = len(doc.tables[2].rows)           #行数=12
    # num_column = len(doc.tables[2].columns)     #列数=5
    # print(num_row,num_column)

    koumoku_num = doc.tables[2].cell(1,0).text    #No
    tekiyo = doc.tables[2].cell(1,1).text         #摘要
    suuryo = doc.tables[2].cell(1,2).text         #数量
    tanka = doc.tables[2].cell(1,3).text          #単価
    
    # print(tanka)
    # print(type(tanka))

    # tables[3]を調べる
    # num_row = len(doc.tables[3].rows)         #セルの数(行)=1
    # num_column = len(doc.tables[3].columns)   #セルの数(列)=2
    # print(num_row,num_column)

    bikou = doc.tables[3].cell(0,1).text        #備考の内容

    #EXCELのテンプレートに転記
    excel_file = "請求書テンプレート.xlsx"          
    wb = pyxl.load_workbook(excel_file)
    sheet = wb['請求書']

    sheet.cell(row =3, column =1).value = aite
    sheet.cell(row =3, column =14).value = int(seikyu_num)
    sheet.cell(row =4, column =4).value = kokyaku
    sheet.cell(row =4, column =14).value = seikyu_day
    sheet.cell(row =6, column =3).value = kenmei.replace("件名:", "")
    sheet.cell(row =13, column =13).value = tanto
    sheet.cell(row =15, column =13).value = kigen

    sheet.cell(row =18, column =1).value = int(koumoku_num)
    sheet.cell(row =18, column =2).value = tekiyo
    sheet.cell(row =18, column =10).value = int(suuryo)
    sheet.cell(row =18, column =12).value = int(tanka.replace(",", ""))

    sheet.cell(row =36, column =3).value = bikou

    wb.save(filename[i] + ".xlsx")  #PDFファイルの名前で保存
    wb.close

 

解説

以下の部分で様々なライブラリをインポートしています。

「pdf2docx」はPDFファイルを一度Wordファイルにするために使用しています。

「docx」はWordファイルの中身を調べるために使用しています。

「glob」はファイルパスやファイル数を取得するために使用しています。

「openpyxl」はExcelファイルの編集や保存などをするために使用しています。

from pdf2docx.main import parse 
import docx, glob 
import openpyxl as pyxl

 

以下の部分でPDFファイルを探して、ファイル数を取得しています。

filename = glob.glob("*.pdf") #PDFファイルをすべて取得
file_num = len(filename) #PDFファイル数を取得

 

for内の処理をPDFファイルの数だけ実行します。…

for i in range(file_num):
…

 

PDFファイル名は、ファイルの命名に使用したいので、ファイル名のみを抽出しています。

filename[i] = filename[i].replace(".pdf", "") #ファイル名のみ抽出

 

PDFファイルを一度Wordファイルに変換しています。

#PDFをWORDに変換
pdf_file = filename[i] + ".pdf" #PDFファイル
docx_file = filename[i] + ".docx" #WORDファイルを命名
parse(pdf_file, docx_file)

 

以下の処理からは、Wordファイルからテキストを抽出しています。

コメントアウトしたPrint文はパラグラフやテーブルの数、中身を調べるために使用しています。

なので、ご自身で活用する場合は、対象のWordファイルに合わせて変数とテーブルの座標を変更してください。

#ワードからテキスト抽出する
doc =docx.Document(docx_file)
…

 

テンプレートのExcelファイルを開き、Wordファイルから抽出したデータを転記しています。ご自身で活用する場合は、適切なテンプレートを用意し、座標を変更してください。

※エクセル側で数式を使用している場合は注意してください。上書きされるので、数式が消える可能性があります。

excel_file = "請求書テンプレート.xlsx"
wb = pyxl.load_workbook(excel_file)
sheet = wb['請求書']

 

あらかじめ取得しておいたPDFファイルの名前でExcelファイルを保存しています。

wb.save(filename[i] + ".xlsx") #PDFファイルの名前で保存
wb.close

 

解説は以上です。

 

3.まとめ

以上、プログラミングを活用して複数のPDFファイルのデータを一度にExcelファイルに置き換える方法をお伝えしました。ご自身の作業効率を改善したい方、セキュリティやコスト面で有料サービスの導入が難しい方は、参考にしてみてください。

もちろん、これがベストの方法ではないので、アレンジしてもらって結構です。

 

興味のある方は、こちらの記事もどうぞご覧ください。

【Python】複数のPDFファイルをWordファイルに変換する方法
Pythonのpdf2docxライブラリを使って複数のPDFファイルをWordファイルに変換する方法を解説しています。この記事を読めば、簡単にたくさんのPDFファイルをWordファイルに変換することができます。
【Python】複数のExcelファイルをPDFファイルに変換する方法
「ExcelファイルをPDFファイルとして出力する方法は知ってます。でも、いちいち1ファイルずつ出力するのは面倒なんです。」 ...

 

ご清聴ありがとうございました。