UnstructuredによるPDFからの画像抽出

UnstructuredによるPDFからの画像抽出
を参考に進める

pip install ‘unstructured[pdf] と
pip install unstructured[all-docs] の違いを調べた

違いはPDFのみか
全てのドキュメント形式(PDF、Word、Excel、HTMLなど)
ということ

これを使い画像を抽出し学習データを作るので
そのままデータ保存できるcolab で実行する

【Python】unstructuredを使って、 PDFファイル内の非構造データを抽出する
を参考に

!pip install unstructured[all-docs]

でインストール

実行後にセッションの再起動を求められる

ITパスポートの過去問のうち、令和6年度分の問題冊子を使うので
https://www3.jitec.ipa.go.jp/JitesCbt/html/openinfo/questions.html
から
問題をダウンロード

!mkdir data

でフォルダを作成し
ここへアップロード

import os
from unstructured.partition.pdf import partition_pdf

# 現在の作業ディレクトリを取得
current_dir = os.getcwd()

# 'data'フォルダのパスを設定
DATA_PAR_PATH = os.path.join(current_dir, 'data')

# 処理対象のPDFファイルのパスを設定
DATASET_PATH = os.path.join(DATA_PAR_PATH, '2024r06_ip_qs.pdf')

# 画像の出力先フォルダのパスを設定
OUTPUT_PATH = os.path.join(DATA_PAR_PATH, 'images')

# フォルダ確認(存在しない場合エラーになるのでアップロード確認用)
if not os.path.exists(DATA_PAR_PATH):
    raise FileNotFoundError(f"'data'フォルダが見つかりません。Google Colabに'2024r06_ip_qs.pdf'をアップロードしてください。")

if not os.path.exists(DATASET_PATH):
    raise FileNotFoundError(f"ファイル '2024r06_ip_qs.pdf' が'data'フォルダ内に存在しません。ファイルをアップロードしてください。")

# PDFファイル内のデータを分割する
raw_pdf_elements = partition_pdf(
    filename=DATASET_PATH,
    chunking_strategy='by_title',
    infer_table_structure=True,
    extract_images_in_pdf=True,
    extract_image_block_output_dir=OUTPUT_PATH
)

# 処理が成功したことを表示
print("PDFファイルの処理が完了しました。")
print(f"画像は以下のフォルダに保存されます: {OUTPUT_PATH}")

として実行したが

WARNING:pdfminer.pdfpage:The PDF <_io.BufferedReader name='/content/data/2024r06_ip_qs.pdf'> contains a metadata field indicating that it should not allow text extraction. Ignoring this field and proceeding. Use the check_extractable if you want to raise an error in this case
yolox_l0.05.onnx: 100%

 217M/217M [00:02<00:00, 149MB/s]
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
/usr/local/lib/python3.10/dist-packages/pdf2image/pdf2image.py in pdfinfo_from_path(pdf_path, userpw, ownerpw, poppler_path, rawdates, timeout, first_page, last_page)
    580             env["LD_LIBRARY_PATH"] = poppler_path + ":" + env.get("LD_LIBRARY_PATH", "")
--> 581         proc = Popen(command, env=env, stdout=PIPE, stderr=PIPE)
    582 



15 frames

FileNotFoundError: [Errno 2] No such file or directory: 'pdfinfo'
During handling of the above exception, another exception occurred:

PDFInfoNotInstalledError                  Traceback (most recent call last)
/usr/local/lib/python3.10/dist-packages/pdf2image/pdf2image.py in pdfinfo_from_path(pdf_path, userpw, ownerpw, poppler_path, rawdates, timeout, first_page, last_page)
    605 
    606     except OSError:
--> 607         raise PDFInfoNotInstalledError(
    608             "Unable to get page count. Is poppler installed and in PATH?"
    609         )

PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH?

となってしまう

これは
pdf2imageパッケージが内部的に使用している
poppler-utilsがインストールされていないために発生

!apt-get update
!apt-get install -y poppler-utils

でインストール

再度実行する

このとき、非構造データは画像として分割され、OUTPUT_PATHで指定したディレクトリに入る

この非構造データを確認してみた結果

* 画像しか検出していない
* テーブルも画像として認識してほしい
* 画像を出力する必要がある
* わざわざ出力せずに、byte型で非構造データを保持したい
* 画像の端っこが見切れている
* 画像によって、見切れ具合は様々

上記の結果を踏まえて非構造データの抽出を工夫

しかし

