Zpdf: ZigによるPDFテキスト抽出
概要
zpdfはZigで書かれたPDFテキスト抽出ライブラリ。
大容量ファイルや並列処理に強い設計。
PDFiumやMuPDFと比較し、速度・精度で優位性。
CLIやPythonバインディングも提供。
用途や特徴に応じた使い分けが可能。
zpdf: Zig製PDFテキスト抽出ライブラリ
- Zig言語で開発されたPDFテキスト抽出ライブラリ
- メモリマップドファイルによる大容量PDFの効率的処理
- アリーナアロケーションを用いたストリーミング抽出
- 各種デコードフィルタ対応(FlateDecode, ASCII85, ASCIIHex, LZW, RunLength)
- フォントエンコーディング(WinAnsi, MacRoman, ToUnicode CMap)サポート
- XRefテーブル/ストリーム解析(PDF 1.5以降対応)
- 厳格/寛容なエラーハンドリング切替可能
- マルチスレッド並列ページ抽出対応
- ベンチマーク機能搭載
ベンチマーク結果(Apple M4 Pro, 並列・ストリーム順)
| ドキュメント | ページ数 | zpdf | pdfium | MuPDF | |----------------------|----------|--------|--------|--------| | Intel SDM | 5,252 | 227ms | 3,632ms| 2,331ms| | Pandas Docs | 3,743 | 762ms | 2,379ms| 1,237ms| | C++ Standard | 2,134 | 671ms | 1,964ms| 1,079ms| | Acrobat Reference | 651 | 120ms | - | - | | US Constitution | 85 | 24ms | 63ms | 58ms |
- 最大スループット:23,137ページ/秒(Intel SDM)
- 精度:いずれもMuPDF基準で99%以上の文字認識率
ビルド・要件
- Zig 0.15.2以降必須
- ビルド:
zig build -Doptimize=ReleaseFast - テスト:
zig build test
ライブラリ利用例(Zig)
const zpdf = @import("zpdf");
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const doc = try zpdf.Document.open(allocator, "file.pdf");
defer doc.close();
var buf: [4096]u8 = undefined;
var writer = std.fs.File.stdout().writer(&buf);
defer writer.interface.flush() catch {};
for (0..doc.pages.items.len) |page_num| {
try doc.extractText(page_num, &writer.interface);
}
}
CLIコマンド例
- 全ページ抽出:
zpdf extract document.pdf - 特定ページ抽出:
zpdf extract -p 1-10 document.pdf - 出力ファイル指定:
zpdf extract -o out.txt document.pdf - 視覚的読順抽出(実験的):
zpdf extract --reading-order doc.pdf - ドキュメント情報表示:
zpdf info document.pdf - ベンチマーク実行:
zpdf bench document.pdf
Pythonバインディング利用例
import zpdf
with zpdf.Document("file.pdf") as doc:
print(doc.page_count)
text = doc.extract_page(0)
all_text = doc.extract_all()
ordered_text = doc.extract_all(reading_order=True)
info = doc.get_page_info(0)
print(f"{info.width}x{info.height}")
- 事前に
zig build -Doptimize=ReleaseFastで共有ライブラリを構築
プロジェクト構成
- src/
root.zig:ドキュメントAPI・コア型定義capi.zig:C ABIエクスポート(FFI用)parser.zig:PDFオブジェクトパーサxref.zig:XRefテーブル/ストリーム解析pagetree.zig:ページツリー解決decompress.zig:ストリームデコードencoding.zig:フォントエンコーディング・CMap解析interpreter.zig:コンテントストリーム解釈simd.zig:SIMD文字列処理main.zig:CLI実装
- python/zpdf/:Pythonバインディング(cffi)
- examples/:使用例
他ライブラリ比較・使い分け指針
| 機能 | zpdf | pdfium | MuPDF | |---------------|-------------|-------------|------------| | ストリーム順抽出 | Yes | Yes | Yes | | 読順抽出 | 実験的 | No | Yes | | ワード境界 | Yes | Yes | Yes | | フォントサポート | WinAnsi等 | Yes | Yes | | ToUnicode CMap | 部分対応* | Yes | Yes | | CIDフォント | 部分対応* | Yes | Yes | | 圧縮 | Flate, LZW等| Yes | Yes | | JBIG2/JPEG2000 | No | Yes | Yes | | 暗号化PDF | No | Yes | Yes | | レンダリング | No | Yes | Yes | | マルチスレッド | Yes | No** | No |
- *ToUnicode/CID:CMapが埋め込まれていれば動作
- **pdfiumはスレッド非対応、プロセス分割で並列化
選択基準
- zpdf:バッチ処理、シンプルなテキスト抽出、Zig統合
- pdfium:ブラウザ連携、完全なPDFサポート、安定性重視
- MuPDF:読順抽出、複雑レイアウト、レンダリング必要時
ライセンス
- WTFPL(完全自由ライセンス)