# PDF Content Extraction Tools Compared: From Plain Text to Structured Parsing


PDF content extraction usually goes in two directions.

One direction is plain text only, as fast as possible. `pdftotext` is a good fit here, but it does not fully preserve charts, formulas, image descriptions, or similar information.

The other direction is output that humans can read, ideally with headings, tables, image descriptions, and reading order preserved. I used to look at Docling first. After trying [MinerU](https://github.com/opendatalab/MinerU) recently, I feel it is more reliable on some of my PDFs. This is just my personal experience, not a benchmark result.

## Tool overview

### pdftotext

`pdftotext` is a command-line tool from the Poppler toolkit. It does one narrow thing: extract text from a PDF quickly, without caring much about layout.

Its strengths are straightforward:

- Fast processing
- Plain text output that is easy to post-process
- Low installation and runtime overhead
- Suitable for batch jobs

### Docling

[Docling](https://github.com/docling-project/docling) is an open-source document parsing tool from IBM. It can convert PDF, DOCX, PPTX, XLSX, and other document formats into structured outputs such as Markdown and JSON.

It is much heavier than `pdftotext`, but the output is also more complete. Heading levels, tables, images, formulas, and reading order can be preserved as much as possible. If you are building document previews, knowledge base pages, or anything that needs downstream structured processing, Docling is more comfortable than a plain text extractor.

Docling's resource usage depends on which features are enabled. Basic parsing is not too demanding. If formula enrichment or chart extraction is enabled, VRAM usage can increase a lot.

### MinerU

[MinerU](https://github.com/opendatalab/MinerU) is an open-source document parsing tool from OpenDataLab. It converts PDFs, images, Office documents, and web pages into Markdown / JSON, which can then be used in LLM / RAG-style workflows.

MinerU provides a [free web version](https://mineru.net/) for trying documents online. It can also be self-hosted from the [GitHub repository](https://github.com/opendatalab/MinerU). The official docs also include Docker deployment. To avoid Python and pip package compatibility issues, I run it in a container and built an image based on the official Dockerfile:

```bash
podman pull docker.io/nite07/mineru:latest
```

Repo: https://git.nite07.com/nite/custom-containerfile

I have been leaning toward MinerU recently for a few reasons.

First, on my documents, the recognition quality feels better than Docling.

Second, it handles content that looks like tables but has no borders pretty well. Many PDF tables are really just whitespace and alignment. Some parsers turn them into scattered text. MinerU often turns this kind of content into readable Markdown tables, which is useful for both reading and later cleanup.

Third, it can recognize image content and add a summary to the output. For images, flowcharts, diagrams, and screenshots, it does more than just save image files. Some output can look close to this:

````markdown
<details>
<summary>Flowchart</summary>

```mermaid
graph LR
    A["Original image X"] --> B["Encoder"]
    B --> C["Decoder"]
    C --> D["Decompressed (or reconstructed) image Ŷ"]
    style B fill:#ff0000,stroke:#333
    style C fill:#ff0000,stroke:#333
    note1["Compressed bitstream Y"] --> B
    note2["x̂ = x, x̂ ≠ x"] --> C
```

</details>
````

This kind of output works well in Markdown. Images and charts are not plain text in the first place, so having a readable summary first is already useful. Manual cleanup can come later.

I also wrote a separate post, [MinerU on Low VRAM](/posts/mineru-low-vram/), about `hybrid-auto-engine` running out of memory on an 8GB GPU while `vlm-auto-engine` worked. If you plan to deploy MinerU locally, that post is worth checking first.

## Usage comparison

### Plain text extraction: pdftotext

If the task only needs body text, `pdftotext` is convenient.

Its advantage is not document understanding. It is speed. Plain text output also uses fewer tokens and is easy to clean, chunk, and ingest. The trade-off is clear: charts, formulas, image descriptions, and table structure will be lost or distorted.

```bash
# Quickly extract PDF text
pdftotext document.pdf - | head -n 50

# Batch process a document folder
for file in documents/*.pdf; do
    pdftotext "$file" "text_output/$(basename "$file" .pdf).txt"
done
```

It fits tasks like these:

- Quickly previewing PDF text
- Batch extracting body text
- Building a rough full-text search index
- Pre-checking documents before a richer parsing pipeline

For serious RAG, especially with technical documents, papers, or financial reports, plain text extraction is usually not enough. Charts, formulas, and tables are part of the source material. They should not be dropped by default.

### Structured parsing: Docling and MinerU

If the output is meant for humans, or if you need to preserve structure, Docling and MinerU are closer to that requirement.

Docling's Python API is easy to use:

```python
from docling.document_converter import DocumentConverter

converter = DocumentConverter()

result = converter.convert("report.pdf")
markdown_content = result.document.export_to_markdown()

with open("report.md", "w", encoding="utf-8") as f:
    f.write(markdown_content)
```

It can also run directly from the CLI. The default output is Markdown. You can use `--to` to choose JSON, HTML, and other formats, and `--output` to set the output directory:

```bash
# Convert to Markdown by default
docling report.pdf --output output

# Output JSON instead
docling report.pdf --to json --output output
```

The VLM pipeline can also be selected from the CLI:

```bash
docling report.pdf --pipeline vlm --output output
```

MinerU's CLI is also direct:

```bash
mineru -p input.pdf -o output
```

If you use the container image, you can start the WebUI like this:

```bash
podman run --rm \
	--device nvidia.com/gpu=all \
	-p 7860:7860 \
	-it mineru:latest \
	mineru-gradio --server-name 0.0.0.0 --server-port 7860
```

If VRAM is tight, you can refer to the low-VRAM post mentioned above and switch the backend to `vlm-auto-engine` or `pipeline`. On my machine, MinerU's pure `vlm-auto-engine` mode is easier to run than Docling with formula and chart recognition enabled.

```bash
mineru -p input.pdf -o output -b vlm-auto-engine
```

## Comparison table

| Dimension              | pdftotext                           | Docling                                                                            | MinerU                                                        |
| ---------------------- | ----------------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------- |
| Processing speed       | Fast                                | Slower                                                                             | Slower                                                        |
| Resource usage         | Low                                 | Depends on enabled features; formula and chart recognition can increase VRAM usage | Depends on backend                                            |
| Output format          | Plain text                          | Markdown / JSON, etc.                                                              | Markdown / JSON, etc.                                         |
| Structure preservation | Almost none                         | Good                                                                               | Good                                                          |
| Table handling         | Weak                                | Good                                                                               | Good, with a nice experience on borderless table-like content |
| Image handling         | Not supported                       | Supports extraction; extra capability depends on configuration                     | Supports extraction and content summaries                     |
| OCR                    | Not supported                       | Supported                                                                          | Supported                                                     |
| Deployment             | System package or command-line tool | pip / uv / source, etc.                                                            | pip / uv / source / Docker, etc.                              |
| Online version         | None                                | Mainly local use                                                                   | Official web version available                                |

These tools are not direct replacements for each other. `pdftotext` is good for quickly getting plain text. Docling and MinerU are better suited for document structure. The final result still depends on your own PDFs. The same tool can behave very differently on papers, scanned files, reports, and slide decks.

## Further reading

- [MinerU website](https://mineru.net/)
- [MinerU GitHub repository](https://github.com/opendatalab/MinerU)
- [MinerU official Dockerfile](https://raw.githubusercontent.com/opendatalab/MinerU/refs/heads/master/docker/global/Dockerfile)
- [MinerU on Low VRAM](/posts/mineru-low-vram/)
- [Docling GitHub repository](https://github.com/docling-project/docling)
- [Docling CLI reference](https://docling-project.github.io/docling/reference/cli/)
- [Docling technical report](https://arxiv.org/abs/2408.09869)
- [Poppler official documentation](https://poppler.freedesktop.org/)


---

> Author: Nite  
> URL: https://www.nite07.com/en/posts/pdf-extractor/  

