Начало работы с PDF Oxide (Julia)
PDF Oxide — самая быстрая PDF-библиотека для Julia: среднее время извлечения текста 0.8 мс и 100% успешных результатов на 3830 PDF. Пакет PdfOxide.jl оборачивает ядро на Rust напрямую через C ABI, поэтому вы получаете нативную скорость с идиоматичным API для Julia. Индексы страниц начинаются с нуля.
Установка
Добавьте пакет из менеджера пакетов в Julia REPL:
using Pkg
Pkg.add("PdfOxide")
Нативная библиотека (libpdf_oxide) загружается во время выполнения. Если её нет в пути загрузчика системы, укажите PdfOxide.jl её расположение через одну из переменных окружения, которые он проверяет по порядку: PDF_OXIDE_LIB_PATH (полный путь к файлу), PDF_OXIDE_LIB_DIR (каталог), а затем локальный каталог сборки target/release.
export PDF_OXIDE_LIB_DIR=/path/to/pdf_oxide/target/release
Быстрый старт
Откройте PDF и извлеките текст с первой страницы. extract_text принимает индекс страницы, отсчитываемый от нуля.
using PdfOxide
doc = open_document("report.pdf")
println("pages: ", page_count(doc))
v = version(doc)
println("version: ", v.major, ".", v.minor)
# Обычный текст с первой страницы (индекс с нуля)
println(extract_text(doc, 0))
Можно также собрать документ в памяти и открыть его из байтов — удобно для тестов и конвейеров, которые вообще не обращаются к диску:
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))
Анализ документа
Несколько недорогих вызовов подскажут, с чем вы имеете дело, ещё до извлечения:
using PdfOxide
doc = open_document("report.pdf")
@show page_count(doc) # количество страниц
@show version(doc).major # версия спецификации PDF
@show is_encrypted(doc) # true, если файл защищён паролем
Конвертация в Markdown и HTML
Конвертируйте отдельную страницу или весь документ сразу. Markdown сохраняет заголовки, списки и выделение; варианты с суффиксом _all объединяют все страницы.
using PdfOxide
doc = open_document("paper.pdf")
# Одна страница (индекс с нуля)
md = to_markdown(doc, 0)
println(md)
# Весь документ
println(to_markdown_all(doc))
# HTML для отдельной страницы
html = to_html(doc, 0)
println(html)
# Обычный текст без какой-либо разметки
println(to_plain_text(doc, 0))
Извлечение по словам
extract_words возвращает вектор значений Word, каждое из которых содержит свой текст, ограничивающий прямоугольник, размер шрифта и флаг жирности. Ограничивающий прямоугольник — это Bbox с полями width, height и позицией.
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
Для построчной разметки extract_text_lines возвращает значения TextLine, каждое со своим текстом, полем word_count и 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
Поиск
Ищите по одной странице или по всему документу. Третий аргумент — флаг учёта регистра (false означает поиск без учёта регистра). Каждое совпадение сообщает свой text, страницу page, на которой оно найдено, и bbox.
using PdfOxide
doc = open_document("manual.pdf")
# Поиск по одной странице (без учёта регистра)
hits = search(doc, 0, "configuration", false)
for h in hits
println("page ", h.page, ": ", h.text)
end
# Поиск по всем страницам
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
Создание PDF
Фабричные функции from_* создают Pdf из Markdown, HTML или обычного текста. Вызовите to_bytes, чтобы получить сырые байты, или save, чтобы записать прямо в файл.
using PdfOxide
# Из Markdown
pdf = from_markdown("# Invoice\n\nAmount due: **\$42**\n")
save(pdf, "invoice.pdf")
# Из HTML
html_pdf = from_html("<h1>Report</h1><p>Quarterly results.</p>")
save(html_pdf, "report.pdf")
# Из обычного текста — берём байты вместо записи файла
text_pdf = from_text("Plain text body.")
bytes = to_bytes(text_pdf)
println("generated ", length(bytes), " bytes")
Обработка ошибок
Неудавшиеся операции вызывают PdfOxideError. Оборачивайте вызовы, работающие с недоверенными данными, в 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
Дальнейшие шаги
- Начало работы с Rust — нативное ядро, на котором построен PDF Oxide
- Начало работы с Python — использование PDF Oxide из Python
- Извлечение текста — подробные параметры и приёмы извлечения
- Создание PDF — продвинутое создание с метаданными и стилизацией