Melhor biblioteca PDF para Python em 2026
PDF Oxide comparada com PyMuPDF (fitz), pypdfium2, pypdf, pdfplumber, pdfminer e outras. Esta página apresenta desempenho, cobertura de recursos, licenciamento e diferenças de API para você escolher a biblioteca PDF de Python certa para extrair texto.
Resumo
| PDF Oxide | PyMuPDF | pypdfium2 | pypdf | pdfplumber | pdfminer | |
|---|---|---|---|---|---|---|
| Tempo médio de extração | 0,8ms | 4,6ms | 4,1ms | 12,1ms | 23,2ms | 16,8ms |
| Taxa de sucesso (3 830 PDFs) | 100% | 99,3% | 99,2% | 98,4% | 98,8% | 98,8% |
| Licença | MIT | AGPL-3.0 | Apache-2.0 | BSD-3 | MIT | MIT |
| Linguagem | Rust + PyO3 | C (MuPDF) | C (PDFium) | Python puro | Python puro | Python puro |
| Extração de texto | Sim | Sim | Sim | Sim | Sim | Sim |
| Posições de caracteres | Sim | Sim | Sim | Parcial | Sim | Sim |
| Extração de imagens | Sim | Sim | Sim | Sim | Não | Não |
| Campos de formulário | Leitura + escrita | Leitura + escrita | Só leitura | Leitura + escrita | Só leitura | Não |
| Criação de PDF | Sim | Sim | Não | Limitada | Não | Não |
| Edição de PDF | Sim | Sim | Não | Sim | Não | Não |
| Saída em Markdown | Sim | Não | Não | Não | Não | Não |
| Saída em HTML | Sim | Não | Não | Não | Não | Não |
| Criptografia | Leitura + escrita | Leitura + escrita | Só leitura | Leitura + escrita | Não | Não |
| Validação PDF/A | Sim | Não | Não | Não | Não | Não |
| Renderização | Sim | Sim | Sim | Não | Não | Não |
| Busca | Regex + espacial | Sim | Sim | Não | Não | Não |
| Versões do Python | 3.8–3.14 | 3.8–3.12 | 3.8+ | 3.6+ | 3.8+ | 3.6+ |
| Tamanho de instalação | ~5 MB wheel | ~20 MB wheel | ~3 MB wheel | ~1 MB | ~1 MB | ~1 MB |
Comparação de desempenho
Tempo médio de extração de texto por PDF, medido no corpus completo de 3 830 PDFs — três conjuntos de testes independentes e públicos que, juntos, cobrem todas as versões da especificação PDF (1.0–2.0), arquivos criptografados, documentos corrompidos, codificações CJK, layouts complexos e casos extremos de segurança. Veja os detalhes do corpus para saber o que cada conjunto testa e por que os resultados são reprodutíveis.
| Biblioteca | Média | Relativa | p99 | Taxa de sucesso |
|---|---|---|---|---|
| PDF Oxide | 0,8ms | 1× | 9ms | 100% |
| PyMuPDF | 4,6ms | 5,8× | 28ms | 99,3% |
| pypdfium2 | 4,1ms | 5,1× | 42ms | 99,2% |
| pymupdf4llm | 55,5ms | 69× | 280ms | 99,1% |
| pdftext | 7,3ms | 9,1× | 82ms | 99,0% |
| pdfminer | 16,8ms | 21× | 124ms | 98,8% |
| pdfplumber | 23,2ms | 29× | 189ms | 98,8% |
| markitdown | 108,8ms | 136× | 378ms | 98,6% |
| pypdf | 12,1ms | 15,1× | 97ms | 98,4% |
O PDF Oxide alcança essa velocidade graças a um núcleo nativo em Rust compilado como módulo de extensão do Python via PyO3. Não há sobrecarga de subprocesso nem ponte com biblioteca C — o código Rust roda direto dentro do processo Python.
Confiabilidade
O PDF Oxide processa 3 823 de 3 823 PDFs válidos sem falhar — uma taxa de sucesso de 100 %. Os 7 arquivos que não passam no corpus de 3 830 são fixtures de teste quebrados de propósito (cabeçalho PDF ausente, catálogos corrompidos por fuzzing, streams xref inválidos).
| Biblioteca | PDFs válidos aprovados | Taxa de sucesso |
|---|---|---|
| PDF Oxide | 3 823 / 3 823 | 100% |
| PyMuPDF | 3 796 / 3 823 | 99,3% |
| pypdfium2 | 3 792 / 3 823 | 99,2% |
| pymupdf4llm | 3 787 / 3 823 | 99,1% |
| pdftext | 3 784 / 3 823 | 99,0% |
| pdfminer | 3 777 / 3 823 | 98,8% |
| pdfplumber | 3 777 / 3 823 | 98,8% |
| markitdown | 3 771 / 3 823 | 98,6% |
| pypdf | 3 762 / 3 823 | 98,4% |
Qualidade do texto
O PDF Oxide atinge 99,5 % de paridade textual em relação a PyMuPDF e pypdfium2 em todo o corpus. A qualidade foi medida comparando a saída extraída caractere a caractere. Os 0,5 % de diferença restantes ficam na normalização de espaços e no tratamento de ligaduras, com o PDF Oxide produzindo uma saída mais limpa.
Comparação de licenças
| Biblioteca | Licença | Uso comercial | Copyleft |
|---|---|---|---|
| PDF Oxide | MIT | Sem restrições | Não |
| pypdfium2 | Apache-2.0 | Sem restrições | Não |
| PyMuPDF | AGPL-3.0 | Exige licença comercial ($) | Sim |
| pypdf | BSD-3 | Sem restrições | Não |
| pdfplumber | MIT | Sem restrições | Não |
| pdfminer | MIT | Sem restrições | Não |
| pdftext | GPL-3.0 | Exige código aberto | Sim |
O PyMuPDF usa o MuPDF sob licença AGPL-3.0. Se você distribui software que usa PyMuPDF, o seu software também precisa ser lançado sob AGPL-3.0 — ou você compra uma licença comercial da Artifex. Isso se aplica a produtos SaaS, aplicações web e qualquer binário distribuído.
O PDF Oxide é MIT, sem restrições. Use em produtos proprietários, plataformas SaaS ou aplicações de código fechado, sem obrigações de licenciamento.
| Caso de uso | PDF Oxide (MIT) | PyMuPDF (AGPL) | pypdfium2 (Apache) | pypdf (BSD) | pdfplumber (MIT) | pdfminer (MIT) |
|---|---|---|---|---|---|---|
| Produto comercial | Sim | Exige licença | Sim | Sim | Sim | Sim |
| Código fechado | Sim | Não (sem licença) | Sim | Sim | Sim | Sim |
| SaaS/nuvem | Sim | Exige licença | Sim | Sim | Sim | Sim |
| Ferramentas internas | Sim | Sim | Sim | Sim | Sim | Sim |
Comparação de APIs
Extração de texto
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)
PyMuPDF:
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
text = page.get_text()
print(text)
pypdf:
from pypdf import PdfReader
reader = PdfReader("report.pdf")
page = reader.pages[0]
text = page.extract_text()
print(text)
pdfplumber:
import pdfplumber
with pdfplumber.open("report.pdf") as pdf:
page = pdf.pages[0]
text = page.extract_text()
print(text)
pdfminer:
from pdfminer.high_level import extract_text
text = extract_text("report.pdf", page_numbers=[0])
print(text)
Extração a nível de caractere
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
chars = doc.extract_chars(0)
for ch in chars:
print(f"'{ch.char}' at ({ch.bbox[0]:.1f}, {ch.bbox[1]:.1f}) "
f"size={ch.font_size:.1f}")
PyMuPDF:
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
blocks = page.get_text("dict")["blocks"]
for block in blocks:
if "lines" in block:
for line in block["lines"]:
for span in line["spans"]:
print(f"'{span['text']}' size={span['size']:.1f}")
pdfplumber:
import pdfplumber
with pdfplumber.open("report.pdf") as pdf:
page = pdf.pages[0]
for char in page.chars:
print(f"'{char['text']}' at ({char['x0']:.1f}, {char['top']:.1f}) "
f"size={char['size']:.1f}")
pdfminer:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTChar
for page_layout in extract_pages("report.pdf"):
for element in page_layout:
if hasattr(element, '__iter__'):
for text_line in element:
if hasattr(text_line, '__iter__'):
for char in text_line:
if isinstance(char, LTChar):
print(f"'{char.get_text()}' at ({char.x0:.1f}, {char.y0:.1f}) "
f"size={char.size:.1f}")
Extração de imagens
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
images = doc.extract_image_bytes(0)
for i, img in enumerate(images):
with open(f"image_{i}.{img['format']}", "wb") as f:
f.write(img["data"])
PyMuPDF:
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
for i, img in enumerate(page.get_images()):
xref = img[0]
base_image = doc.extract_image(xref)
with open(f"image_{i}.{base_image['ext']}", "wb") as f:
f.write(base_image["image"])
pypdf:
from pypdf import PdfReader
reader = PdfReader("report.pdf")
page = reader.pages[0]
for i, image in enumerate(page.images):
with open(f"image_{i}.{image.name.split('.')[-1]}", "wb") as f:
f.write(image.data)
Criação de PDF
PDF Oxide:
from pdf_oxide import Pdf
pdf = Pdf.from_markdown("# Hello World\n\nThis is a PDF.")
pdf.save("output.pdf")
# Também aceita HTML
pdf = Pdf.from_html("<h1>Hello</h1><p>World</p>")
pdf.save("output.pdf")
PyMuPDF:
import fitz
doc = fitz.open()
page = doc.new_page()
text_point = fitz.Point(72, 72)
page.insert_text(text_point, "Hello World", fontsize=24)
doc.save("output.pdf")
pypdf:
# O pypdf consegue mesclar e modificar PDFs, mas não criar do zero com conteúdo de texto.
# Use reportlab ou fpdf2 para criar e depois mescle com o pypdf.
PDFs criptografados
PDF Oxide:
from pdf_oxide import PdfDocument
doc = PdfDocument("encrypted.pdf", password="password")
text = doc.extract_text(0)
PyMuPDF:
import fitz
doc = fitz.open("encrypted.pdf")
doc.authenticate("password")
page = doc[0]
text = page.get_text()
pypdf:
from pypdf import PdfReader
reader = PdfReader("encrypted.pdf")
reader.decrypt("password")
text = reader.pages[0].extract_text()
Saída em Markdown e HTML
PDF Oxide (recurso exclusivo):
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
# Converte para Markdown com detecção de títulos
md = doc.to_markdown(0, detect_headings=True)
print(md)
# Converte para HTML
html = doc.to_html(0)
print(html)
Nenhuma outra biblioteca PDF de Python oferece conversão para Markdown ou HTML embutida.
Perfis das bibliotecas
PDF Oxide
Pontos fortes:
- Extração de texto mais rápida nos benchmarks graças ao núcleo em Rust — 5,8× mais rápida que o PyMuPDF
- 100 % de sucesso no corpus de 3 830 PDFs — maior confiabilidade entre as bibliotecas testadas
- API unificada para extração, criação e edição em uma única biblioteca
- Exportação para Markdown e HTML embutida, com detecção de títulos
- Licença MIT sem restrições copyleft
- Validação de conformidade nativa (PDF/A, PDF/UA, PDF/X)
- Wheels pré-compilados para as principais plataformas e Python 3.8–3.14
- Sem dependências de sistema — o wheel traz tudo
Limitações:
- Biblioteca mais nova, com comunidade menor
- A extração de tabelas é básica diante dos algoritmos do pdfplumber
- O motor de renderização é menos maduro que o do MuPDF
PyMuPDF (fitz)
Pontos fortes:
- Madura e testada em produção (apoiada pelo MuPDF, em desenvolvimento desde 2005)
- Excelente qualidade de renderização em PDFs complexos
- Integração OCR embutida (Tesseract)
- Conjunto de recursos vasto: exportação SVG, manipulação de páginas, detecção de tabelas
Limitações:
- A licença AGPL-3.0 exige abrir o código da sua aplicação ou comprar uma licença comercial
- Wheel grande (~20 MB) por embutir o MuPDF
- Sem exportação para Markdown embutida
- Sem validação de conformidade
pypdfium2
Pontos fortes:
- Rápida (baseada no motor PDFium do Google)
- Licença Apache-2.0 — permissiva para uso comercial
- Boa qualidade de renderização
Limitações:
- API de extração de texto limitada frente a PDF Oxide ou PyMuPDF
- Sem criação nem edição de PDF
- Sem suporte a campos de formulário além de leitura
pypdf
Pontos fortes:
- Python puro — instala em qualquer lugar, sem dependências compiladas
- Leve e bem mantida
- Boa para manipulação de PDF (mesclar, dividir, rotacionar, criptografar)
- Comunidade grande e documentação ampla
Limitações:
- 15× mais lenta que o PDF Oxide para extrair texto
- A qualidade da extração sofre em layouts complexos
- Sem renderização, sem exportação Markdown/HTML, sem extração de tabelas
pdfplumber
Pontos fortes:
- Melhor extração de tabelas entre as bibliotecas PDF de Python
- Excelentes dados de posicionamento a nível de caractere
- Ferramentas visuais de depuração (imagens de página anotadas)
- Licença MIT
Limitações:
- Python puro — 29× mais lenta que o PDF Oxide
- Só leitura — não cria nem edita PDFs
- Sem criptografia nem renderização
pdfminer
Pontos fortes:
- Análise detalhada de caracteres e layout
- Bom suporte a texto CJK
- Base do pdfplumber e de outras ferramentas
- Licença MIT
Limitações:
- 21× mais lenta que o PDF Oxide (Python puro, sem otimização)
- Só leitura, sem criação ou edição
- API verbosa para tarefas comuns
- Manutenção pouco ativa
Quando usar cada uma
| Caso de uso | Biblioteca recomendada |
|---|---|
| Extração rápida de texto | PDF Oxide |
| Produto comercial / proprietário | PDF Oxide, pypdfium2, pypdf, pdfplumber ou pdfminer |
| Alternativa MIT ao PyMuPDF | PDF Oxide |
| Criar PDF a partir de Markdown/HTML | PDF Oxide |
| Validação de conformidade (PDF/A, PDF/X) | PDF Oxide |
| Extração de tabelas em notas fiscais | pdfplumber |
| Depuração visual da extração | pdfplumber |
| Já investiu em MuPDF | PyMuPDF (se AGPL for compatível) |
| Dependências mínimas | pypdf (Python puro) |
| Análise detalhada de layout | pdfminer |
| OCR de documentos escaneados | PyMuPDF |
Instalação
# PDF Oxide
pip install pdf_oxide
# PyMuPDF
pip install pymupdf
# pypdfium2
pip install pypdfium2
# pypdf
pip install pypdf
# pdfplumber
pip install pdfplumber
# pdfminer
pip install pdfminer.six
O PDF Oxide entrega wheels pré-compilados para Linux (x86_64, aarch64), macOS (x86_64, arm64) e Windows (x86_64). Não exige compilador nem bibliotecas do sistema.
Páginas relacionadas
- Benchmarks de desempenho – resultados completos no corpus
- Primeiros passos com Python – instalação e primeira extração
- Referência da API Python – API Python completa
- vs bibliotecas PDF em Rust – comparação do ecossistema Rust