Skip to content

Початок роботи з PDF Oxide (Julia)

PDF Oxide — найшвидша бібліотека для роботи з PDF у Julia: видобуток тексту із середнім часом 0.8 мс і 100% успішних проходів на 3830 PDF. Пакет PdfOxide.jl обгортає ядро на Rust безпосередньо через C ABI, тож ви отримуєте нативну швидкість разом з ідіоматичним API для Julia. Індекси сторінок починаються з 0.

Встановлення

Додайте пакет із менеджера пакетів у REPL Julia:

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 приймає індекс сторінки, що починається з 0.

using PdfOxide

doc = open_document("report.pdf")

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

# Plain text from the first page (0-based index)
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)        # number of pages
@show version(doc).major     # PDF spec version
@show is_encrypted(doc)      # true if the file is password-protected

Конвертація в Markdown і HTML

Конвертуйте одну сторінку або одразу весь документ. Markdown зберігає заголовки, списки й виділення; варіанти _all об’єднують усі сторінки.

using PdfOxide

doc = open_document("paper.pdf")

# One page (0-based)
md = to_markdown(doc, 0)
println(md)

# Whole document
println(to_markdown_all(doc))

# HTML for a single page
html = to_html(doc, 0)
println(html)

# Plain text without any markup
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")

# Search one page (case-insensitive)
hits = search(doc, 0, "configuration", false)
for h in hits
    println("page ", h.page, ": ", h.text)
end

# Search every page
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

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

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

# From plain text — grab the bytes instead of writing a file
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

Наступні кроки