For PDFs with tables, two-column layouts or scanned pages, Docling produced usable Markdown in our tests and MarkItDown did not. MarkItDown was 16 to 53 times faster on the born-digital files, installed in a fraction of the space, and returned the full text of a dense tax form, so it suits simple text PDFs and pipelines that mostly convert Office files. Both are MIT-licensed Python libraries.
We ran Docling 2.138.0 and MarkItDown 0.1.8 with default settings on the same five PDFs on one Mac. The same runs, with three more tools, are in our tested roundup of PDF to Markdown converters. Disclosure: Parsebridge, which publishes this blog, sells a hosted Docling API.
Docling vs MarkItDown at a glance
| Docling | MarkItDown | |
|---|---|---|
| Maintainer | Started at IBM Research, hosted by the LF AI & Data Foundation | Microsoft |
| License | MIT | MIT |
| Python | 3.10 or newer | 3.10 to 3.14 |
| How it reads a PDF | Layout model, TableFormer table model and OCR, on PyTorch | Text extraction with pdfminer.six and pdfplumber, plus heuristics for table-like pages |
| Install, measured | 1.2 GB environment plus about 0.5 GB of models | 182 MB environment, no models |
| Cold start, measured | 11.0 s | 0.5 s |
| 60-page report, measured | 234 to 239 s | 4.3 to 4.5 s |
| Tables | Markdown tables rebuilt cell by cell | Markdown tables only on pages its heuristics flag as tables |
| Multi-column pages | Read in column order | Lines from both columns merged in our test |
| OCR for scanned PDFs | Built in, on by default | None built in; markitdown-ocr plugin (LLM vision) or Azure Document Intelligence |
| Input formats | PDF, DOCX, PPTX, XLSX, HTML, images, audio, LaTeX, email and more | PDF, Word, PowerPoint, Excel, HTML, images, audio, EPUB, ZIP, YouTube URLs and more |
| Output | Markdown, HTML, lossless JSON, DocTags and more | Markdown |
How we tested
Five PDFs, each stressing one thing:
- Paper: PubTables-1M, a 10-page, two-column research paper with four tables (CC BY 4.0).
- Table: Table 1 from page 31 of the EIA Short-Term Energy Outlook, October 2026, with 15 numeric columns under year and quarter headers (US government work, public domain).
- Scan: our scanned order fixture, an image-only page with a small table.
- Form: page 1 of the 2026 IRS Form W-4 (public domain).
- Report: the full 60-page EIA Short-Term Energy Outlook, for timing.
The machine was a Mac mini with an Apple M4 and 16 GB RAM, on macOS 26.6 and Python 3.12.15. Each library had its own virtual environment and ran with defaults: DocumentConverter() for Docling, which picked RapidOCR on PyTorch for OCR and ran its models on the Apple GPU, and MarkItDown() without plugins after pip install 'markitdown[pdf]'. “Cold” is a fresh process converting a one-page PDF, including imports and model loading; the other times are warm conversions in the same process, from the second of two runs.
| Seconds | Paper (10 p.) | Table (1 p.) | Scan (1 p.) | Form (1 p.) | Report (60 p.) |
|---|---|---|---|---|---|
| Docling | 6.6 | 4.6 | 3.8 | 3.9 | 238.8 |
| MarkItDown | 0.4 | 0.2 | 0.0 | 0.1 | 4.5 |
Results on the same PDFs
Dense table
Docling returned a 15-column Markdown table. It combined the year and quarter headers into one row and kept each two-line row label with its values:
| | 2025 - Q1 | 2025 - Q2 | 2025 - Q3 | ...
| Energy Production | | | | ...
| Crude Oil Production (a) (million barrels per day) ........................ | 13.32 | 13.58 | 13.82 | ...
It made one mistake on the page: the last two rows, heating and cooling degree-days, were merged into one row with two numbers in each cell.
MarkItDown returned no table for this page. It listed every row label first, then every number on its own line, column by column:
Crude Oil Production (a)
(million barrels per day) ........................
Dry Natural Gas Production
(billion cubic feet per day) .....................
...
13.32
13.58
13.82
With that layout the numbers can no longer be matched to their rows. When we converted the full 60-page report instead, MarkItDown printed the same table as one line of text per row, with the label followed by its 15 values. Its PDF converter checks every page for table-like content and, if any page qualifies, extracts the whole document with pdfplumber; otherwise it uses pdfminer.six. The same page can therefore come out differently depending on the rest of the file.
Two-column paper
Docling followed both columns in reading order, turned the 16 section titles into ## headings, and produced the paper’s tables cell for cell, including the checkmarks in Table 1.
MarkItDown merged lines from the two columns, dropped the spaces between many words, and turned some sentences into tables:
Abstract
| Recently, | significant progress | has been made | applying | | | | |
| --------- | -------------------- | ------------- | -------- | --- | --- | --- | --- |
machinelearningtotheproblemoftablestructureinference
The checkmarks in Table 1 came out as (cid:88), and the output had no Markdown headings.
Scanned page
Docling ran OCR without any configuration and returned all the text with the item table intact:
| Item | Quantity | Amount |
|-----------------|------------|-----------|
| Archive folders | 3 | CHF 18.00 |
| Storage boxes | 2 | CHF 24.00 |
It split “Total:” and “CHF 42.00” into two paragraphs. MarkItDown returned an empty string, since its PDF converter has no OCR step. The markitdown-ocr plugin adds OCR through an LLM vision model you supply; we did not test it.
Form
This was MarkItDown’s best result. It returned every line of the W-4 in reading order, including the footer, as plain text without headings or checkbox markup. Docling returned the body text with step headings and the checkboxes as - [ ] items, but placed the Step 3 and Step 4 headings next to each other and put the “Exempt from withholding” label inside Step 4. Docling also left out the page footer.
Speed and footprint
MarkItDown converted the 60-page report in about 4.5 seconds, roughly 13 pages per second. Docling took about 4 seconds per page on the same file, with OCR also running on the report’s 16 pages of charts. A fresh MarkItDown process converted its first one-page PDF in half a second. A fresh Docling process took 11 seconds for the same job, about 7 seconds more than a warm conversion, which is the cost of imports and model loading. The MarkItDown environment was 182 MB. Docling’s was 1.2 GB plus about 0.5 GB of layout and table models.
Code for both
Docling:
pip install docling
docling convert report.pdf --to md --output out/
from docling.document_converter import DocumentConverter
converter = DocumentConverter() # reuse it; model loading is the slow part
markdown = converter.convert("report.pdf").document.export_to_markdown()
MarkItDown:
pip install 'markitdown[pdf]'
markitdown report.pdf -o report.md
from markitdown import MarkItDown
markdown = MarkItDown().convert("report.pdf").text_content
When to pick which
Pick Docling when your PDFs have tables you need cell by cell, multi-column layouts, or scanned pages, and you can run a process with PyTorch in it. The Docling getting started guide covers the table and OCR options. If you would rather not run it yourself, Parsebridge serves Docling as an API: it takes PDFs up to 50 MB, new accounts get 50 free pages once, and plans start at $17 a month for 5,000 pages.
Pick MarkItDown when your PDFs are simple, single-column, born-digital text, when speed and a small install matter more than layout, or when you are already using it for Word, PowerPoint and Excel files and only need the words from PDFs.
The two can also share a pipeline: MarkItDown for Office files and plain PDFs, Docling for the PDFs with tables or scans. To see Docling’s output for one of your own PDFs before installing anything, the free PDF to Markdown converter converts the first page in the browser.