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
- Início Rápido com Rust — o núcleo nativo sobre o qual o PDF Oxide é construído
- Início Rápido com Python — usando o PDF Oxide a partir do Python
- Extração de Texto — opções e receitas detalhadas de extração
- Criação de PDF — criação avançada com metadados e estilização