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 implementiert den im ISO 16612-2 Annex definierten PDF/VT-2s-Transport, bei dem ein PDF/VT-Dokument samt seiner referenzierten wiederverwendbaren PDF-Inhalte und des ICC-Profils als einzelner MIME-Multipart-Stream verpackt wird
Anders als der Pfad TPdf.SaveAsPdfVT, der eine eigenständige PDF/VT-1-Datei schreibt, arbeitet diese Unit rein auf Byteströmen und lädt niemals pdfium.dll, sodass sie in Headless-Servern und Batch-Pipelines laufen kann
BuildPdfVT2sStream setzt die Chunks in Reihenfolge zusammen und gibt den StreamVersion-Header, Teilgrenzen sowie Content-Type-/Content-Disposition-Header je Teil aus; ValidatePdfVT2sStream parst einen bestehenden Stream zurück und meldet strukturelle, Druckbedingungs- und ICC-Abweichungen als typisierte Problem-Menge
InspectPdfVT2sStream liefert dasselbe Kompatibilitätsergebnis plus Belege für jeden PDF/VT-Teil, einschließlich PDF/VT-Konformität, PDF/X-Basis, OutputIntent-Identität, Profil-Herkunft, MD5 und SHA-256, rohe ICC-Metadaten sowie DPart-Seiten- und Empfängerdatensatz-Zählungen
Jeder PDF-Teil wird zunächst mit ValidatePdfVTCompliance klassifiziert; nur-PDF/X-wiederverwendbare Anhänge bleiben geeignete Referenzziele, werden aber von der PDF/VT-Hierarchie und den Druckbedingungs-Vergleichen ausgeschlossen
Die Profil-Verpackung folgt der Dateibasis: PDF/VT-1 mit PDF/X-4 und PDF/VT-2 mit PDF/X-5g verwenden ein eingebettetes DestOutputProfile, während PDF/VT-2 mit PDF/X-4p oder PDF/X-5pg ein DestOutputProfileRef verwendet, das zu einem früheren ICC-MIME-Teil aufgelöst wird
| Wert | MIME-Rolle |
|---|---|
vtckInlinePdf | Ein PDF/VT-Dokument als Inline-application/pdf-Teil; mindestens einer ist erforderlich |
vtckAttachmentPdf | Ein vom Inline-Dokument referenzierter wiederverwendbarer PDF-Inhaltsteil, übergeben als attachment mit Dateinamen |
vtckIccProfile | Ein ICC-Profil-Teil (application/vnd.iccprofile), als Anhang mit Dateinamen übergeben |
| Typ | Zweck |
|---|---|
TPdfVT2sChunks | Dynamisches Array geordneter MIME-Chunks, das an BuildPdfVT2sStream übergeben wird |
TAnsiStrings | Dynamisches Dateinamen-Array, verwendet beim Validieren externer Dateireferenzen im Inline-PDF |
TPdfVT2sValidationIssues | Menge der TPdfVT2sValidationIssue-Befunde, die die Validierung zurückgibt |
TPdfVTPrintingConditionSource | Herkunft der Profilbelege: vtpcsNone bei unaufgelöstem Zustand, vtpcsEmbeddedProfile für einen eingebetteten DestOutputProfile-Stream, vtpcsMimeProfile für ein aus einem ICC-MIME-Teil aufgelöstes DestOutputProfileRef |
TPdfVTPrintingConditionEvidence | PDF/VT- und PDF/X-Klassifizierung je Teil, OutputIntent, Profilquelle, Identität, Digest, ICC-Header und DPart-Fakten |
TPdfVT2sValidationReport | Detailliertes Ergebnis von InspectPdfVT2sStream, ohne das klassische Ergebnislayout zu verändern |
| Wert | Wann gemeldet |
|---|---|
vtmviNotMultipart | Der Stream ist kein Multipart-MIME-Container |
vtmviMissingStreamVersion | Der erforderliche PDF/VT-StreamVersion-Header fehlt |
vtmviStreamVersionValue | Der StreamVersion-Wert ist nicht der erwartete 1 |
vtmviStreamVersionAfterCt | StreamVersion erscheint nach der Content-Type-Zeile statt vor ihr |
vtmviMissingBoundary | Der Content-Type-boundary-Parameter fehlt |
vtmviNoInlinePdf | Kein Inline-PDF/VT-Teil ist vorhanden |
vtmviInlinePdfNotPdfVT | Der Inline-Teil ist nicht als PDF/VT deklariert |
vtmviIccProfileBadDisposition | Ein ICC-Profil-Teil ist kein Anhang |
vtmviAttachmentMissingFilename | Ein Anhangsteil hat den erforderlichen Dateinamen nicht |
vtmviInlineHasFilename | Der Inline-PDF-Teil trägt einen Dateinamen, was nicht erlaubt ist |
vtmviNodeNameListMismatch | Zwei PDF/VT-Dateien im Stream geben unterschiedliche NodeNameList-Werte an |
vtmviRecordLevelMismatch | DPart-Datensatzebenen sind innerhalb des Containers widersprüchlich |
vtmviForwardReference | Ein Anhang wird referenziert, bevor er im Stream erscheint |
vtmviBoundaryInvalidChar | Der Boundary-String enthält Zeichen, die RFC 2046 nicht erlaubt |
vtmviDuplicateFilename | Zwei MIME-Anhänge geben denselben groß-/kleinschreibungssensitiven Dateinamen an |
vtmviOutputIntentAmbiguous | Ein PDF-Teil hat keinen oder mehrere maßgebliche GTS_PDFX-OutputIntents |
vtmviOutputProfilePackagingMismatch | Der OutputIntent hat beide Profilformen, keine Form oder eine zur PDF/X-4-, PDF/X-4p-, PDF/X-5g- oder PDF/X-5pg-Basis inkompatible Form |
vtmviOutputProfileReferenceInvalid | Ein DestOutputProfileRef lässt erforderliche Metadaten oder eine URL-Dateispezifikation weg oder verwendet eine unzulässige ColorantTable |
vtmviReferencedPartWrongType | Der referenzierte Dateiname löst zu einem MIME-Teil auf, der kein ICC-Profil ist |
vtmviIccProfileInvalid | Der ICC-Header, die deklarierte Größe, die Signatur, die Tag-Tabelle oder der unterstützte Prozessfarbraum ist ungültig |
vtmviIccChecksumMismatch | Die dekodierte 16-Byte-CheckSum weicht vom MD5 der vollständigen ICC-Datei ab |
vtmviIccVersionMismatch | Die deklarierten vier ICCVersion-Bytes weichen von ICC-Header-Bytes 8 bis 11 ab |
vtmviIccColorSpaceMismatch | ProfileCS weicht von ICC-Header-Bytes 16 bis 19 ab oder ist nicht GRAY, RGB oder CMYK |
vtmviIccProfileNameMismatch | ProfileName passt zu keinem gültigen profileDescriptionTag-Locale-Wert |
vtmviPrintingConditionUnresolved | Der maßgebliche OutputIntent, Bezeichner oder die externe ICC-Abhängigkeit kann nicht aufgelöst werden |
vtmviPrintingConditionMismatch | PDF/VT-Teile weichen bei OutputConditionIdentifier, RegistryName-Präsenz oder -Wert oder beim Prozessfarbraum ab |
vtmviIccDeviceClassMismatch | Ein eingebettetes oder externes Zielfeldprofil ist kein Ausgabegeräte-prtr-Profil |
ValidatePdfVT2sStream für jeden Stream auf, den BuildPdfVT2sStream in Round-trip-Tests erzeugt, oder für extern erstellte PDF/VT-2s-Container vor der VerarbeitungTPdfVT2sValidationResult.IsCompliant gibt nur dann True zurück, wenn die Issues-Menge leer ist
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;