LoginSignup
6
4

More than 3 years have passed since last update.

【Python】PDFの文章をページ毎にCSVに変換(2/24追記)

Last updated at Posted at 2019-12-13

参考:PDFMinerでPDFから日本語テキストを抽出する

ほぼほぼこちらの方法です。
なにも面白いことはしてないです。

つかうもの

PDFMinerというライブラリ。
pipで一発です。

pip install pdfminer.six

参考サイトでは日本語が~とありましたが、pipで入れてもちゃんと日本語検出されました。

つくるCSV

・「更新日時」カラムにCSV作成日データが入っている
・「文章」カラムにPDFのテキストデータが入っている
・「ページ番号」カラムにPDFのページ番号が入っている

できたもの

9割参考サイトのソースです。

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO

import csv,re,datetime
import pandas as pd

class converter(object):
  def pdf_to_csv(self,p_d_f):
    df = pd.DataFrame(columns=["更新日時","文章","ページ番号"])

    #ここからPDFのテキスト抽出
    cnt = 1
    space = re.compile("[  ]+")
    fp = open(p_d_f, 'rb')

    for page in PDFPage.get_pages(fp):
      #逐次初期化 
      rsrcmgr = PDFResourceManager()
      outfp = StringIO()
      codec = 'utf-8'
      laparams = LAParams()
      laparams.detect_vertical = True
      device = TextConverter(rsrcmgr, outfp, codec=codec, laparams=laparams)
      interpreter = PDFPageInterpreter(rsrcmgr, device)

      interpreter.process_page(page)
      text = re.sub(space, "", outfp.getvalue())

      df.loc[cnt,["文章","ページ番号"]] = [text,cnt]
      cnt += 1

    outfp.close()
    fp.close()
    device.close()

    now = datetime.datetime.now()
    df["更新日時"] = now

    csv_path = p_d_f.replace('.pdf', '.csv')
    df.to_csv(csv_path, encoding='CP932', index=False)

if __name__ == "__main__":

  p_d_f = "なんちゃか.pdf"
  con=converter()
  hoge=con.pdf_to_csv(p_d_f)

参考サイトと異なる点は、PDFから抽出したテキストデータを格納する箱(outfp)をデータフレームに入れた矢先に初期化しているというところです。
そのままだと全ページのテキストデータがどんどん追加されていくので。
データフレームに入れてしまえばこちらのものなので、細かいカラム追加などはさくっとできるかと。

検索しても一発でcsv変換が引っかからなかったのは簡単だからという理由もあるかもですが、メモ書きに。

2/24追記

なぜか続いた

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4