function ValidatePdfVT: TPdfVTValidationResult;
ValidatePdfVT обходит открытый документ в поисках маркеров уровня формата файла, определённых ISO 16612-2:2010:
pdfvtid:GTS_PDFVTVersion (§6.3 Table 2) и pdfvtid:GTS_PDFVTModDatepdfvtid:GTS_PDFVTModDate и xmp:ModifyDate (§6.3 NOTE 1)pdfxid:GTS_PDFXVersion — PDF/VT-1 должен быть PDF/X-4 (§6.2.1), тогда как PDF/VT-2 должен использовать одну из основ файлового набора PDF/X-4p, PDF/X-5g или PDF/X-5pg (§6.2.2)pdfaExtension:schemas для обоих пространств имён, pdfvtid и pdfxid/DPartRoot в каталоге с пригодным деревом DPart из §6.5: /DPartRootNode, совместимый с XML NMTOKEN /NodeNameList, ссылки на родителей, массив массивов /DParts, диапазоны /Start//End листьев и постраничные ссылки /DPart должны покрывать дерево страниц ровно один раз в глубинном порядкеGTS_XID, GTS_Scope и GTS_Env, косвенный RecordLevel у DPartRoot, используемый областью Record, и границу «только PDF/VT-2s» для области StreamFlateDecode, потоки страниц или Form XObject с разрешением каждого операнда Do через действующие унаследованные ресурсы, чтобы поддерживать счётчики SingleUse, видимость ресурсов и единоличное владение получателем для области RecordIntent изображения, требуемая изолированная группа прозрачности Group с цветовым пространством смешивания и помеченные операторы необязательного содержимого в прямом или вложенном содержимом Form/OutputIntents в каталоге с OutputIntent, имеющим встроенный /DestOutputProfile или внешний /DestOutputProfileRef, подходящий для основы PDF/X/ID в трейлере и отсутствие /Encrypt (PDF/X запрещает шифрование)xmp:CreateDate и xmp:ModifyDate в XMP для согласованности Info / XMPРезультат — запись TPdfVTValidationResult:
pvc1 (маркер PDF/VT-1), pvc2 (маркер PDF/VT-2), pvcNone (маркера PDF/VT нет) или pvcUnknown (маркер присутствует, но файловая версия не распознана)TPdfVTValidationIssues с нулём или более значений проблем маркеров, DPart, наследования PDF/X, повторно используемых объектов и инкапсуляцииpvviGtsScopeInvalidValue, pvviGtsScopeRecordWithoutRecordLevel, pvviGtsXidNotUuid, pvviGtsEnvMissing, pvviGtsXidInvalidType, pvviGtsEnvInvalidType, pvviGtsScopeStreamInVT1, pvviGtsScopeSingleUseRepeated, pvviGtsScopeRecordCrossesRecords и pvviGtsResourceNotVisiblepvviGtsEncapsulatedInvalidType, pvviGtsEncapsulatedMissingScope, pvviGtsEncapsulatedImageMissingIntent, pvviGtsEncapsulatedGroupInvalid и pvviGtsEncapsulatedOptionalContentConformance является реальным уровнем PDF/VT, а Issues пустValidatePdfVT работает только на чтение. Он проверяет маркеры формата файла, семантику выбранного дерева DPart, область и инкапсуляцию повторно используемых XObject, точное сопоставление баз PDF/VT и PDF/X, а также свойства XMP независимо от того, записаны ли они элементами или RDF-атрибутами. Дополняйте его preflight-движком PDF/X для полной проверки уровня содержимого, а для PDF/VT-2 — InspectPdfVT2sStream или другим полным проверяющим файловых наборов. PDF/VT-2s — уровень соответствия MIME-потока, чья версия сигнализируется заголовком MIME-потока в ISO 16612-2 Annex A, а не файловым значением pdfvtid:GTS_PDFVTVersion
pvviMissingDPartRoot возникает, когда в каталоге нет пригодной иерархии /DPartRoot либо дерево нарушает требования §6.5: искажённые массивы /DParts, смешение /Start и /DParts, дублированное владение потомками, недопустимые имена /NodeNameList или несовпадение глубины, диапазоны страниц, не следующие порядку дерева страниц, одностраничные диапазоны, повторяющие /Start как /End, или ссылки /DPart со страниц, не указывающие на покрывающий листовой DPartFlateDecode; потоки содержимого с другими или цепочечными фильтрами остаются доступными специализированным полным preflight-движкамpvviModDateMismatch возникает, только когда присутствуют и различаются значениями оба pdfvtid:GTS_PDFVTModDate и xmp:ModifyDate; SaveAsPdfVT всегда записывает их с одним значениемConformance = pvcUnknown и пустым набором Issues
uses System.TypInfo;
var
Outcome: TPdfVTValidationResult;
Issue: TPdfVTValidationIssue;
begin
Pdf1.FileName := 'C:\Incoming\statements.pdf';
Pdf1.Active := True;
Outcome := Pdf1.ValidatePdfVT;
Memo1.Lines.Add('Level: ' + GetEnumName(TypeInfo(TPdfVTConformance),
Ord(Outcome.Conformance)));
for Issue in Outcome.Issues do
Memo1.Lines.Add('- ' + GetEnumName(TypeInfo(TPdfVTValidationIssue), Ord(Issue)));
end;