Windows FDF/XFDF 교환

Windows 파일 작업과 hpdf_document_execute_json_v1은 네이티브 scalar 코덱과 bounded 리치 XHTML/CSS 코덱으로 fdf와 xfdf용 forms.export와 forms.import를 구현합니다

파일 작업

{
  "schemaVersion": 1, "type": "forms.import", "format": "xfdf",
  "input": "source.pdf", "output": "filled.pdf", "password": "owner",
  "formDataInput": "values.xfdf",
  "fonts": {
    "regular": "DejaVuSans.ttf", "bold": "DejaVuSans-Bold.ttf",
    "italic": "DejaVuSans-Oblique.ttf", "boldItalic": "DejaVuSans-BoldOblique.ttf"
  },
  "budget": {"memoryBytes": 268435456, "outputBytes": 134217728,
    "timeMilliseconds": 60000, "resultBytes": 16777216}
}

forms.export는 input, output, format과 선택적 password를 쓰며 formDataInput이나 fonts가 필요 없습니다. 파일 작업은 대상 옆에 독점적인 candidate를 확보해 플러시하고 닫은 뒤 bounded 결과 JSON을 검증하고 마지막에 대상을 원자적으로 교체합니다

폰트 누락, 잘못된 입력, 인증이나 정책 실패, 한도 소진, 발행 실패 시 기존 온전한 대상이 보존됩니다. output은 하드링크를 포함해 PDF나 폼 데이터 입력을 별칭으로 가리켜서는 안 됩니다

이름 있는 폰트 패밀리

forms.import는 operation 루트에서 1~16개 레이블 배열 형태의 fontFamilies를 받고, 생략하면 기존 단일 패밀리 프로필과 fontFamily 콜백 레이블이 유지됩니다

"fontFamilies": ["DejaVu Sans", "DejaVu Serif Condensed"],
"fonts": {
  "DejaVu Sans": {
    "regular": "DejaVuSans.ttf", "bold": "DejaVuSans-Bold.ttf",
    "italic": "DejaVuSans-Oblique.ttf", "boldItalic": "DejaVuSans-BoldOblique.ttf"
  },
  "DejaVu Serif Condensed": {
    "regular": "DejaVuSerifCondensed.ttf", "bold": "DejaVuSerifCondensed-Bold.ttf",
    "italic": "DejaVuSerifCondensed-Italic.ttf", "boldItalic": "DejaVuSerifCondensed-BoldItalic.ttf"
  }
}

파일 작업에서 fonts는 정확한 구성 레이블을 키로 하는 객체를 담고, fontFamilies가 없으면 기존 직접 스타일 경로 객체를 유지합니다. 실제 패밀리/스타일 프로그램만 읽으며 선택된 모든 폰트 바이트는 operation 예산을 함께 씁니다

Windows V1 콜백에서는 기존 폰트 콜백이 실제 정규화된 UTF-8 구성 레이블과 선택된 스타일을 하나씩 받습니다. 네 스타일을 모두 쓰는 패밀리 두 개는 콜백 레코드를 바꾸지 않고 실제 프로그램 요청 여덟 번을 만듭니다

레이블의 ASCII 문자는 대소문자를 무시하고 비교하며 다른 Unicode 문자는 정확히 비교합니다. 레이블은 서로 달라야 하고 비어 있으면 안 되며 최대 128 UTF-16 코드 유닛이고, 앞뒤 공백, 제어 문자, 짝 없는 서러게이트, CSS 인용/구분 문장부호를 넣을 수 없습니다

첫 번째 구성 패밀리가 scalar 텍스트와 상속된 리치 스타일의 기본값입니다. 기본적으로 CSS font-family 목록은 네이티브 코덱의 first-known-family 선택을 따릅니다

opt-in인 fallbackFontFamilies=true는 순서가 있는 인라인 CSS font-family 후보를 유지하고 그래펨 단위 폴백을 위해 실제 구성된 면/스타일 프로그램을 로드합니다. typed 후보, 콜백 로딩, 리치 전용 범위는 Windows 제공 패밀리 리치 폰트 폴백을 참고하세요

적용 결과는 richXMLProfile inline-xhtml-font-families-v1, 구성된 fontFamilies 배열, family·style·bytes를 담은 실제 fontFamilyStyles 객체를 보고합니다. fontStyles는 기존 객체 배열 타입을 유지하며 스타일별 바이트 수를 요약하고, fontBytes는 모든 실제 프로그램을 셉니다

배열이 없으면 richXMLProfile은 inline-xhtml-v1입니다. scalar와 원본 typed 리치가 섞인 forms.fill은 아래에서 설명하는 별도 original-typed-runs-v1 바인딩을 쓰고, 예전 작업 폰트 콜백 확장은 별도 후속 작업으로 남습니다

버전화된 Windows C 콜백

hotpdf_abi_form_data.h를 포함하고 hpdf_form_data_operation_v1을 채운 뒤 operation.struct_size를 전체 크기로 설정하고, 바뀌지 않은 operation 접두부를 hpdf_document_execute_json_v1에 넘깁니다

선택적 폰트 콜백은 UTF-8 패밀리 바이트와 스타일(0 regular, 1 bold, 2 italic, 3 boldItalic)을 받고 실제 폰트 프로그램용 완전한 hpdf_io_v1 읽기 테이블을 반환합니다. 리치 데이터가 네 스타일을 모두 쓴다면 프로그램 네 개를 모두 제공하세요

