
2026/10/02 1:14
レイアウト、表式、境界ボックスに対応した軽量 PDF パーサー
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Papero は、PDF、DOCX、PPTX、XLSX、EPUB および HTML など多様な形式から構造化されたコンテンツを抽出することを目的とした、ユニークな機械学習不使用ユーティリティです。本ツールは、重厚な GPU リソースやクラウド処理を必要とせず、ローカル CPU 上またはウェブブラウザ内で動作します。レイアウト解析には PDFium のような既存のライブラリを利用し、OCR には Tesseract を使用(スキャン画像に対応するサーバーサイドサポートあり)、非 PDF メタデータの抽出には Apache Tika を利用します。このアプローチにより、複雑なレイアウト、読み順、列整列、フォント、図表、数式を維持した高忠実度の出力が可能となり、これらを LaTeX またはイメージとして Word や HTML 形式へエクスポートし、すべてのブロックに対してバウンディングボックスを付与します。ベンチマークでは、54 の高密度研究論文においてゼロの失敗を確認しており、単一のラップトップ CPU でページあたりわずか 39 ミリ秒で処理可能です。ユーザーは CLI または Python API コールを通じてフォルダをバッチ変換し、RAG レディなデータセットを生成でき、詳細なレポートを作成することで、高密度 Word エクスポートにおける潜在的な改行問題や境界のないテーブルでの課題などを特定できます。若干の制限は存在します(線形化された行列出力やスキャンドキュメントに対するサーバーサイド OCR の必要性など)が、Papero はページの重ね書きやレイアウト再構築の確認といった本質的な機能を提供しており、プライバシー、スピード、ローカル制御を重視する研究者にとって堅牢なソリューションとなります。
Text to translate:
Improved Summary: Papero is a unique, machine-learning-free utility designed to extract structured content from diverse formats including PDFs, DOCX, PPTX, XLSX, EPUB, and HTML without requiring heavy GPU resources or cloud processing. Operating entirely on local CPUs or within a web browser, it leverages established libraries like PDFium for layout analysis and Tesseract for OCR (with server-side support for scanned images), while using Apache Tika for non-PDF metadata extraction. This approach ensures high-fidelity output that preserves complex layouts, reading orders, column alignment, fonts, figures, and mathematical formulas—exported as LaTeX or images—to Word or HTML formats with bounding boxes for every block. Benchmarks demonstrate zero failures across 54 dense research papers, processing pages in just 39 milliseconds on a single laptop CPU. Users can batch convert folders into RAG-ready datasets via CLI or Python API calls, generating detailed reports that identify specific issues such as potential line breaks in dense Word exports or challenges with borderless tables. While minor limitations exist, such as linearized matrix outputs and the need for server-side OCR for scanned documents, Papero offers essential capabilities like drawing over pages and verifying layout reconstruction, making it a robust solution for researchers prioritizing privacy, speed, and local control.
本文
パペロ:高機能なスタックなしで文書構造を抽出する
PDF から Markdown、JSON、Word、Excel への変換ツール。読み順、表(テーブル)、数式、図表、および各ブロックの位置情報まで完全に対応します。機械学習モデル不要。CPU 専用であり、ブラウザ、Python スクリプト、あるいは API として動作します。
- [ブラウザで試す] · [クイックスタート] · [ベンチマーク]
ブラウザアプリですぐに(30 秒)
PDF を読み込み、あらゆるブロックを詳しく検証できます。表や数式をチェックし、Word へエクスポート可能です。PDF はあなたのマシンから決して離れません。
なぜ papero か?
PDF からテキスト取得は簡単ですが、その構造(どの列が先か、どの行が表の一部か、数式はどこにあるか)を復元することが、RAG や LLM の出力の有効性を決定づけます。papero は単なる幾何学計算のみを使用するため、ラップトップの CPU 上でも高速に動作します。
- 📖 読み順: 2 カラムまたは 3 カラムの論文は列ごとに順次処理されます。ヘッダー、フッター、ページ番号、ロゴなどは除外されます。
- ▦ リアルな表: 罫線付き、無罫線、LaTeX の booktabs 形式の表も復元され、CSV または Excel へエクスポート可能です。
- ∑ 数式: 指数、添字、重ねた分数などは LaTex 形式に変換され、クロップ済み画像も提供されます(例:$\frac{5}{12}$)。
- 📍 すべての位置情報: 各ブロックには境界ボックス(bbox)が付属するため、正確な場所を引用したり切り出したりできます。
- 🖼 図表: 画像とベクター図表はキャプション付きで PNG として保存されます。
- 📝 Word への復元: カラム配置やフォント形式が維持されるため、.docx エクスポート元のページ外観とほぼ一致します。
その他機能:
- LaTeX PDF のアクセント記号を自動補正(例:Computa¸ca˜o → Computação)。
- フォーム生成ツールで使用される白文字は無視されます。
- スキャンされたページは OCR を通じて処理されます。
- Apache Tika を使用して、DOCX/PPTX/XLSX/EPUB/HTML の形式も読み込めます。
クイックスタート
インストールは
pip で行います。
pip install papero-extract
Python スクリプトでの基本的な使い方は以下の通りです。
from papero_extract import extract doc = extract("paper.pdf") print(doc.to_markdown())
ブラウザアプリでも PDF をドロップして直ちにエクスポートが可能です。
より高度な Python 利用
表、数式、位置情報、画像を含む詳細なデータを取得します。
データのアクセス
from papero_extract import extract, extract_text doc = extract("paper.pdf", images=True) # テーブルデータの取得 doc.tables[0].rows # [["Model", "Accuracy"], ["Base", "0.81"], ...] # 数式の取得(LaTeX 形式) doc.formulas[0].latex # "E = mc^{2}" # 画像データへのアクセス doc.figures[0].image.data # PNG バイトデータ # ブロックごとの詳細(読み順と位置情報付き) for block in doc.pages[0].blocks: print(block.type, block.bbox, block.text[:60])
出力形式の選択
整列やインデントを維持した HTML、完全な JSON データへ変換可能です。
: 整列とインデントを維持します。doc.to_html()
: 完全な JSON データを取得します。doc.to_dict()
: 数式を LaTeX 形式で抽出(演算子、関数などを検出)。doc.to_markdown(math="latex")
: テキストのみを抽出(最速モード)。extract_text("contract.pdf").text
多様なファイル形式の読み込み
Apache Tika を使用して、DOCX/PPTX/XLSX/EPUB/HTML の形式も読み込めます。
extract("slides.pptx").to_markdown() # PPTX などから抽出可能
オプションとデフォルト値
| オプション | デフォルト値 | 説明 |
|---|---|---|
| pages | all / "1-3,5,10-" | 処理対象のページ範囲 |
| images | False / True | 図表、表、数式を PNG としてクロップするかどうか |
| tables / formulas | True / False | 検出の有無切り替え |
| ocr | "auto" | OCR の実行モード:scanned pages only ("auto"), forced ("force"), off ("off") |
| ocr_language | "por+eng" | Tesseract の言語設定(デフォルト) |
| tika | True / False | Apache Tika を使用してレイアウトエンジンのみを実行するかどうか |
| workers | 1 | 長時間かかる文書処理用のプロセス数 |
コマンドラインインターフェース (CLI)
基本コマンド
- Markdown + 画像抽出:
papero-extract extract paper.pdf -o paper.md --images - JSON 形式へ:
papero-extract extract paper.pdf -o paper.json - 表のみの CSV 出力:
papero-extract extract paper.pdf -f csv -o tables.csv - HTML 抽出(ページ指定):
papero-extract extract paper.pdf -p 1-5 -f html - 数式を LaTeX 形式で出力:
papero-extract extract paper.pdf --math latex -o p.md - クリーンテキストのみ(最速):
papero-extract extract paper.pdf --fast
バッチ処理とフィデリティレポート
RAG データセット生成や、問題のありそうな文書の特定が可能です。
papero-extract batch ./documents -o ./dataset
フォルダ構成:./dataset/
- documents/: 各 PDF に対応する
と.md
ファイル(サブフォルダ構造を保持)。.json - chunks.jsonl: ヘッダーで切り分けられたすべてのチャンク(表はグリッド保持)。
- manifest.json: 文書ごとの情報(ページ数、表の数、フィデリティスコア)。
- fidelity/:
: 合計数、シグナル、問題点。report.json
: ブラウザで表示可能なレポート。summary.html
: エラーや警告のある文書ごとのproblematic/
ファイル。.json
各チャンクは元の出所がわかるため、検索ヒットをページ上で視覚的に確認できます:
{"id": "paper.pdf#12", "type": "table", "headings": ["4 Results"], "blocks": ["p6-b3"], "text": "Table 2: Accuracy per model..."}
フィデリティチェック項目:
| シグナル | 確認項目 |
|---|---|
| text | PDFium が読み取ったすべての文字列が出力に含まれているか |
| reading_order | 同じ列内で、下のブロックよりも上のブロックを読み取っていないか(逆順) |
| tables | 「Table N」というキャプションに対応する表があり、グリッドになっているか |
| figures | 「Figure N」というキャプションに対応する図があるか |
| formulas | 各数式に LaTeX 表現があり、マッピングできないグリフがないか |
Python でバッチ処理結果を取得:
from papero_extract.batch import run_batch run_batch("./documents", "./dataset", workers=8)["totals"]
問題点の確認(例):
assess(doc, reference_text("paper.pdf")).issues # [Issue(code="table_not_detected", pages=[5], …)]
REST API & Docker
docker compose up で API、Apache Tika、Tesseract、ブラウザアプリをすべて起動できます。
抽出コマンド例
- Markdown 形式:
curl -F "file=@paper.pdf" "localhost:8000/v1/extract?format=markdown" - ZIP 出力(画像付き):
curl -F "file=@paper.pdf" "localhost:8000/v1/extract?format=zip&images=true" -o paper.zip - ブロック情報付:
curl -F "file=@paper.pdf" "localhost:8000/v1/extract?per_page=true"
API パラメータ
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
| mode | structured / fast | structured: レイアウト + Tika のみ、fast: テキストのみ |
| format | json | json, markdown, text, html, csv, zip など |
| pages | all / 1-3,5,10- | 処理対象のページ範囲 |
| per_page | false / true | JSON にブロック位置情報を含めるかどうか |
| images | false / true | 図表などをクロップするかどうか |
| ocr | auto | auto, force, off |
出力結果と形式比較
各ブロックは「何であるか(タイプ)」および「どこにあったか(位置情報:bbox)」を認識しています。
JSON スキーマ例
{ "type": "table", "bbox": [56.7, 294.8, 481.9, 374.2], "rows": [["Model", "Accuracy"], ["Base", "0.81"]], "caption": "Table 1: Comparison between models." }
ブラウザアプリ vs Python/CLI/API
| 出力形式 | Python/CLI/API | ブラウザアプリ |
|---|---|---|
| Markdown, プレーンテキスト, JSON | ✓ | ✓ |
| HTML(整列とインデントを維持) | ✓ | ✓ |
| 表の CSV、画像付き ZIP | ✓ | ✓ |
| Word .docx(ページ外観維持) | × | ✓ |
| Excel .xlsx(表ごとのシート) | × | ✓ |
ブロックタイプ詳細
ヘッディング(レベル付き)、段落、リストアイテム、表(行付き)、図表、数式(LaTeX 付き)、キャプション、コード、およびテキストとは別扱いのヘッダー・フッター・ページ番号が含まれます。境界ボックスは
[x0, y0, x1, y1] で指定され、座標系の原点はページの左上です。
ベンチマーク
GPU なし、単一ラップトップの CPU 上で動作させる多カラム arXiv 論文(数式、表、図表あり)での検証結果。
- **papero **(fast): クリーンなテキストを返します。
- **papero **(structured): 読み順、表、数式、図表を再構築し、54 の論文で 0 フェイル、1 ページあたり平均 39ms(中央値)の性能を達成しました。
| ツール | ライセンス | ML モデル / PyTorch が必要か | 多カラム読み順 | 構造化された表 | 数式 | 境界ボックス (bbox) | DOCX/PPTX/XLSX/EPUB 対応 | ブラウザ全体内動作 |
|---|---|---|---|---|---|---|---|---|
| papero | MIT | なし | ✓ | ✓ | グリフ + 画像から LaTex | ✓ | ✓ | ✓ |
| PyMuPDF | AGPL | なし | 一部 | — | — | ✓ | 一部 | × |
| pdfplumber | MIT | なし | × | × | × | ✓ | × | × |
| pypdf | BSD | なし | × | × | × | ✓ | × | × |
| Docling | GPL | あり | ✓ | ✓ | ✓ | ✓ | ✓ | × |
| Marker | MIT | あり | ✓ | ✓ | ✓ | ✓ | 一部 | × |
ML ベースのツールは複雑な数式(行列、整列系など)では依然として優れています。papero もグリフと画像から近似的な LaTeX と画像を提供するため、情報の損失を防ぐことができます。
仕組み
1 つのファイルに対して同時に 2 つのエンジンが動作します:
- **レイアウトエンジン **(PDFium): すべてのグリフ(文字)とその位置、フォント、サイズを読み込み、罫線と画像を処理。その後、列を意識した XY カットにより、カラム、表、数式、リスト、図表を再構築します。
- **メタデータエンジン **(Apache Tika): メタデータ、タグ付き PDF のヘッディング、OCR(Tesseract)、および PDF でないあらゆる形式を読み取ります。
ブラウザアプリでは、このアルゴリズムを JavaScript に移植して pdf.js で動作させ、CI でブロック単位で両エンジンが一致するか確認しています。
制限事項
- 数式: グリフとストロークから再構築されます。行列、整列系、ネスト構造は線形(1 次元)に展開されます(ただし、クロップされた画像は常に提供されるため)。PDF 製作者がグリフを再番号付けした場合、Python エンジンでは認識できない可能性があります。
- Word 出力: 各ページは独立したページとして出力されます。Word が改行位置を変更する場合、文字列の一部が次の余計な行に流れてしまうことがあります。
- 無罫線の表: カラム間の非常に狭いギャップがテキストとして誤認識される可能性があります。
- スキャンされた PDF: OCR の必要があり、サーバーサイドのパスで実行されます(Tesseract は Docker イメージに含まれています)。
- Word/Excel 出力: 現時点ではブラウザアプリ内でのみ利用可能です。
開発環境へのセットアップ
git clone https://github.com/beatrizalmeidaf/papero-pdf-text-extractor.git && cd papero-pdf-text-extractor pip install -e ".[dev]" # 回帰テストなどを実行 pytest -q ruff check src tests && ruff format --check src tests npm install --prefix tests/js && python tests/js/expected.py tests/js/out && node tests/js/parity.mjs tests/js/out # ブラウザアプリを起動(http://localhost:8000) python -m http.server -d web
: Python エンジン、API、CLIsrc/papero_extract/
: ブラウザアプリ(GitHub Pages 向け)web/
: 2 つのエンギンの一致性を確認tests/js/
: データセットをダウンロードしグラフを描画benchmarks/
コントリビューション
papero が誤って処理する PDF を見つけたら、それは最も価値のある Issue です。該当ファイルや期待内容を投稿ください(読み順、表、数式、エンコーディングなどあらゆる問題)。 時間が節約できた場合は、🌟 星評価をお願いします。