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 canalizaciones por lotes
BuildPdfVT2sStream ensambla los fragmentos en orden y emite el encabezado StreamVersion, los límites de las partes y los encabezados Content-Type / Content-Disposition de cada parte; ValidatePdfVT2sStream vuelve a analizar un flujo existente e informa las desviaciones estructurales, de condición 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, incluidos la conformidad PDF/VT, la base PDF/X, la identidad del OutputIntent, la procedencia del perfil, MD5 y SHA-256, los metadatos ICC sin procesar y los conteos de páginas y de registros de destinatarios del DPart
Cada parte PDF se clasifica primero con ValidatePdfVTCompliance; los adjuntos reutilizables de solo PDF/X siguen siendo objetivos de referencia elegibles, pero quedan excluidos de las comparaciones de jerarquía PDF/VT y de condición 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 usa 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 | Arreglo dinámico de fragmentos MIME ordenados suministrados a BuildPdfVT2sStream |
TAnsiStrings | Arreglo dinámico de nombres de archivo usado 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 se resuelve, 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, encabezado ICC y datos del 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 el encabezado StreamVersion requerido de PDF/VT |
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 de adjunto 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 en el flujo exponen valores NodeNameList distintos |
vtmviRecordLevelMismatch | Los niveles de registro del DPart son inconsistentes en el contenedor |
vtmviForwardReference | Se hace referencia a 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, distinguiendo mayúsculas de minúsculas |
vtmviOutputIntentAmbiguous | Una parte PDF tiene cero o múltiples OutputIntents GTS_PDFX autoritativos |
vtmviOutputProfilePackagingMismatch | El OutputIntent tiene ambas formas de perfil, ninguna forma, o una forma incompatible con la base PDF/X-4, PDF/X-4p, PDF/X-5g o PDF/X-5pg |
vtmviOutputProfileReferenceInvalid | Un DestOutputProfileRef omite los 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 | El encabezado ICC, el tamaño declarado, la firma, la tabla de etiquetas o el espacio de color de proceso admitido no es válido |
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 del encabezado ICC |
vtmviIccColorSpaceMismatch | ProfileCS difiere de los bytes 16 a 19 del encabezado 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 | No se puede resolver el OutputIntent autoritativo, el identificador o la dependencia ICC externa |
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 en pruebas de ida y vuelta de cualquier flujo producido por BuildPdfVT2sStream, o en 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;