scalar 데이터는 regular 프로그램을 요청하고 fontFamily 기본값은 DejaVu Sans입니다. 넘겨준 폰트 IO 콜백과 사용자 데이터는 연산이 돌아올 때까지 유효해야 하며, 0이 아닌 콜백 상태는 고정되어 폴백 재시도 없이 그대로 전파됩니다

forms.import에서는 InputIO가 FDF/XFDF를 공급하고 대상 문서는 이미 로드되어 있어야 합니다. OutputIO는 candidate PDF를, ResultIO는 bounded JSON을 받습니다. forms.export는 기존 V1 레코드를 쓰며 FDF/XFDF를 OutputIO에 기록합니다

Windows hpdf_document_load_from_io는 돌아오기 전에 입력 전체를 불변의 owned 소스로 복사하므로, 호출자가 교체하거나 덧붙여도 활성 로드 리비전과 이후 폼 데이터 출력은 바뀌지 않습니다

owned 소스는 배경 랜덤 읽기에 별도의 동기화된 핸들을 쓰기 때문에 프리페치가 순차 발행 커서를 움직일 수 없고, candidate 문서는 소스가 파괴되기 전에 배경 리더를 해제합니다

활성 컨텍스트는 출력과 결과 콜백이 모두 성공하고 마지막 취소 체크포인트를 지나야 바뀝니다. 콜백 실패나 취소는 candidate를 버리고 이전 문서와 owned 소스를 유지합니다

어떤 콜백은 나중 콜백이 실패하기 전에 이미 candidate 바이트를 받았을 수 있습니다. 호출자는 execute 함수가 HPDF_STATUS_OK를 반환한 뒤에만 자체 출력 대상을 커밋해야 합니다

기존 V1 레코드 레이아웃과 익스포트 심볼은 그대로이고, 이 Windows 확장은 네이티브 Linux의 공개 콜백 확장과 별개입니다

바인딩된 진입점은 파일 작업 프로세서와 hpdf_document_execute_json_v1입니다. 예전 HPDFDocRunJob 콜백 레코드와 일반 ExecuteLoadedOperation은 이 단계에서 폰트 확장을 얻지 않고, Pascal 호출자는 명시적 트랜잭션 클래스를 쓸 수 있습니다

필드, 리치 텍스트, 정책

지원되는 값에는 중첩 Unicode 텍스트 이름, 체크박스와 라디오 익스포트 이름, 다중 선택 배열, 변경 없는 읽기 전용 값이 있습니다. /V와 /RV, 실제 AP 리소스는 함께 저장되고, 모르는 필드와 필수 필드 제약은 트랜잭션을 실패시킵니다

리치 교환은 문서화된 bounded XHTML/CSS 프로필과 실제 제공된 스타일 폰트를 쓰며, 임의 HTML이나 모든 CSS, 제한 없는 리치 XML 지원을 주장하지 않습니다

서명된 AES R5/R6 갱신은 원본 접두부 전체, 암호화 매개변수, 영구 암호화 식별자, 기존 CMS 서명을 유지합니다. 바뀌지 않은 scalar·리치 임포트는 현재 커밋된 리비전과 바이트 단위로 같습니다

서명된 폼 갱신 전에 기존 CMS 무결성과 ESS 서명자 바인딩을 인증하고, P2/P3 채우기는 실제 제약 안에서만 허용됩니다. P1, FieldMDP 잠금, 변경된 읽기 전용 필드는 발행을 거부합니다

signaturePolicy는 불리언 requireCAdES, requireTimestamp, requireAdobeRevocationInfo, requireTimestampRevocation을 받습니다. trustedCAFile, timestampCAFile, timestampCRLFile, revocationCAFile은 NUL이 없는 문자열이어야 하고 요청한 검사에 호출자의 명시적 신뢰를 지정합니다

C 콜백 옵션은 maxEvidenceBytes와 maxEvidenceObjects로 서명 증거에도 상한을 둡니다. 신뢰 검증은 기본 서명 무결성 검사와 별개입니다

formData는 maxBytes, maxFields, maxObjects, maxDepth, maxValues, maxValueCodeUnits, maxTotalCodeUnits을 낮출 수 있고, 이 양의 정수들은 작업 가용 용량으로 추가로 잘립니다. budget의 objectCount와 pageCount는 candidate 문서를 제한합니다

budget.timeMilliseconds는 연산 데드라인을 정하고 Windows C 콜백은 추가로 더 타이트한 elapsedMilliseconds도 받습니다. 취소는 현재 그래프 준비, 폼 디코딩, 폰트 읽기, CMS 검사, candidate 로딩, 발행 도중에 폴링됩니다

기능 조회는 실제 포맷, 스타일, 불변 입력, 트랜잭션 콜백 동작을 보고합니다. 매핑된 어노테이션 XFDF 교환은 별도로 구현되어 있고, 임베드된 FDF 파일, 더 넓은 액션, 증분 FDF 문서는 아직 미완성입니다

관련 항목

혼합 scalar와 원본 typed 리치 채우기는 파일 작업과 execute-json-v1을 통해 같은 인증된 Windows candidate 라이프사이클을 씁니다

트랜잭션 클래스, 현재 그래프 준비, 네이티브 폼 데이터

내부 스타일 시트는 상한이 적용된 selector, importance, specificity, 소스 순서를 실제 가져온 rich 값과 저장 모양에 적용합니다. 반복되는 동등 import와 실패한 공개는 기존 트랜잭션 원본 바이트와 no-op 동작을 유지합니다

richTextResources는 기존 트랜잭션과 폰트 바인딩을 사용해 실제 Windows 파일 작업과 execute-json-v1 가져오기에 링크되고 가져온 CSS를 공급합니다