function ValidatePdfA: TPdfAValidationResult;
ValidatePdfA обходит открытый документ в поисках каждого маркера соответствия PDF/A, определённого ISO 19005-1 (с Cor.1:2007):
pdfaid:part и pdfaid:conformance, который сообщает проверяющему, на какой уровень PDF/A ориентировался документ при создании (1a, 1b, 2b, 3b, ...)/ID в трейлере (обязателен по ISO 19005-1 6.1.3)xmp:CreateDate и xmp:ModifyDate в пакете XMP (требуются, когда словарь Info хранит значения CreationDate / ModDate, согласно 6.7.3 Example 2)pdfaExtension:schemas, описывающий схему расширения pdfaid (требуется по 6.7.8 / Cor.1)Результат — запись TPdfAValidationResult:
pac1a, pac1b, pac2a, pac2b, pac2u, pac3a, pac3b, pac3u, pacNone или pacUnknown для маркера PDF/A без распознанного уровня)TPdfAValidationIssues из значений TPdfAValidationIssue, описывающих каждую найденную проблему. Структурные маркеры: pvaiMissingXmpMetadata, pvaiMissingPdfAIdentifier, pvaiMissingOutputIntent, pvaiMissingIccProfile, pvaiEncryptionPresent, pvaiMissingTrailerId, pvaiMissingXmpDates и pvaiMissingExtensionSchema. Он также сообщает нарушения уровня содержимого, которые впрыскиванием маркеров не исправить: pvaiLevelAStructureMissing (заявка уровня A без тегированной структуры), pvaiJavaScriptPresent, pvaiForbiddenAction, pvaiAdditionalActions, pvaiEmbeddedFilesNonConforming, pvaiLzwUsed, pvaiTransparencyForbidden, pvaiOptionalContentForbidden, pvaiForbiddenAnnotation, pvaiNeedAppearancesTrue, pvaiXfaPresent, pvaiFontNotEmbedded и pvaiUnicodeMappingMissing (заявка PDF/A-2u / PDF/A-3u, у которой шрифты без /ToUnicode). Более строгие проверки ISO 19005 добавляют pvaiTrappedTrue, pvaiForbiddenActionSubtype, pvaiTransparentColorSpace, pvaiAnnotationDictViolation, pvaiUnembeddedFont, pvaiMixedDeviceColorSpaces, pvaiUndefinedContentOperator, pvaiForbiddenRenderingIntent, pvaiExtGStateTransferFunction, pvaiImageDictionaryViolation, pvaiFormXObjectViolation, pvaiPostScriptOrRefXObject, pvaiAnnotationFlagsViolation, pvaiDeprecatedAction, pvaiMetadataFilterForbidden, pvaiStructElemTypeMissing и pvaiRoleMapMissing. Раунд 4 добавляет pvaiHeaderBinaryMarkerMissing (6.1.2), pvaiExternalStreamRef (6.1.7), pvaiOutputIntentScheme (6.2.2), pvaiInfoXmpDateMismatch (6.7.3), pvaiMarkInfoMissing (6.8.2.2 Level A), pvaiAnnotationApDictViolation (6.5.3), pvaiEmbeddedFileMissingAFRelationship (PDF/A-3 Annex E.2) и pvaiJpeg2000Violation (PDF/A-2 6.2.8.3). Раунд 5 добавляет pvaiCidFontMissingCidToGidMap (6.3.3.2), pvaiSubsetMissingCharSet (6.3.5), pvaiSubsetMissingCidSet (6.3.5), pvaiWidgetActionForbidden (6.6.1) и pvaiOptionalContentAsKey (PDF/A-2 6.9). Раунд 6 добавляет pvaiNeedsRenderingPresent (PDF/A-2 6.4.2), pvaiDestOutputProfileRef (PDF/A-3 6.2.3), pvaiEmbeddedFileMissingUF (PDF/A-3 6.8), pvaiXmpPacketBytesAttr (6.7.5) и pvaiAnnotationToggleNoView (PDF/A-2 6.3.2). Раунд 7 (v1.73.0) добавляет слой объектной модели Pdfium: pvaiPdfiumFontNotEmbedded (6.3.4, для каждого шрифта FPDFFont_GetIsEmbedded) и pvaiPdfiumUnicodeMapError (6.3.8, для каждого символа FPDFText_HasUnicodeMapError); их выставляет TPdf.ValidatePdfA, а не автономная побайтовая ValidatePdfACompliance. Раунд 8 (v1.74.0) добавляет pvaiPermissionsViolation (6.1.12), pvaiTransActionForbidden (PDF/A-2 6.5.1) и pvaiPdfiumObjectTransparency (PDF/A-1 6.4 через FPDFPageObj_HasTransparency). Раунд 9 (v1.75.0) добавляет pvaiIntegerImplementationLimit (PDF/A-2 6.1.13), pvaiBlendModeNotWhitelisted (PDF/A-2 6.2.10) и pvaiHexStringOddDigits (6.1.6). Раунд 10 (v1.76.0) добавляет pvaiNameNotValidUtf8 (PDF/A-2 6.1.8), pvaiInlineImageLzwForbidden (PDF/A-2 6.1.10) и pvaiTrueTypeDifferencesForbidden (6.3.7). Раунд 11 (v1.77.0) добавляет pvaiPdfiumNotDefGlyph (PDF/A-2 6.2.11.8, объектная модель Pdfium), pvaiWordBreakMissing (Level A 6.8.3.2) и pvaiLinkActionMissingTarget (6.6.3)pvaiMissingXmpMetadata означает, что ключ /Metadata каталога отсутствует, нечитаем или не разрешается в словарь-поток с /Type /Metadata и /Subtype /XMLpvaiPdfA1Pdf15Structure сообщает о документах PDF/A-1, содержащих потоки перекрёстных ссылок или потоки объектов PDF 1.5; для PDF/A-2 и PDF/A-3 эти структуры остаются допустимымиpvaiInlineImageLzwForbidden применяется к фильтрам встроенных изображений в каждой части PDF/A: PDF/A-1 отвергает /LZWDecode, а PDF/A-2 / PDF/A-3 дополнительно отвергают значения фильтров /LZW, /LZWDecode и /Crypt у встроенных изображенийpvaiImageDictionaryViolation также покрывает встроенные изображения PDF/A-2 и PDF/A-3 со значением true у /I или /Interpolate в дополнение к нарушениям словаря Image XObject /Alternates, /OPI и /Interpolate truepvaiAnnotationApDictViolation покрывает как искажённые словари внешнего вида аннотаций, чья запись /AP содержит ключи кроме /N, так и аннотации, которым словарь внешнего вида требуется, но отсутствуетpvaiInfoXmpValueMismatch сообщает о присутствующем значении Info, чьё отображённое свойство XMP отсутствует, имеет неверную форму RDF-контейнера, отличается как текст Unicode, содержит недопустимую дату или представляет другой момент UTCConformance является реальным уровнем PDF/A, а Issues пустValidatePdfA работает только на чтение — документ оно не меняет, и вызывать его повторно безопасно. Используйте его перед передачей PDF в архивную систему, чтобы показать оператору несоответствия. Для частой проверки «какой это уровень?», не требующей списка проблем, предпочитайте более лёгкое свойство PdfAConformance
Conformance = pacNone и пустым массивом Issues
uses System.TypInfo;
var
Outcome: TPdfAValidationResult;
Issue: TPdfAValidationIssue;
begin
Pdf1.FileName := 'C:\Incoming\report.pdf';
Pdf1.Active := True;
Outcome := Pdf1.ValidatePdfA;
Memo1.Lines.Add('Level: ' + GetEnumName(TypeInfo(TPdfAConformance),
Ord(Outcome.Conformance)));
for Issue in Outcome.Issues do
Memo1.Lines.Add('- ' + GetEnumName(TypeInfo(TPdfAValidationIssue), Ord(Issue)));
end;