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 附属書で定義される PDF/VT-2s 転送形式を実装します。PDF/VT ドキュメントと、そこから参照される再利用可能な PDF コンテンツおよび ICC プロファイルを、単一の MIME multipart ストリームとしてパッケージ化します
スタンドアロンの PDF/VT-1 ファイルを書き出す TPdf.SaveAsPdfVT の経路とは異なり、このユニットは純粋にバイトストリーム上で動作し pdfium.dll を決して読み込まないため、ヘッドレスサーバーやバッチパイプラインで実行できます
BuildPdfVT2sStream はチャンクを順に組み立て、StreamVersion ヘッダー、パート境界、パートごとの Content-Type / Content-Disposition ヘッダーを生成します。ValidatePdfVT2sStream は既存のストリームを逆解析し、構造、印刷条件、ICC の逸脱を型付きの問題セットとして報告します
InspectPdfVT2sStream は同じ互換結果に加えて、PDF/VT 適合、PDF/X ベース、OutputIntent の識別情報、プロファイルの由来、MD5 と SHA-256、生の ICC メタデータ、DPart のページと受信者レコード数といった、各 PDF/VT パートのエビデンスを返します
各 PDF パートは最初に ValidatePdfVTCompliance で分類されます。PDF/X のみの再利用可能な添付は引き続き参照先として有効ですが、PDF/VT の階層と印刷条件の比較からは除外されます
プロファイルのパッケージ化はファイルベースに従います。PDF/X-4 をベースとする PDF/VT-1 と PDF/X-5g をベースとする PDF/VT-2 は埋め込みの DestOutputProfile を使用し、PDF/X-4p または PDF/X-5pg をベースとする PDF/VT-2 は、前の方にある ICC MIME パートへ解決される DestOutputProfileRef を使用します
| 値 | MIME 役割 |
|---|---|
vtckInlinePdf | インラインの application/pdf パートとして運ばれる PDF/VT ドキュメントです。少なくとも 1 つが必要です |
vtckAttachmentPdf | インラインドキュメントから参照される再利用可能な PDF コンテンツパートです。ファイル名付きの attachment として運ばれます |
vtckIccProfile | ファイル名付きの添付として供給される ICC プロファイルパート (application/vnd.iccprofile) です |
| 型 | 目的 |
|---|---|
TPdfVT2sChunks | BuildPdfVT2sStream に供給される、順序付き MIME チャンクの動的配列です |
TAnsiStrings | インライン PDF 内の外部ファイル参照を検証するときに使われる、動的なファイル名配列です |
TPdfVT2sValidationIssues | 検証が返す TPdfVT2sValidationIssue の検出結果セットです |
TPdfVTPrintingConditionSource | プロファイルエビデンスの由来です。未解決のときは vtpcsNone、埋め込み DestOutputProfile ストリームは vtpcsEmbeddedProfile、ICC MIME パートから解決された DestOutputProfileRef は vtpcsMimeProfile です |
TPdfVTPrintingConditionEvidence | パートごとの PDF/VT と PDF/X の分類、OutputIntent、プロファイルの由来、識別情報、ダイジェスト、ICC ヘッダー、DPart の情報です |
TPdfVT2sValidationReport | 従来の結果レイアウトを変えずに InspectPdfVT2sStream が返す詳細結果です |
| 値 | 報告される状況 |
|---|---|
vtmviNotMultipart | ストリームが multipart MIME コンテナではありません |
vtmviMissingStreamVersion | 必須の PDF/VT StreamVersion ヘッダーが存在しません |
vtmviStreamVersionValue | StreamVersion 値が期待される 1 ではありません |
vtmviStreamVersionAfterCt | StreamVersion が Content-Type 行の前ではなく後に現れています |
vtmviMissingBoundary | Content-Type の boundary パラメータが欠落しています |
vtmviNoInlinePdf | インラインの PDF/VT パートが存在しません |
vtmviInlinePdfNotPdfVT | インラインパートが PDF/VT として宣言されていません |
vtmviIccProfileBadDisposition | ICC プロファイルパートが attachment ではありません |
vtmviAttachmentMissingFilename | 添付パートに必須のファイル名がありません |
vtmviInlineHasFilename | インライン PDF パートが、許可されないファイル名を運んでいます |
vtmviNodeNameListMismatch | ストリーム内の 2 つの PDF/VT ファイルが異なる NodeNameList 値を公開しています |
vtmviRecordLevelMismatch | DPart のレコードレベルがコンテナ全体で一貫していません |
vtmviForwardReference | 添付が、ストリーム内に出現する前に参照されています |
vtmviBoundaryInvalidChar | boundary 文字列に RFC 2046 で許可されない文字が含まれています |
vtmviDuplicateFilename | 2 つの MIME 添付が、大文字小文字を区別して同じファイル名を公開しています |
vtmviOutputIntentAmbiguous | PDF パートに、権威ある GTS_PDFX OutputIntent が 0 個または複数あります |
vtmviOutputProfilePackagingMismatch | OutputIntent に両方のプロファイル形式、またはどちらの形式もなく、あるいは PDF/X-4、PDF/X-4p、PDF/X-5g、PDF/X-5pg のベースと非互換の形式があります |
vtmviOutputProfileReferenceInvalid | DestOutputProfileRef に必須メタデータや URL ファイル指定がなく、または禁止された ColorantTable を使用しています |
vtmviReferencedPartWrongType | 参照されたファイル名が解決した MIME パートが ICC プロファイルではありません |
vtmviIccProfileInvalid | ICC ヘッダー、宣言サイズ、シグネチャ、タグテーブル、サポートされるプロセス色空間のいずれかが無効です |
vtmviIccChecksumMismatch | デコードされた 16 バイトの CheckSum が ICC ファイル全体の MD5 と一致しません |
vtmviIccVersionMismatch | 宣言された 4 バイトの ICCVersion が ICC ヘッダーの 8 から 11 バイト目と一致しません |
vtmviIccColorSpaceMismatch | ProfileCS が ICC ヘッダーの 16 から 19 バイト目と一致しないか、GRAY、RGB、CMYK のいずれでもありません |
vtmviIccProfileNameMismatch | ProfileName が有効な profileDescriptionTag のロケール値のどれにも一致しません |
vtmviPrintingConditionUnresolved | 権威ある OutputIntent、識別子、外部 ICC 依存を解決できません |
vtmviPrintingConditionMismatch | PDF/VT パート間で OutputConditionIdentifier、RegistryName の有無や値、プロセス色空間が一致しません |
vtmviIccDeviceClassMismatch | 埋め込みまたは外部の出力プロファイルが、出力デバイスの prtr プロファイルではありません |
BuildPdfVT2sStream が生成したストリームや、処理前に外部作成の PDF/VT-2s コンテナに対して ValidatePdfVT2sStream を呼び出してくださいTPdfVT2sValidationResult.IsCompliant は Issues セットが空のときにのみ True を返します
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;