텍스트와 벡터를 보존하는 로드 PDF의 PDF/A-4 변환

HPDFArchivalConversion은 보이는 폰트, 색 공간, 렌더링 리소스만으로 페이지 콘텐츠를 교체하지 않고 PDF/A-4를 충족할 수 있는 로드 문서용 보존 프로필을 제공합니다

컨버터는 원본 텍스트 연산자, 벡터 경로, 이미지, 페이지 지오메트리, 기존 OCR 텍스트 레이어를 유지하고, 보이는 normal 어노테이션·위젯 appearance를 벡터 Form XObject로 평탄화하며, 지원되는 메타데이터·구조 문제를 복구한 뒤 발행 전에 직렬화 결과를 검증합니다

이 프로필은 페이지를 래스터화하지 않습니다. OCR이 임시 인식 비트맵을 렌더링하고 보이지 않는 검색 가능 텍스트를 덧붙이는 경우에도 RasterizedPages는 0으로 유지됩니다

런타임 인수 검증은 Delphi Win32와 Win64를 다루고, Windows FPC는 소스를 새로 컴파일하며, 생성된 공개 헤더는 C++Builder Win32와 Win64x에서 컴파일됩니다

진입점

function HPDFConvertLoadedToPDFA4Preserving(Source: THotPDF;
  Destination: TStream; const SRGBProfile: TBytes;
  const Options: THPDFArchivalPreservationOptions;
  out Report: THPDFArchivalPreservationReport): Boolean;

function HPDFConvertLoadedToPDFA4PreservingFile(Source: THotPDF;
  const TargetFileName: string; const SRGBProfile: TBytes;
  const Options: THPDFArchivalPreservationOptions;
  out Report: THPDFArchivalPreservationReport): Boolean;

소스를 먼저 로드하고 호출자 소유 입력 스트림이 있다면 살려 두며, 연산 도중에는 문서를 컨버터가 단독으로 쓰게 하세요

Options := THPDFArchivalPreservationOptions.Default;
if not HPDFConvertLoadedToPDFA4PreservingFile(Source, TargetFileName,
  SRGBProfile, Options, Report) then
  raise Exception.Create(Report.Conversion.Diagnostic);

보존 증명

컨버터는 그래프 트랜잭션 아래에서 현재 편집된 소스 그래프를 스냅샷하고 직렬화 후 소스를 롤백한 다음, 독립적으로 로드한 클론에서 모든 변환 작업을 수행합니다

원본 디코딩 페이지 콘텐츠 스트림은 출력을 다시 로드한 뒤에도 바이트 단위로 같고 원본 페이지에서 원래 순서 그대로 도달 가능해야 합니다

페이지 리소스 트리와 남겨진 normal appearance 리소스 트리는 객체·재귀 한도를 두고 순회합니다. 임베드 폰트 프로그램, ToUnicode 맵, 이미지, ICC 프로필, 중첩 Form XObject는 원본 인코딩 페이로드를 유지하며 스트리밍 SHA-256으로 검증하고 출력 페이지에서 계속 도달 가능한지 검사합니다

독립 콘텐츠 스트림은 그래픽 상태 가드로 원본 페이지 연산자를 감싸고 덧붙인 appearance 연산자를 담아, 원본 콘텐츠 스트림을 다시 쓰게 되는 네이티브 단일 스트림 append 경로를 피합니다

TextAndVectorContentPreserved는 네이티브 출력 검증과 보존 검사를 모두 통과한 뒤에만 참이 되고, 변환이나 파일 발행이 실패하면 지워집니다

appearance 처리

기존 normal appearance를 제공하면 Unicode를 포함해 그 appearance에 이미 올바르게 표현된 임의의 임베드 폰트 텍스트를 지원합니다. 컨버터는 시스템 폰트로 대체하는 대신 그 appearance를 유지합니다

평탄화는 보이는 appearance를 유지하면서 어노테이션 상호작용, 편집 가능 필드, 계산, 액션, 서명 필드를 제거합니다. 영향받은 각 어노테이션과 합성된 각 appearance는 가능할 때 소스 페이지, 어노테이션 인덱스, 객체 번호를 담은 손실 항목을 만듭니다

색, 폰트, 명시적 손실

필수 ICC 인자는 기존 아카이브 검증기가 받아들이는 sRGB matrix/TRC 프로필입니다. 기존 output profile은 제공한 프로필과 디코딩 바이트까지 정확히 같아야 하고, 그렇지 않으면 기존 output condition을 재해석하는 일을 막기 위해 변환을 거절합니다

컨버터는 필요할 때만 sRGB PDF/A output intent를 더하고, 실제 직렬화기를 PDF 2.0 헤더에 맞추며, bounded 기본 PDF/A-4 메타데이터·구조 복구를 호출합니다

보이는 폰트 프로그램이 빠져 있어도 임베드하지 않고, 원본 텍스트를 재인코딩하지 않으며, DeviceCMYK 연산자 색을 바꾸지 않고, 기존 output condition을 교체하지 않고, 페이지 투명도를 비트맵으로 평탄화하지도 않습니다. 해소되지 않은 네이티브 preflight 지적은 발행을 거절합니다

