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 el transporte PDF/VT-2s definido en el Anexo de ISO 16612-2, donde un documento PDF/VT junto con su contenido PDF reutilizable referenciado y su perfil ICC se empaquetan como un único flujo MIME multiparte
A diferencia de la ruta TPdf.SaveAsPdfVT que escribe un archivo PDF/VT-1 independiente, esta unidad opera puramente sobre flujos de bytes y nunca carga pdfium.dll, de modo que puede ejecutarse en servidores sin interfaz y en pipelines por lotes
BuildPdfVT2sStream ensambla los fragmentos en orden y emite la cabecera StreamVersion, los límites de las partes y las cabeceras Content-Type / Content-Disposition de cada parte; ValidatePdfVT2sStream vuelve a analizar un flujo existente e informa de las desviaciones estructurales, de condiciones de impresión y de ICC como un conjunto de problemas tipado
InspectPdfVT2sStream devuelve el mismo resultado de compatibilidad más evidencia de cada parte PDF/VT, incluida la conformidad PDF/VT, la base PDF/X, la identidad del OutputIntent, la procedencia del perfil, el MD5 y el SHA-256, los metadatos ICC en bruto y los recuentos de páginas y registros de destinatarios de DPart
Cada parte PDF se clasifica primero con ValidatePdfVTCompliance; los adjuntos reutilizables exclusivamente PDF/X siguen siendo objetivos de referencia elegibles, pero quedan excluidos de la jerarquía PDF/VT y de las comparaciones de condiciones de impresión
El empaquetado del perfil sigue la base del archivo: PDF/VT-1 con PDF/X-4 y PDF/VT-2 con PDF/X-5g usan un DestOutputProfile incrustado, mientras que PDF/VT-2 con PDF/X-4p o PDF/X-5pg usan DestOutputProfileRef resuelto a una parte MIME ICC anterior
| Valor | Rol MIME |
|---|---|
vtckInlinePdf | Un documento PDF/VT llevado como una parte application/pdf en línea; se requiere al menos uno |
vtckAttachmentPdf | Una parte de contenido PDF reutilizable referenciada por el documento en línea, llevada como attachment con un nombre de archivo |
vtckIccProfile | Una parte de perfil ICC (application/vnd.iccprofile) suministrada como adjunto con un nombre de archivo |
| Tipo | Propósito |
|---|---|
TPdfVT2sChunks | Matriz dinámica de fragmentos MIME ordenados suministrados a BuildPdfVT2sStream |
TAnsiStrings | Matriz dinámica de nombres de archivo usada al validar referencias a archivos externos en el PDF en línea |
TPdfVT2sValidationIssues | Conjunto de hallazgos TPdfVT2sValidationIssue devueltos por la validación |
TPdfVTPrintingConditionSource | Origen de la evidencia del perfil: vtpcsNone cuando no está resuelto, vtpcsEmbeddedProfile para un flujo DestOutputProfile incrustado, vtpcsMimeProfile para un DestOutputProfileRef resuelto desde una parte MIME ICC |
TPdfVTPrintingConditionEvidence | Clasificación PDF/VT y PDF/X por parte, OutputIntent, origen del perfil, identidad, resumen, cabecera ICC y datos de DPart |
TPdfVT2sValidationReport | Resultado detallado devuelto por InspectPdfVT2sStream sin cambiar la disposición del resultado heredado |
| Valor | Se informa cuando |
|---|---|
vtmviNotMultipart | El flujo no es un contenedor MIME multiparte |
vtmviMissingStreamVersion | Falta la cabecera StreamVersion de PDF/VT requerida |
vtmviStreamVersionValue | El valor de StreamVersion no es el 1 esperado |
vtmviStreamVersionAfterCt | StreamVersion aparece después de la línea Content-Type en lugar de antes |
vtmviMissingBoundary | Falta el parámetro boundary del Content-Type |
vtmviNoInlinePdf | No hay ninguna parte PDF/VT en línea presente |
vtmviInlinePdfNotPdfVT | La parte en línea no está declarada como PDF/VT |
vtmviIccProfileBadDisposition | Una parte de perfil ICC no es un adjunto |
vtmviAttachmentMissingFilename | Una parte adjunta carece del nombre de archivo requerido |
vtmviInlineHasFilename | La parte PDF en línea lleva un nombre de archivo, lo cual no está permitido |
vtmviNodeNameListMismatch | Dos archivos PDF/VT del flujo exponen valores NodeNameList distintos |
vtmviRecordLevelMismatch | Los niveles de registro de DPart son inconsistentes en todo el contenedor |
vtmviForwardReference | Se referencia un adjunto antes de que aparezca en el flujo |
vtmviBoundaryInvalidChar | La cadena boundary contiene caracteres no permitidos por RFC 2046 |
vtmviDuplicateFilename | Dos adjuntos MIME exponen el mismo nombre de archivo, que distingue mayúsculas de minúsculas |
vtmviOutputIntentAmbiguous | Una parte PDF tiene cero o varios OutputIntents GTS_PDFX autoritativos |
vtmviOutputProfilePackagingMismatch | El OutputIntent tiene ambas formas de perfil, ninguna de ellas, o una forma incompatible con la base PDF/X-4, PDF/X-4p, PDF/X-5g o PDF/X-5pg |
vtmviOutputProfileReferenceInvalid | Un DestOutputProfileRef omite metadatos requeridos, una especificación de archivo URL, o usa un ColorantTable prohibido |
vtmviReferencedPartWrongType | El nombre de archivo referenciado resuelve a una parte MIME que no es un perfil ICC |
vtmviIccProfileInvalid | La cabecera ICC, el tamaño declarado, la firma, la tabla de etiquetas o el espacio de color de proceso admitido no son válidos |
vtmviIccChecksumMismatch | El CheckSum decodificado de 16 bytes difiere del MD5 del archivo ICC completo |
vtmviIccVersionMismatch | Los cuatro bytes ICCVersion declarados difieren de los bytes 8 a 11 de la cabecera ICC |
vtmviIccColorSpaceMismatch | ProfileCS difiere de los bytes 16 a 19 de la cabecera ICC o no es GRAY, RGB ni CMYK |
vtmviIccProfileNameMismatch | ProfileName no coincide con ningún valor de configuración regional válido del profileDescriptionTag |
vtmviPrintingConditionUnresolved | El OutputIntent autoritativo, el identificador o la dependencia ICC externa no pueden resolverse |
vtmviPrintingConditionMismatch | Las partes PDF/VT discrepan en OutputConditionIdentifier, en la presencia o el valor de RegistryName, o en el espacio de color de proceso |
vtmviIccDeviceClassMismatch | Un perfil de destino incrustado o externo no es un perfil de dispositivo de salida prtr |
ValidatePdfVT2sStream sobre cualquier flujo producido por BuildPdfVT2sStream en pruebas de ida y vuelta, o sobre contenedores PDF/VT-2s creados externamente antes de procesarlosTPdfVT2sValidationResult.IsCompliant devuelve True solo cuando el conjunto Issues está vacío
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;