【Python】PDF2imageでメモリエラーした場合の画像ファイルへの変換する方法

python
スポンサーリンク
ピーター
ピーター

スペックの低いPCを使うとメモリエラーでPythonでPDFを画像ファイルに変換できない!

前回の記事ではPythonでPDFを画像ファイルに変換するための手順を紹介しました。

前回紹介した方法だと、PDFファイルの全ページを一括変換してしまうため、メモリ不足でエラーになってしまうことがあります

  • スペックの低PCで変換するケース
  • 大量のページがあるPDFを変換するケース

などで問題が生じます。

私は副業先で使っているAmazon EC2 Linuxを使っていましたが、割とスペックが低い。。。(笑)

自分のPCで検証している時には発生していないエラーが今回の件でした。

エラーのメッセージをメモし忘れてしまったので、申し訳ございませんが、ページ数が多くなるとエラーが出てしまう場合の対応方法を説明します!



PyPDF2のインストール

pipでインストールしている場合のコマンド

pip install pypdf2

PyPDF2の情報はこちらです。

PyPDF2 Documentation — PyPDF2 1.26.0 documentation

Pythonのコード

全てのページを処理したい場合

from pathlib import Path
from pdf2image import convert_from_path
from PyPDF2 import PdfFileReader

input_pdf_path = 'in_pdf/sample.pdf'
pdf = PdfFileReader(str(input_pdf_path))
page_count = pdf.getNumPages()

image_dir = Path('out_image')
out_format = 'jpeg'

for page in range(page_count):
        image = convert_from_path(
                pdf_path = input_pdf_path,
                dpi = 300,
                first_page = page + 1,
                last_page = page + 1,
                fmt= out_format,
                thread_count = 1,
                userpw = None,
                use_cropbox = False,
                strict = False
            )
        out_image_path = input_img_dir_path + "/img_{}.{}".format(page + 1, out_format)
        image[0].save(out_image_path, out_format)

PDFをImageに変換する関数(convert_from_path)パタメータは主に以下のような設定があります。

  • pdf_path:変換するPDFのファイルパス
  • output_folder:変換後に保管するフォルダパスの設定
  • dpi:変換後の解像度になります(デフォルトは200dpi)
  • fmt:変換時の画像フォーマット(jpeg/png/ppm、デフォルトはppm)
  • grayscale:グレースケール変換の設定(デフォルトはFalse)
  • timeout:タイムアウトする時間の設定(デフォルトは600)

パソコンの性能によっては、PDFのページ数が多い場合にエラーとなってしまうケースがあります。

特定のページのみPDFから画像ファイル化する方法

from pathlib import Path
from pdf2image import convert_from_path
from PyPDF2 import PdfFileReader

def trance_PDF2Image(input_pdf_path, in_page_num, img_format = "jpg"):
    
    pdf = PdfFileReader(input_pdf_path)
    pdf_page_num = pdf.getNumPages()
    
    page_num = min(in_page_num, pdf_page_num)
    
    images = convert_from_path(
            pdf_path = input_pdf_path,
            dpi = 300,
            first_page = page_num,
            last_page = page_num,
            fmt= img_format,
            thread_count = 1,
            userpw = None,
            use_cropbox = False,
            strict = False
        )
    
    return images[0]

特定ページのみPDFから画像ファイルに変換することでメモリや処理の無駄を減らせますね!

その他の関連ページ

PDFデータでパスワードが掛かっている場合や解除したい場合があります。その場合は、こちらの記事を参考にしてください

コメント

ランキング

タイトルとURLをコピーしました