Skip to content

История изменений

Здесь задокументированы все значимые изменения в PDF Oxide.


v0.3.38 – 2026-04-22

DocumentBuilder появляется во всех привязках; AES-256 на пути записи; проверка подписей; многоцелевой WASM; бэкенд Go purego

Паритет API записи во всех привязках (#384)

  • DocumentBuilder + FluentPageBuilder + EmbeddedFont теперь поставляются в Python, Node/TypeScript, C#, Go и WASM наряду с Rust. Многостраничное построение с полной поддержкой CJK / кириллицы / греческого через встроенные шрифты. Закрывает #382 на уровне всех языков.
  • 15 методов аннотаций в каждой привязке: link_url / link_page / link_named, highlight, underline, strikeout, squiggly, стикер, штамп (14 стандартных + пользовательский), свободный текст, watermark (пользовательский / DRAFT / CONFIDENTIAL).
  • 5 типов виджетов AcroForm в каждой привязке: text_field, checkbox, combo_box, radio_group, push_button.
  • Графические примитивы в каждой привязке: rect, filled_rect, line.
  • Конвейер HTML+CSSPdf.from_html_css(...) и from_html_css_with_fonts(...) для каскадов из нескольких шрифтов в каждой привязке.

Шифрование AES-256 на пути записи (#386)

  • save_encrypted(path, user_pw, owner_pw) / to_bytes_encrypted(user_pw, owner_pw) в DocumentBuilder в каждой привязке.
  • save_with_encryption в Rust для пользовательского алгоритма + разрешений.

Настоящее формирование подмножества шрифтов (#385 / FONT-3b)

  • Начертания CJK теперь встраиваются как подмножество, а не как полное начертание. PDF из 5 символов, построенный на шрифте CJK размером ~17 МБ, обычно занимает менее 100 КБ. Потоки контента, ширины /W и CMap ToUnicode перепривязываются к пространству GID подмножества; обход extract_text остаётся неизменным.
  • Изменение внутреннего API записи: EmbeddedFont::encode_string / encode_shaped_run возвращают Vec<u16>, а build_embedded_font_objects возвращает GlyphRemapper, который вызывающая сторона передаёт в ContentStreamBuilder::build_with_remappers. Высокоуровневые API не изменились.

Проверка цифровых подписей (#208, половина с проверкой)

  • Signature.verify() и Signature.verify_detached(pdf_bytes) (и нативные эквиваленты привязок) в каждой привязке. Проверки атрибутов подписанта по RFC 5652 §5.4 + messageDigest по §11.2.
  • RSA-PKCS#1 v1.5 поверх SHA-1 / SHA-256 / SHA-384 / SHA-512 возвращает Valid / Invalid. RSA-PSS и ECDSA проявляются как Unknown / UnsupportedFeatureException; вызывающая сторона по-прежнему может прочитать сертификат и выполнить собственную проверку.
  • Certificate — инспекция DER (subject, issuer, серийный номер, срок действия, is_valid) через x509-parserкаждая привязка.
  • Signature — перечисление + инспекция + .get_certificate()каждая привязка.
  • Timestamp — разбор TSTInfo по RFC 3161 (время, серийный номер, политика, имя TSA, алгоритм хеширования, отпечаток сообщения) — каждая привязка.
  • TsaClient — HTTP POST по RFC 3161 с nonce и базовой HTTP-аутентификацией за Cargo-фичей tsa-clientкаждая привязка, кроме WASM. Намеренно не подключён в WASM (ureq несовместим с wasm).
  • Запись метаданных DocumentEditor::set_producer / set_creation_date.
  • render_page_region и render_page_fit — обрезанная и подогнанная поверхность рендеринга.
  • Бикубическая фильтрация изображений (паритет с pdf.js #19978) — отсканированные / двухуровневые страницы с накладками в режиме Multiply больше не схлопывают свой диапазон оттенков серого при уменьшении масштаба.

Само подписание (в отличие от проверки) не охвачено; #208 остаётся открытым для этой половины.

Многоцелевая упаковка WASM (#392)

  • pdf-oxide-wasm теперь поставляет три сборки бок о бок с условным экспортом в package.json: nodejs/, bundler/ (Vite / webpack / Rollup / esbuild / Bun) и web/ (браузеры / Deno / Cloudflare Workers).
  • Исправляет ReferenceError: Can't find variable: __dirname, возникавший под браузерными сборщиками.
  • Доступны импорты по подпутям (pdf-oxide-wasm/web, /nodejs, /bundler) для ручной маршрутизации.

Привязка Go — бэкенд purego + установка в каталог кэша

  • Второй бэкенд через ebitengine/purego выполняет dlopen для libpdf_oxide.{so,dylib,dll} во время выполнения. Сборки с CGO_ENABLED=0 теперь работают. Выбор бэкенда происходит автоматически — //go:build cgo → полный CGo API, //go:build !cgo → purego.
  • Поверхность purego: открытие PdfDocument (путь / байты / пароль), количество страниц, версия, извлечение текста / Markdown / HTML / простого текста, шрифты, аннотации, элементы страницы, поиск, размеры страницы, логирование, плюс PdfCreator.FromMarkdown для тестовых фикстур.
  • Только CGo (ошибка компиляции при !cgo): DocumentEditor, DocumentBuilder, штрихкоды, подписи, TSA, рендеринг, OCR, изменение форм.
  • Установщик: новый флаг -shared получает cdylib вместо staticlib и печатает CGO_ENABLED=0 + PDF_OXIDE_LIB_PATH=… для экспорта.
  • Каталог установки перенесён в os.UserCacheDir()~/.cache/pdf_oxide (Linux), ~/Library/Caches/pdf_oxide (macOS), %LocalAppData%\pdf_oxide (Windows). Соответствует собственному соглашению Go GOCACHE.
  • Релизные ассеты теперь включают pdf_oxide-go-ffi-shared-<platform>.tar.gz для каждой платформы Tier-1 наряду с существующими архивами staticlib.

Исправления ошибок

  • #395RenderPage больше не вызывает SignatureException, когда страница содержит неразбираемые метаданные поля подписи, но не имеет интерактивного виджета подписи. Сообщено @gevorgter.

Благодарности

  • @sparkyandrew – #382 (CJK через DocumentBuilder), #385 (формирователь подмножества).
  • @arthurlassagne – #392 (поломка браузерной сборки).
  • @gevorgter – #395 (исключение подписи в RenderPage).

v0.3.37 – 2026-04-20

HTML + CSS → PDF (#248) — первый достойный доверия конвейер на чистом Rust

Новый API — Pdf::from_html_css

let font = std::fs::read("DejaVuSans.ttf")?;
let pdf = Pdf::from_html_css(
    "<h1>Hello</h1><p>World</p>",
    "h1 { color: blue; font-size: 24pt }",
    font,
)?;
pdf.save("out.pdf")?;

Передайте HTML + CSS + байты шрифта — получите разбитый на страницы PDF. Чистый Rust, только MIT/Apache (без транзитивных зависимостей MPL), обход extract_text совпадает побайтово, поэтому произведённые PDF участвуют в существующей тестовой инфраструктуре.

Что вошло в релиз

  • Подсистема шрифтов — встраивание TTF/OTF с эмиссией Type 0 / CIDFontType2 / Identity-H / ToUnicode; латиница, кириллица, греческий, иврит, арабский проходят обход через extract_text. Обнаружение системных шрифтов через fontdb, шейпинг текста через rustybuzz.
  • Самописный движок CSS (~6 500 строк, ноль зависимостей MPL) – токенизатор, парсер, селекторы L3+L4 (:is/:where/:not/:has), сопоставитель, каскад, calc() / min() / max() / clamp(), var() с обнаружением циклов, типизированные значения свойств, at-правила (@media print, @page с :first/:left/:right/:blank, @font-face, @import, @supports), счётчики, контент псевдоэлементов.
  • HTML – токенизатор HTML5, плоский arena-DOM, извлечение таблиц стилей (<style>, <link rel="stylesheet">, встроенный style=""), извлечение ресурсов (<img> + srcset, <picture>/<source>, <a href>).
  • Раскладка – block / flex / grid на основе Taffy, перенос строк по UAX #14, схлопывание отступов, многоколоночность, таблицы (auto + fixed).
  • Отрисовка – текст + рамки, RTL через rustybuzz, <a href> → аннотация /Link, data-URI из <img>/XObject, ::before / ::after, page-break-{before,after}: always, opacity, transform: translate*(), маркеры списков <ul> / <ol>, встроенные шрифты через DocumentBuilder::register_embedded_font (#382).

Каскад из нескольких шрифтов

  • Pdf::from_html_css_with_fonts(html, css, Vec<(family, bytes)>) — CSS-свойство font-family на любом элементе разрешается относительно зарегистрированных семейств (без учёта регистра, с кавычками и без них, многословные без кавычек).

Исправления ошибок в крайних случаях

  • Полужирный текст Base-14 теперь отрисовывается полужирным (несоответствие ключа словаря ресурсов относительно Tf /Helvetica-Bold).
  • Системные шрифты TTC (Helvetica.ttc, msgothic.ttc) теперь разрешаются через Source::SharedFile из fontdb.
  • Многословный font-family без кавычек теперь корректно токенизируется.
  • Закрыта утечка памяти в фабриках Pdf::from_html_css (четыре места Box::leak заменены локальными переменными с областью видимости).
  • PNG alpha / мягкая маска (SMask) теперь отрисовываются.
  • Шейпленный текст проходит обход через extract_text (encode_shaped_run отображает кластеры глифов обратно в исходные кодовые точки).
  • PdfWriter::finish встраивает шрифты в порядке регистрации (ранее — в случайном порядке HashMap).
  • Коллизии имён встроенных шрифтов изолированы через монотонно растущие имена ресурсов EFn.
  • Mutex fontdb больше не удерживается во время fs::read байтов шрифта.

Вне области охвата

CSS-фильтры, 3D-трансформации, анимации, SVG внутри HTML (каждый жизнеспособный Rust-крейт SVG имеет лицензию MPL), MathML, hyphens: auto, shape-outside, JavaScript, полноматричный transform (scale/rotate), градиенты, box-shadow.

Аудит лицензий

cargo deny check licenses проходит с нулём транзитивных зависимостей MPL. CSS-стек Mozilla (cssparser, selectors, html5ever, lightningcss, stylo) полностью под MPL-2.0; v0.3.37 самостоятельно реализует эквиваленты, чтобы pdf_oxide оставался полностью под MIT/Apache.

Благодарности

  • @jmriebold – #248 («поддержка CSS») лежит в основе всего конвейера HTML+CSS→PDF этого релиза.

v0.3.36 – 2026-04-19

Структурное извлечение Markdown — эмиссия заголовков/списков из тегированного PDF, порядок чтения по нескольким колонкам, более безопасная обработка RTL

Структурное извлечение Markdown (#377)

to_markdown() теперь подключает /StructTreeRoot напрямую в конвейер Markdown вместо повторного выведения уровней заголовков из эвристик размера шрифта и маркеров списков из обнаружения глифов:

  • Эмиссия заголовков и списков из /StructTreeRoot. Новый StructRole (Heading(1..6), ListItem, ListItemLabel, ListItemBody), прикреплённый к каждому фрагменту. Документы с тегами Word восстанавливают полную иерархию заголовков; списки эмитируют - item с разрывами абзацев на каждом переходе роли.
  • Роль распространяется через вложенные MCR. Шаблоны H1 → Span → MCR и LI → LBody → Span → MCR теперь несут правильную семантическую роль через InheritedContext { heading_level, list_role }.
  • Граница блока на каждый /StructTreeRoot принудительно создаёт разрыв абзаца. OrderedContent.block_id инкрементируется при каждом входе в /P, /H1..6, /LI, /Lbl, /LBody, /Sect, /Div, /Art, /TR, /TH, /TD, /Note, /Reference, /BibEntry, /Code; раскладки с плотными промежутками больше не сливаются.
  • Шлюз одной базовой линии против чрезмерной фрагментации заголовков форм — фрагменты на одной базовой линии воссоединяются в один заголовок.
  • Обнаружение межколоночного промежутка — фрагменты на одной базовой линии, разделённые > max(3 × font_size, 30 pt), трактуются как межколоночные.
  • Обнаружение переноса порядка чтения по обратному x — порядок чтения по колонкам (последний фрагмент колонки 1 на x=976 → первый фрагмент колонки 2 на x=192 на той же базовой линии) теперь разрывает абзацы вместо их соединения.
  • Геометрическое обнаружение заголовков + префиксов списков для нетегированных документов. Полужирный + прибавка размера на 5 % повышает до H4. Новый is_ordered_list_marker распознаёт 1. / 12. / a) / iv. / A., отвергая подписи к рисункам и годы.

RTL-текст — безопасно по умолчанию

  • Ложные маркеры **bold** вокруг контекстных глифов арабского теперь удаляются (переходы шейпинга сбивали детектор насыщенности шрифта).
  • Переупорядочивание bidi выключено по умолчанию. Более ранний черновик прогонял визуально→логическое переупорядочивание unicode-bidi на каждой RTL-строке, что ломало ранее корректные PDF с логическим порядком (имя на иврите בנימין инвертировалось). Помощник переупорядочивания остаётся в text::bidi::reorder_visual_to_logical для вызывающих сторон, чей ввод имеет визуальный порядок.

Вывод Markdown

  • Встроенные data-URI изображений в base64 ограничены 200 КБ. PDF с диаграммами высокого разрешения ранее раздували вывод Markdown в 10–20 раз (статья на 1,9 МБ давала 11,3 МБ Markdown). Изображения сверх лимита эмитируют HTML-комментарий-заглушку с исходным размером. Вывод изображений в файлы (image_output_dir) не затронут.

Эмпирический эффект

Проверено относительно v0.3.35 на регрессии из 369 PDF, охватывающей подмножества академических, государственных, форм, газет, технических, диссертаций, IRS, pdfium, pdfjs, safedocs и медленного корпуса:

  • 0 катастрофических регрессий.
  • Token Jaccard относительно pdfium и pdftotext: медиана 1,000, ≥0,95 на 95 из 106 фикстур.
  • Token Jaccard относительно pymupdf4llm: медиана 0,978, ≥0,95 на 65 из 106 фикстур.
  • Примерно в 2 раза больше эмитированных заголовков, чем у pymupdf4llm, по всему корпусу.

Благодарности

  • @Goldziher (kreuzberg) – завёл #377 с методологией бенчмарка на 727 документов плюс 9 воспроизводящих PDF. Формулировка («TF1 в пределах ±3 %, так что текстовое содержимое в порядке, проблема в структуре») сделала всё расследование посильным.

v0.3.35 – 2026-04-19

Сохранение дублетов узких глифов при извлечении текста

Корректность извлечения текста

  • Соседние дублеты узких глифов больше не схлопываются при малых размерах шрифта (#378, PR #379). TextExtractor::deduplicate_overlapping_chars и deduplicate_overlapping_spans использовали жёстко заданный абсолютный порог 2 pt; для узких глифов (l, r, I, i) в компактных шрифтах малых размеров ширина продвижения на глиф падает до ≤ 2 pt (l в Helvetica ≈ 2,5 pt при 9 pt), поэтому законные соседние дублеты, отстоящие ровно на одно продвижение, попадали в окно дедупликации, и один из двух глифов молча отбрасывался. Видимые повреждения включали controller → controler, billed → biled, warranty → warrnty, following → folowing, VIII → VII. Порог теперь масштабируется с собственной advance_width каждого глифа как min(advance_width * 0.30, 2.0). Настраиваемые параметры вынесены в ассоциированные константы TextExtractor::DEDUP_OVERLAP_RATIO / DEDUP_OVERLAP_CAP_PT.

Благодарности

  • @Hugues-DTANKOUO – сообщил о #378 с точным анализом первопричины и написал PR #379 с порогом, масштабируемым по продвижению, и параметризованной регрессионной матрицей (4 узких глифа × 3 размера основного текста).

v0.3.34 – 2026-04-17

Идиоматичный API страниц во всех привязках; структурированное извлечение таблиц

Новые возможности

  • API страниц (#371) – Python, Node.js, C# и Go теперь предоставляют объект PdfPage. Итерируйте через for page in doc, for (const p of doc), foreach (var p in doc.Pages) или doc.Pages(); индексируйте через doc[i], doc.page(i), doc[i] или doc.Page(i). Каждая страница предоставляет ленивые text, markdown(), html(), words, lines, tables, images, paths, annotations, search() и многое другое.
  • Структурированное извлечение таблиц (#289)extract_tables() (Python), ExtractTables() (C#/Go) и extractTables() (Node.js) теперь возвращают строки и ячейки с текстом плюс ограничивающие прямоугольники, а не только Markdown. Доступно как на PdfDocument, так и на новом PdfPage.
  • Паритет Node.jsextractWords, extractTextLines, extractTables, extractPaths, getEmbeddedImages, ocrExtractText подключены в слой TypeScript (ранее только нативные).
  • ExtractedTableTable – переименование в ядре Rust; избыточный префикс Extracted удалён. Типы, обращённые к FFI, обновлены.

Качество извлечения текста

  • Обнаружение колонок XY-cut на страницах смешанной раскладки (#319) – защита is_multi_column_page ужесточена, чтобы требовать не менее 15 фрагментов на колонку; фрагменты, упорядоченные по колонкам, больше не пересортировываются построчно-осведомлённой сортировкой в extract_text.

Благодарности

  • @SeanPedersen за предложение API «страница прежде всего» (#371). @pdenapo за запрос структурированного извлечения таблиц (#289).

v0.3.33 – 2026-04-16

Исправления извлечения текста, корректности изображений и безопасности памяти

Исправления ошибок

  • Промах CMap ToUnicode (#363) – подмножества шрифтов Type0 теперь эмитируют U+FFFD, когда CID отсутствует в CMap ToUnicode, вместо проваливания в шифротекст Identity-H (например, %B+$%8A//$2*%01*1%6APP).
  • Внутрисловный кернинг TJ больше не разбивает слова (#365) – кернинг пар букв 0,10–0,20 em внутри одиночных слов ([(diffe) -150 (rent)]) больше не вызывает вставку пробела.
  • Восстановлена кириллическая UTF-8 кракозябра (#317) – шрифты с только латинской кодировкой и сырыми последовательностями байтов UTF-8 теперь декодируются корректно.
  • Частичное восстановление FlateDecode отвергает мусорный вывод (#364) – PDF от MS Reporting Services, чьи потоки контента дают сбой в середине распаковки, больше не возвращают 128 байт псевдослучайных данных.
  • Палитра Indexed + ICCBased (#373) – неразрешённые ссылки на ICC-потоки внутри базового массива Indexed больше не устанавливают /N по умолчанию в 3 вместо 4 для CMYK, исправляя артефакты диагональных полос. Сообщено @Charltsing.
  • Палитры Indexed на основе Lab → sRGB (#337) – байты палитры CIE L*a*b* теперь конвертируются Lab→XYZ→sRGB вместо переинтерпретации как сырой RGB.

Память и производительность

  • Все внутренние кэши ограничены (PR #369, #354) – кэш объектов (64 МБ), кэши шрифтов (256–512 записей), кэши фрагментов/изображений XObject (1024 записи) и глобальный кэш CMap (1024 записи) теперь используют вытеснение FIFO.
  • Исправлено OOM при извлечении путей на PDF с обилием диаграмм (#369) – добавлена дедупликация XObject с учётом CTM, поэтому один и тот же XObject в одной и той же позиции дедуплицируется, но один и тот же XObject в разных позициях обрабатывается отдельно.
  • Устойчивость к отравлению MutexMutexExt::lock_or_recover() заменяет 72 места вызова .lock().unwrap().

Зависимости

  • Экосистема RustCrypto cipher 0.5 (PR #352, #295, #291): aes 0.8→0.9, cbc 0.1→0.2, sha2/sha1/md-5 0.10→0.11.

Набор тестов

  • Удалены 13 мёртвых/устаревших игнорируемых тестов; исправлены 3 ранее игнорируемых теста. Добавлены регрессионные тесты на каждое исправление выше. Набор теперь: 6 300 пройдено, 0 провалено, 228 проигнорировано.

Благодарности

  • @Charltsing за отчёт об ошибке извлечения изображений Indexed + CMYK (#373).
  • @ddxtanx за профилирование неограниченного роста памяти при многостраничном извлечении (#354).
  • @andrewjradcliffe за PR #369: ограниченные FIFO-кэши, дедупликация XObject с учётом CTM, трейт восстановления при отравлении MutexExt, упрочнение привязки Python.

v0.3.32 – 2026-04-15

Исправление релизного конвейера для tarball Go FFI под Windows-x64

Релизный конвейер

  • Исправление сбоя сборки нативной библиотеки x86_64-pc-windows-gnu, проваливавшей релиз v0.3.31scripts/shrink-staticlib.sh запускал objcopy --strip-debug на каждом члене архива, но кросс-компилирующий тулчейн MinGW эмитирует разделённые отладочные члены .dwo, содержащие только секции DWARF; после удаления у члена не оставалось секций, и objcopy прерывал весь архив. Исправление: удалить члены архива .dwo через ar d перед вызовом objcopy. Никаких функциональных изменений в артефактах Rust, Python, Node, WASM или C# — этот релиз существует исключительно для разблокировки пути установки Go под Windows-x64.

v0.3.31 – 2026-04-13

Исправления ошибок, изменения сборки Go, улучшения релизной инфраструктуры

Исправления ошибок

  • Восстановление Xref – исправлено восстановление для неверно помеченных свободных объектов страниц и записей смещения xref, ошибающихся на несколько байт.

Ломающие изменения

  • Нативные библиотеки Go – нативные библиотеки больше не коммитятся в go/lib/. Потребители должны один раз на машину выполнить go run github.com/yfedoseev/pdf_oxide/go/cmd/install@latest.

Релизная инфраструктура

  • Уменьшены staticlib Rust на 63% (с 71 МБ до 26 МБ), удалена отладочная информация из аддона npm .node, убраны sourcemap из npm, исправлена утечка sdist крейта, ужесточена упаковка NuGet snupkg.

v0.3.27 – 2026-04-12

Go staticlib, нативные привязки Node.js, C# NativeAOT, OCR FFI, крупные исправления ошибок

Новые возможности

  • Миграция Go на staticlib – переход с cdylib на staticlib ради самодостаточных бинарников Go.
  • Нативные привязки Node.js – предсобранные платформенные подпакеты через распространение в стиле napi-rs.
  • C# LibraryImport – мигрировано 881 объявление P/Invoke с DllImport на LibraryImport ради совместимости с NativeAOT.
  • Мост OCR FFI – поддержка OCR теперь доступна в привязках Go, C# и Node.js.
  • Регрессионная оснастка – курируемый корпус из 60 PDF для автоматизированного тестирования качества.

Исправления ошибок

  • Изображения с цветовым пространством Indexed, шифрование AES-256 (V=5, R=6), порядок чтения для одноколоночного и табличного контента, извлечение арабского текста, разделение слов, запасной вариант ширины шрифта, инвалидация кэша объектов, улучшения рендеринга.

v0.3.24 – 2026-04-09

Официальные привязки для JavaScript/TypeScript, Go и C#

Новые возможности

  • Привязки JavaScript/TypeScript – опубликованы на npm с полным покрытием API.
  • Привязки Go – нативный пакет Go с полной поверхностью API.
  • Привязки C# – пакет .NET, опубликованный на NuGet.
  • Слой C FFI – более 270 функций extern "C" с общим заголовком pdf_oxide.h.
  • Глобальный контроль уровня логирования – настраивается во всех привязках.

v0.3.23 – 2026-04-09

Критические исправления стабильности

Исправления ошибок

  • Исправлен SIGABRT на страницах с вырожденной CTM из повёрнутых PDF от dvips.
  • Исправлено удаление изображений/XObject при сохранении.
  • Исправлен искажённый рендеринг на системах без распространённых шрифтов.
  • Исправлено: индекс страницы поля формы всегда возвращал 0.

v0.3.22 – 2026-04-08

Потокобезопасные документы, асинхронный Python, Python без GIL, тонкая настройка сегментации слов/строк

Новые возможности

  • Потокобезопасный PdfDocumentSend + Sync через Mutex (заменил RefCell).
  • Асинхронный API PythonAsyncPdfDocument, AsyncPdf, AsyncOfficeConverter.
  • Python без GIL – поддержка cp314t (сборки без GIL).
  • Пороги сегментацииword_gap_threshold, line_gap_threshold, profile для настройки обнаружения слов/строк.

Исправления ошибок

  • Пустые страницы при split/merge в CLI, пропуск рендеринга для некорректных изображений, SIGSEGV из-за цикла в дереве структуры, шлюзование стратегии таблиц.

Производительность

  • Кэшированные дерево структуры и распакованные потоки контента, поиск MCID за O(1), обход дерева страниц за O(log n), ленивое заполнение дерева страниц.

v0.3.21 – 2026-04-04

Многоархитектурные колёса Python, исправление уровня логирования

Исправления ошибок

  • Уровень логирования теперь полностью соблюдается в Python (макросы перенаправляются в крейт log).

Новые возможности

  • Многоархитектурные колёса Python – Linux aarch64, musl x86_64/aarch64, Windows ARM64; требование к glibc снижено до 2_28.

v0.3.20 – 2026-04-04

Крупная переработка извлечения таблиц, улучшения качества текста, тихое логирование по умолчанию

Новые возможности

  • Переработка движка извлечения таблиц – конвейер пересечений, обнаружение краёв текста, расширенная сетка, обнаружение текста с учётом колонок, реконструкция пунктирных/штриховых линий, гибридное обнаружение строк.
  • Качество извлечения текста – пробелы между соседними значениями, слияние разделённых десятичных, консолидация полужирных фрагментов, иерархия заголовков HTML, сопоставление меток и значений, слияние колоночных групп.
  • Тихое логирование – логирование теперь тихое по умолчанию во всех привязках; логи Python текут через модуль logging посредством pyo3-log.

Исправления ошибок

  • Понятное сообщение об ошибке для зашифрованного PDF, расшифровка потоков ObjStm/XRef, обработка завершающего перевода строки парсером потоков.

v0.3.19 – 2026-04-02

Извлечение страницы одним вызовом, порядок чтения с учётом колонок, посимвольные ограничивающие прямоугольники

Новые возможности

  • extract_page_text() – DTO с одним вызовом для упрощённого извлечения страницы.
  • Порядок чтения с учётом колонок – пространственное разбиение XY-Cut для многоколоночных документов.
  • Посимвольные ограничивающие прямоугольники – выведены из метрик шрифта для точного позиционирования символов.
  • Флаг is_monospace – доступен на TextSpan и TextChar.
  • Pdf::from_bytes() – новый конструктор во всех привязках.
  • Операции с путямиextract_paths() в привязках Python.

Исправления ошибок

  • UTF-8 паника в многобайтовом отладочном логе, интервалы Markdown, /Matrix у Form XObject, матрица повёрнутого текста, потеря CTM при предсканировании, дедупликация, потеря текста при масштабе Tm, слияние слов в Markdown, пустые документы при слиянии в CLI.

Ломающие изменения

  • WASM – имена полей JSON теперь используют camelCase.

v0.3.18 – 2026-04-01

Капитальная переработка движка рендеринга, новые API Python и WASM, Python «с батарейками»

Новые возможности

  • Капитальная переработка движка рендеринга – корректный межсимвольный интервал, поддержка встроенных шрифтов, метрики стандартных шрифтов, заливка-и-обводка, путь обрезки, градиентное затенение, альфа-прозрачность, трафаретные маски изображений, поворот страницы, плашечные цветовые пространства.
  • Новые API Pythonvalidate_pdf_a, validate_pdf_ua, validate_pdf_x, extract_pages, delete_page, move_page, flatten_to_images, конструктор с паролем, merge.
  • Новые API WASMvalidatePdfA, deletePage, extractPages, save, конструктор с паролем, merge.
  • Python «с батарейками» – рендеринг, параллелизм, подписи и конвертация Office включены по умолчанию.

Исправления ошибок

  • Прерывание при вырожденной CTM, защита от flate-бомбы в FlateDecode (лимит 256 МБ), синхронизация стека обрезки.

v0.3.17 – 2026-03-08

Уточнение обнаружения таблиц, оптимизация тегированного PDF

Улучшения

  • Уточнённое обнаружение таблиц – требует 2+ колонки, снижая ложные срабатывания.
  • Оптимизированный конвейер извлечения тегированного PDF.

Исправления ошибок

  • Исправлена паника RefCell already borrowed при рекурсивной обработке Form XObject.

v0.3.16 – 2026-03-08

Умное гибридное извлечение таблиц, заглушки типов Python, поддержка pathlib

Новые возможности

  • Умное гибридное извлечение таблиц – кластеризация Union-Find, анализ визуальных линий, визуальные фрагменты/заголовки.
  • Профессиональные ASCII-таблицы – многострочный перенос для вывода в терминал.
  • Заглушки типов Python – автоматически генерируются через mypy stubgen.
  • Python PdfDocument – принимает pathlib.Path и поддерживает контекстный менеджер.

Исправления ошибок

  • Segfault во вложенном Form XObject, масштабирование координат в Python, UTF-8 паника в ASCII-таблице.

v0.3.15 – 2026-03-06

Управление колонтитулами, шаблоны страниц, ограниченное по области извлечение

Новые возможности

  • API управления колонтитулами – добавление, удаление и редактирование артефактов PDF.
  • Шаблоны страниц – динамические заполнители для нумерации страниц, дат и т. д.
  • Ограниченное по области извлечение – учитывает erase_regions для отфильтрованного вывода.
  • PdfDocument.from_bytes() – новый конструктор Python.

Исправления ошибок

  • Порядок чтения по нескольким колонкам (XY-Cut), коллизии идентичности шрифтов, ложные срабатывания стратегии таблиц Lines.

v0.3.14 – 2026-03-03

Высокоуровневый рендеринг, извлечение слов/строк, геометрические примитивы, гибридные таблицы

Новые возможности

  • Высокоуровневый API рендерингаPdf::render_page в Rust, Python и WASM.
  • Извлечение слов и строкextract_words, extract_text_lines во всех привязках.
  • Извлечение геометрических примитивовextract_rects, extract_lines.
  • Гибридное обнаружение таблиц – подсказки векторных линий улучшают обнаружение границ таблиц.
  • Гармонизация API – текучий паттерн .within(page, rect).
  • Команды CLI – команды render и paths с фильтрацией --area.

Исправления ошибок

  • Обнаружение шлюзования фичи OCR, отравление кэша фрагментов XObject, крипто-фильтры V=4, зашифрованный CIDToGIDMap.

v0.3.13 – 2026-03-02

Исправления извлечения текста CJK

Исправления ошибок

  • Многобайтовое декодирование в extract_chars для шрифтов CJK/Type0, улучшенная точность позиционирования символов, масштабирование межсимвольного интервала.

v0.3.12 – 2026-03-01

Качество извлечения текста, конвертация в Markdown, производительность

Улучшения

  • Качество извлечения текста – расчёт ширины CID-шрифтов, обнаружение границ слов при смене шрифта, запасной вариант для нестандартного отображения CID, направленность RTL-текста.
  • Конвертация в Markdown – рекурсивное пространственное разбиение XY-Cut, обнаружение заголовков, реконструкция списков.

Производительность

  • Обход дерева страниц без копирования, кэширование дерева структуры, ранний выход по оператору BT, больший буфер ввода-вывода, удалён порог реконструкции xref.

v0.3.10 – 2026-02-26

Параллельное извлечение, поддержка WASM/JavaScript, пакетная обработка, улучшения качества текста

Новые возможности

  • Поддержка WASM/JavaScript – привязки WebAssembly через wasm-bindgen. Полное извлечение текста, создание PDF, редактирование, поля форм и поиск доступны в браузере и Node.js. Опубликовано как pdf-oxide-wasm на npm.

  • Параллельное извлечение страниц – новый флаг фичи parallel с многопоточным извлечением на основе rayon. ParallelExtractor распределяет страницы по рабочим потокам. Глобальный кэш шрифтов гарантирует, что шрифты разбираются лишь однажды.

  • API пакетной обработки – новый BatchProcessor для рабочих процессов с несколькими PDF с обратными вызовами прогресса и сбором ошибок. Поддерживает как последовательную, так и параллельную обработку.

  • Гибридное обнаружение OCR – новый перечислитель PageType (NativeText, ScannedPage, HybridPage) с мультиэвристическим обнаружением для интеллектуального запасного OCR.

  • Полный паритет API WASM/Python – 10 новых групп методов в привязках WASM и Python: get/set полей форм, извлечение байтов изображений, PDF из изображений, уплощение форм, слияние PDF, встраивание файлов, метки страниц, метаданные XMP.

Исправления ошибок

  • Segfault при циклическом XObject – исправлен segfault от циклических ссылок Form XObject во время извлечения изображений
  • Переполнение цепочки XRef /Prev – разбор цепочки XRef /Prev переписан с рекурсивного на итеративный с обнаружением циклов
  • Сломанный текст с лигатурами – постпроцессор repair_ligatures() исправляет повреждённый текст из LaTeX-PDF
  • Качество извлечения текста – извлечение текста аннотаций, нормализация ведущих точек, поддержка CMap Priority 3
  • Извлечение таблиц – объединённые ячейки, многострочное содержимое ячеек, обнаружение заголовков на основе шрифта
  • Сохранение полей форм – инкрементальное сохранение теперь корректно сохраняет изменения значений полей форм

Производительность

  • Пропуск страниц только с изображениями – предпроверка page_cannot_have_text() пропускает распаковку для страниц без шрифтов
  • Операнды операторов SmallVec – размещённые на стеке операнды устраняют выделение в куче на каждый оператор
  • Кросс-документный кэш шрифтов – кэш шрифтов LRU на уровне процесса, разделяемый всеми экземплярами PdfDocument

v0.3.9 – 2026-02-24

20+ микрооптимизаций – извлечение текста на 40% быстрее

Производительность

  • Исправление конкатенации строк за O(n^2) – предвыделенный Vec<&str>, соединяемый в конце, заменяет квадратичное накопление String::push_str()
  • Парсер потоков контента только с изображениями – новый быстрый путь для extract_images(), пропускающий операторы текста и графики (в 3-5 раз быстрее)
  • Кэш шрифтов на основе отпечатка – идентификация шрифта хешированием encoding+widths+flags вместо полного сравнения структуры
  • Потоковый парсер – операторы потока контента передаются потоком вместо сбора в Vec
  • Быстрый встроенный парсер для BT/ET – прямое побайтовое сопоставление для распространённых текстовых операторов
  • Таблица поиска байт-в-символ – 256-элементная таблица поиска заменяет HashMap на горячем пути
  • Таблица поиска ширин – массив фиксированного размера заменяет HashMap для ширин глифов
  • Сжатие перечисления Operator – со 112 до 40 байт через боксинг крупных вариантов (на 64% меньше)
  • Бэкенд zlib-rs – распаковка потоков на 15-25% быстрее через порт zlib-ng

Исправления ошибок

  • Кодировка шрифтов со встроенными программами – корректное разрешение базовой кодировки согласно спецификации PDF
  • Дополнительный Unicode (U+10000+) – исправлено усечение дополнительных кодовых точек
  • Отображение лигатур StandardEncoding – корректное отображение fi, fl, ff, ffi, ffl через Adobe Glyph List
  • Нормализация радикалов Канси – полная таблица отображения U+2F00-U+2FD5
  • Порядок символов RTL-текста – арабский/иврит извлекаются в логическом порядке чтения
  • Разделение многоколоночного текста – улучшенное обнаружение колонок через анализ промежутков

Возможности

  • extract_all_text() – новый удобный метод для извлечения текста всех страниц
  • source_role для StructElem – сохраняет исходное имя роли PDF до отображения ролей

v0.3.8 – 2026-02-20

Парсер только текста – страницы с обилием графики в 10-30 раз быстрее

Производительность

  • Парсер потоков контента только текста – новый быстрый путь parse_content_stream_text_only() пропускает операторы графики вне блоков BT/ET, используя побайтовое сканирование вместо полного разбора nom
  • Побайтовый сканер графики – сырая индексная арифметика заменяет цикл операндов на основе nom, обрабатывая со скоростью, близкой к memcpy
  • Пропуск операторов цвета – 12 операторов цвета добавлены в побайтовый список пропуска
  • Отложенная эмиссия q/cm/Q – операции состояния графики откладываются до подтверждения текста, устраняя ~75% накладных расходов на возврат
  • Кэш FontInfo в обёртке Arc – избегает клонирования полных структур FontInfo при попаданиях в кэш
  • Построение карты страниц за O(n) – однопроходный обход заменяет рекурсивный спуск
  • Кэш имя-в-ссылку для XObject – устраняет клонирование словарей за O(n^2) на страницах с обилием XObject

v0.3.7 – 2026-02-19

Качество извлечения текста: с 95,7% до 99,6% чистоты

Проверено – корпус из 3 829 PDF

Метрика v0.3.6 v0.3.7 Изменение
Чистота 95,7% 99,6% 3 812 из 3 829 PDF
Грязные PDF 165 17 -90%

Добавлено – парсер и декодеры

  • Потоковый фильтр BrotliDecode (PDF 2.0) – новый декодер для потоков, сжатых Brotli
  • Выбор трейлера Xref – корректный выбор трейлера при наличии нескольких трейлеров
  • Восстановление PDF без заголовка – поиск первого маркера объекта при отсутствии заголовка %PDF-

Добавлено – кодировка шрифтов

  • Парсер кодировки шрифтов CFF – разбор программ шрифтов CFF/OpenType для кодировки символов
  • Парсер кодировки шрифтов Type1 – разбор встроенных программ шрифтов Type 1 для отображений глифов
  • 80K+ отображений CID-в-Unicode – расширены Adobe-CNS1, Adobe-GB1, Adobe-Japan1, Adobe-Korea1
  • Декодирование Shift-JIS/RKSJ – поддержка потоков CMap в японской кодировке Shift-JIS
  • Распространение cmap Identity-H – распространение таблиц cmap TrueType от потомков CIDFont

Исправлено – конвейер извлечения текста

  • Сброс буфера Tf – сброс отложенного текста при смене шрифта для предотвращения потери текста
  • Адаптивный порог пробела – замена фиксированного порога 0,25em на интервал на основе bbox
  • Дедупликация фрагментов – дедупликация перекрывающихся фрагментов, отрисованных для эффектов полужирного/тени
  • Дедупликация символов – удаление дублирующихся символов в пределах 2pt на одной строке
  • Удаление проверки оператора BT – исправлена некорректная проверка, пропускавшая допустимые текстовые блоки
  • Декодирование ByteMode – корректное декодирование 1-байтовых, 2-байтовых и переменной ширины кодов символов
  • Извлечение текста аннотаций – извлечение текста из Widget, FreeText и потоков внешнего вида

v0.3.6 – 2026-02-16

В 10 раз быстрее – устранены два узких места O(n)

Производительность

  • Массовый кэш дерева страниц – при первом доступе к странице всё дерево страниц обходится один раз, и все страницы кэшируются. Ранее get_page() обходил от корня для каждой некэшированной страницы, что давало O(n) на страницу и O(n^2) суммарно для последовательного доступа. Теперь O(1) на страницу после единственного обхода за O(n). Тестовый файл veraPDF на 10 000 страниц прошёл с 55 667 мс до 332 мс (в 168 раз быстрее).

  • Кэш смещений сканирования объектов – когда объекты отсутствуют в таблице xref, scan_for_object() ранее читал весь PDF-файл для каждого отсутствующего объекта. Тегированные PDF с сотнями элементов дерева структуры не в xref запускали сотни полных чтений файла. Теперь файл сканируется один раз, и все смещения объектов кэшируются. Тегированный PDF на 10 страниц прошёл с ~10 с до 68 мс (в 146 раз быстрее). Академический PDF на 154 страницы с 571 шрифтом прошёл с ~18 с до 405 мс (в 44 раза быстрее).

  • Однопроходное извлечение текстаextract_spans() больше не выполняет два прохода (классификация типа документа, затем извлечение). Проход классификации полностью устранён; адаптивные пороги с учётом шрифта теперь дают равные или лучшие результаты за один проход.

  • Предвыделение Vec потока контентаparse_content_stream() предвыделяет ёмкость Vec операторов на основе размера потока, сокращая переаллокации для крупных потоков контента.

Проверено – корпус из 3 830 PDF (с v0.3.5 до v0.3.6)

Метрика v0.3.5 v0.3.6 Изменение
Доля прохождения 99,8% 99,8% 3 823 из 3 830 валидных PDF
Медленные (>5s) 2 0 Устранены
Среднее 23,3ms 2,1ms -91%
p50 0,6ms 0,6ms
p90 3,0ms 2,6ms -13%
p99 33,2ms 18,0ms -46%
Макс 68 722ms 625ms -99%
Сумма (все PDF) 89,1s 8,0s -91%

Текстовый вывод проверен как побайтово идентичный на 11 PDF (862 КБ извлечённого текста). 4 PDF показали улучшенное качество извлечения благодаря адаптивным интервалам.


v0.3.5 – 2026-02-15

Производительность, стабильность на 3 830 PDF и восстановление после ошибок

Производительность

  • Кэширование шрифтов между страницами – кэш шрифтов на уровне документа с ключом ObjectRef избегает повторного разбора общих шрифтов на каждой странице
  • Кэширование объектов страницget_page() кэширует разрешённые объекты страниц, устраняя повторный обход дерева страниц при многостраничном извлечении
  • Кэширование дерева структуры – результат дерева структуры кэшируется после первого доступа, избегая избыточного разбора при каждом вызове extract_text()
  • Ранний выход по оператору BT – извлечение текста пропускает полный конвейер для страниц только с изображениями, не содержащих операторов BT (Begin Text)
  • Больший буфер ввода-вывода для крупных файлов – ёмкость BufReader увеличена с 8 КБ до 256 КБ для файлов свыше 100 МБ
  • Удалён порог реконструкции Xref – устранена эвристика, запускавшая полную реконструкцию файла на валидных portfolio-PDF с малым числом объектов

Проверено – корпус из 3 830 PDF

  • 100% прохождения на 3 830 PDF из veraPDF (2 907), Mozilla pdf.js (897), SafeDocs (26)
  • Ноль таймаутов, ноль паник
  • p50 = 0,6ms, p90 = 3,0ms, p99 = 33ms

Добавлено – шифрование

  • Аутентификация пароля владельца – алгоритм 7 для R<=4, алгоритм 12 для R>=5
  • Проверка пользовательского пароля R>=5 с SASLprep – полная проверка пароля AES-256 с использованием SHA-256
  • Публичный API аутентификации по паролюPdf::authenticate(password) и PdfDocument::authenticate(password)

Добавлено – проверка соответствия PDF/A

  • Проверка метаданных XMP – проверка записей pdfaid:part и pdfaid:conformance
  • Проверка цветового пространства – сканирование потоков контента страниц на наличие зависящих от устройства операторов цвета без output intent
  • Проверка AFRelationship – проверка спецификации встроенных файлов PDF/A-3

Добавлено – проверка соответствия PDF/X

  • Идентификация XMP PDF/X – проверка pdfxid:GTS_PDFXVersion
  • Проверка отношений рамок страницы – TrimBox внутри BleedBox внутри MediaBox
  • Обнаружение прозрачности ExtGState – проверки SMask, CA/ca, BM
  • Обнаружение зависящего от устройства цвета – помечает неподдерживаемые цветовые пространства
  • Проверка ICC-профиля – проверка потоков ICCBased-профилей

Добавлено – рендеринг

  • Корректная по спецификации обрезка – состояние обрезки ограничено областью сохранения/восстановления q/Q
  • Расчёт ширины продвижения глифа – согласно разделу 9.4.4 спецификации PDF
  • Рендеринг Form XObject – разбор трансформации /Matrix, использование /Resources формы

Исправлено – восстановление после ошибок (28+ реальных PDF)

  • Отсутствующие объекты разрешаются в Null согласно разделу 7.3.10 спецификации PDF
  • Снисходительный разбор версии заголовка для необычных строк версии
  • Сопоставление нестандартного алгоритма шифрования (комбинации V=1, R=3)
  • Resources не-словарь трактуется как пустой вместо ошибки
  • Null-узлы в дереве страниц изящно пропускаются
  • Повреждённые потоки контента возвращают пустой контент вместо ошибок
  • Усиленное сканирование дерева страниц с эвристикой /Resources+/Parent

Исправлено – защита от DoS

  • Количество страниц проверяется по лимиту Приложения C.2 спецификации PDF (8 388 607)

Исправлено – извлечение изображений

  • Извлечение изображений из потока контента через операторы Do
  • Вложенные изображения Form XObject с обнаружением циклов
  • Встроенные изображения (последовательности BI…ID…EI)
  • Трансформации CTM для позиционирования изображений
  • Разрешение косвенных ссылок ColorSpace

Исправлено – надёжность парсера

  • Многострочные заголовки объектов (формат 1 0\nobj, используемый PDF от Google)
  • Поиск заголовка расширен с 1024 до 8192 байт
  • Снисходительный разбор версии для некорректных заголовков

Исправлено – надёжность доступа к страницам

  • Страницы без /Contents возвращают пустой контент
  • Обнаружение циклического дерева страниц предотвращает переполнение стека
  • Null-ссылки на потоки обрабатываются изящно
  • Страницы без записи /Type находятся по ключам /MediaBox или /Contents

Исправлено – надёжность шифрования

  • Расшифровка AES с недоразмерными ключами возвращает ошибку вместо паники
  • Разбор потока Xref упрочнён против некорректных записей
  • Косвенные ссылки /Encrypt разрешаются до разбора

Исправлено – обработка потоков контента

  • Запасной вариант Dictionary-as-Stream для голых словарей
  • Сокращённые имена фильтров (AHx, A85, LZW, Fl, RL, CCF, DCT)
  • Лимит операторов потока контента (по умолчанию 1 000 000)

Исправлено – качество кода

  • Косвенные ссылки на объекты дерева структуры разрешаются на этапе разбора
  • Устранение неоднозначности токенов R/RG в лексере
  • Обрезка пробелов потока больше не удаляет байты NUL или пробелы из бинарных данных

Тесты

  • 8 ранее игнорировавшихся тестов разыгнорированы и исправлены

Удалено

  • Пустая заглушка PdfImage (извлечение использует ImageInfo)
  • Закомментированный тестовый блок DocumentType::detect()

v0.3.4 – 2026-02-12

Надёжность разбора, извлечение символов и пути XObject

Ломающие изменения

  • Сигнатура parse_header() изменена с (u8, u8) на (u8, u8, u64) для включения байтового смещения

Исправлено – надёжность разбора PDF (Issue #41)

  • PDF с бинарными префиксами или заголовками BOM теперь открываются успешно
  • Поиск заголовка сканирует первые 1024 байта на маркер %PDF-
  • Поддерживает UTF-8 BOM, заголовки электронной почты и другие ведущие бинарные данные
  • Снисходительный режим обрабатывает реальные некорректные PDF; строгий режим для тестирования соответствия

Добавлено – извлечение текста на уровне символов (Issue #39)

  • extract_chars() возвращает Vec<TextChar> с посимвольным позиционированием
  • Включает матрицу трансформации, угол поворота, ширину продвижения
  • Отсортировано в порядке чтения с дедупликацией перекрывающихся символов
  • На 30-50% быстрее извлечения фрагментов для случаев использования только с символами
  • Доступно в API как Rust, так и Python

Добавлено – извлечение путей XObject (Issue #40)

  • extract_paths() рекурсивно обрабатывает Form XObject через оператор Do
  • Трансформации координат через /Matrix применяются корректно
  • Состояние графики правильно изолируется (сохранение/восстановление)
  • Обнаружение дубликатов XObject предотвращает бесконечные циклы
  • Вложенные XObject поддерживаются

Изменено

  • Библиотека парсера nom обновлена с 7.1 до 8.0

v0.3.3 – 2026-02-11

Поддержка CJK, улучшения дерева структуры и основы соответствия

Включает все изменения из v0.2.5 и v0.2.6 как консолидированный релиз.

Основные моменты

  • Поддержка TagSuspect/MarkInfo – разбор словаря MarkInfo из каталога документа
  • Структурный элемент Word Break /WB для текста CJK
  • Поддержка предопределённых CMap для Adobe-GB1 (упрощённый китайский), Adobe-Japan1 (японский), Adobe-CNS1 (традиционный китайский), Adobe-Korea1 (корейский)
  • Поддержка раскрытия сокращений /E
  • Разбор массива Type 0 /W для ширин глифов CIDFont
  • Исправление обработки мягкого переноса (U+00AD)
  • Усиленная фильтрация артефактов с поддержкой подтипов
  • Встраивание изображений в вывод HTML и Markdown (data-URI в base64)
  • Экспорт изображений в файлы с embed_images=false и image_output_dir
  • Методы PdfImage::to_base64_data_uri() и to_png_bytes()

v0.3.2 – 2026-02-01

Редактирование, шифрование и безопасность документов

Добавлено – редактирование PDF

  • DocumentEditor для модификации существующих PDF
  • Полная поддержка аннотаций (текстовая разметка, фигуры, штампы, чернила, вложения файлов, редактирование)
  • Создание интерактивных полей форм (текст, чекбокс, радио, выпадающий список, список, кнопка)
  • Уплощение форм
  • Аннотации-ссылки (URL, внутренняя навигация по страницам)
  • Конструктор оглавления/закладок
  • Слои PDF (Optional Content Groups)

Добавлено – шифрование

  • Шифрование при записи (AES-256, AES-128, RC4-128, RC4-40)
  • Контроль разрешений (печать, копирование, изменение, аннотирование)
  • Конструктор EncryptionConfig с EncryptionAlgorithm и Permissions
  • Основа для цифровых подписей

v0.3.1 – 2026-01-14

Поля форм, мультимедиа, инструменты создания и поиск

Добавлено – создание PDF

  • Pdf::from_markdown(), Pdf::from_html(), Pdf::from_text(), Pdf::from_image()
  • Текучий паттерн PdfBuilder для конфигурации метаданных и раскладки
  • DocumentBuilder для программной генерации PDF
  • Рендеринг таблиц с TableRenderer
  • Графический API: цвета, градиенты, паттерны, режимы наложения, прозрачность
  • Шаблоны страниц с колонтитулами, нумерацией страниц, водяными знаками
  • Генерация штрихкодов (QR, Code128, EAN-13, UPC-A, Code39, ITF)

Добавлено – поиск

  • Поиск текста с регулярными выражениями, с учётом/без учёта регистра, по целым словам, по диапазонам страниц
  • Типы SearchOptions и SearchResult
  • Отслеживание позиции со страницей/координатами

Добавлено – покрытие полей форм (95%)

  • Иерархическое создание полей (родительские/дочерние структуры с точечными именами)
  • Изменение свойств полей (только чтение, обязательность, прямоугольник, всплывающая подсказка, макс. длина, выравнивание, значение по умолчанию)
  • Экспорт FDF/XFDF для обмена данными форм

Добавлено – мультимедийные аннотации

  • MovieAnnotation, SoundAnnotation, ScreenAnnotation, RichMediaAnnotation
  • ThreeDAnnotation с поддержкой форматов U3D и PRC

Добавлено – поддержка форм XFA

  • XfaExtractor, XfaParser, XfaConverter (конвертация XFA в AcroForm)

Изменено – привязки Python

  • Настоящая поддержка Python 3.8-3.14 через abi3-py38
  • Современный инструментарий: интеграция uv, pdm, ruff

v0.3.0 – 2026-01-10

Основа извлечения – унифицированный API и базовые возможности

Добавлено – унифицированный API Pdf

  • Pdf::open() для чтения существующих PDF
  • DOM-подобная навигация по страницам с pdf.page(0)
  • Низкоуровневый дескриптор PdfDocument для продвинутых случаев использования

Добавлено – извлечение текста

  • extract_text() – простой текст всей страницы
  • extract_spans() – стилизованные текстовые прогоны с метаданными шрифта
  • Порядок чтения на основе дерева структуры для тегированных PDF
  • Интеллектуальное обнаружение переносов строк и пробелов для нетегированных PDF

Добавлено – извлечение изображений

  • extract_images() – извлечение всех изображений со страницы
  • Обнаружение формата (JPEG, PNG, TIFF, JBIG2, CCITT)
  • Обработка цветовых пространств (DeviceRGB, DeviceCMYK, DeviceGray, ICCBased)

Добавлено – извлечение метаданных

  • Словарь информации о документе (заголовок, автор, тема, ключевые слова)
  • Чтение/запись метаданных XMP
  • Информация о странице (размеры, поворот, рамки media/crop/trim)

Добавлено – извлечение форм

  • extract_form_fields() для перечисления полей AcroForm
  • Типы полей: текст, кнопка, выбор и подпись

Добавлено – конвертация

  • to_markdown() – конвертация в Markdown на уровне страницы
  • to_html() – конвертация в HTML на уровне страницы
  • to_plain_text() – настраиваемый вывод простого текста

Добавлено – соответствие

  • Проверка PDF/A (ISO 19005, уровни от 1a до 3b)
  • Проверка PDF/X (ISO 15930, уровни от X-1a до X-6p)
  • Проверка PDF/UA (ISO 14289, уровни UA-1 и UA-2)

Добавлено – рендеринг (требует фичи rendering)

  • Рендеринг страниц в PNG/JPEG через tiny-skia
  • Настраиваемые DPI и масштаб

Добавлено – привязки Python

  • Класс PdfDocument с полным API извлечения
  • Класс Pdf с API создания и высокоуровневым API
  • На основе PyO3, опубликовано на PyPI как pdf_oxide

v0.2.4 – 2026-01-09

  • Исправление трансформации CTM для позиционирования текста
  • Разбор /Alt и /Pg дерева структуры
  • FormulaRenderer для изображений формул

v0.2.3 – 2026-01-07

  • Сброс матрицы BT/ET согласно спецификации PDF
  • Обнаружение геометрических интервалов в конвертере Markdown
  • apply_intelligent_text_processing() для лигатур и переносов

v0.2.2 – 2025-12-15

  • Оптимизация ключевых слов для обнаруживаемости

v0.2.1 – 2025-12-15

  • Улучшения декодирования зашифрованных потоков

v0.1.4 – 2025-12-12

  • Исправления декодирования зашифрованных потоков

v0.1.0 – 2025-11-06

  • Первоначальный релиз
  • Извлечение текста из PDF с соответствующим спецификации отображением Unicode
  • Интеллектуальное обнаружение порядка чтения
  • Привязки Python через PyO3
  • Поддержка зашифрованных PDF
  • Извлечение полей форм
  • Извлечение изображений