Python PDFファイルをページ毎に分割/日本語テキストを抽出/画像を抽出する方法

 本記事では、題目を成すための方法について、「PyPDF2」「pdfminer.six」「fitz」「PyMuPDF」の4つのライブラリのインストール方法とコード例を載せました。
1. PDFファイルをページ毎に分割して.pdfで保存する「PyPDF2」

pip install PyPDF2

2. 日本語テキストを抽出して.txtで保存する「pdfminer.six」

pip install pdfminer.six

3. 画像を抽出して.pngで保存する「fitz」と「PyMuPDF」

pip install fitz

fitzを動かすためには、下記のようにPyMuPDFもインストする必要がある。

pip install PyMuPDF

■本プログラム

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PyPDF2 import PdfFileReader
from PyPDF2 import PdfFileWriter

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

import fitz

# pdfをページ毎に分割してpdfを生成する。またそのファイル名をリストで返す
# PyPDF2を使用
def my_split_pdf(input_pdf):
    file_name_list = []
    with open(input_pdf, 'rb') as f1:
        input = PdfFileReader(f1)
        pgnum = input.getNumPages()
        for i in range(pgnum):
          file_name = str(i) + "page.pdf"
          output = PdfFileWriter()
          output.addPage(input.getPage(i))
          outputfile = open(file_name, 'wb')
          output.write(outputfile) 
          outputfile.close()
          file_name_list.append(file_name)
          
    return file_name_list

# pdfから日本語テキスト抽出してテキストファイルで保存する
# pdfminer.sixを使用
def my_pdf2txt(my_pdf):
    out_txtfile = my_pdf[:-4] + '.txt'
    print(out_txtfile)
    manager = PDFResourceManager()
    with open(out_txtfile, "wb") as wf:
        with open(my_pdf, 'rb') as rf:
            with TextConverter(manager, wf, codec='utf-8', laparams=LAParams()) as conv:
                interpreter = PDFPageInterpreter(manager, conv)
                for page in PDFPage.get_pages(rf): # 1ページずつ読み込む
                    interpreter.process_page(page)

# pdfから画像を抽出する
# fitz(とPyMuPDF)を使用
def my_save_img(my_pdf):
    file_name = my_pdf[:-4]
    doc = fitz.open(my_pdf)
    for i in range(len(doc)):
        for img in doc.getPageImageList(i):
            xref = img[0]
            pix = fitz.Pixmap(doc, xref)
            if pix.n < 5: # in case RGB
                pix.writePNG(file_name + "p%s-%s.png" % (i, xref))
            else: # convert to RGB first
                pix = fitz.Pixmap(fitz.csRGB, pix)
                pix.writePNG(file_name + "p%s-%s.png" % (i, xref))
            pix = None

if __name__ == '__main__':
    input_pdf = 'PDFファイル名.pdf'
    
    # pdfをページ毎に分割してpdfを生成する。またそのファイル名をリストで返す
    file_name_list = my_split_pdf(input_pdf)
    for file_name in file_name_list:
        # pdfから日本語テキスト抽出してテキストファイルで保存する
        my_pdf2txt(file_name)
        # pdfから画像を抽出する
        my_save_img(file_name)

●備考
ModuleNotFoundError: No module named 'frontend'
のエラーが出た場合は、「PyMuPDF」をpip install PyMuPDFでインストールして下さい。
以上

<広告>