Primeros pasos con PDF Oxide (Julia)
PDF Oxide es la librería PDF más rápida para Julia: 0,8 ms de media en extracción de texto y 100 % de aciertos sobre 3.830 PDF. El paquete PdfOxide.jl envuelve el núcleo en Rust directamente sobre la C ABI, de modo que obtienes velocidad nativa con una API idiomática de Julia. Los índices de página empiezan en 0.
Instalación
Añade el paquete desde el gestor de paquetes del REPL de Julia:
using Pkg
Pkg.add("PdfOxide")
La librería nativa (libpdf_oxide) se carga en tiempo de ejecución. Si no está en la ruta del cargador del sistema, indícale a PdfOxide.jl dónde encontrarla con una de las variables de entorno que comprueba, en este orden: PDF_OXIDE_LIB_PATH (ruta completa al archivo), PDF_OXIDE_LIB_DIR (directorio) y, por último, el directorio local de compilación target/release.
export PDF_OXIDE_LIB_DIR=/path/to/pdf_oxide/target/release
Guía rápida
Abre un PDF y extrae el texto de la primera página. extract_text recibe un índice de página basado en 0.
using PdfOxide
doc = open_document("report.pdf")
println("pages: ", page_count(doc))
v = version(doc)
println("version: ", v.major, ".", v.minor)
# Texto plano de la primera página (índice basado en 0)
println(extract_text(doc, 0))
También puedes construir un documento en memoria y abrirlo desde sus bytes, algo muy práctico para pruebas y pipelines que nunca tocan el 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))
Inspección del documento
Unas pocas llamadas baratas te indican con qué estás trabajando antes de extraer nada:
using PdfOxide
doc = open_document("report.pdf")
@show page_count(doc) # número de páginas
@show version(doc).major # versión de la especificación PDF
@show is_encrypted(doc) # true si el archivo está protegido con contraseña
Conversión a Markdown y HTML
Convierte una sola página o el documento completo de una vez. Markdown conserva los encabezados, las listas y el énfasis; las variantes _all concatenan todas las páginas.
using PdfOxide
doc = open_document("paper.pdf")
# Una página (basada en 0)
md = to_markdown(doc, 0)
println(md)
# Documento completo
println(to_markdown_all(doc))
# HTML de una sola página
html = to_html(doc, 0)
println(html)
# Texto plano sin ningún tipo de marcado
println(to_plain_text(doc, 0))
Extracción por palabras
extract_words devuelve un vector de valores Word, cada uno con su texto, su cuadro delimitador, el tamaño de fuente y una bandera de negrita. El cuadro delimitador es un Bbox con campos width, height y de posición.
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 una disposición orientada a líneas, extract_text_lines devuelve valores TextLine, cada uno con su texto, un word_count y un 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
Búsqueda
Busca en una sola página o en todo el documento. El tercer argumento es la bandera de distinción entre mayúsculas y minúsculas (false para no distinguirlas). Cada coincidencia informa de su text, de la page en la que se encontró y de un bbox.
using PdfOxide
doc = open_document("manual.pdf")
# Buscar en una página (sin distinguir mayúsculas y minúsculas)
hits = search(doc, 0, "configuration", false)
for h in hits
println("page ", h.page, ": ", h.text)
end
# Buscar en todas las 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
Crear un PDF
Las funciones de fábrica from_* construyen un Pdf a partir de Markdown, HTML o texto plano. Llama a to_bytes para obtener los bytes en bruto, o a save para escribir directamente en un archivo.
using PdfOxide
# Desde Markdown
pdf = from_markdown("# Invoice\n\nAmount due: **\$42**\n")
save(pdf, "invoice.pdf")
# Desde HTML
html_pdf = from_html("<h1>Report</h1><p>Quarterly results.</p>")
save(html_pdf, "report.pdf")
# Desde texto plano: obtén los bytes en lugar de escribir un archivo
text_pdf = from_text("Plain text body.")
bytes = to_bytes(text_pdf)
println("generated ", length(bytes), " bytes")
Gestión de errores
Las operaciones fallidas lanzan un PdfOxideError. Envuelve en un try/catch las llamadas que manejan entradas no confiables:
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 pasos
- Primeros pasos con Rust — el núcleo nativo sobre el que se construye PDF Oxide
- Primeros pasos con Python — usar PDF Oxide desde Python
- Extracción de texto — opciones y recetas de extracción en detalle
- Creación de PDF — creación avanzada con metadatos y estilos