Skip to content

Начало работы с 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

Дальнейшие шаги