История изменений
Здесь задокументированы все значимые изменения в 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+CSS —
Pdf.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и CMapToUnicodeперепривязываются к пространству 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). Соответствует собственному соглашению GoGOCACHE. - Релизные ассеты теперь включают
pdf_oxide-go-ffi-shared-<platform>.tar.gzдля каждой платформы Tier-1 наряду с существующими архивами staticlib.
Исправления ошибок
- #395 –
RenderPageбольше не вызывает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.js –
extractWords,extractTextLines,extractTables,extractPaths,getEmbeddedImages,ocrExtractTextподключены в слой TypeScript (ранее только нативные). ExtractedTable→Table– переименование в ядре 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 в разных позициях обрабатывается отдельно.
- Устойчивость к отравлению Mutex –
MutexExt::lock_or_recover()заменяет 72 места вызова.lock().unwrap().
Зависимости
- Экосистема RustCrypto cipher 0.5 (PR #352, #295, #291):
aes0.8→0.9,cbc0.1→0.2,sha2/sha1/md-50.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.31 –scripts/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, тонкая настройка сегментации слов/строк
Новые возможности
- Потокобезопасный PdfDocument –
Send + Syncчерез Mutex (заменил RefCell). - Асинхронный API Python –
AsyncPdfDocument,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 Python –
validate_pdf_a,validate_pdf_ua,validate_pdf_x,extract_pages,delete_page,move_page,flatten_to_images, конструктор с паролем,merge. - Новые API WASM –
validatePdfA,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
- Извлечение полей форм
- Извлечение изображений