암호화된 소스는 변환 전에 복호화해야 합니다. 이 프로필은 기본 PDF/A-4를 대상으로 하므로 서명 필드에는 명시적 AllowSignatureInvalidation, 기존 임베드 파일에는 명시적 RemoveEmbeddedFiles가 필요합니다

Losses는 서명 무효화, 임베드 파일 제거, 예전 Info 사전 제거, 금지된 catalog·presentation 메타데이터 제거도 보고합니다

기존 XMP는 지원될 때 유지됩니다. 메타데이터를 생성할 때는 지원되는 제목, 저자, 주제, 키워드 정보를 옮기지만 임의의 예전 Info 필드가 남는다는 보장은 없습니다

OCR과 예산

AddOCRToImagePages 기본값은 false입니다. 켜면 추출 가능한 텍스트가 없는 페이지를 인식해 원본 콘텐츠와 기존 OCR 레이어를 교체하지 않고 보이지 않는 텍스트를 덧붙입니다

OCREngine에 애플리케이션 엔진을 넣거나 nil로 두면 기본 제공 bounded ASCII OCR 엔진을 쓰며, 이 엔진의 언어·타이포그래피 커버리지는 기본 제공 인식 프로필의 그것입니다

OCROptions는 인식 해상도와 단어 예산을 제어하고, 컨버터는 skip-pages-with-text, 기존 OCR 레이어 유지, 새 optional-content 그룹 생략을 강제합니다

Limits는 페이지 수, 객체 수, 스테이징 출력 바이트, 개별 스트림 작업, 누적 스트림 작업, 취소, 동기 체크포인트에 THPDFArchivalConversionOptions.Default를 씁니다. 래스터 픽셀 한도는 OCR이 인식 비트맵을 렌더링할 때만 적용됩니다

추가 기본값은 손실 항목 1,024개, 추출 또는 예상 텍스트 코드 유닛 1,048,576개, 네이티브 검증 패스당 콘텐츠 토큰 4,000,000개입니다

리소스 페이로드 해싱은 인코딩된 바이트를 같은 스트림 작업 예산에 청구하고, 소스·출력 검증이 모두 누적 작업을 소비하므로 리소스 검증이 고정 64 KiB 해시 버퍼를 쓰더라도 큰 스캔 모음에는 MaxTotalDecodedBytes를 명시적으로 늘려야 할 수 있습니다

예산은 소스 로드 후에 적용되고 컨버터 소유 스냅샷과 스테이징 출력을 따로 묶습니다. 신뢰할 수 없는 입력을 받을 때는 로더 한도를 설정하세요

발행과 검증

스트림 API는 위치 0의 빈 시크 가능 대상을 요구하고 소스 별칭을 거절합니다. 스테이징 바이트는 다시 로드, 네이티브 검증, 보존 검사, 취소 검사가 모두 성공한 뒤에만 복사됩니다

대상 쓰기 실패는 최선의 리셋을 시도하지만 임의의 커스텀 스트림은 그 리셋을 거절할 수 있으므로, 원자적인 파일 발행에는 파일 진입점을 쓰세요

파일 API는 소스 별칭을 탐지하고 대상 옆에 단독 임시 파일을 만들어 플러시한 뒤, 모든 검사가 통과한 후에야 MoveFileEx로 대상을 교체합니다. 그 전에 실패하면 기존 대상을 유지하고 임시 파일을 제거합니다

InitialValidationIssues, Repair, Conversion.ValidationIssues, OCR 세부 정보, 스트림 개수, 추출 텍스트 개수, 명시적 손실은 검토용으로 그대로 남습니다

네이티브 검증은 지원되는 HotPDF PDF/A-4 규칙을 다룰 뿐 임의 PDF에 대한 일괄 인증이 아닙니다. 회귀 인수 검증은 여기에 독립적인 pypdf·MuPDF 검사와 생성된 appearance 및 네이티브 OCR 결과물에 대한 veraPDF PDF/A-4 검증을 더해 수행합니다

실제 코퍼스 회귀에는 임베드 폰트를 쓴 Word·도서 안내문과 380페이지짜리 중국어 스캔 모음이 있고, 폰트를 임베드하지 않고 DeviceCMYK 콘텐츠를 쓰는 무역 보고서는 명시적인 거절 케이스입니다

회귀 명령

powershell -File Tests/Delphi/Run-ArchivalPreservationTests.ps1 -Platform Win32
powershell -File Tests/Delphi/Run-ArchivalPreservationTests.ps1 -Platform Win64
python Tests/Delphi/Fixtures/ArchivalPreservation/verify_preserving_output.py
verapdf --format xml --flavour 4 Tests/Delphi/generated/ArchivalPreservation/appearance.pdf Tests/Delphi/generated/ArchivalPreservation/ocr.pdf Tests/Delphi/generated/ArchivalPreservation/native-appearance.pdf

Delphi 러너는 뷰어 실행을 억제하며 보존 회귀 픽스처와 기존 래스터 회귀 픽스처를 모두 포함합니다. 독립 veraPDF 인수 검증은 실제 PDF/A-4 검증 프로필을 씁니다

관련 항목

래스터 아카이브 변환은 네이티브 렌더링이 지원될 때 원본 텍스트와 벡터를 명시적으로 잃는 별도 프로필을 제공합니다