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, ISO 16612-2 Annex'te tanımlanan PDF/VT-2s taşımayı uygular; burada bir PDF/VT belgesi, başvurduğu yeniden kullanılabilir PDF içeriği ve ICC profili tek bir MIME multipart akışı olarak paketlenir
Tek başına bir PDF/VT-1 dosyası yazan TPdf.SaveAsPdfVT yolundan farklı olarak bu birim tamamen bayt akışları üzerinde çalışır ve pdfium.dll'yi asla yüklemez; böylece headless sunucularda ve toplu iş hatlarında çalışabilir
BuildPdfVT2sStream parçaları sırayla birleştirir ve StreamVersion başlığını, parça sınırlarını ve parça başına Content-Type / Content-Disposition başlıklarını üretir; ValidatePdfVT2sStream mevcut bir akışı geriye doğru ayrıştırır ve yapısal, baskı koşulu ve ICC sapmalarını türlü bir sorun kümesi olarak bildirir
InspectPdfVT2sStream aynı uyumluluk sonucunu artı her PDF/VT parçası için kanıtı döndürür; PDF/VT uyumu, PDF/X tabanı, OutputIntent kimliği, profil kökeni, MD5 ve SHA-256, ham ICC üst verisi ve DPart sayfa ile alıcı kaydı sayıları dahildir
Her PDF parçası önce ValidatePdfVTCompliance ile sınıflandırılır; yalnızca PDF/X olan yeniden kullanılabilir ekleri geçerli başvuru hedefi olmaya devam eder ama PDF/VT hiyerarşisi ve baskı koşulu karşılaştırmalarının dışında tutulur
Profil paketleme dosya tabanını izler: PDF/X-4 ile PDF/VT-1 ve PDF/X-5g ile PDF/VT-2 gömülü bir DestOutputProfile kullanır; PDF/X-4p ya da PDF/X-5pg ile PDF/VT-2 ise daha önceki bir ICC MIME parçasına çözülen DestOutputProfileRef kullanır
| Value | MIME role |
|---|---|
vtckInlinePdf | Satır içi bir application/pdf parçası olarak taşınan PDF/VT belgesi; en az biri zorunludur |
vtckAttachmentPdf | Satır içi belgenin başvurduğu, bir dosya adıyla attachment olarak taşınan yeniden kullanılabilir PDF içerik parçası |
vtckIccProfile | Dosya adıyla bir ek olarak sağlanan ICC profil parçası (application/vnd.iccprofile) |
| Type | Purpose |
|---|---|
TPdfVT2sChunks | BuildPdfVT2sStream işlevine verilen sıralı MIME parçalarının dinamik dizisi |
TAnsiStrings | Satır içi PDF'teki harici dosya başvuruları doğrulanırken kullanılan dinamik dosya adı dizisi |
TPdfVT2sValidationIssues | Doğrulamanın döndürdüğü TPdfVT2sValidationIssue bulguları kümesi |
TPdfVTPrintingConditionSource | Profil kanıtının kökeni: çözülemediğinde vtpcsNone, gömülü bir DestOutputProfile akışı için vtpcsEmbeddedProfile, bir ICC MIME parçasından çözülen DestOutputProfileRef için vtpcsMimeProfile |
TPdfVTPrintingConditionEvidence | Parça başına PDF/VT ve PDF/X sınıflandırması, OutputIntent, profil kaynağı, kimlik, özet, ICC başlığı ve DPart bilgileri |
TPdfVT2sValidationReport | Eski sonuç düzenini değiştirmeden InspectPdfVT2sStream tarafından döndürülen ayrıntılı sonuç |
| Value | Reported when |
|---|---|
vtmviNotMultipart | Akış bir multipart MIME kapsayıcısı değilse |
vtmviMissingStreamVersion | Zorunlu PDF/VT StreamVersion başlığı yoksa |
vtmviStreamVersionValue | StreamVersion değeri beklenen 1 değilse |
vtmviStreamVersionAfterCt | StreamVersion, Content-Type satırından önce yerine sonra görünüyorsa |
vtmviMissingBoundary | Content-Type boundary parametresi eksikse |
vtmviNoInlinePdf | Hiç satır içi PDF/VT parçası yoksa |
vtmviInlinePdfNotPdfVT | Satır içi parça PDF/VT olarak bildirilmemişse |
vtmviIccProfileBadDisposition | Bir ICC profil parçası ek (attachment) değilse |
vtmviAttachmentMissingFilename | Bir ek parçada zorunlu dosya adı eksikse |
vtmviInlineHasFilename | Satır içi PDF parçası izin verilmeyen bir dosya adı taşıyorsa |
vtmviNodeNameListMismatch | Akıştaki iki PDF/VT dosyası farklı NodeNameList değerleri açığa çıkarıyorsa |
vtmviRecordLevelMismatch | DPart kayıt düzeyleri kapsayıcı boyunca tutarsızsa |
vtmviForwardReference | Bir eke, akışta görünmesinden önce başvuruluyorsa |
vtmviBoundaryInvalidChar | Boundary dizesi RFC 2046'nın izin vermediği karakterler içeriyorsa |
vtmviDuplicateFilename | İki MIME eki aynı, büyük/küçük harfe duyarlı dosya adını açığa çıkarıyorsa |
vtmviOutputIntentAmbiguous | Bir PDF parçasında sıfır ya da birden çok yetkili GTS_PDFX OutputIntent varsa |
vtmviOutputProfilePackagingMismatch | OutputIntent'te her iki profil biçimi, hiçbiri ya da PDF/X-4, PDF/X-4p, PDF/X-5g, PDF/X-5pg tabanıyla uyumsuz bir biçim varsa |
vtmviOutputProfileReferenceInvalid | Bir DestOutputProfileRef zorunlu üst veriyi ya da URL dosya belirtimini atlıyorsa ya da yasak bir ColorantTable kullanıyorsa |
vtmviReferencedPartWrongType | Başvurulan dosya adı ICC profili olmayan bir MIME parçasına çözülüyorsa |
vtmviIccProfileInvalid | ICC başlığı, bildirilen boyut, imza, tag tablosu ya da desteklenen proses renk uzayı geçersizse |
vtmviIccChecksumMismatch | Çözülen 16 baytlık CheckSum, ICC dosyasının tamamının MD5'inden farklıysa |
vtmviIccVersionMismatch | Bildirilen dört ICCVersion baytı, ICC başlığındaki 8-11. baytlardan farklıysa |
vtmviIccColorSpaceMismatch | ProfileCS, ICC başlığındaki 16-19. baytlardan farklıysa ya da GRAY, RGB, CMYK'dan biri değilse |
vtmviIccProfileNameMismatch | ProfileName geçerli hiçbir profileDescriptionTag yerel ayar değeriyle eşleşmiyorsa |
vtmviPrintingConditionUnresolved | Yetkili OutputIntent, tanımlayıcı ya da harici ICC bağımlılığı çözülemiyorsa |
vtmviPrintingConditionMismatch | PDF/VT parçaları OutputConditionIdentifier, RegistryName varlığı veya değeri ya da proses renk uzayı üzerinde anlaşmıyorsa |
vtmviIccDeviceClassMismatch | Gömülü ya da harici hedef profil bir çıktı aygıtı prtr profili değilse |
BuildPdfVT2sStream ile üretilen herhangi bir akışı gidiş-dönüş testinde ya da işlemeye almadan önce harici yazılmış PDF/VT-2s kapsayıcılarında ValidatePdfVT2sStream ile doğrulayınTPdfVT2sValidationResult.IsCompliant, yalnızca Issues kümesi boşken True döndürür
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;