Переносимые маски паролей XFA

Модуль: HPDFXFAHeadless

HPDFXFAWriteHeadlessPDF обрабатывает поля XFA passwordEdit как нативные текстовые виджеты с PDF-флагом пароля и маскирующим appearance на встроенном шрифте в Windows и Linux

Appearance содержит по одной звёздочке на каждое скалярное значение Unicode: дополнительный символ, представленный суррогатной парой UTF-16, даёт одну звёздочку, тогда как комбинирующие знаки и ZWJ вносят каждый свою

Нативное /V сохраняет полное авторское Unicode-значение; маскирование appearance не шифрует и не удаляет это значение из PDF

Например, A😀B даёт три звёздочки, а é — две, потому что комбинирующий акцент — отдельный скаляр

Лимиты и отмена

Адаптер проверяет отмену во время подсчёта скаляров и остаток агрегированного бюджета глифов до выделения строки маски

TXFAHeadlessPDFResult.GlyphUnits считает фактические сгенерированные звёздочки для масок паролей; существующий учёт UTF-16 для обычного текста и прочих потребителей appearance не меняется

Два дополнительных символа влезают в остаток бюджета MaxGlyphs, равный двум; бюджет, равный единице, ломает операцию до выделения маски

Исходное значение остаётся под лимитами входа и байтов объектов, а все поля делят агрегированный бюджет appearance

Сбои подготовки, бюджета и отмены оставляют позицию, длину и существующие байты цели вызывающего без изменений; ошибки записи в цель следуют собственному поведению потока при частичной записи

Проверка

Tests/Linux/XFAHeadlessPasswordTests.pas и раннеры паролей Windows и Linux проверяют точные бюджеты, границы отмены, сохранение потока и поведение повторной попытки

Независимый верификатор проверяет нативные значения, флаги, фактические AP-последовательности CID, ToUnicode и идентификаторы встроенных глифов, затем отрисовывает и извлекает сохранённые PDF через MuPDF

Автоматическое создание XFA описывает прочих потребителей нативных полей и отрисовки