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/VT 적합성, PDF/X 기반, OutputIntent 식별 정보, 프로필 출처, MD5와 SHA-256, raw ICC 메타데이터, DPart 페이지 및 수신자 레코드 수의 증거를 반환합니다
각 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를 사용합니다
| Value | MIME role |
|---|---|
vtckInlinePdf | 인라인 application/pdf 파트로 실리는 PDF/VT 문서입니다. 최소 하나가 필요합니다 |
vtckAttachmentPdf | 인라인 문서가 참조하는 재사용 PDF 콘텐츠 파트로, 파일 이름과 함께 attachment로 실립니다 |
vtckIccProfile | 파일 이름과 함께 첨부로 공급되는 ICC 프로필 파트입니다(application/vnd.iccprofile) |
| Type | Purpose |
|---|---|
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이 반환하는 상세 결과입니다 |
| Value | Reported when |
|---|---|
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 | 스트림 안의 두 PDF/VT 파일이 서로 다른 NodeNameList 값을 노출합니다 |
vtmviRecordLevelMismatch | DPart 레코드 레벨이 컨테이너 전체에서 일관되지 않습니다 |
vtmviForwardReference | 첨부가 스트림에 나타나기 전에 참조됩니다 |
vtmviBoundaryInvalidChar | boundary 문자열에 RFC 2046이 허용하지 않는 문자가 들어 있습니다 |
vtmviDuplicateFilename | 두 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 | 참조된 파일 이름이 ICC 프로필이 아닌 MIME 파트로 해석됩니다 |
vtmviIccProfileInvalid | ICC 헤더, 선언된 크기, 시그니처, 태그 테이블, 지원되는 프로세스 색 공간 중 하나가 잘못되었습니다 |
vtmviIccChecksumMismatch | 디코딩된 16바이트 CheckSum이 전체 ICC 파일의 MD5와 다릅니다 |
vtmviIccVersionMismatch | 선언된 네 ICCVersion 바이트가 ICC 헤더의 8~11번째 바이트와 다릅니다 |
vtmviIccColorSpaceMismatch | ProfileCS가 ICC 헤더의 16~19번째 바이트와 다르거나 GRAY, RGB, CMYK 중 하나가 아닙니다 |
vtmviIccProfileNameMismatch | ProfileName이 유효한 profileDescriptionTag locale 값 어느 것과도 일치하지 않습니다 |
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;