はじめに
本記事では、Pythonライブラリである PyMuPDF4LLM を使用して、PDFファイル内の文章をMarkdown形式で抽出する方法を紹介します。
PyMuPDF4LLM とは
PyMuPDF4LLM は、高機能なPDF操作ライブラリである PyMuPDF をベースにしたPythonライブラリです。
LLM(Large Language Model) や RAG(Retrieval-Augmented Generation) 環境では、PDFファイルをプレーンテキスト形式に変換してから入力する必要があります。
PyMuPDF4LLM は、PDFファイル内の文章を抽出し、Markdown形式のテキストとして出力することができます。
環境構成
この記事で紹介するコマンドと出力の例は、以下の環境で実行されたものです。
- OS: Ubuntu Server 24.04.2 LTS
- Python: 3.12.3
インストール
Python 3.3から標準ライブラリとして提供されている venv を使用して仮想環境を構築し,インストールを行います。
仮想環境の作成と有効化
# pymupdf4llm(例)という仮想環境を作成
$ python3 -m venv pymupdf4llm
$
$ ls pymupdf4llm
bin include lib lib64 pyvenv.cfg
$
# 仮想環境を有効化
$ source pymupdf4llm/bin/activate
# シェルのプロンプトの先頭に「(pymupdf4llm)」が表示されたことを確認する
(pymupdf4llm)$
インストール
(pymupdf4llm) $ pip install pymupdf4llm
Collecting pymupdf4llm
Using cached pymupdf4llm-0.0.27-py3-none-any.whl.metadata (4.8 kB)
Collecting pymupdf>=1.26.3 (from pymupdf4llm)
Using cached pymupdf-1.26.5-cp39-abi3-manylinux_2_28_x86_64.whl.metadata (3.4 kB)
Using cached pymupdf4llm-0.0.27-py3-none-any.whl (30 kB)
Using cached pymupdf-1.26.5-cp39-abi3-manylinux_2_28_x86_64.whl (24.1 MB)
Installing collected packages: pymupdf, pymupdf4llm
Successfully installed pymupdf-1.26.5 pymupdf4llm-0.0.27
(pymupdf4llm) $
サンプルコードと実行例
今回の記事では例として、令和7年版情報通信白書(総務省)の43ページのテキストを抽出しました。
下記のPDFをEXAMPLE.pdfとしてダウンロードしました。
出典:「令和7年版情報通信白書」(総務省)
https://www.soumu.go.jp/johotsusintokei/whitepaper/ja/r07/pdf/n1240000.pdf
licensed under CC BY 4.0 https://creativecommons.org/licenses/by/4.0/deed.ja
EXAMPLE.pdf内のコンテンツを抽出し、Markdown形式のファイルとして出力するサンプルコードを下記に示します。
import pymupdf4llm
import pathlib
# PDFファイルを開く
pdf_path = "/path/to/EXAMPLE.pdf"
md_text = pymupdf4llm.to_markdown(pdf_path)
# Markdownファイルで出力する
pathlib.Path("/path/to/output.md").write_bytes(md_text.encode())
下記のコマンドを実行すると、サンプルコード内で指定したディレクトリにMarkdown形式のファイルが保存されます。
(pymupdf4llm) $ python3 sample.py
(pymupdf4llm) $ ls
EXAMPLE.pdf output.md sample.py
(pymupdf4llm) $
保存されたMarkdownファイルの例
保存されたMarkdownファイル( ▶︎ を押して展開します )
# ~~第 4 節 サイバーセキュリティ~~
デジタル活用が社会のあらゆる面で拡大する一方、世界情勢の不安定化・緊迫化等も背景にしたサイ
バー攻撃の複雑化・巧妙化や、デジタル活用拡大に伴うシステムの複雑化やインターネットに面したア
タックサーフェス(攻撃可能面)の拡大等により、ランサムウェアやゼロデイ攻撃等による機密情報の
漏えい、重要インフラのサービス停止等のセキュリティリスクが拡大傾向にある。
デジタルインフラへの社会の依存度が増す中、ひとたびサイバーインシデントにより被害を受けた際
の規模・範囲もますます拡大すると想定され、安全保障上も懸念が大きい。
デジタル空間におけるサイバーセキュリティ確保のためには、各ステークホルダーの水準の向上と連
携が求められる。政府の対応、官民連携、国際連携、技術的対応、国民リテラシー向上等、すべての関
係者による総合的な対応が重要となっている。
## ~~**1 主な課題の概要**~~
サイバー攻撃のリスクは、年々拡大傾向にある。例えば、国立研究開発法人情報通信研究機構
(NICT)によれば、NICTERのダークネット観測網における2024年の1 IPアドレス当たりの年間総
観測パケット数は、前年の2023年から更に増加しており、インターネット上を飛び交う探索活動が更
*1
に活発化していることがうかがわれる 。
また、社会経済活動における重要インフラが、サイバー攻撃により被害・サービス停止した場合、大
きな社会的な混乱が引き起こされるおそれがある。2024年度中にも、重要インフラ等を狙った様々な
サイバー攻撃事案等が発生した。
## ~~**2 対応の方向性**~~
デジタル空間におけるサイバーセキュリティ確保のためには、各ステークホルダーの水準の向上と連
携が求められるが、ここでは最近の動きとして、政府の対応としての能動的サイバー防御に関する法整
備について取り上げる。
近年、サイバー攻撃による政府や企業の内部システムからの情報窃取等が大きな問題となっているほ
か、重要インフラ等の機能を停止させることを目的とした高度な侵入・潜伏能力を備えたサイバー攻撃
に対する懸念が急速に高まっている。特に重要インフラの機能停止や破壊等を目的とした重大なサイ
バー攻撃は、国家を背景とした形でも日常的に行われるなど、安全保障上の大きな懸念となっている。
こうした情勢に対処するため、「国家安全保障戦略」(2022年12月16日閣議決定)に基づき、サイ
バー安全保障分野での対応能力を欧米主要国と同等以上に向上させるべく、2025年の第217回国会
(常会)に「重要電子計算機に対する不正な行為による被害の防止に関する法律」及び「重要電子計算
機に対する不正な行為による被害の防止に関する法律の施行に伴う関係法律の整備等に関する法律」の
両法案が提出され、原案修正の上、2025年5月に可決・成立した。
*1 第Ⅱ部第1章第10節2「サイバーセキュリティの現状」参照
令和7年版 情報通信白書 第Ⅰ部 43
プレビューの表示例
Visual Studio CodeやCursorに標準搭載されているMarkdownのプレビュー機能で表示した結果です。
良かった点
- 本文のテキストや、ページの「フッター」「ページ番号」をすべて正確に抽出できた。
課題
-
見出しの誤認識
元のPDFにあった見出しの囲み線や装飾が、Markdownの取り消し線として誤検知された。 -
抽出できていなかった要素
- ページ右上の「サイバーセキュリティ」「第4章」(柱の箇所)
- ページ右端の「第2章」「進展するデジタルがもたらす課題」(小口見出しの箇所)
- 「1. 主な課題の概要」内の,四角で囲まれた「関連データ 国内で2024年度に発生した重要インフラ関連のサイバー攻撃被害事例」「URL」の項目
-
文章間の改行
抽出された文章のブロック間に2行の空行があった。これはプログラム側で replace 処理などを用いて調整することで解決できます。
おわりに
PyMuPDF4LLM を使用して、PDFファイル内のコンテンツ(文章)の抽出を行う方法を紹介しました。
今回の検証においては、本文のテキストを抽出する精度は非常に高いと感じましたが、一方で、装飾を取り消し線として誤検知するケースや、本文以外の箇所が抽出できていないことがありました。
これらの特性を許容できる用途においては、PyMuPDF4LLM は非常に便利なライブラリだと思いました。
