OpenSource-Hub

docling

ライブラリ

docling-project/docling

各種ドキュメントを生成AIが利用可能な構造化データに解析します。

概要

Docling は PDF、DOCX、PPTX、HTML、画像、音声などの多様なフォーマットを解析し、統一された構造化ドキュメント表現に変換できます。レイアウト分析、読み順、表、コード、数式認識などの高度な PDF 理解機能を備えており、Markdown、HTML、ロスレス JSON へのエクスポートが可能で、スキャン文書の OCR をサポートし、LangChain、LlamaIndex などの AI フレームワークとシームレスに統合できます。

README プレビュー

\n  \n    \n  \n\n\n# Docling\n\n\n  \n\n\n[](https://arxiv.org/abs/2408.09869)\n[](https://docling-project.github.io/docling/)\n[](https://pypi.org/project/docling/)\n[](https://pypi.org/project/docling/)\n[](https://github.com/astral-sh/uv)\n[](https://github.com/astral-sh/ruff)\n[](https://pydantic.dev)\n[](https://pypi.org/project/prek/)\n[](https://opensource.org/licenses/MIT)\n[](https://pepy.tech/projects/docling)\n[](https://apify.com/vancura/docling)\n[](https://app.dosu.dev/097760a8-135e-4789-8234-90c8837d7f1c/ask?utm_source=github)\n[](https://docling.ai/discord)\n[](https://www.bestpractices.dev/projects/10101)\n[](https://lfaidata.foundation/projects/)\n\n## What is Docling ?\n\nDocling simplifies document processing by parsing diverse formats — including advanced PDF understanding — and providing seamless integrations with the generative AI ecosystem.\n\n## Features\n\n- 🗂️ Parsing of [multiple document formats][supported_formats] including PDF, DOCX, PPTX, XLSX, HTML, EPUB, Apple Pages, WAV, MP3, WebVTT, Box Notes, email formats (EML, MSG), images (PNG, TIFF, JPEG, ...), LaTeX, DocLang, plain text, and more\n- 📑 Advanced PDF understanding incl. page layout, reading order, table structure, code, formulas, image classification, and more\n- 🧬 A unified, expressive [DoclingDocument][docling_document] representation format\n- ↪️ Various [export formats][supported_formats] and options, including Markdown, HTML, WebVTT, DocLang, [DocTags](https://arxiv.org/abs/2503.11576) and lossless JSON\n- 📜 Support for several application-specific XML schemas including [DocLang](https://doclang.ai), [USPTO](https://www.uspto.gov/patents) patents, [JATS](https://jats.nlm.nih.gov/) articles, and [XBRL](https://www.xbrl.org/) financial reports.\n- 🔒 Local execution capabilities for sensitive data and air-gapped environments\n- 🤖 Plug-and-play [integrations][integrations] incl. LangChain, LlamaIndex, Crew AI & Haystack for agentic AI\n- 🔍 Extensive OCR support for sca

FAQ (5)

トラブル対応
Doclingの画像エンリッチメント(クラシファイア、説明、チャート抽出)で、透過PNG画像が真っ黒になってしまうのはなぜですか?

