vs Bibliotecas PDF para Python
PDF Oxide comparado com PyMuPDF (fitz), pypdfium2, pypdf, pdfplumber, pdfminer e outras. Esta página aborda desempenho, cobertura de recursos, licenciamento e diferenças de API para ajudar você a escolher a biblioteca PDF para Python certa para extração de 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 aprovação (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) | Pure Python | Pure Python | Pure Python |
| 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 | Somente leitura | Leitura + escrita | Somente 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 | Somente 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 | wheel de ~5 MB | wheel de ~20 MB | wheel de ~3 MB | ~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 disponíveis publicamente que, juntos, cobrem todas as versões da especificação PDF (1.0–2.0), arquivos criptografados, documentos malformados, codificações CJK, layouts complexos e casos-limite de segurança. Veja os detalhes completos do corpus para saber o que cada conjunto testa e por que esses resultados são reproduzíveis.
| Biblioteca | Média | Relativo | p99 | Taxa de aprovação |
|---|---|---|---|---|
| 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 atinge sua velocidade graças a um núcleo nativo em Rust compilado em um módulo de extensão do Python via PyO3. Não há sobrecarga de subprocesso nem ponte com bibliotecas C — o código Rust roda diretamente no processo do Python.
Confiabilidade
O PDF Oxide processa 3.823 de 3.823 PDFs válidos sem falhas — uma taxa de aprovação de 100%. Os 7 arquivos que não passaram no corpus de 3.830 arquivos são fixtures de teste intencionalmente quebrados (cabeçalho PDF ausente, catálogos corrompidos por fuzzing, fluxos xref inválidos).
| Biblioteca | PDFs válidos aprovados | Taxa de aprovação |
|---|---|---|
| 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 de texto em relação ao PyMuPDF e ao pypdfium2 em todo o corpus. A qualidade foi medida comparando a saída de texto extraído caractere por caractere. A diferença restante de 0,5% está na normalização de espaços em branco e no tratamento de ligaduras, onde o PDF Oxide produz 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 a licença AGPL-3.0. Se você distribuir software que usa o PyMuPDF, seu software também precisa ser lançado sob a AGPL-3.0 — ou você precisa comprar uma licença comercial da Artifex. Isso se aplica a produtos SaaS, aplicações web e quaisquer binários distribuídos.
O PDF Oxide é licenciado sob MIT, sem restrições. Use-o em produtos proprietários, plataformas SaaS ou aplicações de código fechado sem nenhuma obrigação 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 API
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 em 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")
# Also supports 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:
# pypdf can merge/modify PDFs but cannot create from scratch with text content.
# Use reportlab or fpdf2 for creation, then merge with 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")
# Convert to Markdown with heading detection
md = doc.to_markdown(0, detect_headings=True)
print(md)
# Convert to HTML
html = doc.to_html(0)
print(html)
Nenhuma outra biblioteca PDF para Python oferece conversão integrada para Markdown ou HTML.
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ápido que o PyMuPDF
- Taxa de aprovação de 100% no corpus de 3.830 PDFs — a maior confiabilidade entre todas as bibliotecas testadas
- API unificada para extração, criação e edição em uma única biblioteca
- Exportação integrada para Markdown e HTML com detecção de títulos
- Licença MIT, sem restrições de copyleft
- Validação nativa de conformidade (PDF/A, PDF/UA, PDF/X)
- Wheels pré-compilados para todas as principais plataformas e Python 3.8–3.14
- Sem dependências de sistema — o wheel já inclui tudo
Limitações:
- Biblioteca mais recente, com comunidade menor
- A extração de tabelas é básica em comparação com os algoritmos do pdfplumber
- O mecanismo de renderização é menos maduro que o MuPDF
PyMuPDF (fitz)
Pontos fortes:
- Madura e testada em produção (baseada no MuPDF, em desenvolvimento desde 2005)
- Excelente qualidade de renderização para PDFs complexos
- Integração de OCR embutida (Tesseract)
- Conjunto rico de recursos: exportação para 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
- Tamanho grande do wheel (~20 MB) por causa do MuPDF empacotado
- Sem exportação integrada para Markdown
- Sem validação de conformidade
pypdfium2
Pontos fortes:
- Rápida (baseada no mecanismo 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 em comparação com PDF Oxide ou PyMuPDF
- Sem criação ou edição de PDF
- Suporte a campos de formulário apenas para leitura
pypdf
Pontos fortes:
- Pure Python — 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 extensa
Limitações:
- 15× mais lenta que o PDF Oxide na extração de texto
- A qualidade de extração de texto sofre com layouts complexos
- Sem renderização, sem exportação para Markdown/HTML, sem extração de tabelas
pdfplumber
Pontos fortes:
- A melhor extração de tabelas entre todas as bibliotecas PDF para Python
- Excelentes dados de posicionamento em nível de caractere
- Ferramentas de depuração visual (imagens de página anotadas)
- Licença MIT
Limitações:
- Pure Python — 29× mais lenta que o PDF Oxide
- Somente leitura — sem criação ou edição de PDF
- Sem criptografia ou renderização
pdfminer
Pontos fortes:
- Análise detalhada de caracteres e layout
- Bom suporte a texto CJK
- Base para o pdfplumber e outras ferramentas
- Licença MIT
Limitações:
- 21× mais lenta que o PDF Oxide (Pure Python, sem otimizações)
- Somente leitura, sem criação ou edição
- API verbosa para tarefas comuns
- Manutenção menos ativa
Quando usar cada uma
| Caso de uso | Biblioteca recomendada |
|---|---|
| Extração de texto rápida | PDF Oxide |
| Produto comercial / proprietário | PDF Oxide, pypdfium2, pypdf, pdfplumber ou pdfminer |
| Alternativa ao PyMuPDF (licença MIT) | PDF Oxide |
| Criação de PDF a partir de Markdown/HTML | PDF Oxide |
| Validação de conformidade (PDF/A, PDF/X) | PDF Oxide |
| Extração de tabelas de notas fiscais | pdfplumber |
| Depuração visual da extração | pdfplumber |
| Investimento existente em MuPDF | PyMuPDF (se compatível com AGPL) |
| Dependências mínimas | pypdf (Pure Python) |
| Análise detalhada de layout | pdfminer |
| OCR para documentos digitalizados | 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 distribui wheels pré-compilados para Linux (x86_64, aarch64), macOS (x86_64, arm64) e Windows (x86_64). Nenhum compilador ou biblioteca de sistema é necessário.
Páginas relacionadas
- Benchmarks de desempenho – resultados de benchmark do corpus completo
- Primeiros passos com Python – instalação e primeira extração
- Referência da API Python – API Python completa
- vs Bibliotecas PDF para Rust – comparação do ecossistema Rust