Skip to content

Primeiros passos com o PDF Oxide (Julia)

O PDF Oxide é a biblioteca de PDF mais rápida para Julia — extração de texto com média de 0,8ms e 100% de aprovação em 3.830 PDFs. O pacote PdfOxide.jl envolve o núcleo em Rust diretamente sobre a C ABI, então você tem velocidade nativa com uma API idiomática de Julia. Os índices de página começam em 0.

Instalação

Adicione o pacote a partir do gerenciador de pacotes do REPL de Julia:

using Pkg
Pkg.add("PdfOxide")

A biblioteca nativa (libpdf_oxide) é carregada em tempo de execução. Se ela não estiver no caminho do carregador do sistema, indique sua localização para o PdfOxide.jl por meio de uma das variáveis de ambiente que ele verifica, nesta ordem: PDF_OXIDE_LIB_PATH (caminho completo para o arquivo), PDF_OXIDE_LIB_DIR (diretório) e, por fim, o diretório de build local target/release.

export PDF_OXIDE_LIB_DIR=/path/to/pdf_oxide/target/release

Início rápido

Abra um PDF e extraia o texto da primeira página. extract_text recebe um índice de página começando em 0.

using PdfOxide

doc = open_document("report.pdf")

println("pages:   ", page_count(doc))
v = version(doc)
println("version: ", v.major, ".", v.minor)

# Texto puro da primeira página (índice começando em 0)
println(extract_text(doc, 0))

Você também pode construir um documento na memória e abri-lo a partir dos bytes — útil para testes e pipelines que nunca tocam o disco:

using PdfOxide

pdf = from_markdown("# Hello pdf_oxide\n\nThis is the **Julia** binding.\n")
doc = open_from_bytes(to_bytes(pdf))

println("pages: ", page_count(doc))
println(extract_text(doc, 0))

Inspeção do documento

Algumas chamadas baratas mostram com o que você está lidando antes de extrair:

using PdfOxide

doc = open_document("report.pdf")

@show page_count(doc)        # número de páginas
@show version(doc).major     # versão da especificação PDF
@show is_encrypted(doc)      # true se o arquivo estiver protegido por senha

Conversão para Markdown e HTML

Converta uma única página ou o documento inteiro de uma só vez. O Markdown preserva títulos, listas e ênfase; as variantes _all concatenam todas as páginas.

using PdfOxide

doc = open_document("paper.pdf")

# Uma página (índice começando em 0)
md = to_markdown(doc, 0)
println(md)

# Documento inteiro
println(to_markdown_all(doc))

# HTML de uma única página
html = to_html(doc, 0)
println(html)

# Texto puro, sem nenhuma marcação
println(to_plain_text(doc, 0))

Extração no nível de palavra

extract_words retorna um vetor de valores Word, cada um trazendo seu texto, caixa delimitadora (bounding box), tamanho da fonte e um indicador de negrito. A caixa delimitadora é um Bbox com os campos width, height e de posição.

using PdfOxide

doc = open_document("paper.pdf")
words = extract_words(doc, 0)

for w in first(words, 10)
    println(rpad(w.text, 20),
            " size=", w.font_size,
            " bold=", w.bold,
            " width=", round(w.bbox.width; digits = 1))
end

Para um layout orientado a linhas, extract_text_lines retorna valores TextLine, cada um com seu texto, um word_count e um bbox:

using PdfOxide

doc = open_document("paper.pdf")
lines = extract_text_lines(doc, 0)

for line in lines
    println(line.word_count, " words: ", line.text)
end

Pesquisa

Pesquise em uma única página ou no documento inteiro. O terceiro argumento é o indicador de diferenciação entre maiúsculas e minúsculas (false para ignorar maiúsculas/minúsculas). Cada ocorrência informa seu text, a page em que foi encontrada e um bbox.

using PdfOxide

doc = open_document("manual.pdf")

# Pesquisa em uma página (sem diferenciar maiúsculas/minúsculas)
hits = search(doc, 0, "configuration", false)
for h in hits
    println("page ", h.page, ": ", h.text)
end

# Pesquisa em todas as páginas
all_hits = search_all(doc, "configuration", false)
println(length(all_hits), " total matches")
for h in all_hits
    println("page ", h.page, " at (",
            round(h.bbox.x; digits = 0), ", ",
            round(h.bbox.y; digits = 0), ")")
end

Criando um PDF

As funções fábrica from_* constroem um Pdf a partir de Markdown, HTML ou texto puro. Chame to_bytes para obter os bytes brutos ou save para gravar diretamente em um arquivo.

using PdfOxide

# A partir de Markdown
pdf = from_markdown("# Invoice\n\nAmount due: **\$42**\n")
save(pdf, "invoice.pdf")

# A partir de HTML
html_pdf = from_html("<h1>Report</h1><p>Quarterly results.</p>")
save(html_pdf, "report.pdf")

# A partir de texto puro — pegue os bytes em vez de gravar um arquivo
text_pdf = from_text("Plain text body.")
bytes = to_bytes(text_pdf)
println("generated ", length(bytes), " bytes")

Tratamento de erros

Operações que falham lançam um PdfOxideError. Envolva chamadas que tocam entradas não confiáveis em um try/catch:

using PdfOxide

try
    doc = open_document("missing.pdf")
    println(extract_text(doc, 0))
catch e
    e isa PdfOxideError || rethrow()
    println("PDF error: ", e)
end

Próximos passos