function ValidatePdfR: TPdfRValidationResult;
ValidatePdfR percorre o documento aberto em busca dos marcadores de formato de arquivo definidos pela ISO 23504-1:2020:
%PDF-raster-x.y perto do fim do arquivo (§5)%PDF-1.4, %PDF-1.5, %PDF-1.6 ou %PDF-1.7 (§6.2.2) para arquivos não criptografados, ou %PDF-2.0 (§6.2.3) para arquivos criptografados/Type /ObjStm — §6.2.4)pvriProhibitedCatalogEntry)pvriProhibitedInfoEntry)/ID no trailerO resultado é um registro TPdfRValidationResult:
prc1 (marcador PDF/R-1 encontrado), prcNone (nenhum marcador) ou prcUnknown (falha na análise ou documento inativo)TPdfRValidationIssues com zero ou mais valores: pvriMissingVersionMarker, pvriBadHeader, pvriObjStmPresent, pvriProhibitedCatalogEntry, pvriProhibitedInfoEntry, pvriInfoXmpMismatch, pvriMissingXmpMetadata, pvriMissingTrailerIdValidatePdfR é uma inspeção somente leitura do formato de arquivo. A conformidade PDF/R-1 tem requisitos estruturais rígidos que este método não verifica — estrutura Contents por página, formato MediaBox, filtros permitidos, referências indiretas com geração zero e layout de faixa. Combine-o com um validador PDF/R do TWAIN Working Group para essas verificações em nível de conteúdo
%PDF-raster- como substring em qualquer ponto do arquivo. A ISO 23504-1 §5 especifica que o marcador fica entre o dicionário de trailer e startxref, mas o validador aceita outros locais para ser tolerante com geradores levemente fora do padrãoConformance = prcUnknown e um conjunto Issues vazio%PDF-2.0), portanto o validador NÃO marca a chave /Encrypt do trailer como não conformidade. PDFs de origem criptografados sob PDF 1.x ainda falhariam por causa da checagem do cabeçalho
uses System.TypInfo;
var
Outcome: TPdfRValidationResult;
Issue: TPdfRValidationIssue;
begin
Pdf1.FileName := 'C:\Incoming\scan.pdf';
Pdf1.Active := True;
Outcome := Pdf1.ValidatePdfR;
Memo1.Lines.Add('Level: ' + GetEnumName(TypeInfo(TPdfRConformance),
Ord(Outcome.Conformance)));
for Issue in Outcome.Issues do
Memo1.Lines.Add('- ' + GetEnumName(TypeInfo(TPdfRValidationIssue), Ord(Issue)));
end;