Переносимые маски паролей 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 описывает прочих потребителей нативных полей и отрисовки