TVt2sChunkKind = (vtckInlinePdf, vtckAttachmentPdf, vtckIccProfile);
TPdfVT2sChunk = record
Kind: TVt2sChunkKind;
Bytes: TBytes;
FileName: AnsiString;
end;
TPdfVT2sChunks = array of TPdfVT2sChunk;
TAnsiStrings = array of AnsiString;
TPdfVT2sValidationResult = record
Issues: TPdfVT2sValidationIssues;
function IsCompliant: Boolean;
end;
TPdfVTPrintingConditionSource = (vtpcsNone, vtpcsEmbeddedProfile, vtpcsMimeProfile);
TPdfVTPrintingConditionEvidence = record
PartIndex: Integer;
Conformance: TPdfVTConformance;
PdfXVersion: AnsiString;
OutputIntentObjectNumber: Integer;
OutputConditionIdentifier: AnsiString;
RegistryName: AnsiString;
Source: TPdfVTPrintingConditionSource;
ProfileFileName: AnsiString;
ProfileName: AnsiString;
ProfileColorSpace: AnsiString;
ProfileByteSize: Int64;
ProfileMd5: string;
ProfileSha256: string;
ProfileVersion: string;
ProfileDeviceClass: string;
ProfilePcs: string;
ProfileComponentCount: Integer;
Resolved: Boolean;
ProfileValid: Boolean;
DPart: TPdfVTDPartEvidence;
end;
TPdfVT2sValidationReport = record
Validation: TPdfVT2sValidationResult;
PrintingConditions: TPdfVTPrintingConditionEvidenceArray;
end;
procedure BuildPdfVT2sStream(const Chunks: TPdfVT2sChunks; Dest: TStream);
function ValidatePdfVT2sStream(Source: TStream): TPdfVT2sValidationResult;
function InspectPdfVT2sStream(Source: TStream): TPdfVT2sValidationReport;
FPdfPdfvtMime implementa o transporte PDF/VT-2s definido no Anexo da ISO 16612-2, em que um documento PDF/VT mais seu conteúdo PDF reutilizável referenciado e o perfil ICC são empacotados como um único stream MIME multipart
Diferente do caminho TPdf.SaveAsPdfVT que grava um arquivo PDF/VT-1 autônomo, esta unidade opera puramente sobre streams de bytes e nunca carrega o pdfium.dll, de modo que pode executar em servidores headless e pipelines de lote
BuildPdfVT2sStream monta os chunks em ordem e emite o header StreamVersion, os limites de partes e os headers Content-Type / Content-Disposition de cada parte; ValidatePdfVT2sStream analisa um stream existente de volta e informa desvios estruturais, de condição de impressão e de ICC como um conjunto de questões tipado
InspectPdfVT2sStream retorna o mesmo resultado de compatibilidade mais evidências para cada parte PDF/VT, incluindo conformidade PDF/VT, base PDF/X, identidade do OutputIntent, proveniência do perfil, MD5 e SHA-256, metadados ICC brutos e contagens de páginas e de registros de destinatários do DPart
Cada parte PDF é primeiro classificada com ValidatePdfVTCompliance; anexos reutilizáveis apenas PDF/X permanecem elegíveis como alvos de referência, mas são excluídos das comparações de hierarquia PDF/VT e de condição de impressão
O empacotamento do perfil segue a base do arquivo: PDF/VT-1 com PDF/X-4 e PDF/VT-2 com PDF/X-5g usam um DestOutputProfile embutido, enquanto PDF/VT-2 com PDF/X-4p ou PDF/X-5pg usam DestOutputProfileRef resolvido para uma parte MIME ICC anterior
| Value | MIME role |
|---|---|
vtckInlinePdf | Um documento PDF/VT carregado como uma parte inline application/pdf; pelo menos um é exigido |
vtckAttachmentPdf | Uma parte de conteúdo PDF reutilizável referenciada pelo documento inline, carregada como um attachment com um nome de arquivo |
vtckIccProfile | Uma parte de perfil ICC (application/vnd.iccprofile) fornecida como um attachment com um nome de arquivo |
| Type | Purpose |
|---|---|
TPdfVT2sChunks | Array dinâmico de chunks MIME ordenados fornecidos a BuildPdfVT2sStream |
TAnsiStrings | Array dinâmico de nomes de arquivo usado ao validar referências a arquivos externos no PDF inline |
TPdfVT2sValidationIssues | Conjunto de constatações TPdfVT2sValidationIssue retornado pela validação |
TPdfVTPrintingConditionSource | Origem das evidências do perfil: vtpcsNone quando não resolvido, vtpcsEmbeddedProfile para um stream DestOutputProfile embutido, vtpcsMimeProfile para um DestOutputProfileRef resolvido a partir de uma parte MIME ICC |
TPdfVTPrintingConditionEvidence | Classificação PDF/VT e PDF/X por parte, OutputIntent, origem do perfil, identidade, digest, header ICC e dados do DPart |
TPdfVT2sValidationReport | Resultado detalhado retornado por InspectPdfVT2sStream sem alterar o layout do resultado legado |
| Value | Reported when |
|---|---|
vtmviNotMultipart | O stream não é um contêiner MIME multipart |
vtmviMissingStreamVersion | O header StreamVersion de PDF/VT exigido está ausente |
vtmviStreamVersionValue | O valor de StreamVersion não é o 1 esperado |
vtmviStreamVersionAfterCt | StreamVersion aparece depois da linha Content-Type em vez de antes dela |
vtmviMissingBoundary | O parâmetro boundary do Content-Type está ausente |
vtmviNoInlinePdf | Nenhuma parte PDF/VT inline está presente |
vtmviInlinePdfNotPdfVT | A parte inline não é declarada como PDF/VT |
vtmviIccProfileBadDisposition | Uma parte de perfil ICC não é um attachment |
vtmviAttachmentMissingFilename | Uma parte attachment carece do nome de arquivo exigido |
vtmviInlineHasFilename | A parte PDF inline carrega um nome de arquivo, o que não é permitido |
vtmviNodeNameListMismatch | Dois arquivos PDF/VT no stream expõem valores NodeNameList diferentes |
vtmviRecordLevelMismatch | Os níveis de registro do DPart são inconsistentes ao longo do contêiner |
vtmviForwardReference | Um attachment é referenciado antes de aparecer no stream |
vtmviBoundaryInvalidChar | A string boundary contém caracteres não permitidos pela RFC 2046 |
vtmviDuplicateFilename | Dois attachments MIME expõem o mesmo nome de arquivo, com distinção de maiúsculas e minúsculas |
vtmviOutputIntentAmbiguous | Uma parte PDF tem zero ou múltiplos OutputIntents GTS_PDFX autoritativos |
vtmviOutputProfilePackagingMismatch | O OutputIntent tem ambas as formas de perfil, nenhuma forma, ou uma forma incompatível com a base PDF/X-4, PDF/X-4p, PDF/X-5g ou PDF/X-5pg |
vtmviOutputProfileReferenceInvalid | Um DestOutputProfileRef omite metadados exigidos, uma especificação de arquivo de URL, ou usa um ColorantTable proibido |
vtmviReferencedPartWrongType | O nome de arquivo referenciado resolve para uma parte MIME que não é um perfil ICC |
vtmviIccProfileInvalid | O header ICC, o tamanho declarado, a assinatura, a tabela de tags ou o espaço de cor de processo suportado é inválido |
vtmviIccChecksumMismatch | O CheckSum decodificado de 16 bytes difere do MD5 do arquivo ICC completo |
vtmviIccVersionMismatch | Os quatro bytes ICCVersion declarados diferem dos bytes 8 a 11 do header ICC |
vtmviIccColorSpaceMismatch | ProfileCS difere dos bytes 16 a 19 do header ICC ou não é GRAY, RGB ou CMYK |
vtmviIccProfileNameMismatch | ProfileName não corresponde a nenhum valor de locale válido do profileDescriptionTag |
vtmviPrintingConditionUnresolved | O OutputIntent autoritativo, o identificador ou a dependência ICC externa não podem ser resolvidos |
vtmviPrintingConditionMismatch | As partes PDF/VT divergem quanto ao OutputConditionIdentifier, à presença ou ao valor do RegistryName, ou ao espaço de cor de processo |
vtmviIccDeviceClassMismatch | Um perfil de destino embutido ou externo não é um perfil de dispositivo de saída prtr |
ValidatePdfVT2sStream em qualquer stream produzido por BuildPdfVT2sStream em testes de ida e volta, ou em contêineres PDF/VT-2s autorais externos antes do processamentoTPdfVT2sValidationResult.IsCompliant retorna True somente quando o conjunto Issues está vazio
var Chunks: TPdfVT2sChunks;
begin
SetLength(Chunks, 2);
Chunks[0].Kind := vtckIccProfile;
Chunks[0].FileName := 'profile.icc';
Chunks[0].Bytes := IccBytes;
Chunks[1].Kind := vtckInlinePdf;
Chunks[1].Bytes := InlinePdfBytes;
BuildPdfVT2sStream(Chunks, MimeStream);
end;