Skip to content

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