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

オフィスファイル(黄緑) Python
スポンサーリンク
スポンサーリンク

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

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

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

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

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

 

「偉そうに語るおまえは誰やねん。」と思われるので、私のことも少し紹介させてください。

たいらーのプロフィール

  • 文系四大出身。ソフトウェア開発の経験はなしですが、IT業界に身を置いています。
  • 開発者やユーザーとのパイプ役など、業務にプログラミングスキルを活かす。
  • Pythonは独学で習得。スクレイピングや作業の自動化などに勤しんでいます。

 

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の学習を深めて、より業務の効率化や自動化の技術を身につけたい方は、『Pythonで業務を効率化・自動化しよう【プログラミング未経験でも大丈夫】』の記事もおすすめです。

Pythonを使った業務効率化のテクニックや実際の使用例を紹介しており、プログラミングスキルを活かして日々の業務をよりスムーズに進めるためのヒントが満載です。ぜひこちらの記事もご覧ください。

Pythonで業務を効率化・自動化しよう【プログラミング未経験でも大丈夫】
Pythonを使った業務効率化の秘訣を初心者にもわかりやすく解説。Word、Excel、PowerPointの自動化例から学習方法まで、実践的なガイドを提供。あなたのビジネスを変革するための一歩を踏み出しましょう。

 

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