DoclingのエンリッチメントモデルはRGBA画像をPILのconvert("RGB")で変換しますが、この変換はアルファチャンネルの下に保持されている色(通常は黒)をそのまま使うため、透明領域が白ではなく黒になってしまいます。これはdocument_picture_classifier.py:167、picture_description_base_model.py:106、inference_engines/vlm/_utils.py:131に影響します。修正方法:これら3箇所のconvert("RGB")を、docling/backend/image_backend.pyの_to_rgb(#4511で追加)に置き換えてください。_to_rgbは画像を白い背景にフラット化します。自分のコードでの回避策としては、モデルに画像を渡す前にRGBAを白に合成してください。例:bg = Image.new("RGB", img.size, (255,255,255)); bg.paste(img, mask=img.split()[3])。なお、ページ画像はすでに_to_rgbを通っています。prepare_element経由でDOCX/HTML/PPTXに埋め込まれた画像のみが、このバグのあるパスを通ります。

参照 Issue #4774
トラブル対応
Doclingが数千の小さな図形を含むPDFを変換する際に、document_timeoutを無視していつまでもハングしてしまうのはなぜですか?

これは Docling 2.132–2.134(commit 42de1e2)におけるリグレッションです。読み取り順序モデルがページ区切り候補を無制限に生成し(例:各座席が正方形で表されるコンサートホールの平面図では約195K個)、候補のマージ処理が二次の計算量となるため、変換が実質的に完了しません。また、このフェーズ内では document_timeout の予算がチェックされなかったため、パイプラインが永遠にブロックされていました。

修正方法:PR #4633 を含む Docling バージョンにアップグレードしてください。この修正では、(1) 区切り候補を1ページあたり5,000個に制限し、上限を超えたページでは警告を出力して区切り抽出をスキップし、デフォルトの読み取り順序にフォールバックします。さらに (2) 候補ループとマージ処理は残りの document_timeout 予算が尽きた時点で中断され、TIMEOUT エラーが記録されるため、変換はハングする代わりにステータス PARTIAL_SUCCESS を返すようになりました。

アップグレードできない場合の回避策:pip install docling==2.124 を実行して、影響を受けない最後のバージョンに固定してください。

参照 Issue #4632
トラブル対応
複数の PDF に対して tesserocr OCR を並列実行する際に発生する Docling のセグメンテーションフォルト(SIGSEGV)を修正する方法

根本原因: Docling の TesseractOcrModel はパイプラインごとに tesserocr の PyTessBaseAPI リーダーを 1 つキャッシュしており、tesserocr はスレッドセーフではありません。変換が同時に実行される場合(settings.perf.doc_batch_concurrency > 1 の場合、または 1 つの DocumentConverter が複数のスレッドから呼び出される場合)、SetImage/SetRectangle/GetUTF8Text の同時呼び出しが互いの状態を破壊します。その結果、プロセスは SIGSEGV(終了コード 139)で終了するか、cysignals.signals.SignalError: Segmentation fault を送出するか、OCR テキストが欠落したままステータス success を暗黙的に返します。

回避策:

1. 変換の前にバッチ変換を強制的に順次実行にする:

from docling.datamodel.settings import settings
settings.perf.doc_batch_concurrency = 1

2. 独自のスレッドから Docling を呼び出す場合は、1 つの DocumentConverter を共有しないでください。スレッドごとに個別の DocumentConverter を作成する(それぞれが独自のパイプラインと tesserocr リーダーを構築します)か、threading.Lock ですべての convert()/convert_all() 呼び出しを直列化してください。

3. docling を最新リリースにアップグレードし、上流の修正状況について issue #4940 を確認してください。

注意: Python は SIGSEGV をキャッチできないため、1 つのドキュメントのクラッシュがプロセス内のすべての変換を停止させます。スレッドセーフな修正がリリースされるまでは、並行数を 1 に維持してください。

参照 Issue #4940
トラブル対応
pillow<13 の依存関係の競合があるにもかかわらず、Docling を Pillow 13 と一緒にインストールするにはどうすればよいですか?

Docling(2.141.0 まで)は、4 つのパッケージ(docling-slim、docling-core、docling-parse、docling-ibm-models)で pillow>=10.0.0,<13.0.0 に固定しています。これにより、pip-audit が指摘する 8 件の CVE(CVE-2026-112895、CVE-2026-112400、CVE-2026-112397、CVE-2026-112896、CVE-2026-112897、CVE-2026-112395、CVE-2026-112404、CVE-2026-112899)を修正した Pillow 13.0.0 がブロックされます。

回避策:依存関係のオーバーライドで Pillow 13 を強制します。uv の場合、プロジェクトにオーバーライドを追加するか、オーバーライドファイルを使用します:

uv pip install docling --overrides overrides.txt   # overrides.txt の内容: pillow==13.0.0

または pyproject.toml に記述します:
[tool.uv]
override-dependencies = ["pillow>=13.0.0"]

互換性は Python 3.12 上の docling 2.132.0 で検証済みです。PDF、スキャン PDF、PNG、JPEG はすべて正常に変換され、Markdown エクスポート、ページ数/テーブル数、ページ画像サイズは Pillow 12.3.0 と同一でした。TableFormer も正常に動作しました。ソースコードの監査により、docling、docling-core、docling-parse、docling-ibm-models は Pillow 13 で削除された API(Image._show、get_child_images、ImageCmsProfile.product_name/product_info、ExifTags.IFD.Makernote、dtype を変更する fromarray)を一切使用していないことが確認されました。上限を <14.0.0 に引き上げるリクエストは現在保留中です。公式な修正については 2.141.0 以降のリリースを確認してください。

参照 Issue #4926
トラブル対応
Doclingがセミコロン区切りのCSVファイルをカンマで分割してしまうのはなぜですか?また、それを修正するにはどうすればよいですか?

これはDoclingのCSVバックエンドにおけるバグです。docling/backend/csv_backend.py内の_sniff_dialect()は、最初の行(ヘッダー)のみから区切り文字を検出します。ヘッダーの列名にカンマが含まれている場合(例:Weight (kg, net))、Pythonのcsv.Snifferは;ではなく,を選択してしまい、すべてのセルが破損します。これは、;が列区切り文字で,が小数点記号であるヨーロッパのロケールでExcelがエクスポートするファイルに一般的に影響します。回避策:(1) 変換前にヘッダーの列名からカンマを削除する(例:Weight (kg, net)をWeight (kg net)に変更する)— これにより、同じファイルが;で正しく分割されます。(2) ファイルを前処理する:ファイル全体の内容を使用してダイアレクトをスニッフし(csv.Sniffer().sniff(full_text, ',;\t|:'))書き換えるか、最初にCSVをXLSXに変換してからそれをDoclingで変換する。(3) issue #4895にリンクされた修正PRがマージされたらDoclingを更新する。このPRにより、一貫性のためにダイアレクト検出が複数行を使用するようになります。

参照 Issue #4895