pdfplumber vs PyMuPDF – Velocidade, Tabelas e Licenciamento
O pdfplumber e o PyMuPDF são bibliotecas PDF populares para Python, mas ambas forçam você a fazer concessões. O pdfplumber é ótimo para tabelas mas 29× mais lento que o necessário. O PyMuPDF é rápido mas bloqueado pelo licenciamento AGPL-3.0 que impede uso comercial. Esta página compara ambos — e mostra por que o PDF Oxide é uma escolha melhor para a maioria dos casos de uso.
A resposta curta: O PDF Oxide é 29× mais rápido que o pdfplumber, 5.8× mais rápido que o PyMuPDF, licenciado sob MIT e lida com texto, imagens, formulários, criptografia, saída Markdown e OCR — tudo em uma única biblioteca. A única área onde o pdfplumber ainda lidera é a extração de tabelas complexas com depuração visual.
Comparação Rápida
| pdfplumber | PyMuPDF | PDF Oxide | |
|---|---|---|---|
| Licença | MIT | AGPL-3.0 | MIT |
| Linguagem | Python puro | C (MuPDF) | Rust + PyO3 |
| Tempo médio de extração | 23.2ms | 4.6ms | 0.8ms |
| Tempo de extração p99 | 189ms | 28ms | 9ms |
| Taxa de aprovação (3.830 PDFs) | 98.8% | 99.3% | 100% |
| Extração de texto | Sim | Sim | Sim |
| Posições de caracteres | Sim | Sim | Sim |
| Extração de tabelas | Avançada | Básica | Básica |
| Extração de imagens | Não | Sim | Sim |
| Depuração visual | Sim | Não | Não |
| Criação de PDF | Não | Sim | Sim |
| Edição de PDF | Não | Sim | Sim |
| Saída Markdown | Não | Não | Sim |
| Saída HTML | Não | Não | Sim |
| Campos de formulário | Somente leitura | Leitura + Escrita | Leitura + Escrita |
| Criptografia | Não | Leitura + Escrita | Leitura + Escrita |
| Renderização | Não | Sim | Sim |
| OCR | Não | Tesseract | Integrado (PaddleOCR) |
| Tamanho da instalação | ~1 MB | ~20 MB | ~5 MB |
| Versões Python | 3.8+ | 3.8–3.12 | 3.8–3.14 |
Benchmarks de Velocidade
As três bibliotecas foram testadas no mesmo corpus de 3.830 PDFs de três suítes de teste públicas independentes (veraPDF, Mozilla pdf.js, DARPA SafeDocs). O corpus cobre todas as versões da especificação PDF (1.0–2.0), arquivos criptografados, documentos malformados, codificações CJK e layouts complexos.
| Métrica | pdfplumber | PyMuPDF | PDF Oxide |
|---|---|---|---|
| Tempo médio de extração | 23.2ms | 4.6ms | 0.8ms |
| Tempo de extração p99 | 189ms | 28ms | 9ms |
| Relativo ao PDF Oxide | 29× mais lento | 5.8× mais lento | 1× |
| Taxa de aprovação (PDFs válidos) | 98.8% (3.777/3.823) | 99.3% (3.796/3.823) | 100% (3.823/3.823) |
O PyMuPDF é aproximadamente 5× mais rápido que o pdfplumber porque delega toda a análise para a biblioteca C MuPDF. O pdfplumber é construído sobre o pdfminer para análise, e depois adiciona sua própria camada de análise espacial — ambos escritos em Python puro. O PDF Oxide lida com toda a análise, decodificação de fontes e montagem de texto em Rust compilado rodando diretamente no processo Python via PyO3, o que explica sua vantagem de 5.8× sobre o PyMuPDF e 29× sobre o pdfplumber.
O Que os Números Significam na Prática
| Carga de trabalho | pdfplumber | PyMuPDF | PDF Oxide |
|---|---|---|---|
| 100 PDFs | 2.3 segundos | 0.46 segundos | 0.08 segundos |
| 1.000 PDFs | 23 segundos | 4.6 segundos | 0.8 segundos |
| 10.000 PDFs | 3.9 minutos | 46 segundos | 8 segundos |
| 100.000 PDFs | 39 minutos | 7.7 minutos | 80 segundos |
Para scripts pontuais processando um punhado de arquivos, a diferença de velocidade é irrelevante. Para pipelines de produção processando milhares de documentos diariamente, a diferença entre 39 minutos e 80 segundos muda decisões de arquitetura.
Extração de Tabelas
A extração de tabelas é a principal razão pela qual desenvolvedores escolhem o pdfplumber em vez do PyMuPDF. É aqui que o pdfplumber genuinamente se destaca.
pdfplumber: Análise Estruturada de Tabelas
O pdfplumber fornece extração dedicada de tabelas com detecção configurável de linhas, mesclagem de células e depuração visual:
import pdfplumber
with pdfplumber.open("invoice.pdf") as pdf:
page = pdf.pages[0]
# Extract all tables as structured data
tables = page.extract_tables()
for table in tables:
for row in table:
print(row)
# Fine-tune detection with custom settings
tables = page.extract_tables({
"vertical_strategy": "text",
"horizontal_strategy": "lines",
"snap_tolerance": 5,
})
# Visual debugging: render page with detected table boundaries
im = page.to_image()
im.debug_tablefinder()
im.save("debug.png")
O pdfplumber retorna dados estruturados de linhas/colunas e lida com células mescladas, cabeçalhos que abrangem várias colunas e tabelas sem bordas. A sobreposição de depuração visual é inestimável para ajustar parâmetros de extração em layouts difíceis.
PyMuPDF: Detecção Básica de Tabelas
O PyMuPDF adicionou detecção de tabelas em versões recentes, mas é menos madura que os algoritmos do pdfplumber:
import fitz
doc = fitz.open("invoice.pdf")
page = doc[0]
# PyMuPDF's built-in table finder (added in v1.23)
tabs = page.find_tables()
for table in tabs:
df = table.to_pandas() # requires pandas
print(df)
A extração de tabelas do PyMuPDF funciona para tabelas simples baseadas em grade com bordas visíveis. Tem dificuldade com layouts sem bordas, cabeçalhos multinível e células que abrangem múltiplas linhas ou colunas — exatamente os casos onde o pdfplumber é mais forte.
PDF Oxide: Saída em Tabelas Markdown
O PDF Oxide converte tabelas para sintaxe Markdown como parte de seu pipeline de saída estruturada:
from pdf_oxide import PdfDocument
doc = PdfDocument("invoice.pdf")
# Tables are detected and converted to Markdown table format
md = doc.to_markdown(0, detect_headings=True)
print(md)
# Also available as HTML with table tags
html = doc.to_html(0)
print(html)
A detecção de tabelas do PDF Oxide é funcional para layouts de grade padrão e produz saída limpa em Markdown ou HTML. Para tabelas complexas com células mescladas, designs sem bordas ou cabeçalhos que abrangem várias colunas, os algoritmos dedicados do pdfplumber permanecem mais robustos.
Resumo da Extração de Tabelas
| Capacidade | pdfplumber | PyMuPDF | PDF Oxide |
|---|---|---|---|
| Tabelas com bordas simples | Sim | Sim | Sim |
| Tabelas sem bordas | Sim | Limitado | Limitado |
| Células mescladas | Sim | Limitado | Limitado |
| Cabeçalhos multinível | Sim | Não | Não |
| Detecção configurável | Sim | Limitado | Não |
| Depuração visual | Sim | Não | Não |
| Formato de saída | Listas Python | DataFrames pandas | Markdown / HTML |
| Velocidade | Lenta (Python puro) | Rápida | Mais rápida |
Se extração de tabelas complexas é seu único caso de uso, o pdfplumber é a melhor ferramenta. Se você precisa de tabelas junto com extração rápida de texto, extração de imagens ou criação de PDF, o PDF Oxide cobre mais terreno.
Extração de Texto
Para extração de texto simples, ambas as bibliotecas dão conta do recado mas diferem em velocidade e design de API.
pdfplumber
import pdfplumber
with pdfplumber.open("report.pdf") as pdf:
page = pdf.pages[0]
text = page.extract_text()
print(text)
PyMuPDF
import fitz
doc = fitz.open("report.pdf")
page = doc[0]
text = page.get_text()
print(text)
PDF Oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
print(text)
As três produzem saída de texto comparável para PDFs bem formados. O PDF Oxide alcança 99.5% de paridade de texto com o PyMuPDF no corpus completo, com os 0.5% de diferença restantes na normalização de espaços em branco e tratamento de ligaturas.
Posicionamento em Nível de Caractere
Tanto o pdfplumber quanto o PyMuPDF fornecem dados de posição em nível de caractere, o que é importante para análise espacial, detecção de bounding box e reconstrução personalizada de layout.
pdfplumber
import pdfplumber
with pdfplumber.open("report.pdf") as pdf:
page = pdf.pages[0]
for char in page.chars[:10]:
print(f"'{char['text']}' at ({char['x0']:.1f}, {char['top']:.1f}) "
f"size={char['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}")
PDF Oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
chars = doc.extract_chars(0)
for ch in chars[:10]:
print(f"'{ch.char}' at ({ch.x:.1f}, {ch.y:.1f}) size={ch.font_size:.1f}")
O pdfplumber retorna dicionários por caractere com metadados ricos. O PyMuPDF retorna estruturas aninhadas de bloco/linha/span. O PDF Oxide retorna objetos de caractere planos com dados de posição e fonte.
Licenciamento
Esta é a diferença mais consequente entre pdfplumber e PyMuPDF para projetos comerciais.
| pdfplumber | PyMuPDF | PDF Oxide | |
|---|---|---|---|
| Licença | MIT | AGPL-3.0 | MIT |
| Produto comercial | Sim | Requer licença comercial | Sim |
| SaaS de código fechado | Sim | Requer licença comercial | Sim |
| Distribuição Docker | Sim | Requer licença comercial | Sim |
| Ferramentas internas | Sim | Sim | Sim |
| Projeto open source | Sim | Sim (se compatível com AGPL) | Sim |
O Problema da AGPL do PyMuPDF
O PyMuPDF encapsula o MuPDF, que é licenciado sob AGPL-3.0. Se você distribui software que inclui PyMuPDF — incluindo SaaS, aplicações web e contêineres Docker — seu código deve ser aberto sob AGPL ou você deve comprar uma licença comercial da Artifex.
A Artifex não publica os preços da licença comercial publicamente. Você deve contatar a equipe de vendas para uma cotação. As licenças são tipicamente por aplicação, renovadas anualmente, sem nível gratuito ou exceção para startups.
pdfplumber e PDF Oxide São Ambos MIT
Tanto o pdfplumber quanto o PDF Oxide são licenciados sob MIT. Use qualquer um em qualquer projeto — comercial, proprietário, SaaS ou código aberto — sem obrigações. Se o licenciamento é sua principal preocupação e você está escolhendo entre pdfplumber e PyMuPDF, o pdfplumber (ou PDF Oxide) é a escolha mais segura.
PDFs Criptografados
O tratamento de criptografia é uma lacuna significativa no conjunto de funcionalidades do pdfplumber e um ponto de dor comum para desenvolvedores que trabalham com documentos protegidos por senha.
pdfplumber: Sem Suporte a Criptografia
O pdfplumber não pode abrir PDFs criptografados ou protegidos por senha. Se você passar um PDF criptografado para o pdfplumber, ele gera um erro. Você deve descriptografar o arquivo primeiro usando outra ferramenta:
import pdfplumber
# This will fail on encrypted PDFs:
with pdfplumber.open("encrypted.pdf") as pdf:
# raises pdfminer.pdfparser.PDFSyntaxError or similar
pass
Uma solução comum é usar PyMuPDF ou pypdf para descriptografar o arquivo primeiro, e depois passá-lo para o pdfplumber para extração de tabelas — adicionando outra dependência ao seu pipeline.
PyMuPDF: Suporte Completo a Criptografia
import fitz
doc = fitz.open("encrypted.pdf")
doc.authenticate("password")
page = doc[0]
text = page.get_text()
O PyMuPDF suporta senhas de usuário e proprietário, criptografia AES-128 e AES-256, e pode criar PDFs criptografados.
PDF Oxide: Suporte Completo a Criptografia
from pdf_oxide import PdfDocument
doc = PdfDocument("encrypted.pdf", password="password")
text = doc.extract_text(0)
O PDF Oxide lida com todos os métodos padrão de criptografia de PDF (RC4, AES-128, AES-256) tanto para leitura quanto para escrita. Sem dependências adicionais ou pré-processamento necessário.
Extração de Imagens
Outra lacuna no conjunto de funcionalidades do pdfplumber. O pdfplumber não extrai imagens incorporadas de PDFs.
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"])
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"])
Se seu pipeline requer extrair tanto texto quanto imagens de PDFs, o pdfplumber não pode lidar com o lado das imagens. Você precisa do PyMuPDF, PDF Oxide ou pypdfium2 para isso.
Saída Markdown e HTML
Nem o pdfplumber nem o PyMuPDF fornecem conversão integrada para Markdown ou HTML. Esta é uma funcionalidade exclusiva do PDF Oxide.
from pdf_oxide import PdfDocument
doc = PdfDocument("paper.pdf")
# Markdown with heading detection and table formatting
md = doc.to_markdown(0, detect_headings=True)
print(md)
# HTML with semantic tags
html = doc.to_html(0)
print(html)
Para pipelines de LLM, sistemas RAG e fluxos de trabalho de conversão de documentos, a saída Markdown estruturada elimina a necessidade de uma etapa separada de conversão. Usuários do PyMuPDF tipicamente dependem do pacote separado pymupdf4llm, que é 69× mais lento que a conversão integrada do PDF Oxide.
Quando Escolher Cada Biblioteca
Escolha pdfplumber se:
- Extração de tabelas complexas é seu caso de uso principal. Os algoritmos de tabela do pdfplumber lidam com células mescladas, tabelas sem bordas e cabeçalhos que abrangem várias colunas melhor que qualquer outra biblioteca PDF para Python.
- Você precisa de depuração visual. O pdfplumber pode renderizar imagens de página anotadas mostrando linhas detectadas, caracteres e limites de tabelas — inestimável para ajustar a extração em documentos difíceis.
- Você quer uma solução em Python puro. Sem dependências compiladas, instala em qualquer lugar que Python rode.
- Velocidade não é uma preocupação. Se você processa menos de cem arquivos por vez, a média de 23ms é perfeitamente aceitável.
Escolha PyMuPDF se:
- Você já tem uma licença comercial do MuPDF e depende da renderização ou exportação SVG específica do MuPDF.
- Você precisa de renderização de alta fidelidade. O motor de renderização do MuPDF é maduro e lida bem com PDFs complexos.
- Seu projeto é compatível com AGPL. Se você está construindo software de código aberto sob AGPL ou uma licença compatível, o licenciamento do PyMuPDF não é uma preocupação.
- Você precisa de OCR via Tesseract. O PyMuPDF tem integração embutida com Tesseract para documentos digitalizados.
Escolha PDF Oxide se:
- Você precisa de velocidade e ampla cobertura de funcionalidades. 0.8ms de extração média — 5.8× mais rápido que PyMuPDF, 29× mais rápido que pdfplumber — com texto, imagens, formulários, criação e criptografia em uma única biblioteca.
- Você quer licenciamento MIT sem sacrificar velocidade. O pdfplumber é MIT mas lento. O PyMuPDF é rápido mas AGPL. O PDF Oxide é ambos MIT e rápido.
- Você precisa de saída Markdown ou HTML. Conversão estruturada integrada para pipelines de LLM e sistemas RAG.
- Você precisa de suporte a PDFs criptografados com licença permissiva. O pdfplumber não pode lidar com criptografia. O PyMuPDF pode mas requer conformidade AGPL. O PDF Oxide lida com criptografia sob MIT.
- Você quer uma única biblioteca para extração, criação e edição. Tanto o pdfplumber quanto o PyMuPDF requerem ferramentas adicionais para partes do fluxo de trabalho PDF. O PDF Oxide cobre extração, criação, edição, renderização e validação.
Use PDF Oxide + pdfplumber juntos:
Para pipelines que precisam de extração rápida de texto, extração de imagens e análise complexa de tabelas, use PDF Oxide para o pipeline geral e pdfplumber para tabelas:
from pdf_oxide import PdfDocument
import pdfplumber
# Fast text and image extraction with PDF Oxide
doc = PdfDocument("report.pdf")
text = doc.extract_text(0)
images = doc.extract_image_bytes(0)
# Complex table extraction with pdfplumber
with pdfplumber.open("report.pdf") as pdf:
tables = pdf.pages[0].extract_tables()
Instalação
# pdfplumber
pip install pdfplumber
# PyMuPDF
pip install pymupdf
# PDF Oxide
pip install pdf_oxide
As três instalam via pip. O pdfplumber e o PDF Oxide são licenciados sob MIT. O PyMuPDF é AGPL-3.0 — revise as implicações de licenciamento antes de adicioná-lo a um projeto comercial.
O Veredito
O pdfplumber e o PyMuPDF ambos resolvem partes do problema. O PDF Oxide resolve o todo.
| O que importa para você | Melhor escolha |
|---|---|
| Velocidade máxima | PDF Oxide (0.8ms — 29× mais rápido que pdfplumber) |
| Extração de tabelas complexas | pdfplumber (depuração visual, células mescladas) |
| Licença permissiva + velocidade | PDF Oxide — pdfplumber é MIT mas lento, PyMuPDF é rápido mas AGPL |
| PDFs criptografados | PDF Oxide ou PyMuPDF — pdfplumber não pode descriptografar |
| Extração de imagens | PDF Oxide ou PyMuPDF — pdfplumber não tem suporte a imagens |
| Saída Markdown/HTML | PDF Oxide — única biblioteca com conversão integrada |
| OCR sem Tesseract | PDF Oxide — PaddleOCR integrado |
| Uma biblioteca para tudo | PDF Oxide — extração, criação, edição, criptografia, OCR |
A menos que todo seu fluxo de trabalho seja extração de tabelas complexas (tabelas sem bordas, células mescladas, depuração visual), o PDF Oxide substitui tanto o pdfplumber quanto o PyMuPDF — mais rápido, mais funcionalidades, licenciado sob MIT.
Comece em 10 segundos:
pip install pdf_oxide
from pdf_oxide import PdfDocument
doc = PdfDocument("report.pdf")
text = doc.extract_text(0) # 29× faster than pdfplumber
md = doc.to_markdown(0) # built-in, no separate package
images = doc.extract_image_bytes(0) # pdfplumber can't do this
Páginas Relacionadas
- PDF Oxide vs PyMuPDF – comparação detalhada com guia de migração
- PDF Oxide vs pdfplumber – comparação detalhada com exemplos de código
- vs Bibliotecas PDF para Python – todas as bibliotecas Python comparadas
- Benchmarks de Desempenho – metodologia completa de benchmark do corpus
- Extrair Tabelas de PDF – guia de extração de tabelas
- Primeiros Passos com Python – instalação e primeira extração