function ValidatePdfUa: TPdfUaValidationResult;
ValidatePdfUa распознаёт PDF/UA-1 и PDF/UA-2 по XMP и применяет правила выбранного профиля
pdfuaid:part = 1 и соответствующим описанием pdfaExtension:schemas (§5)dc:title внутри пакета XMP (§7.1)StructTreeRoot в каталоге или где-либо в файле (§7.1) — без него документ вообще не может нести тегирование/MarkInfo << /Marked true /Suspects false >> в каталоге (§7.1)/ViewerPreferences << /DisplayDocTitle true >> в каталоге (§7.1)/Lang в каталоге с тегом языка BCP 47 (§7.2)/ID в трейлере и отсутствие шифрованияxmp:CreateDate / xmp:ModifyDate (рекомендуется для согласованности Info / XMP)Результат — запись TPdfUaValidationResult:
puc1, puc2, pucNone или pucUnknownTPdfUaValidationIssues с нулём или более значений: pvuaiMissingXmpMetadata, pvuaiMissingPdfUaIdentifier, pvuaiMissingExtensionSchema, pvuaiMissingDcTitle, pvuaiMissingStructTreeRoot, pvuaiMissingMarkInfo, pvuaiSuspectsTrue, pvuaiMissingDisplayDocTitle, pvuaiMissingLang, pvuaiEncryptionPresent, pvuaiMissingTrailerId, pvuaiMissingXmpDates, pvuaiFontNotEmbedded, pvuaiFontMissingToUnicode, pvuaiMissingTabsOrder, pvuaiFigureMissingAlt, pvuaiFormulaMissingAlt, pvuaiNoteMissingId. Раунд 1 (v1.66.0) добавляет pvuaiRoleMapMissing (7.1), pvuaiOptionalContentAsKey (7.10), pvuaiXfaPresent (7.15), pvuaiTrapNetAnnotation (7.18.2), pvuaiReferenceXObject (7.20) и pvuaiEncryptionPBitMissing (7.16 — точное нарушение шифрования, заменившее старый любой-шифрование флаг). Раунд 2 (v1.67.0) добавляет pvuaiLinkMissingContents (7.18.5), pvuaiAnnotationMissingContents (7.18.1), pvuaiEmbeddedFileMissingName (7.11), pvuaiMediaClipMissingAlt (7.18.6.2) и pvuaiCidFontMissingCidToGidMap (7.21.3.2). Раунд 3 (v1.68.0) добавляет pvuaiUriActionIsMap (7.18.5) и pvuaiHeadingSequenceViolation (7.4.2 — первое правило уровня дерева структуры; ValidatePdfUaStructureElements теперь проверяет последовательность нумерованных заголовков). Раунд 4 (v1.69.0) добавляет pvuaiWidgetOutsideForm (7.18.4 — вложение Widget в дереве структуры) и pvuaiSubsetMissingCharSet (7.21.4.2). Раунд 5 (v1.70.0) добавляет pvuaiSubsetMissingCidSet (7.21.4.2), pvuaiToUnicodeForbiddenValue (7.21.7), pvuaiLangInvalidFormat (7.2) и pvuaiOrderedListMissingListNumbering (7.6 — возникает с v1.71.0, когда элемент L объявляет значение ListNumbering вне множества из Table 347; отсутствие атрибута не помечается). Раунд 7 (v1.80.0) добавляет проверки таблиц из §7.5: pvuaiTableStructureInvalid (TH/TD вне TR или TR/THead/TBody/TFoot вне требуемого контейнера), pvuaiTableHeaderMissingScope (TH без атрибута Scope и без ID в таблице, где ни одна ячейка не использует привязку Headers) и pvuaiTableHeadersUndefinedId (ячейки ссылаются на заголовки через массивы Headers, но ни один элемент структуры документа не определяет ID; отдельное повисшее упоминание рядом с разрешаемыми допускается, как у эталонного проверяющего). v1.81.0 добавляет проверку вложенности списков из §7.6 pvuaiListStructureInvalid (LI вне контейнера L или Lbl/LBody вне элемента LI; вложенные списки и Lbl внутри Note/BibEntry принимаются). v1.82.0 добавляет проверки разрешения RoleMap из §7.1: pvuaiRoleMapRemapsStandard (запись RoleMap переопределяет стандартный тип структуры) и pvuaiRoleMapUnresolved (используемый нестандартный тип структуры не имеет записи в RoleMap либо его цепочка повисла или циклична; косвенные цепочки, приводящие к стандартному типу, принимаются, а неиспользуемые записи RoleMap никогда не осуждаются). v1.83.0 добавляет проверки модели заголовков из §7.4.4: pvuaiHeadingModelMixed (универсальный тег H вперемешку с нумерованными заголовками H1..Hn) и pvuaiHeadingMultipleInNode (узел структуры с более чем одним дочерним заголовком H). v1.84.0 добавляет проверку нетегированного содержимого из §7.1 pvuaiUntaggedContent (отображаемый текстовый или графический объект, не заявленный деревом структуры страницы через его marked-content ID и не помеченный как Artifact; голые контурные объекты вне проверки, чтобы не помечать вездесущую декоративную графику). v1.85.0 добавляет проверку динамического XFA из §7.15 pvuaiXfaDynamic (конфигурация XFA выставляет dynamicRender в required) и выводит из употребления пометку любого-XFA pvuaiXfaPresent (статический XFA соответствует; значение перечисления остаётся, но больше не возникает). С v1.85.1 проверка §7.18.3 pvuaiMissingTabsOrder выполняется постранично: каждой аннотированной странице нужен собственный /Tabs /S в её словаре. v1.86.0 добавляет проверки кодировки TrueType из §7.21.6: pvuaiTrueTypeEncodingInvalid (несимвольный TrueType без Encoding либо его кодировка — не MacRomanEncoding и не WinAnsiEncoding напрямую или через BaseEncoding) и pvuaiSymbolicTrueTypeEncoding (символьный TrueType с нестандартным именем Encoding; стандартные имена допускаются, потому что соответствующие стандартам документы нередко помечают шрифты со стандартной кодировкой как символьные). v1.87.0 добавляет проверки составных шрифтов из §7.21.3: pvuaiCidSystemInfoMismatch (встроенный CMap и потомок CIDFont расходятся в Registry/Ordering либо Supplement CIDFont превышает CMap), pvuaiCMapNotEmbedded (CMap, упомянутый по имени, не входит в число предопределённых CMap из Table 118) и pvuaiCMapWModeMismatch (словарь WMode встроенного CMap расходится с содержимым его потока; судить можно только о байт-читаемых несжатых потоках CMap), и расширяет pvuaiCidFontMissingCidToGidMap, помечая также имя CIDToGIDMap, отличное от Identity. v1.93.0 добавляет слой объектной модели Pdfium — три точные проблемы по шрифту и по символу, вычисляемые по живому дереву объектов Pdfium: pvuaiPdfiumFontNotEmbedded (§7.21.4, фактически используемый страницей шрифт не встроен по FPDFFont_GetIsEmbedded), pvuaiPdfiumUnicodeMapError (§7.21.7, символ страницы имеет недопустимое отображение Unicode по FPDFText_HasUnicodeMapError) и pvuaiPdfiumNotDefGlyph (§7.21.8, символ отображается в Unicode 0 / .notdef). Они дополняют побайтовые эвристики pvuaiFontNotEmbedded / pvuaiFontMissingToUnicode (срабатывающие только при общедокументном сигнале «ноль встроенных» или отсутствии /ToUnicode); обход сокращается на трёх уровнях (цикл по страницам, цикл по объектам, сканирование символов). v1.94.0 добавляет шесть проблем второго прохода из повторного аудита по пунктам стандарта: pvuaiHeadingFormatInvalid (§7.4.3, тег заголовка, начинающийся с H, который не является ни универсальным H, ни H + чистыми арабскими цифрами — разделители, пробелы и римские цифры запрещены), pvuaiMissingDocumentOutline (§7.17, многостраничный документ без набора закладок; одностраничные документы освобождены), pvuaiStructElementLangInvalid (§7.2, значение /Lang элемента структуры, не являющееся допустимым тегом BCP 47), pvuaiWidgetMissingPrintField (§7.14 / §7.18.4, элемент структуры Widget без владельца атрибута PrintField), pvuaiLinkNotInStructureTree (§7.18.5, документ с аннотациями /Subtype /Link, чьё дерево структуры не содержит элемента Link) и слой аннотаций Pdfium pvuaiPdfiumAnnotationMissingContents / pvuaiPdfiumLinkMissingContents (§7.18.1 / §7.18.5, точное сканирование, освобождающее скрытые, за пределами crop box, Popup и Widget аннотации и устраняющее ложные срабатывания побайтовой эвристики). v1.95.0 улучшает полноту и корректность: проверки §7.21.3.3 pvuaiCMapWModeMismatch и §7.21.7 pvuaiToUnicodeForbiddenValue теперь распаковывают сжатые FlateDecode потоки CMap / ToUnicode перед сканированием (ранее судили только о несжатых потоках), а pvuaiSubsetCharSetEmpty (§7.21.4.2) помечает FontDescriptor подмножества Type 1 с пустым строковым значением /CharSet (проверка отсутствия ключа ловила лишь полностью отсутствующий ключ). v1.96.0 добавляет pvuaiAnnotationFlagsViolation (§7.18.1, неосвобождённая аннотация с Hidden / Invisible / NoView) и pvuaiActionTargetMissing (§7.18.5, действие GoToR / URI / SubmitForm без ключа цели), оба перенесены из проверяющего PDF/A, и исправляет ошибку перебазирования ParentIndex между страницами при слиянии дерева структуры плюс разборщик RoleMap, преждевременно завершавшийся на косвенных ссылках и значениях-массивахConformance является реальным уровнем PDF/UA, а Issues пустПроверка PDF/UA-2 дополнительно требует четырёхзначного pdfuaid:rev, действительного PDF 2.0, упорядочивания табуляции аннотаций A/W/S, отсутствия XFA, непустых имён конфигураций необязательного содержимого, отсутствия устаревших в PDF 2.0 аннотаций Sound или Movie и явно нумерованных типов заголовочной структуры H1 через Hn
С v3.73.0 набор проблем может также содержать pvuaiNaturalLanguageUncovered, когда текст страницы вне Artifact или строка Title, Alt, ActualText либо Expansion структуры не имеет действующего объявления /Lang
С v3.74.0 набор проблем может также содержать pvuaiArtifactInStructureTree, когда объект страницы Artifact несёт MCID, заявленный деревом структуры страницы, включая артефакты разбиения на основе контуров
С v3.75.0 проблемы отображения Unicode берутся из одного прохода InspectPdfUaUnicodeCoverage в области объекта; действительный ActualText покрывает только символы своего исходного текстового объекта, тогда как символы Artifact и сгенерированные PDFium исключаются из семантического покрытия
ValidatePdfUa работает только на чтение — документ оно не меняет, и вызывать его повторно безопасно. Используйте его перед передачей PDF в архивную систему или проверку доступности, чтобы показать оператору несоответствия. Для частой проверки «это PDF/UA-1?», не требующей списка проблем, предпочитайте более лёгкое свойство PdfUaConformance
Conformance = pucUnknown и пустым набором IssuespvuaiSuspectsTrue, только когда в /MarkInfo явно указано /Suspects true. Документы, вовсе не содержащие ключа /Suspects, считаются соответствующими в этом пункте (стандарт запрещает только true)N 0 R); существующие ключи сохраняются, а словарь нормализуется к прямому словарю в перезаписанном каталоге
uses System.TypInfo;
var
Outcome: TPdfUaValidationResult;
Issue: TPdfUaValidationIssue;
begin
Pdf1.FileName := 'C:\Incoming\report.pdf';
Pdf1.Active := True;
Outcome := Pdf1.ValidatePdfUa;
Memo1.Lines.Add('Level: ' + GetEnumName(TypeInfo(TPdfUaConformance),
Ord(Outcome.Conformance)));
for Issue in Outcome.Issues do
Memo1.Lines.Add('- ' + GetEnumName(TypeInfo(TPdfUaValidationIssue), Ord(Issue)));
end;