Skip to content

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
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