PDF para Markdown em Python

Quatro bibliotecas que transformam PDFs em Markdown, com o comando de instalação e código que funciona para cada uma, o que as licenças permitem e como escolher entre elas.

Última atualização: 2026-11-13

Qual biblioteca escolher

BibliotecaLicençaPrecisa deMelhor para
PyMuPDF4LLMAGPL 3.0, ou licença comercial pagaSó pipPDFs de texto rápidos e precisos; títulos e tabelas
MarkItDownMITSó pipMuitos tipos de arquivo numa só chamada
DoclingMITPyTorch, download de modelosLayouts complexos, tabelas, saída estruturada
MarkerCódigo Apache 2.0; pesos do modelo sob licença OpenRAIL-M modificadaPyTorch, e um servidor de inferência para OCRArtigos cheios de fórmulas e digitalizações, de preferência com GPU

As versões abaixo eram as atuais na data no topo desta página. Se você só tem alguns PDFs, não precisa de nenhuma: o conversor da nossa página inicial faz o mesmo no seu navegador.

PyMuPDF4LLM

A exportação para Markdown do PyMuPDF. Desde o PyMuPDF 2.0 ela vem dentro do pacote pymupdf; o nome de importação continua pymupdf4llm.

pip install pymupdf
import pymupdf4llm

md = pymupdf4llm.to_markdown("report.pdf")
open("report.md", "w", encoding="utf-8").write(md)

Opções úteis:

# Só algumas páginas (a partir de 0), como um dict por página com seus metadados
pages = pymupdf4llm.to_markdown("report.pdf", pages=[0, 1, 2], page_chunks=True)
for p in pages:
    print(p["metadata"]["page_number"], len(p["text"]))

Para páginas digitalizadas, instale também um motor de OCR: com pip install rapidocr onnxruntime, o PyMuPDF lê páginas sem camada de texto.

Licença: o PyMuPDF tem licença dupla: GNU AGPL 3.0 ou uma licença comercial da Artifex. A AGPL exige que você publique seu próprio código-fonte se distribuir o software ou oferecê-lo como serviço em rede, então verifique isso antes de usá-lo num produto fechado.

No nosso benchmark, o PyMuPDF4LLM 2.1 manteve em média 99% do texto principal e teve a melhor ordem de leitura dos três conversores avaliados.

MarkItDown

O conversor da Microsoft para muitos formatos: PDF, Word, PowerPoint, Excel, HTML, EPUB e mais.

pip install 'markitdown[pdf]'
from markitdown import MarkItDown

md = MarkItDown()
result = md.convert("report.pdf")
open("report.md", "w", encoding="utf-8").write(result.markdown)

Pela linha de comando: markitdown report.pdf -o report.md.

Licença: MIT.

Bom saber: para PDFs ele extrai o texto com pdfminer.six e pdfplumber. O resultado não tem títulos, mantém as quebras de linha e os hifens de fim de linha do PDF, e a instalação padrão não tem OCR. É a escolha certa quando os PDFs são uma pequena parte de uma pilha misturada de arquivos de escritório. Nossa página sobre o MarkItDown tem os detalhes.

Docling

Um kit de conversão de documentos que nasceu no IBM Research Zurich e hoje é mantido pela LF AI & Data Foundation. Ele roda modelos de layout, tabelas e OCR, então instala o PyTorch e baixa os modelos no primeiro uso. Além de PDF, lê Word, PowerPoint, Excel, HTML, imagens e mais.

pip install docling
from docling.document_converter import DocumentConverter

converter = DocumentConverter()
result = converter.convert("report.pdf")
md = result.document.export_to_markdown()
open("report.md", "w", encoding="utf-8").write(md)

Pela linha de comando: docling report.pdf grava um arquivo .md na pasta atual.

Licença: MIT. Além de Markdown, o documento pode ser exportado para HTML e para um formato JSON sem perdas que guarda as informações de layout para processamento posterior.

Marker

O conversor da Datalab, construído em torno dos seus próprios modelos de visão. É forte em fórmulas e digitalizações, e mais pesado de rodar.

pip install marker-pdf

O Marker precisa do PyTorch e, para OCR, inicia um servidor de inferência no primeiro uso: vLLM numa GPU NVIDIA, ou o binário llama-server do llama.cpp numa CPU ou num Apple Silicon.

from marker.converters.pdf import PdfConverter
from marker.models import create_model_dict
from marker.output import text_from_rendered

converter = PdfConverter(artifact_dict=create_model_dict())
rendered = converter("report.pdf")
text, _, images = text_from_rendered(rendered)
open("report.md", "w", encoding="utf-8").write(text)

Pela linha de comando: marker_single report.pdf.

Licença: o código é Apache 2.0. Os pesos do modelo usam uma licença AI Pubs OpenRAIL-M modificada, gratuita para pesquisa, uso pessoal e startups com menos de 5 milhões de dólares em investimento ou receita; uso comercial maior precisa de licença da Datalab.

Converter uma pasta de PDFs

O mesmo laço funciona com qualquer uma das bibliotecas; aqui com o PyMuPDF4LLM:

from pathlib import Path
import pymupdf4llm

src, out = Path("pdfs"), Path("markdown")
out.mkdir(exist_ok=True)
for pdf in sorted(src.glob("*.pdf")):
    try:
        md = pymupdf4llm.to_markdown(str(pdf))
    except Exception as e:  # um arquivo danificado ou criptografado não deve parar o lote
        print(f"skipped {pdf.name}: {e}")
        continue
    (out / f"{pdf.stem}.md").write_text(md, encoding="utf-8")

Quando um script não é a ferramenta certa

  • Poucos arquivos, uma vez só: soltá-los no conversor é mais rápido que montar um ambiente, e você confere cada página com o Markdown dela.
  • Documentos sensíveis numa máquina compartilhada: o conversor no navegador não precisa de instalação e mantém o arquivo na aba.
  • Você quer contagem de tokens e chunks para RAG sem escrever isso: veja PDF para Markdown para LLMs.

Perguntas frequentes

Qual biblioteca é a mais rápida?

Em PDFs de texto, o MarkItDown e o PyMuPDF4LLM levam de uma fração de segundo a alguns segundos por documento num notebook. O Docling e o Marker rodam modelos neurais e são bem mais lentos sem GPU.

Qual lida melhor com tabelas?

Das duas que medimos, o PyMuPDF4LLM produziu tabelas Markdown de verdade, e o MarkItDown quase nunca. O Docling e o Marker usam modelos de tabela e costumam ser recomendados para tabelas complexas; teste nos seus próprios documentos.

Posso usá-las num produto comercial?

MarkItDown e Docling são MIT, o que permite. O PyMuPDF exige cumprir a AGPL ou uma licença comercial. O código do Marker é Apache 2.0, mas os pesos do modelo têm limites de receita para uso comercial.

Existe uma opção em JavaScript?

O próprio pdftomd roda em JavaScript e WebAssembly no navegador. Seu motor de texto é o pacote de código aberto @firecrawl/pdf-inspector-wasm, e o OCR é o PaddleOCR rodando no ONNX Runtime Web. Veja a página de licenças para cada componente.