WARNING:pdfminer.pdfpage:The PDF <_io.BufferedReader name='/content/data/2024r06_ip_qs.pdf'> contains a metadata field indicating that it should not allow text extraction. Ignoring this field and proceeding. Use the check_extractable if you want to raise an error in this case
yolox_l0.05.onnx: 100%

 217M/217M [00:01<00:00, 237MB/s]
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
/usr/local/lib/python3.10/dist-packages/unstructured_pytesseract/pytesseract.py in get_tesseract_version()
    450     try:
--> 451         output = subprocess.check_output(
    452             [tesseract_cmd, '--version'],



21 frames

FileNotFoundError: [Errno 2] No such file or directory: 'tesseract'
During handling of the above exception, another exception occurred:

TesseractNotFoundError                    Traceback (most recent call last)
/usr/local/lib/python3.10/dist-packages/unstructured_pytesseract/pytesseract.py in get_tesseract_version()
    456         )
    457     except OSError:
--> 458         raise TesseractNotFoundError()
    459 
    460     raw_version = output.decode(DEFAULT_ENCODING)

TesseractNotFoundError: tesseract is not installed or it's not in your PATH. See README file for more information.

これは
このエラーは、PDFの画像からテキストを抽出するために必要なOCRエンジン Tesseract がインストールされていないために発生しています。Google Colabではデフォルトで Tesseract がインストールされていないため

!apt-get update
!apt-get install -y tesseract-ocr
!apt-get install -y libtesseract-dev

でインストール

これで再度

import base64
import io
import os
from PIL import Image
from unstructured.partition.pdf import partition_pdf

# Google Colab環境用のパス設定
current_dir = os.getcwd()
DATA_PAR_PATH = os.path.join(current_dir, 'data')  # 'data'フォルダを利用
DATASET_PATH = os.path.join(DATA_PAR_PATH, '2024r06_ip_qs.pdf')

# 必要なフォルダやファイルの存在確認
if not os.path.exists(DATA_PAR_PATH):
    raise FileNotFoundError(f"'data'フォルダが存在しません。Google Colabに'2024r06_ip_qs.pdf'をアップロードしてください。")

if not os.path.exists(DATASET_PATH):
    raise FileNotFoundError(f"ファイル '2024r06_ip_qs.pdf' が 'data' フォルダ内に存在しません。アップロードしてください。")

# PDFファイル内のデータを分割する
raw_pdf_elements = partition_pdf(
    filename=DATASET_PATH,
    infer_table_structure=True,
    strategy='hi_res',
    extract_images_in_pdf=True,
    extract_image_block_types=['Image', 'Table'],
    extract_image_block_to_payload=True
)

# 画像として保持されている非構造データを確認する
for elem in raw_pdf_elements:
    if elem.category in ['Image', 'Table']:
        image_base64 = elem.metadata.image_base64
        decoded_image = base64.b64decode(image_base64)
        image = Image.open(io.BytesIO(decoded_image))
        print(f"Page Number: {elem.metadata.page_number}")
        display(image)  # Colab環境で画像を表示

を実行すると画像が表示される

import os
from unstructured.partition.pdf import partition_pdf

# 現在の作業ディレクトリを取得
current_dir = os.getcwd()

# 'data'フォルダのパスを設定
DATA_PAR_PATH = os.path.join(current_dir, 'data')

# 処理対象のPDFファイルのパスを設定
DATASET_PATH = os.path.join(DATA_PAR_PATH, '2024r06_ip_qs.pdf')

# 画像の出力先フォルダのパスを設定
OUTPUT_PATH = os.path.join(DATA_PAR_PATH, 'images')

# フォルダ確認(存在しない場合エラーになるのでアップロード確認用)
if not os.path.exists(DATA_PAR_PATH):
    raise FileNotFoundError(f"'data'フォルダが見つかりません。Google Colabに'2024r06_ip_qs.pdf'をアップロードしてください。")

if not os.path.exists(DATASET_PATH):
    raise FileNotFoundError(f"ファイル '2024r06_ip_qs.pdf' が'data'フォルダ内に存在しません。ファイルをアップロードしてください。")

# PDFファイル内のデータを分割する
raw_pdf_elements = partition_pdf(
    filename=DATASET_PATH,
    chunking_strategy='by_title',
    infer_table_structure=True,
    extract_images_in_pdf=True,
    extract_image_block_output_dir=OUTPUT_PATH
)

# 処理が成功したことを表示
print("PDFファイルの処理が完了しました。")
print(f"画像は以下のフォルダに保存されます: {OUTPUT_PATH}")

を実行すると dataフォルダの中に images が作成され
ここに抽出した画像が保存される

次はチラシで試す

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です