pdfplumber vs PyMuPDF — velocidade, tabelas e licenciamento
pdfplumber e PyMuPDF são bibliotecas Python populares para PDF, mas ambas forçam você a aceitar concessões. O pdfplumber é ótimo para tabelas, porém 29× mais lento do que o necessário. O PyMuPDF é rápido, mas está preso ao licenciamento AGPL-3.0, que bloqueia o uso comercial. Esta página compara as duas — e mostra por que o PDF Oxide é a melhor escolha 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, tem licença MIT e lida com texto, imagens, formulários, criptografia, saída em Markdown e OCR — tudo em uma única biblioteca. A única área em que 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 sucesso (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 em Markdown | Não | Não | Sim |
| Saída em 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 do Python | 3.8+ | 3.8–3.12 | 3.8–3.14 |
Benchmarks de velocidade
As três bibliotecas foram avaliadas no mesmo corpus de 3.830 PDFs, reunido a partir de três suítes de teste públicas e 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 |
| Em relação ao PDF Oxide | 29x mais lento | 5,8x mais lento | 1x |
| Taxa de sucesso (PDFs válidos) | 98,8% (3.777/3.823) | 99,3% (3.796/3.823) | 100% (3.823/3.823) |
O PyMuPDF é cerca de 5x mais rápido que o pdfplumber porque delega toda a análise à biblioteca C MuPDF. O pdfplumber se apoia no pdfminer para a análise e depois adiciona sua própria camada de análise espacial — ambos escritos em Python puro. O PDF Oxide faz toda a análise, decodificação de fontes e montagem de texto em Rust compilado, executado diretamente no processo Python via PyO3, o que explica sua vantagem de 5,8x sobre o PyMuPDF e de 29x 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 que processam alguns arquivos, a diferença de velocidade é irrelevante. Para pipelines de produção que processam milhares de documentos por dia, a distância entre 39 minutos e 80 segundos muda as decisões de arquitetura.
Extração de tabelas
A extração de tabelas é o principal motivo pelo qual os desenvolvedores escolhem o pdfplumber em vez do PyMuPDF. É aqui que o pdfplumber realmente se destaca.
pdfplumber: análise estruturada de tabelas
O pdfplumber oferece extração de tabelas dedicada, com detecção de linhas configurável, 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 se estendem por 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 complicados.
PyMuPDF: detecção básica de tabelas
O PyMuPDF adicionou detecção de tabelas em versões recentes, mas ela é 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 em grade com bordas visíveis. Ela tem dificuldade com layouts sem bordas, cabeçalhos de vários níveis e células que se estendem por várias linhas ou colunas — exatamente os casos em que o pdfplumber é mais forte.
PDF Oxide: saída de tabelas em Markdown
O PDF Oxide converte tabelas em 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 em grade padrão e produz uma saída limpa em Markdown ou HTML. Para tabelas complexas com células mescladas, designs sem bordas ou cabeçalhos que se estendem, os algoritmos dedicados do pdfplumber continuam mais robustos.
Resumo da extração de tabelas
| Capacidade | pdfplumber | PyMuPDF | PDF Oxide |
|---|---|---|---|
| Tabelas simples com bordas | Sim | Sim | Sim |
| Tabelas sem bordas | Sim | Limitado | Limitado |
| Células mescladas | Sim | Limitado | Limitado |
| Cabeçalhos de vários níveis | 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 | Lento (Python puro) | Rápido | Mais rápido |
Se a 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 atinge 99,5% de paridade de texto com o PyMuPDF em todo o corpus, com a diferença restante de 0,5% concentrada na normalização de espaços em branco e no tratamento de ligaduras.
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 caixas delimitadoras 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
Para projetos comerciais, essa é a diferença mais consequente entre o pdfplumber e o PyMuPDF.
| 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 via Docker | Sim | Requer licença comercial | Sim |
| Ferramentas internas | Sim | Sim | Sim |
| Projeto de código aberto | Sim | Sim (se compatível com AGPL) | Sim |
O problema da AGPL no PyMuPDF
O PyMuPDF encapsula o MuPDF, que tem licença AGPL-3.0. Se você distribuir software que inclua o PyMuPDF — incluindo SaaS, aplicações web e contêineres Docker — seu código precisa ser aberto sob AGPL ou você precisa comprar uma licença comercial da Artifex.
A Artifex não divulga publicamente os preços da licença comercial. Você precisa entrar em contato com a equipe de vendas para obter um orçamento. As licenças geralmente são por aplicação, renovadas anualmente, sem camada gratuita nem exceção para startups.
pdfplumber e PDF Oxide são ambos MIT
Tanto o pdfplumber quanto o PDF Oxide têm licença MIT. Use qualquer um deles em qualquer projeto — comercial, proprietário, SaaS ou de código aberto — sem obrigações. Se o licenciamento é sua principal preocupação e você está escolhendo entre o pdfplumber e o PyMuPDF, o pdfplumber (ou o PDF Oxide) é a escolha mais segura.
PDFs criptografados
O tratamento de criptografia é uma lacuna significativa no conjunto de recursos do pdfplumber e uma dor de cabeça comum para desenvolvedores que trabalham com documentos protegidos por senha.
pdfplumber: sem suporte a criptografia
O pdfplumber não consegue abrir PDFs criptografados ou protegidos por senha de forma alguma. Se você passar um PDF criptografado para o pdfplumber, ele gera um erro. É preciso 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 o PyMuPDF ou o pypdf para descriptografar o arquivo primeiro e depois passá-lo ao pdfplumber para a extração de tabelas — adicionando mais uma 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 tanto senhas de usuário quanto de 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. Não exige dependências adicionais nem pré-processamento.
Extração de imagens
Outra lacuna no conjunto de recursos 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 o seu pipeline precisa extrair tanto texto quanto imagens de PDFs, o pdfplumber não dá conta da parte das imagens. Você precisa do PyMuPDF, do PDF Oxide ou do pypdfium2 para isso.
Saída em Markdown e HTML
Nem o pdfplumber nem o PyMuPDF oferecem conversão integrada para Markdown ou HTML. Esse é um recurso exclusivo 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 conversão de documentos, a saída estruturada em Markdown elimina a necessidade de uma etapa de conversão separada. Os usuários do PyMuPDF normalmente recorrem ao pacote separado pymupdf4llm, que é 69x mais lento que a conversão integrada do PDF Oxide.
Quando escolher cada biblioteca
Escolha o pdfplumber se:
- A extração de tabelas complexas é seu principal caso de uso. Os algoritmos de tabela do pdfplumber lidam com células mescladas, tabelas sem bordas e cabeçalhos que se estendem melhor do que qualquer outra biblioteca Python.
- Você precisa de depuração visual. O pdfplumber consegue renderizar imagens de página anotadas, mostrando linhas, caracteres e limites de tabelas detectados — inestimável para ajustar a extração em documentos complicados.
- Você quer uma solução em Python puro. Sem dependências compiladas, instala em qualquer lugar onde o Python rode.
- Velocidade não é uma preocupação. Se você processa menos de uma centena de arquivos por vez, a média de 23ms é perfeitamente aceitável.
Escolha o PyMuPDF se:
- Você já tem uma licença comercial do MuPDF e depende da renderização específica do MuPDF ou da exportação para SVG.
- 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 é um problema.
- Você precisa de OCR via Tesseract. O PyMuPDF tem integração com o Tesseract embutida para documentos digitalizados.
Escolha o PDF Oxide se:
- Você precisa de velocidade e ampla cobertura de recursos. Média de 0,8ms de extração — 5,8x mais rápido que o PyMuPDF, 29x mais rápido que o pdfplumber — com texto, imagens, formulários, criação e criptografia em uma única biblioteca.
- Você quer licença MIT sem sacrificar velocidade. O pdfplumber é MIT, mas lento. O PyMuPDF é rápido, mas AGPL. O PDF Oxide é MIT e rápido.
- Você precisa de saída em Markdown ou HTML. Conversão estruturada integrada para pipelines de LLM e sistemas RAG.
- Você precisa de suporte a PDF criptografado com uma licença permissiva. O pdfplumber não lida com criptografia. O PyMuPDF lida, mas exige conformidade com a 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 exigem ferramentas adicionais para partes do fluxo de PDF. O PDF Oxide cobre extração, criação, edição, renderização e validação.
Use o PDF Oxide + pdfplumber juntos:
Para pipelines que precisam de extração rápida de texto, extração de imagens e análise de tabelas complexas, use o PDF Oxide para o pipeline geral e o pdfplumber para as 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_images(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 são instaladas via pip. O pdfplumber e o PDF Oxide têm licença 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 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 o pdfplumber) |
| Extração de tabelas complexas | pdfplumber (depuração visual, células mescladas) |
| Licença permissiva + velocidade | PDF Oxide — o pdfplumber é MIT mas lento, o PyMuPDF é rápido mas AGPL |
| PDFs criptografados | PDF Oxide ou PyMuPDF — o pdfplumber não descriptografa |
| Extração de imagens | PDF Oxide ou PyMuPDF — o pdfplumber não tem suporte a imagens |
| Saída em 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 o 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, com mais recursos, licença 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_images(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 do Python — todas as bibliotecas Python comparadas
- Benchmarks de desempenho — metodologia completa de benchmark no corpus
- Extrair tabelas de PDF — guia de extração de tabelas
- Primeiros passos com Python — instalação e primeira extração