변경 내역
릴리스 이력
PDFlibPas 라이브러리의 버전 이력입니다. 최신순으로 나열되며, 각 릴리스는 프로젝트 릴리스 정책에 따라 시맨틱 버저닝을 준수합니다.
언어:English (US)English (UK)Español (España)Español (Latinoamérica)DeutschFrançaisItaliano日本語Português (Brasil)NederlandsSvenskaPolskiTürkçe한국어العربيةРусский简体中文繁體中文
v3.56.42 2026-05-27
- v3.56.41에서 도입한 버퍼 기반 AES-256 복호화 경로를 수정하여 호출자가 암호문 버퍼를 제공한 동일한
AnsiString에 복호화 결과를 다시 대입해도 액세스 위반이 발생하지 않도록 했습니다. - 일반 API의
LoadFromFile,Encrypt,SaveToFile, 다시 로드,Decrypt,SaveToFile워크플로가 큰 로드된 PDF에서도 다시 완료되며, 복사량을 줄인 AES-CBC 복호화 최적화는 유지됩니다. - 저장 중 암호화된 stream을 되돌릴 때 입력 버퍼와 결과 대상이 같은 경우를 위한 AES 회귀 테스트를 추가했으며, 이전 실패를 드러낸 504 KB 대형 페이로드도 포함했습니다.
v3.56.41 2026-05-27
- 전체 일반 객체 그래프를 구축하지 않고 페이지 수와 변경 없는 파일 복사본이 필요한 Direct Access 워크플로를 위해
TPDFlib.DACopyFile을 추가했습니다. - 버퍼 기반 AES-CBC 복호화 경로를 추가하고 로드된 문자열과 stream 복호화에 사용하여 AES-256 복호화를 최적화했으며, 큰 암호화 stream에서 추가 암호문 복사를 줄였습니다.
- Delphi
HugeFileBenchmarkdemo에direct-copy행과 대용량 파일 집중 실행을 위한--ops,--skip필터를 추가했습니다.
v3.56.40 2026-05-26
- Delphi 및 C++Builder
HelloWorld데모는 이제 동일한 빌드 및 실행 흐름을 유지하면서 문서 정보, 선택된 표준 글꼴 출력, 스타일이 적용된 제목 블록, 간단한 벡터 그리기, 다음 단계 안내를 포함하는 더 풍부한 시작 PDF를 만듭니다. - Delphi 및 C++Builder 데모의 모든 노트를 브라우저 친화적인
Readme.html페이지로 교체했습니다. 암호, 제한된 파일, 서명 결과에 대한 보조 노트도 포함되며, 데모 인덱스는 이제 사용자를 HTML 노트로 안내합니다.
v3.56.39 2026-05-26
- 직접 파일 API 저장 경로는 이제 교차 참조 조회 테이블을 선형으로 생성하므로, 객체 수가 매우 많거나 페이지 트리가 조밀한 PDF에서
DASaveAsFile및 관련 직접 저장 경로가 훨씬 빨라집니다. - 최적화된 writer는 동일한 free-object chain 의미를 유지하면서 전체 xref 생성 중 반복적인 객체 번호 스캔을 피합니다. 이를 통해 공개 API나 출력 계약을 변경하지 않고 대형 직접 저장 워크플로를 개선합니다.
v3.56.38 2026-05-26
- 일반 API 암호화 출력을 수정하여
Encrypt가 AES-256 보안 데이터를 쓰기 전에 trailer/ID를 생성하거나 유지하도록 했습니다. 따라서 암호화된 PDF를 다시 로드해도EncryptionStatus로 감지할 수 있습니다. - 일반 API의
LoadFromFile,Encrypt,SaveToFile, 다시 로드,Decrypt,SaveToFile워크플로는 이제 명시적Decrypt전까지 암호화 상태를 유지하며, 큰 레거시 PDF에 대한 직접 파일 API 동작과 일치합니다.
v3.56.37 2026-05-26
TPDFlib.ComparePreflightReports가 추가되었습니다. 일반 텍스트 preflight 보고서를 줄 단위로 비교하고, 변동되는Generated:타임스탬프 줄은 무시하며, 안정적인 보고서 내용이 일치하면 빈 문자열을 반환합니다.- Delphi
PreflightReport데모는 이제 단일 파일 모드에서--compare <file>을 지원하며, 생성된 텍스트 보고서가 baseline과 다를 때 UTF-8.diff.txt보고서를 쓰고 종료 코드 2를 반환합니다.
v3.56.36 2026-05-26
- Delphi
PreflightReport데모는 이제--input-dir,--output-dir,--recursive를 사용한 디렉터리 일괄 실행을 지원하며, 각 PDF마다<basename>.preflight.<ext>형식의 보고서를 씁니다. - 일괄 모드는 각 원본 PDF, pass/fail 상태, 문제 수, 생성된 보고서 경로를 기록하는 UTF-8
preflight-summary.csv파일을 쓰며, 자동화를 위한 기존 종료 코드 계약은 유지됩니다.
v3.56.35 2026-05-26
ReportFormat = 3은TPDFlib.CreatePreflightReportEx와TPDFlib.SavePreflightReportEx에 CSV 출력을 추가하여 보고서 메타데이터, 선택된 각 준수 검사, 개별 문제 코드와 메시지, 최종 요약을 UTF-8 행으로 생성합니다.- Delphi
PreflightReport데모는 이제--format csv와--csv를 지원하므로 명령줄 preflight 실행 결과를 JSON 후처리나 텍스트 추출 없이 스프레드시트 또는 간단한 CI 파서에 전달할 수 있습니다.
v3.56.34 2026-05-26
- 형식 인식 API
TPDFlib.CreatePreflightReportEx및TPDFlib.SavePreflightReportEx를 추가하여 기존 텍스트 전용 보고서 API를 유지하면서 PDF/A 및 PDF/UA-1 preflight 보고서를 일반 텍스트, JSON 또는 독립 HTML로 생성할 수 있게 했습니다. - Delphi
PreflightReport데모는 이제--format text|json|html과--json,--html단축 옵션을 지원하므로 같은 명령줄 워크플로에서 사람이 읽는 보고서나 기계가 읽는 CI 산출물을 만들 수 있습니다.
v3.56.33 2026-05-26
TPDFlib.CreatePreflightReport및TPDFlib.SavePreflightReport를 추가하여 애플리케이션이 문자열 목록 핸들을 직접 열거하지 않고도 내장 PDF/A 및 PDF/UA-1 준수 검사에서 재사용 가능한 일반 텍스트 보고서를 생성할 수 있게 했습니다.- Delphi
PreflightReport데모는 이제 라이브러리 수준 보고서 API를 직접 호출하므로, 예제는 명령줄 워크플로, 선택된 검사, 첫 번째 문제 모드, 자동화에 적합한 종료 코드에 집중합니다.
v3.56.32 2026-05-26
- 새 Delphi 콘솔 데모
PreflightReport를 추가했습니다. 이 데모는CheckFileCompliance로 PDF/A 및 PDF/UA-1 검사를 실행하고,GetStringListCount와GetStringListItem으로 문제 목록을 열거한 뒤 일반 텍스트 preflight 보고서를 작성합니다. - 이 데모는
--input,--output,--pdfa,--pdfua,--both,--first-issue옵션과 자동화에 적합한 통과, 문제 발견, 런타임 오류 종료 코드를 지원합니다.
v3.56.31 2026-05-25
GetCustomKeys(2)는 이제 라이브러리에서 관리하는 Catalog 시스템 항목을 일관되게 숨기며, 여기에는 /OutputIntents, /Extensions, /Requirements, /Collection 및 /NeedsRendering가 포함됩니다.SetPDFAMode함수에 의해 생성되는 PDF/A 출력 설정은 더 이상 사용자 정의 카탈로그 키로 표시되지 않으며, 이를 통해 애플리케이션 메타데이터 열거를 PDF 규정 준수 구조와 분리할 수 있습니다.
v3.56.25 2026-05-23
- 작성 측면에서 GetPDFUADiagnostics이
MULTIPLE-H-CHILDREN:N문제와 일치하며, v3.56.24부터 판독 측면10044과 동일합니다. ISO 14289-1 §7.4.4은 각 태그 트리 노드에서 직접 하위 요소인 H가 하나 이상 있는 것을 금지합니다. 작성 측면 검사는 메모리 내 FStructElems 트리에 이러한 위반이 포함되어 있는지 확인합니다. - 새로운 중첩 CountMultipleHChildren 도우미 함수는 트리를 깊이 우선 방식으로 탐색하면서 각 레벨에서 H 하위 요소의 개수를 세어줍니다. 이 검사는 기존 LIST-STRUCT / LIST-NO-NUMBERING 탐색과 함께 실행되며 동일한 FStructElems 탐색 패턴을 사용합니다.
v3.56.24 2026-05-23
- PDF/UA-1 감사 기능에 ISO 14289-1 §7.4.4 H 태그 고유성 검사가 추가되었습니다.
10044은 하나 이상의 직접 하위 요소인 H를 가진 모든 구조 노드를 보고합니다. —은 사양이 엄격하게 구조화된 문서에서 이를 금지하며, 전체 구조 모드와 관계없이 모든 태그 트리 노드에 동일한 제약이 적용됩니다. 다른 § 7.4.4 SHALL (문서는 엄격하거나 약하게 구조화되어야 하며, 둘 다일 수 없음)은 문서 전체에 대한 휴리스틱이 필요하며, 의도적으로 이 감사에서는 제외되었습니다. - 새로운 전위 구조 트리 탐색기 (UAVisitStructNodeForHUniqueness / ScanStructTreeForHUniqueness)는 각 노드에서 직접 H 하위 요소의 개수를 세고 깊이 우선 방식으로 재귀합니다. 기존의 제목/목록/참조 탐색기와 동일한 K-형 디코더를 재사용합니다.
v3.56.23 2026-05-23
- PDF/UA-1 감사 기능에 ISO 14289-1 §7.21.6 글꼴 프로그램 검사 기능이 추가되었습니다. 이 기능은 v3.56.10에서 TrueType 파서가 제공되기 전까지는 처리하지 못했던 딕셔너리 계층 검사를 수행합니다.
10034은 TrueType 프로그램이 아닌, 내장된 SFNT cmap 테이블에 platformID=3, encodingID=0이라는 단 하나의 항목만 포함하는 경우를 보고합니다. — § 7.21.6절의 첫 번째 문단에서는 각 /Encoding.에 대해 적어도 하나의 비기호 cmap 하위 테이블이 필요하다고 명시하고 있습니다.10035은 Adobe Glyph List에 속하지 않은 글리프 이름을 가진 TrueType 배열을 보고합니다 (.notdef은 예외). — § 7.21.6절의 세 번째 문단에서는 모든 Differences 항목이 AGL에 포함되어야 한다고 명시하고 있습니다. - 새로운
Lib/PDFlibPDFUAFontInspect.pas은 허용적인 SFNT 테이블 디렉토리 탐색기 및 cmap 하위 테이블 디렉토리 파서를 구현합니다. 이전 인프라 커밋에서 스캐폴드로 추가된 4281개의 이름을 가진 Adobe Glyph List 테이블이 Differences 검사를 통해 연결되었습니다. SFNT (Type 1 PFB / PFA, OpenType 컬렉션, 임의의 쓰레기)로 파싱되지 않는 프로그램은 조용히 건너뜁니다. 감사 단계에서는 오탐보다 오탐이 선호됩니다.
v3.56.22 2026-05-23
- PDF/UA-1 감사 기능에 미디어 클립 데이터 검사 기능이 추가되었습니다.
10042은/S /MCD(선택 사항인/Type /MediaClip)으로 식별되는 미디어 클립 데이터 딕셔너리에 필요한/CTcontent-type 항목이 없는 경우를 보고합니다.10043은 동일한 딕셔너리에 필요한/Alt배열이 없는 경우를 보고합니다. ISO 32000-1 표 274에서는 두 키 모두 선택 사항으로 나열되어 있지만, ISO 14289-1 §7.18.6은 화면 리더가 내장된 멀티미디어에 대한 의미 있는 설명을 발표할 수 있도록 필수 항목으로 지정합니다. - 이것은 PDF /UA 심층 감사 계획의 6단계입니다 (
.superpowers/plans/2026-05-23-pdfua-deep-audit-plan.md). 이 기능은 글꼴 프로그램 또는 콘텐츠 스트림 파서에 의존하지 않으므로 v3.56.0..v3.56.13 시리즈 이후의 첫 번째 하위 클래스입니다.
v3.56.21 2026-05-23
- 새로운
SetSignProcessCommitmentType은 CAdEScommitment-type-indication서명 속성 (OID 1.2.840.113549.1.9.16.2.16, ETSI EN 319 122-1 v1.2.1 §5.2.3)을 PAdES-B-B SignerInfo 내부에 생성합니다. 1..6의 정수 코드를 받아 잘 알려진 ETSI 커밋 OIDsid-cti-ets-proofOfOrigin~id-cti-ets-proofOfCreation에 매핑하며, 0을 전달하면 지웁니다. 범위를 벗어난 코드는 거부됩니다. - 새로운
SetSignProcessSignaturePolicy은 CAdESsignature-policy-identifier서명 속성 (OID 1.2.840.113549.1.9.16.2.15, §5.2.9)을 생성합니다. 점-10진수 정책 OID, 정책 문서 해시(대문자-16진수 문자열), 그리고 다이제스트 알고리즘 코드(1=SHA-1, 2=SHA-256, 3=SHA-384, 4=SHA-512, 0=자동/SHA-256)를 받습니다. 이 속성은SignaturePolicyIdSEQUENCE을sigPolicyId+sigPolicyHash(OtherHashAlgAndValueSEQUENCE) 값으로 포함합니다. - 두 속성은 모두 SubFilter이
ETSI.CAdES.detached(PAdES-B-B 경로)일 때만 적용됩니다. 기존rgAuthAttr배열과 함께content-type및signing-certificate-v2을 확장합니다. PAdES 표 1의 d) 행은commitment-type-indication를 PDF 서명 딕셔너리/Reason항목과 함께 사용하는 것을 금지합니다. 호출자는 두 항목을 모두 설정하지 않도록 해야 합니다.
v3.56.20 2026-05-23
- 새로운
AddPAdESDSSVRI은 조립 중인 서명 VRI 하위 딕셔너리 항목을 DSS에 연결하여 ETSI EN 319 142-1 v1.2.1 절 5.4.2.3 검증 관련 정보 구조를 완성합니다. 이 항목은 서명 '의/Contents바이트의 대문자-16진수 SHA-1로 키가 지정되며,Cert/CRL/OCSP하위 배열은 0부터 시작하는 인덱스로 제공된 쉼표로 구분된 목록(예:"0,2,5")을 사용하여 해당 부모 DSS 스트림을 참조하여 채워집니다. - 기본
TSmartPDFDocument.AddPAdESDSSWithVRI은 각 인증/CRL/OCSP에 대해 생성된 스트림 객체 번호를 추적하고 이를 사용하여 VRI 하위 배열을 동일한 스트림으로의 간접 참조로 작성합니다. 이는 부모 DSS 배열이 이미 가리키는 스트림을 사용하여 사양 요구 사항을 충족합니다. VRI 항목이 부모 DSS 딕셔너리와 동일한 스토리지를 공유해야 합니다. 원래AddPAdESDSS항목은 VRI가 필요하지 않은 호출자의 경우에도 변경되지 않은 상태로 계속 작동합니다. - 각 서명별 VRI 하위 딕셔너리는 선택 사항인
/Type /VRI마커를 포함하므로Type태그를 사용하여 카탈로그를 탐색하는 도구가 부모 경로를 다시 확인하지 않고도 구조를 인식할 수 있습니다.
v3.56.19 2026-05-23
- 새로운 PAdES-B-T 워크플로우를 통해 RFC 3161 / RFC 5816 서명-타임스탬프(id-aa-signatureTimeStampToken, OID 1.2.840.113549.1.9.16.2.14)를 기존 PAdES-B-B 서명에 연결합니다.
NewPAdESSignatureTimeStampProcessFromFile/FromStream/FromString를 사용하여 서명된 PDF를 열고,SetPAdESSignatureTimeStampField은 필드 이름을 지정하고,GetPAdESSignatureValueHashHex는 서명자의signatureValue의GetPAdESSignatureValueHashHex-256 (또는 384 / 512) 해시를 반환하여 TSA에 제출하고,GetPAdESSignatureCMSBytes는 기존 CMS 페이로드를 노출하고,SetPAdESSignatureCMSBytes는 호출자가 선택한 CMS 라이브러리를 통해 조립된 증강된 CMS 바이트를 수락하고,EndPAdESSignatureTimeStampProcessToFile/ToStream/ToString는 새로운 CMS를 원래/Contents플레이스홀더에 삽입합니다. BuildPAdESSignatureTimeStampAttribute은 상태가 없는 도우미 함수로, TSA에서 발급된 TimeStampToken을 CMS 속성 SEQUENCE에 래핑하며,SignerInfo.unsignedAttrs이 예상하는 형식입니다. 따라서 이미 CMS 라이브러리를 가지고 있는 호출자는 OID + SET과 같은 복잡한 부분을 건너뛸 수 있습니다.- 새로운
SetSignProcessReserveContentsBytes은 초기 서명 시점에/Contents플레이스홀더를 확장하여 사후 증강된 CMS이 원래 예약 공간을 초과하지 않도록 합니다. 일반적으로 TSA에서 발급된 TimeStampTokens은 SignerInfo에 2-6 KB을 추가합니다. 여유 공간을 확보하려면 1024-8192를 전달하십시오. 충분한 여유 공간이 없으면 증강 호출은13(출력 오버플로우)을 반환합니다. - 라이브러리는 TSA HTTP 클라이언트를 제공하지 않습니다. 호출자는 TimeStampToken (일반적으로 TSP 요청의 30-50 줄 + HTTP POST)을 가져와 예를 들어 FreeTSA 또는 DigiCert에 대해 요청합니다. Windows ⟦P0010⟧
CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR은 원칙적으로 라이브러리 내에서 ⟦P0011⟧ 주입을 자동화할 수 있지만, 분리된 SignedData 형태의 PAdES에서CRYPT_E_INVALID_INDEX(0x80091008)을 반환하므로, 호출자가 제공하는 CMS 바이트 경로를 대신 사용합니다.
v3.56.18 2026-05-23
- PAdES
signing-certificate-v2속성은 이제 RFC 5035 (ESSCertIDv2)에서 정의된 선택적IssuerSerial필드를 포함합니다. 서명 인증서의 발급자 구별 이름은GeneralName [4] EXPLICIT directoryNameCHOICE 안에 래핑되어GeneralNames에 포함되며, 그 뒤에는 인증서의 시리얼 번호가 ASN.1 INTEGER로 이어집니다. 시리얼 번호 바이트는 Windows CryptoAPI (CRYPT_INTEGER_BLOB)에서 리틀 엔디안으로 도착하며, 높은 비트가 설정되면 양수 정수 패딩 바이트를 추가하여 빅 엔디안으로 변환하며, 이는 OpenSSL 및 BouncyCastle이 동일한 필드를 출력하는 방식과 일치합니다. - 검증기는 서명 인증서 v2 속성에서 발급자 이름 + 시리얼 쌍을 경로 구축 후보 집합과 비교(특히 EU DSS의 엄격 모드)하는 경우, 이전 v3.56.17 출력은
certHash참조만 제공했습니다. - 새로운 ASN.1 도우미 함수
DER_IntegerFromLittleEndian(Win32CRYPT_INTEGER_BLOB바이트 순서를 처리) 및DER_ContextTagExplicit(페이로드를 컨텍스트별 태그가 포함된 구성된 컨텍스트에 래핑)는PDFlibASN1마이크로 인코더를 완성합니다. 새로운CERT_INFO/CRYPT_ALGORITHM_IDENTIFIER/CRYPT_INTEGER_BLOB/PCERT_CONTEXT선언은PDFlibCryptoAPI에서 서명 경로가 파싱된 인증서 필드에 액세스할 수 있도록 합니다.
v3.56.17 2026-05-23
- 내장
ETSI.CAdES.detached서명 경로는 이제 구조적으로 PAdES-B-B 에 부합하는 서명을 생성한다. 라이브러리가 CMS authenticated attributes 를 직접 구성한다 —content-type(id-data) 와 RFC 5035 / RFC 5816 의signing-certificate-v2(서명 인증서의 SHA-256 해시를 포함) — 그리고rgAuthAttr를 통해CryptSignMessage에 전달한다. 이 필드가 non-NULL 이 되면, Windows CryptoAPI 는 PAdES (ETSI EN 319 142-1 v1.2.1 Table 1) 가 금지하는signing-time속성을 자동으로 주입하지 않게 된다. 그 결과SignerInfo는 필수 속성만 보유한다. - 새
PDFlibASN1유닛은SigningCertificateV2속성 값을 구성하는 데 사용되는 집중된 DER (X.690) 마이크로 인코더 — length prefix, OCTET STRING, SEQUENCE, SET, OBJECT IDENTIFIER — 를 제공한다. 이 인코더는 base-128 OID arc 의 표준 규칙을 따르며, 선택적인hashAlgorithm필드가 단지 SHA-256 의 기본값을 반복할 뿐이라면 이를 생략한다. 이는 OpenSSL 와 BouncyCastle 의 출력과 일치한다. ApplySignature는ETSI.CAdES.detached를 미리 계산된 digest 를 공급하는 대신 raw-byte 경로 (adbe.pkcs7.detached가 사용하는 것과 동일한 경로) 로 라우팅하도록 변경되었다. 이제 CryptoAPI 가 실제로 서명되는 콘텐츠에 대해messageDigestauthenticated attribute 를 계산하며, 이는 검증자가 기대하는 동작이다.- signing-certificate-v2 속성 구축 시 SHA-384 와 SHA-512 도 존중된다:
hashAlgorithm필드는 기본값에 의존하지 않고 대응하는AlgorithmIdentifier와 함께 발행된다. 이 맥락에서 SHA-1 은 PAdES-B-B 가 SHA-1 을 허용하지 않으므로 (clause 6.2.1) 조용히 SHA-256 으로 업그레이드된다.
v3.56.16 2026-05-23
- 새
SetSignProcessDigestAlgorithm는 서명 message-digest 알고리즘을 선택한다:1= SHA-1 (deprecated),2= SHA-256 (현대 기본값),3= SHA-384,4= SHA-512,0= auto (legacyadbe.pkcs7.sha1경로를 제외한 모든 SubFilter 에 대해 SHA-256, 해당 legacy 경로는 바이트 안정 하위 호환성을 위해 SHA-1 을 유지). ETSI EN 319 142-1 v1.2.1 §6.2.1 은 MD5 를 금지하고 권장 암호 스위트는 ETSI TS 119 312 에 따르도록 위임하므로, PAdES 서명자는 SHA-256 이상을 선택해야 한다. - 기존
SHA1StreamRange옆에SHA256StreamRange,SHA384StreamRange,SHA512StreamRange해시 헬퍼를 추가했다; 서명 경로는 선택된 알고리즘으로 PDF ByteRange 의 digest 를 계산할 때 이를 사용한다. 이제 PKCS#7 의SignerInfo.digestAlgorithmOID 와 실제 해시 바이트가 일치함이 보장된다 (이전 코드는 협상된 알고리즘과 무관하게 항상 SHA-1 의 digest 를 전달했다). TPDFlibPFXFile.SignData는 이제DigestAlgorithm매개변수를 받아 각 (SubFilter, algorithm) 쌍에 맞는 올바른 OID 를 선택한다: detached 및 custom SubFilter 의 SHA-256/384/512 에는2.16.840.1.101.3.4.2.1/.2/.3(RFC 5754), legacyadbe.pkcs7.sha1경로에는 대응하는sha256WithRSAEncryption패밀리 OID 를 사용한다.
v3.56.15 2026-05-23
- 새
SetSignProcessDocTimeStamp는 sign process 를 ETSI EN 319 142-1 v1.2.1 §5.4.3 에 따른 PAdES Document Time-stamp 모드로 전환한다. 결과 Signature Dictionary 는/Type /DocTimeStamp와/SubFilter /ETSI.RFC3161을 가지며, 허용되지 않는/M,/Reason,/Location,/ContactInfo,/Name키는 생략하고, 외부에서 가져온 RFC 3161 TimeStampToken 을 위해/Contents에 8192 바이트 (또는 호출자가 지정한 크기) 의 hex placeholder 를 예약한다. - TimeStampToken 이 외부 TSA 에서 오기 때문에 DocTimeStamp 모드가 선택되면 passthrough 가 자동으로 활성화된다. DocTimeStamp 모드로 전환한 후 호출된
SetSignProcessInfo는 signature dictionary 를 사양에 부합하게 유지하기 위해 조용히 무시된다. - v3.56.8 에서 추가된 기존 PAdES
/Extensions /ESIC자동 주입은 SubFilter 가ETSI.로 시작하기 때문에 DocTimeStamp 도 이미 커버하며, 따라서 Document Time-stamp PDF 는 추가 작업 없이 필요한 catalog extension 을 선언한다.
v3.56.14 2026-05-23
- 새 PAdES Document Security Store (DSS) augmentation API.
NewPAdESDSSProcessFromFile/NewPAdESDSSProcessFromStream/NewPAdESDSSProcessFromString은 이미 서명된 PDF 를 열고,AddPAdESDSSCertificate/AddPAdESDSSCRL/AddPAdESDSSOCSP는 DER 로 인코딩된 검증 자료를 stage 하며,EndPAdESDSSProcessToFile/EndPAdESDSSProcessToStream/EndPAdESDSSProcessToString은 ETSI EN 319 142-1 v1.2.1 §5.4.2.2 가 명시한 대로/DSS << /Type /DSS /Certs [...] /CRLs [...] /OCSPs [...] >>사전을 담은 incremental update 를 작성한다. 이것은 PAdES-B-B / B-T 서명을 PAdES-B-LT 장기 검증으로 승격시키는 구성 요소이다. - DSS process 는 검증 자료를 추가할 때 catalog 의
/Extensions /ESIC항목을 최소ExtensionLevel 1로 자동 bump 하여 §5.6 의 요구 사항과 일치시키며, 반복 호출 시 새 인증서, CRL, OCSP 응답을 기존/Certs//CRLs//OCSPs배열에 병합하여 개정이 덮어쓰기가 아닌 누적되도록 한다. GetPAdESDSSProcessResult/ReleasePAdESDSSProcess가 라이프사이클을 완성하며, 기존SignProcessAPI surface 를 미러링한다.
v3.56.8 2026-05-23
- PAdES baseline 컨포먼스: 서명이 PAdES SubFilter (
ETSI.CAdES.detached또는ETSI.RFC3161) 로 생성될 때, 문서 catalog 는 이제 ETSI EN 319 142-1 v1.2.1 §5.6 가 요구하는/Extensions /ESIC <</BaseVersion /1.7 /ExtensionLevel 2>>항목을 자동으로 받는다. 이 항목은 서명을 담는 동일한 incremental update 를 통해 추가되며, 더 높은 기존/ExtensionLevel을 절대 다운그레이드하지 않고, 소스 PDF 가 이미/Extensions나/ESIC를 별도 객체로 저장한 경우 indirect 참조를 따른다. TPDFlib를 통해 작성된 PDF 에 대해 SetSignProcessCustomSubFilter 가 기록하는 Adobe 동등 extension 마커는 이제/ADBE /BaseVersion /1.7 /ExtensionLevel 8이다 (이전에는ExtensionLevel 5). 이는 PAdES baseline 서명에 허용되는 대체 선언과 일치한다. 레벨 5 는 ISO 32000-2 폼 / 3D / RichMedia 기능만 다뤘으며 실제로 PAdES extension 을 식별하지 않았다.
v3.56.13 2026-05-23
- SetPDFUAMode 가 활성화되고 문서가 저장될 때, 명시적
ListNumbering속성이 없는 모든 L (list) 구조 요소는 이제 자동으로/O = List /ListNumbering = None을 받는다. ISO 14289-1 §7.6 는 모든 L 태그가 numbering 스타일을 선언할 것을 요구한다. 새ApplyPDFUAListNumbering저장 시점 fix-up 은 기존ApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationship/ApplyPDFUAStripTrapNet패밀리에 합류한다. - 특정 list 스타일에 신경 쓰는 작성자는 여전히 EndTag 전에 SetStructElemListNumbering 을 호출해야 한다. auto-fixup 은 저장 시점에 ListNumbering 속성이 전혀 없을 때만 발동하므로, 명시적 값은 보존된다.
- writer 측
LIST-NO-NUMBERING:N진단 메시지는 이제 저장 시점에 auto-fixup 이 이슈를 마스킹할 것임을 안내하며, 따라서 사용자는 누락된 속성과 자동 복구 동작 양쪽을 이해할 수 있다.
v3.56.12 2026-05-23
- PDF/UA-1 감사에 3 개의 새 ISO 14289-1 검사가 추가되었다.
10031은 URI action 사전이/IsMap = true를 가지는 Link 어노테이션을 보고한다 (§7.18.5 가 금지하며, 동등한 기능이 콘텐츠의 다른 곳에 제공되지 않는 한. 정당한 IsMap 사용 사례가 있는 작성자는 스스로 진단을 억제할 수 있다).10032는/ID항목이 없는Note구조 요소를 보고한다 — §7.9 는 모든 Note 태그가 고유 ID 를 선언할 것을 요구한다.10033은 두 개 이상의 Note 태그가 동일한/ID값을 공유할 때 중복 쌍의 개수를 보고한다. - Note ID 충돌 감지는 ID 를 정렬된 TStringList 에 수집하고 인접 쌍을 순회하여 수행되므로, 하나의 ID 를 공유하는 3 개의 Note 그룹은 두 개의 중복 쌍으로 계산된다.
- URI action 검사는 모든 페이지의
/Annots배열을 순회하고,/Subtype /Link로 필터링한 다음,/A /S /URI와/IsMap불리언을 검사한다. 각 단계에서 indirect 참조는 역참조되므로 별도로 분리된 action 사전은 인라인과 동일하게 동작한다.
v3.56.11 2026-05-23
- ISO 14289-1 §7.6 은 모든 L (list) 구조 요소가 명시적
ListNumbering속성을 가질 것을 요구한다.10030(reader 측) 과LIST-NO-NUMBERING:N(writer 측) 은 이를 생략한 L 태그를 보고한다. reader 측 walker 는 두 가지/A형태 (단일 속성 사전, 또는 revision 정수가 섞인 사전 배열) 를 디코딩하고 owner 와 무관하게/ListNumbering키를 찾는다. writer 측 검사는TPDFStructElem.Attributes를 검사하여 최종 구조 목록과 아직 열려 있는 태그 스택 양쪽에서 동일한 이름을 찾는다. - ISO 32000-1 Table 347 에 따른 유효한
ListNumbering값은None,Disc,Circle,Square,Decimal,UpperRoman,LowerRoman,UpperAlpha,LowerAlpha이다. 감사는 키의 존재만 검사하며 어떤 값이 선택되었는지는 보지 않는다 — 모든 L 태그는 이들 중 하나가 필요하다.
v3.56.10 2026-05-23
- PDF/UA-1 감사에 ISO 14289-1 §7.21.6 TrueType 인코딩 규칙이 추가되었다.
10028은/Encoding(또는 Encoding 사전 내부의/BaseEncoding) 이MacRomanEncoding도WinAnsiEncoding도 아닌 non-symbolic TrueType 폰트를 보고한다.10029는/Encoding항목을 가지는 symbolic TrueType 폰트를 보고한다 (§7.21.6 네 번째 단락에서 금지). - Symbolic 대 non-symbolic 은 FontDescriptor
/Flags비트 3 (마스크4) 에서 결정되며, sub-class 4 의 기존UAFontDescriptorSymbolic헬퍼를 재사용한다. §7.21.6 의 첫 단락 전체 (임베디드 TrueType 프로그램이 일치하는 cmap 항목을 포함해야 함) 는 TrueType 폰트 프로그램의 파싱을 필요로 하며 여전히 보류 중이다. 위의 사전 레벨 규칙은 이 감사가 TrueType 파서 없이 검증할 수 있는 실용적인 계층이다. - §7.21.6 의 Differences-array 규칙 (AGL-only 글리프 이름, Microsoft Unicode cmap 존재) 은 같은 이유로 범위 밖에 머문다 — 폰트 프로그램 검사가 필요하다.
v3.56.9 2026-05-23
- PDF/UA-1 감사에 완전한 ISO 14289-1 §7.18.4 검사가 추가되었다.
10027은/StructParent가 구조 트리의/ParentTree를 통해 resolve 되지만/S = Form인 구조 요소에 도달하지 못하는 Widget 어노테이션을 보고한다. 이전 v3.56.7 의 부분 검사 (10026) 는/StructParent가 전혀 없는 Widget 만 잡았다. 새 검사는 number-tree 포인터를 따라가 대상 태그를 검증함으로써 규칙을 완성한다. - 새
NumberTreeLookup헬퍼는 ISO 32000-1 §7.9.7 number-tree 형태 (평탄한/Nums루트,/Limits로 범위가 지정된 중간/Kids) 를 구현한다. 향후/StructParents페이지 항목 또는/PageLabels레이블을 resolve 해야 하는 감사가 이를 재사용할 수 있다. - Widget 어노테이션 Form-tag 검증은 2-tier 모델을 사용한다.
/StructParent가 없는 Widget 은10026으로 보고된다./StructParent가 존재하지만/S = Form으로 resolve 되지 않는 Widget 은 더 구체적인10027로 보고된다. 이는 동일한 위반이 두 코드 아래 이중으로 계산되는 것을 방지한다.
v3.56.7 2026-05-23
- SetPDFUAMode 가 활성화되고 문서가 저장될 때, 모든
TrapNet어노테이션 항목은 이제 모든 페이지의/Annots배열에서 자동으로 제거된다. ISO 14289-1 §7.18.2 는TrapNet어노테이션을 금지한다. 새ApplyPDFUAStripTrapNet저장 시점 fix-up 은 기존ApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationship패밀리에 합류하여, PDF/UA 모드 문서가TrapNet잔재를 조용히 내보내는 것을 멈추도록 한다. - PDF/UA-1 감사에 §7.18.4 의 부분 검사가 추가되었다.
10026은/StructParent가 없는 Widget 어노테이션을 보고한다 —/StructParent가 없는 Widget 은 구조 트리에서 접근할 수 없으므로Form구조 태그에 중첩될 수 없다. 완전한 구조적 검증 (/StructParent를ParentTree를 통해 resolve 하고 부모/S가Form인지 확인) 은 후속 릴리스로 남겨둔다. - Writer 측 GetPDFUADiagnostics 는 매칭되는
WIDGET-NO-STRUCTPARENT:N이슈를 받는다. 기존 TRAPNET-ANNOT 메시지는 이제 SetPDFUAMode 가 저장 시점에 이를 자동 제거함을 안내한다.
v3.56.6 2026-05-23
- PDF/UA-1 감사에 두 가지 ISO 14289-1 §7.4.2 헤딩 계층 검사가 추가되었다.
10024는 문서 순서상 첫 헤딩 요소가 H1 (또는 H) 이 아닐 때 보고한다.10025는 내림차순 시퀀스의 헤딩 레벨 점프 수를 보고한다 (예: H2 없이 H1 직후에 H3). 두 검사는 중첩된/K형태 (단일 StructElem, StructElems / IndRefs / MCRs 배열) 를 디코딩하는 단일 구조 트리 사전 순회를 공유한다. - Writer 측 GetPDFUADiagnostics 는 매칭되는
FIRST-HEADING-NOT-H1이슈를 받아 reader10024와 동등성을 가진다. 이전에 존재하던 HEADING-LEVEL-SKIP writer 검사는 이제 "첫 헤딩이 H2 였다" 스타일의 문제도 잡는 동반자를 가지게 된다.
v3.56.5 2026-05-23
- SetPDFUAMode 가 활성화되고 이후 문서가 암호화될 때, 암호화 권한 키 (encrypt 사전의
/P) 는 이제 호출자가 Encrypt 에 전달된TPDFExtraPermissions에ppCanCopyAccess를 포함하지 않았더라도 자동으로 비트 10 (마스크$200, "접근성 지원을 위해 텍스트와 그래픽 추출") 이 설정된다. ISO 14289-1 §7.16 은 모든 암호화된 컨포밍 파일이 접근성 추출을 허용할 것을 요구하며, 그 비트는 그렇지 않으면 놓치기 쉽다. 이 비트는 항상 설정해도 안전하다 — 다른 추출 경로가 아닌 보조 기술에만 추가 접근을 부여한다. - Writer 측 GetPDFUADiagnostics 는 PDFUAMode 가 켜져 있고 encrypt 사전의
/P비트 10 이 지워진 경우 발동하는 새ENCRYPT-NO-ACCESS이슈를 얻는다. 이는 사용자가Encrypt()를 먼저 호출하고 그 후에야 SetPDFUAMode 를 호출한 호출 순서 엣지 케이스를 잡는다 — 진단은 사용자에게Encrypt()를 다시 호출하여 encrypt dict 가 수정된/P로 재발행되도록 안내한다.
v3.56.4 2026-05-23
- Writer 측 GetPDFUADiagnostics 는 5 개의 새 ISO 14289-1 검사를 얻어, 인메모리 문서 감사가 reader 측 CheckFileCompliance ComplianceTest=2 감사와 동일한 위반을 잡도록 한다.
SUSPECTS-TRUE는 MarkInfo/Suspects=true 를 플래그한다 (§7.1: PDF/UA 컨포밍 파일은 Suspects=false 를 요구).ROLEMAP-STANDARD-REMAP:N은 표준 구조 태그를 재매핑하려는 AddRoleMap 호출을 플래그한다 — §7.1 은 표준 태그의 재매핑을 금지한다.DC-TITLE-MISSING은 빈 XMP dc:title 을 플래그한다 (DOCINFO-TITLE-MISSING 과는 별개로, 이는 /Info /Title 을 검사한다).TRAPNET-ANNOT:N은 TrapNet 어노테이션을 플래그한다 (§7.18.2 가 금지).ANNOT-PAGE-NO-TABS-S:N은 페이지 사전 /Tabs 가 /S 가 아닌 어노테이션을 가지는 페이지를 플래그한다 (§7.18.3 은 그러한 페이지에서 구조 트리 탭 순서를 요구). - Writer 측과 reader 측 PDF/UA-1 감사는 이제 대체로 동등해졌다. reader 측 감사가 저장된 파일에서 제기하는 모든 이슈는 각 함수의 형식 규약 (줄바꿈으로 구분된 텍스트 대 NNNNN-code 문자열 목록) 차이를 제외하면 인메모리 진단에서도 도달할 수 있다.
v3.56.3 2026-05-23
- PDF/UA-1 감사는 §7.21 폰트 검사를 얻는다.
10020은 FontDescriptor 가FontFile/FontFile2/FontFile3을 결여한 모든 비-Standard-14 폰트를 보고한다 (§7.21.4.1: 렌더링되는 모든 폰트는 프로그램을 임베드해야 한다).10021은/CIDToGIDMap항목이 없는 CIDFontType2 후손을 보고한다 (§7.21.3.2).10022는 임베디드 프로그램 없이 참조된 Standard 14 폰트 (Helvetica, Times, Courier, Symbol, ZapfDingbats 및 굵게 / 기울임 변형) 를 호출해낸다 — §7.21.4 NOTE 5 는 이 폰트들에 대해 임베딩 면제가 없음을 분명히 한다.10023은/ToUnicodeCMap 이 없고 §7.21.7 면제 목록과 일치하지 않는 폰트를 보고한다 (사전 정의된 MacRoman / MacExpert / WinAnsi 인코딩, Adobe-GB1 / CNS1 / Japan1 / Korea1 문자 컬렉션을 가진 Type 0, non-symbolic TrueType). - Composite Type 0 폰트는 두 계층에서 검사된다. Type 0 부모 사전 자체의
/ToUnicode, 그리고 첫 번째 후손 CIDFont 의 임베딩 //CIDToGIDMap. Type 3 폰트는 임베딩 검사를 건너뛰지만 (글리프가 인라인 CharProcs 이다) 여전히/ToUnicode검사에 참여한다. - 유사한 폰트 작업을 위한 PDFlibPDFA 헬퍼는 의도적으로 공유되지 않았다 — 여섯 개 가량의 짧은 루틴 (subset-prefix stripping, Standard-14 이름 테이블, FontFile 존재, Symbolic 플래그) 이
UA*헬퍼로 로컬에 복제되어, PDF/A 감사가 PDF/UA 를 깨뜨리지 않고 진화를 계속할 수 있고 그 반대도 마찬가지이다.
v3.56.2 2026-05-23
- PDF/UA-1 감사는 어노테이션, 임베디드 파일, optional content 를 다루는 5 개의 추가 ISO 14289-1 검사를 얻는다.
10015는 비어 있지 않은/Contents대체 설명이 없는 Link 어노테이션을 보고한다 (§7.18.5) 그래서 스크린 리더가 링크 대상을 안내할 수 있도록 한다.10016과10017은 필수/F또는/UF파일 이름 키가 없는 임베디드 파일 FileSpec 사전을 플래그한다 (§7.11).10018은 비어 있지 않은/Name텍스트 문자열을 생략하는 optional-content 구성 사전을 플래그한다 (§7.10).10019는 금지된/AS키를 포함하는 optional-content 구성 사전을 플래그한다 (§7.10). - TrapNet 과
/Tabs /S검사를 이미 구동한 페이지별 어노테이션 순회는 이제 동일한 패스에서 Link //Contents데이터도 수집하여, 객체 수에 대해 감사를 O(N) 으로 유지한다.
v3.56.1 2026-05-23
- PDF/UA-1 감사는 5 개의 새 ISO 14289-1 검사를 얻는다.
10010은 암호화된 파일에서 접근성 추출 권한 (암호화/P키의 비트 10) 을 검증한다 (§7.16).10011은 XFA XDP 패킷 내부의<dynamicRender>required</dynamicRender>요소를 통해 동적 XFA 폼을 감지한다 (§7.15).10012는/Ref항목을 가지는 Form XObject 를 플래그한다 — 참조 XObject 는 금지된다 (§7.20).10013은TrapNet어노테이션을 플래그한다 (§7.18.2).10014는 모든 페이지를 순회하고 페이지 사전이/Tabs /S를 설정하지 않은 어노테이션을 가지는 페이지를 보고한다 (§7.18.3) 그래서 탭 순서가 구조 트리를 따르도록 한다. - 5 개의 새 코드는 모두 이전 릴리스가 추가한 동일한 CheckFileCompliance + GetStringListItem 핸들 쌍을 통해 흐른다 — 새 공개 API surface 는 없다.
v3.56.0 2026-05-23
- 새 reader 측 감사
CheckCompliancePDFUA는 외부 PDF 를 ISO 14289-1 (PDF/UA-1) 에 대해 검증한다. 임의의 입력 PDF (자체 출력, 스캐너 출력, 서드파티 콘텐츠) 를 받아들이고 CheckFileCompliance 가 이미 PDF/A 문제를 보고하는 것과 동일한 방식으로 PDF/UA-1 위반을 나열함으로써, 기존 GetPDFUADiagnostics writer 측 검사를 보완한다. - CheckFileCompliance 는 이제 새 PDF/UA-1 감사를 실행하기 위해
ComplianceTest = 2를 받아들인다.ComplianceTest = 1하의 PDF/A 테스트는 변경되지 않았고, 이슈 목록은 여전히 기존 GetStringListCount / GetStringListItem 핸들 쌍을 통해 흘러나온다. - 첫 cut 은 §5 (XMP
pdfuaid:part식별) 과 §7.1 (Catalog/Metadata스트림, 태그된 PDF 마커, 구조 트리, 뷰어 타이틀 선호, 문서 언어, XMPdc:title,/Suspects값, 표준 구조 태그 재매핑 금지) 의 기초적인 PDF/UA-1 컨포먼스 게이트를 다룬다. 8 개의 진단 코드가 발행된다 —10001부터10009까지 — 숫자 범위를 PDF/A00xxx코드와 시각적으로 분리하여 유지한다. - 더 깊은 PDF/UA-1 조항 (보안, 어노테이션, XObject, 폰트 서브셋) 은 동일한 감사 프레임워크 위에 후속 패치 릴리스로 추적된다.
v3.55.6 2026-05-22
- 새로 생성된 모든 XMP 패킷은 이제 uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 형식의 xmpMM:InstanceID 속성을 가진다. 식별자는 Win32 CoCreateGuid 를 통해 생성되며 ISO 19005-1 §6.7.2 (Cor2) 와 PDF/A 모범 사례 가이드가 권장하는 대로 생성된 각 문서에 고유하고 버전 독립적인 핑거프린트를 제공한다. 비 Windows 빌드 (XMP 패킷이 비어 있는 경우) 는 영향받지 않는다.
- xmpMM 네임스페이스 (http://ns.adobe.com/xap/1.0/mm/) 는 이제 XMP 패킷의 SelectionNamespaces 의 일부이다. 새 SetXMPMM 과 GenerateInstanceID 헬퍼가 InstanceID 발행을 뒷받침하고 향후 xmpMM:History / xmpMM:DerivedFrom 지원을 위한 기반을 제공한다.
- PDF/A Extension Schema description 스키마 (pdfaExtension / pdfaSchema / pdfaProperty / pdfaType / pdfaField) 는 이 릴리스에서 추가되지 않는다. 사용자 정의 extension 스키마를 작성하려면 현재의 SetDublinCore / SetXMPBasic 형태를 넘어선 다단계 bag / seq / 구조화된 속성 구성이 필요하다. 이 작업은 향후 릴리스로 추적된다. 사용자 정의 XMP 속성을 선언해야 하는 문서는 계속 LoadFromString 경로로 폴백한다.
v3.55.5 2026-05-22
- PDF/A 문서는 이제 저장 시점에 어노테이션 /F 플래그가 정규화된다. ISO 19005-1 §6.5.3 은 Print 비트가 1 이고 Hidden / Invisible / NoView 비트가 0 일 것을 모든 어노테이션에 대해 요구한다. writer 는 이제 저장 시점에 그 마스크를 적용하므로 호출자는 비트 레이아웃을 기억할 필요가 없다. /Subtype /Popup 케이스는 면제된다 — popup 은 다른 어노테이션의 자식이며 전통적으로 인쇄되지 않는다.
- AcroForm /NeedAppearances 플래그는 이제 문서가 PDF/A 모드에 있을 때 저장 시점에 false 로 강제 설정된다. ISO 19005-1 §6.9 는 플래그가 없거나 false 일 것을 요구한다. 이전에는 writer 가 호출자가 설정한 값을 그대로 두었고, 이로 인해 열기 시점에 뷰어가 외관을 재생성하도록 요청하는 문서가 생성되었으며 호출자가 true 로 설정한 경우 사양을 조용히 위반했다. 수정은 플래그가 이전에 없던 문서에도 실행된다 — writer 는 검증기에 모호함을 남기지 않도록 명시적인 /NeedAppearances false 를 발행한다.
v3.55.4 2026-05-22
- AddStandardFont 는 이제 PDF/A 모드에서 호출을 거부한다. ISO 19005-1 §6.3.4 는 PDF 참조의 "Standard 14 는 임베디드되지 않을 수 있다" 면제를 취소한다. 컨포밍 파일의 모든 폰트 프로그램은 임베디드되어야 하며, 라이브러리는 Standard 14 윤곽선을 번들하지 않는다. facade 는 조용히 0 을 반환한다. 호출자는 실제 폰트 파일과 함께 AddTrueTypeFont 또는 AddType1Font 로 전환해야 한다.
- AddTrueTypeFont 는 이제 PDF/A 모드가 활성화될 때 Embed=0 (임베딩 없음) 을 Embed=1 (전체 폰트 임베드) 로 조용히 승격한다. 비임베디드 참조 경로는 시스템 Arial / Times / Courier 설치에 대한 뷰어의 폰트 폴백에 의존하는 PDF 를 생성했으며, 이는 ISO 19005-1 §6.3.4 를 위반한다. 임베딩 (Embed=1 또는 2) 을 요청한 기존 호출자는 영향받지 않는다.
- Non-symbolic TrueType /Encoding 컨포먼스 검사 (ISO 19005-1 §6.3.7 Cor2 는 WinAnsi 또는 MacRoman 을 인코딩 이름 또는 BaseEncoding 으로 요구하며 /Differences 가 없을 것) 는 이 릴리스에서 추가되지 않는다. 라이브러리는 이미 non-symbolic TrueType 서브셋에 대해 /WinAnsiEncoding 을 발행하며, 더 깊은 강제는 서브셋 경로를 통해 symbolic 대 non-symbolic 디스패치를 추적해야 한다. CheckCompliancePDFA 00034 / 00035 (v3.51.0 에서 추가) 는 검증 시점에 비컨포밍 출력을 플래그한다.
v3.55.3 2026-05-22
- TrueType-backed CIDFontType2 폰트 사전은 이제 /CIDToGIDMap /Identity 를 명시적으로 가진다. ISO 19005-1 §6.3.3.2 (Cor2) 는 모든 임베디드 Type 2 CIDFont 에 대해 항목이 존재할 것을 요구한다. PDF 참조는 암묵적 Identity 기본값을 허용하지만, PDF/A 는 명시적 값을 요구한다. writer 는 이전에 키를 전적으로 생략하고 있어, veraPDF (와 v3.51.0 에서 추가된 CheckCompliancePDFA 00033) 가 파일을 플래그하게 했다. /Identity 이름은 writer 가 이미 암묵적으로 생성하고 있던 GID-as-CID 레이아웃과 일치하므로, 기존 문서는 동일하게 렌더링된다.
- FontDescriptor /CharSet (Type 1 서브셋용) 과 /CIDSet (CIDFont 서브셋용) 은 여전히 TODO 이다. writer 는 그것들을 정확하게 채우려면 어떤 글리프 이름 / CID 가 서브셋에 들어갔는지를 추적해야 한다. CheckCompliancePDFA 00031 과 00032 (역시 v3.51.0 에서 추가) 는 검증 시점에 누락을 플래그하여 사용자가 문제를 볼 수 있도록 한다.
v3.55.2 2026-05-22
- AddImageDirectFromString 는 이제 진입점에서 PDF/A 비호환 필터를 거부한다. Filter = 'LZWDecode' 전달은 모든 PDF/A 부분에서 거부된다 (ISO 19005-1 §6.1.10 과 동등한 ISO 19005-2 / -3 규칙). Filter = 'JBIG2Decode' 또는 'JPXDecode' 전달은 PDF/A-1 (모드 1 과 2) 에서 거부된다. PDF/A-2 와 PDF/A-3 는 ISO 19005-2 §6.2.8.3 하에서 sub-spec 제약 (컬러 채널 수, 비트 깊이 균일성, METH/APPROX 요구 사항) 과 함께 JPXDecode 를 허용하며, writer 측 게이트는 이를 강제하지 않는다 — 그 모드의 호출자는 여전히 JPEG 2000 스트림이 컨포밍한지 확인해야 한다. 금지된 필터가 요청되면 facade 는 조용히 0 을 반환한다.
- AddImageFromFile / AddImageFromStream 을 통해 로드된 TIFF, PNG, JPEG, JPEG 2000 입력은 영향받지 않는다. 임포터는 소스 바이트를 압축 해제하고 FlateDecode (또는 JPEG 페이로드에 대해 DCTDecode) 로 재인코딩하므로 LZW 입력은 출력 Filter 체인에 절대 전파되지 않는다. v3.50.0 (00004) 과 v3.52.0 (00022, 00023) 에서 추가된 CheckCompliancePDFA 검증기는 금지된 필터를 출력에 여전히 슬쩍 흘리는 모든 간접 경로에 대해 검증 시점에 두 번째 방어선을 제공한다.
v3.55.1 2026-05-22
- AddLinkToHideField 는 이제 PDF/A 모드에서 호출을 거부한다. 이전 릴리스는 action 이 PDF/A 호환임을 주장하는 주석을 남겼지만, ISO 19005-1 Cor2 는 /Hide 를 금지된 action 목록에 추가했으며 (§6.6.1), ISO 19005-2 / -3 는 제한을 상속한다. facade 는 PDF/A 모드에서 호출되면 조용히 0 을 반환하며, AddLinkToJavaScript 와 AddLinkToImportData 와 일치한다.
- AddSWFAnnotationFromFile 는 이제 PDF/A 모드에서 호출을 거부한다. SWF / RichMedia 어노테이션은 ISO 19005-1 §6.5.2 (Movie / Sound 서브타입 없음) 가 금지하고 ISO 19005-2 §6.3.1 (3D / Sound / Screen / Movie 없음) 이 보강하는 Flash 미디어를 감싼다. facade 는 조용히 0 을 반환한다.
- AddEmbeddedFile 과 AddLinkToEmbeddedFile 은 이제 PDF/A-1 과 PDF/A-2 모드에서 호출을 거부한다 (1-4 모드). ISO 19005-1 §6.1.11 은 /EF 를 금지하고, ISO 19005-2 §6.8 은 임베디드 PDF/A 파일만 허용한다. 첨부된 페이로드의 재귀적 PDF/A 성을 검증하기보다는, writer 는 그저 이 모드에서 호출을 거부한다. PDF/A-3 (SetPDFAMode 5 또는 6) 은 허용된 채로 남는다 — 자동 /AFRelationship 주입은 v3.55.0 을 참조하라.
- SetOpenActionMenu 는 이제 문서가 PDF/A 모드에 있을 때 {NextPage, PrevPage, FirstPage, LastPage} 화이트리스트 밖의 MenuItem 값을 거부한다. ISO 19005-1 §6.6.1 은 named action 을 그 집합으로 제한하므로, 이전에는 API 가 veraPDF 가 거부할 비컨포밍 Find / Print / FullScreen Open-Action 사전을 조용히 생성했다.
- NewOptionalContentGroup 은 이제 PDF/A-1 모드에서 호출을 거부한다 (SetPDFAMode 1 또는 2). ISO 19005-1 §6.1.13 은 Catalog /OCProperties 키를 금지한다. PDF/A-2 (모드 3/4) 와 PDF/A-3 (모드 5/6) 는 각각의 §6.9 의 제약과 함께 optional content 를 허용하므로 게이트는 PDF/A-1 에 대해서만 발동한다.
v3.55.0 2026-05-22
- PDF/A-3 문서는 이제 모든 임베디드 파일에 /AFRelationship 항목을 자동으로 받는다. 이전에는 라이브러리로 생성된 PDF/A-3 파일이 ISO 19005-3 Annex E, Table E.1 이 모든 임베디드 파일 사양에 AFRelationship 을 요구하기 때문에 검증에 실패할 수 있었다. writer 는 이제 저장 시점에 항목이 없는 모든 FileSpec 사전에 구성된 기본값 (즉시 사용 시 'Unspecified') 을 주입하며, 이전에 도입된 PDF/UA AFRelationship 자동 주입을 미러링한다. PDF/A-3 모드 (SetPDFAMode 5 = PDF/A-3b 또는 6 = PDF/A-3a) 만 자동 주입을 트리거한다. PDF/A-1 과 PDF/A-2 는 ISO 19005-1 §6.1.11 과 ISO 19005-2 §6.8 에 따라 임베디드 파일을 여전히 단호히 거부한다.
- SetPDFA3DefaultAFRelationship 는 임베디드 파일이 /AFRelationship 항목을 결여할 때 writer 가 쓰는 기본값을 재정의하는 새 API 이다. ISO 19005-3 Table E.1 값을 받아들인다. 'Source' (임베디드 파일이 PDF 콘텐츠를 생성한 원본 자료), 'Data' (파일이 시각적 테이블이나 차트를 뒷받침하는 구조화된 데이터), 'Alternative' (오디오 버전과 같은 대체 렌더링), 'Supplement' (수식의 MathML 형식과 같은 보충 표현), 'Unspecified' (관계가 위로 특징지을 수 없음), 또는 등록된 second-class 이름. 빈 문자열은 'Unspecified' 로 재설정한다. 파일별 재정의는 SetEmbeddedFileAFRelationship 을 통해 계속 사용할 수 있다.
- 새 API 는 Delphi facade 에서 TPDFlib.SetPDFA3DefaultAFRelationship 으로, DLL 에서는 DLSetPDFA3DefaultAFRelationship (PWideChar) 와 DLSetPDFA3DefaultAFRelationshipA (PAnsiChar) 로 노출된다.
v3.54.0 2026-05-22
- LoadOutputIntentProfile 은 번들된 sRGB OutputIntent 프로필을 디스크에서 로드된 외부 ICC 프로필로 교체하는 새 API 이다. 라이브러리가 sRGB 프로필만 출시하므로, DeviceCMYK 또는 DeviceGray 색 공간에서 PDF/A 문서를 생성할 때 필요하다. 일반적인 사용은 먼저 SetPDFAMode (OutputIntent 스켈레톤을 초기화) 를 호출한 다음, LoadOutputIntentProfile('C:\\path\\to\\FOGRA39.icc', 'DeviceCMYK') 을 호출하여 프로필 바이트를 교환하고 새 색 공간으로 문서에 태그를 단다. 성공 시 1, 파일을 찾을 수 없거나 알 수 없는 색 공간일 때 0 을 반환한다. Delphi facade 에서 TPDFlib.LoadOutputIntentProfile 로, DLL 에서는 DLLoadOutputIntentProfile (PWideChar 형식) 와 DLLoadOutputIntentProfileA (PAnsiChar 형식) 로 노출된다. ISO 19005-1 §6.2.2 는 DestOutputProfile 스트림에서 모든 등록된 ICC 프로필을 허용한다.
- SetFillColorCMYK, SetTextColorCMYK, SetTextHighlightColorCMYK, SetTextUnderlineColorCMYK, AddSeparationColor, SetFillColorSep, SetLineColorSep, SetTextHighlightColorSep, SetTextColorSep 는 이제 문서의 OutputIntent 프로필이 DeviceCMYK 일 때 PDF/A 모드에서 성공한다. 이전에는 이 API 들이 OutputIntent 와 무관하게 PDF/A 모드의 모든 호출을 거부했으며, 이는 컨포밍 CMYK 문서를 생성하지 못하게 했다. 게이트는 이제 PDFAMode = 0 OR OutputIntentColorSpace = 'DeviceCMYK' 이며, OutputIntent 가 CMYK 프로필을 사용할 때 DeviceCMYK 가 허용된다는 ISO 19005-1 §6.2.3.3 규칙과, 기본 색 공간도 컨포밍한 Separation alternate 를 허용하는 ISO 19005-1 §6.2.3.4 와 일치한다.
- SetTextShader 는 이제 OutputIntent 프로필이 DeviceRGB 또는 DeviceCMYK 일 때 PDF/A 모드에서 성공한다. shader 자체는 PDF/A 에 의해 금지되지 않는다. 검증기 (read 측) 는 shader 의 내부 색 공간이 OutputIntent 와 일치하는지 검증한다. 이전의 strict-reject 동작은 컨포밍 shader 사용을 거부했다.
- CMYK / Separation / Shader 차단 해제는 AddOutputIntent 와 LoadOutputIntentProfile (v3.53.0 에서 도입) 이 설정한 OutputIntentColorSpace 태그에 의존한다. LoadOutputIntentProfile 없이 SetPDFAMode 를 호출하면 색 공간이 DeviceRGB (번들된 sRGB 프로필) 로 유지되므로, CMYK 호출은 여전히 기본적으로 거부된다 — 새 동작은 LoadOutputIntentProfile 을 통한 opt-in 이다.
v3.53.0 2026-05-22
- OutputIntent 사전은 이제 ISO 19005-1 §6.2.2 와 Adobe Acrobat preflight 가 권장하는 전체 PDF/A 스켈레톤 필드를 가진다. /OutputCondition (사람이 읽을 수 있는 색 조건 설명), /Info (장문 식별 텍스트), /RegistryName (레지스트리 URL, 기본값 http://www.color.org). 값은 기존 단일 인수 호출 사이트에 대해 "sRGB IEC61966-2.1" / "sRGB IEC61966-2.1" / "http://www.color.org" 으로 기본 설정된다. 새 AddOutputIntent 오버로드는 4 개의 사용자 정의 필드를 직접 받아 호출자가 자신의 색 조건에 대해 그것들을 채울 수 있게 한다.
- AddOutputIntent 는 새 5-인수 오버로드를 얻는다. AddOutputIntent(ColorSpace, OutputConditionIdentifier, OutputCondition, Info, RegistryName). 기존 단일 인수 형식은 변경 없이 계속 작동한다. 이제 sRGB 기본값과 함께 새 오버로드에 위임한다. ColorSpace 인수는 또한 임베디드 ICC 프로필 사전에 작성되는 /N 컴포넌트 수를 선택한다 (DeviceRGB 는 3, DeviceCMYK 는 4, DeviceGray 는 1). 임베디드 프로필 자체는 v3.54.0 에서 다가올 LoadOutputIntentProfile API 가 출시될 때까지 번들된 sRGB 스트림으로 남아 있다.
- TPDFDocument 는 마지막 AddOutputIntent 호출의 색 공간을 추적하는 OutputIntentColorSpace 를 읽기/쓰기 속성으로 노출한다. 이것은 v3.54.0 에서 CMYK / Separation / Shader writer 측 제한의 게이트 조건이 되며, 거기서 오늘날 PDF/A 모드의 모든 호출을 거부하는 색 API 는 색 공간이 OutputIntent 와 일치하지 않을 때만 거부할 것이다.
v3.52.0 2026-05-22
- CheckCompliancePDFA 는 이제 어노테이션, graphics-state, action, form XObject 를 감사하여, ISO 19005-1 6.2-6.6 장과 동등한 PDF/A-2/-3 차등 규칙에 대한 PDF/A read 측 검증기의 커버리지를 완성한다. 검증기는 14 개의 새 이슈 클래스 (00050-00067) 를 보고한다. 금지된 어노테이션 서브타입 (00050; ISO 19005-1 §6.5.2 는 PDF/A-1 에 대해 FileAttachment / Sound / Movie 를 금지하고, ISO 19005-2 §6.3.1 은 PDF/A-2 와 PDF/A-3 에 대해 3D / Sound / Screen / Movie 를 금지), 1.0 이 아닌 어노테이션 /CA (00051; §6.5.3), 어노테이션 /F 가 없거나 Print=0 / Hidden=1 / Invisible=1 / NoView=1 (00052; §6.5.3, /Subtype /Popup 은 면제), 어노테이션 /AA (00054; §6.6.2), /N 외의 키를 가지거나 비컨포밍 /N 값을 가지는 어노테이션 외관 사전 (00055; §6.5.3 Cor2), /A 를 가지는 Widget 어노테이션 (00056; §6.9), ExtGState /TR (00058; §6.2.8), /Default 가 아닌 ExtGState /TR2 (00059; §6.2.8), 그리고 PDF/A-1 에서만: /None 이 아닌 ExtGState /SMask (00061; §6.4), Normal 또는 Compatible 이 아닌 /BM (00062; §6.4), 1.0 이 아닌 /CA 또는 /ca (00063; §6.4).
- Action-anywhere 감사 (00064, 00065) 는 v3.50.0 의 OpenAction-only 검사를 action 이 어디에 있든 (어노테이션 /A, widget /A, outline /A, catalog /OpenAction 등) 금지된 /S action 값 (Launch, Sound, Movie, ResetForm, ImportData, JavaScript, Hide, SetState, NOP, Trans, GoTo3DView, Rendition, SetOCGState) 과 /N 이 {NextPage, PrevPage, FirstPage, LastPage} 밖인 named action 을 플래그하는 전체 sweep 으로 대체한다. ISO 19005-1 §6.6.1.
- XObject 감사 (00066, 00067) 는 PostScript 와 Reference XObject, 그리고 Form XObject 의 금지된 키 (/OPI, /PS, /Subtype2 = /PS) 와 Image XObject 의 금지된 키 (/Alternates, /OPI, /Interpolate true) 를 보고한다. ISO 19005-1 §6.2.4 - §6.2.7.
v3.51.0 2026-05-22
- CheckCompliancePDFA 는 이제 v3.50.0 에서 추가된 구조적 검사 외에 폰트와 색 공간 컨포먼스도 감사한다. 검증기는 9 개의 새 이슈 클래스를 보고한다. 적어도 하나의 폰트 프로그램이 임베디드되지 않음 (00030; ISO 19005-1 §6.3.4 는 Standard 14 대체를 포함한 모든 폰트 프로그램이 임베디드될 것을 요구), FontDescriptor 에 /CharSet 이 없는 Type 1 서브셋 (00031; §6.3.5), /CIDSet 이 없는 CIDFont 서브셋 (00032; §6.3.5), /CIDToGIDMap 이 없는 CIDFontType2 (00033; §6.3.3.2 Cor2), 비컨포밍 /Encoding 을 가진 non-symbolic TrueType (00034; §6.3.7 Cor2 는 직접 또는 BaseEncoding 으로 WinAnsi/MacRoman 을 요구하며 /Differences 없을 것), 여전히 /Encoding 을 가지는 symbolic TrueType (00035; §6.3.7 Cor2), PDF/A-Na 또는 PDF/A-Nu 문서에서 /ToUnicode 가 없는 폰트 적어도 하나 (00036; §6.3.8 4-클래스 면제 적용), 프로필 스트림을 임베드하지 않는 ICCBased 색 공간 (00037; §6.2.3.2), DeviceRGB 와 DeviceCMYK 를 모두 사용하는 파일 (00038; §6.2.3.3 은 혼합을 금지).
- /ToUnicode 검사 (00036) 는 ISO 19005-1 §6.3.8 과 ISO 19005-2 §6.2.11.7 에 따라 그 레벨만 유니코드 매핑을 요구하기 때문에 컨포먼스 레벨 A 와 U 로 범위가 지정된다. 레벨 B 파일 (PDF/A-1b, PDF/A-2b, PDF/A-3b) 은 플래그되지 않는다. 4-클래스 면제는 사전 정의된 인코딩 (MacRomanEncoding, MacExpertEncoding, WinAnsiEncoding), Adobe Standard Latin / Symbol 글리프 이름 폰트의 프록시로서 Standard 14 Type 1 BaseFont, 그리고 후손 CIDFont 가 Adobe-GB1, Adobe-CNS1, Adobe-Japan1 또는 Adobe-Korea1 레지스트리를 사용하는 Type 0 폰트를 인식한다.
- 폰트 감사는 모든 Font 사전을 순회하고, Subtype (Type1, MMType1, TrueType, Type3, 그 후손 CIDFontType0 또는 CIDFontType2 를 가진 Type 0) 으로 분류한 다음, 관련 검사를 디스패치한다. Type 0 복합 폰트는 임베딩과 서브셋 검사를 후손 CIDFont 에 위임하면서 /ToUnicode 는 Type 0 wrapper 에 유지한다. 서브셋 감지는 표준 6 개 대문자 prefix 규약을 사용한다.
v3.50.0 2026-05-22
- CheckCompliancePDFA 는 이제 검증기가 이전에 놓쳤던 15 개의 추가 PDF/A 비컨포먼스 이슈를 보고한다. trailer /ID 배열 없음 (00013), Document Catalog /Metadata 스트림 없음 (00014), /Metadata 스트림에 적용된 /Filter (00015), /F, /FFilter 또는 /FDecodeParms 를 통해 외부 파일을 참조하는 스트림 사전 (00016), 모든 파일 사양 사전의 /EF 를 통해 또는 PDF/A-1 문서에서 Name 트리 /EmbeddedFiles 항목을 통해 선언된 임베디드 파일 (00017, 00018), 금지된 action 타입을 가리키는 /OpenAction (00019), Document Catalog 또는 모든 Page 의 /AA additional-action 사전 (00020, 00021), PDF/A-1 문서의 JBIG2Decode 또는 JPXDecode 필터 (00022, 00023), /Name 이 /Identity 가 아닌 Crypt 필터 (00024), Document Catalog 의 /Requirements (00025), /UR3 와 /DocMDP 외의 키를 가지는 /Perms (00026), 그리고 true 로 설정된 /AcroForm /NeedAppearances (00027). 검증기는 이제 ISO 19005-1 §6.6.1 에 따라 금지된 Catalog /OpenAction action 타입 (/Launch, /Sound, /Movie, /ResetForm, /ImportData, /JavaScript, /Hide, /SetState, /NOP, /Trans, /GoTo3DView, /Rendition, /SetOCGState) 과 {NextPage, PrevPage, FirstPage, LastPage} 화이트리스트 밖의 named-action /N 값을 플래그한다.
- PDFAID 파서는 기존 A 와 B 변형과 함께 U 컨포먼스 접미사 (PDF/A-2U, PDF/A-3U) 를 받아들이므로, CheckCompliancePDFA 는 다른 도구가 생성한 PDF/A-2U 또는 PDF/A-3U 파일을 스캔할 때 더 이상 가짜 "00005 PDFA Mark NOT Found or invalid" 경고를 발생시키지 않는다. ISO 19005-2:2011 에서 추가된 유니코드 매핑 컨포먼스 레벨은 이제 검증기에 의해 인식된다.
- 필터별 검사 (JBIG2Decode, JPXDecode) 와 임베디드 파일 검사 (/EF, /EmbeddedFiles) 는 ISO 19005-2 §6.2.8.3 과 §6.8 이 PDF/A-2 와 PDF/A-3 에 대해 그 제한을 명시적으로 완화하기 때문에 PDF/A-1 로 범위가 지정된 채로 남는다. 문서 구조 검사 (/Metadata, /AcroForm /NeedAppearances, /OpenAction, /AA, /Requirements, /Perms) 는 모든 PDF/A 부분에 적용된다.
v3.49.0 2026-05-21
- AddLinkToImportData 는 Link 어노테이션을 생성하며, 해당 action 은 PDF 가져오기 데이터 액션 (/S /ImportData) 이다. 사용자가 링크를 클릭하면 외부 FDF 파일에서 문서의 AcroForm 필드를 채워 넣는다 (ISO 32000-1 §12.6.4.8, Table 198). FileName 매개변수는 filespec 사전으로 참조되며, 경로 정규화 규칙은 AddLinkToFile / AddLinkToFileEx 와 동일하다 (ISO 32000-1 §7.11.2.1 에 따라 백슬래시를 슬래시로 변환). Options 비트 0 은 표시 테두리를 토글하고, 비트 1–3 은 링크 하이라이트 모드 (Invert, Outline, Push) 를 선택하며, 기존 AddLinkTo* 의 규약과 일치한다. PDF 1.4 이상. 액션이 외부 리소스를 참조하므로 PDF/A 에서는 허용되지 않으며, facade 는 PDF/A 모드에서 호출되면 조용히 0 을 반환한다. Delphi 라이브러리와 DLL 인터페이스에서 DLAddLinkToImportData / DLAddLinkToImportDataA (PWideChar 와 PAnsiChar 형식) 로 제공된다.
v3.48.0 2026-05-21
- AddLinkToHideField 는 Link 어노테이션을 생성하며, 해당 action 은 PDF 숨김 액션 (/S /Hide) 이다. 사용자가 링크를 클릭하면 하나 이상의 AcroForm 필드의 가시성을 토글한다 (ISO 32000-1 §12.6.4.10, Table 196). FieldNames 는 쉼표, 세미콜론, 줄바꿈으로 구분된 하나 이상의 완전 한정 필드 이름을 받는다. 단일 이름은 텍스트 문자열로 /T 에 출력되고, 두 개 이상은 배열로 /T 에 출력되며, 두 형식 모두 사양에서 허용된다. HideFlag 는 가시성 방향을 선택한다. 0 이 아닌 값은 나열된 필드를 숨기고 (/H true), 0 은 표시한다 (/H false). Options 비트 0 은 표시 테두리를 토글하고, 비트 1–3 은 링크 하이라이트 모드 (Invert, Outline, Push) 를 선택하며, AddLinkToWeb / AddLinkToNamedAction 과 일치한다. PDF 1.2 이상. 외부 리소스를 참조하지 않으므로 PDF/A 와 호환된다. Delphi 라이브러리와 DLL 인터페이스에서 DLAddLinkToHideField / DLAddLinkToHideFieldA (PWideChar 와 PAnsiChar 형식) 로 제공된다.
v3.47.0 2026-05-21
- AddLinkToNamedAction 은 Link 어노테이션을 생성하며, 해당 action 은 PDF 명명된 액션 (/S /Named) 이다. ISO 32000-1 §12.6.4.11, Table 194 에 정의된 4 가지 표준 뷰어 내비게이션 명령 중 하나 (NextPage, PrevPage, FirstPage, LastPage) 를 트리거한다. NamedActionType 매개변수로 명령을 선택한다 (0=NextPage, 1=PrevPage, 2=FirstPage, 3=LastPage). 범위를 벗어난 값은 NextPage 로 폴백되어 writer 가 항상 사양 준수 /N 이름을 출력한다. Options 비트 0 은 표시 테두리를 토글하고, 비트 1–3 은 링크 하이라이트 모드 (Invert, Outline, Push) 를 선택하며, 기존 AddLinkToWeb / AddLinkToPage 의 규약과 일치한다. 어노테이션은 PDF 1.1 이상이 필요하며, 외부 리소스를 참조하지 않으므로 PDF/A 와 호환된다. Delphi 라이브러리와 DLL 인터페이스에서 제공된다.
v3.46.1 2026-05-21
- AddCaretAnnotation 은 지정된 사각형 위치에 캐럿 마크업 어노테이션 (PDF /Subtype /Caret) 을 생성한다. 페이지 상에서 텍스트나 내용이 삽입, 생략되었거나 검토자의 주의가 필요한 위치를 표시하는 데 사용한다. SymbolType (0 / 1) 으로 2 가지 심볼 타입 (None 과 Paragraph) 을 지원하고, 색상, 불투명도, 제목, 내용, 생성/수정 타임스탬프를 설정할 수 있다. ISO 32000-1 §12.5.6.11 에 정의되어 있다. PDF 1.5 이상. Delphi 라이브러리와 DLL 인터페이스에서 제공된다.
- 이 항목은 v3.44.0 의 Square+Circle 로 시작된 기하 어노테이션 보강 작업을 완료하는 것이다. PDFlibPas 는 이제 기존의 Link, FileAttachment, SVG, U3D, SWF 지원에 더해 Text, Stamp, FreeText, TextMarkup (Highlight/Underline/Squiggly/StrikeOut), Square, Circle, Line, Polygon, PolyLine, Ink, Caret 어노테이션을 생성할 수 있다.
v3.46.0 2026-05-21
- AddInkAnnotation 은 ink 마크업 어노테이션 (PDF /Subtype /Ink) 을 생성한다. 페이지에 그려진 손글씨 스트로크나 자유형 표시를 나타낸다. 스트로크는 단일 문자열로 전달되며, 여러 스트로크는 '|' 또는 줄바꿈으로 구분하고, 각 스트로크 내의 좌표 쌍은 AddPolygonAnnotation 과 동일한 공백/쉼표/세미콜론/탭 형식을 따른다. 예를 들어 "100 100 110 105 120 110 | 200 200 210 205" 는 2 개의 별도 스트로크를 나타낸다. 설정 가능한 테두리 너비, ink 색상, 불투명도, 제목, 내용, 타임스탬프를 지원한다. ISO 32000-1 §12.5.6.13 에 정의되어 있다. PDF 1.3 이상. Delphi 라이브러리와 DLL 인터페이스에서 제공된다.
- 각 스트로크는 짝수 개의 값 (최소 4 개) 을 포함해야 하며, 그렇지 않으면 0 을 반환하고 어노테이션은 작성되지 않는다. /Rect 는 모든 스트로크의 결합 범위에 작은 패딩을 더해 자동으로 계산되며, 스트로크가 어노테이션 바운딩 박스 안에 들어오도록 한다.
v3.45.0 2026-05-21
- AddPolygonAnnotation 은 닫힌 다각형 마크업 어노테이션 (PDF /Subtype /Polygon) 을 생성한다. 꼭짓점은 공백, 쉼표, 세미콜론, 탭으로 구분된 좌표 쌍 문자열로 전달한다 (예: "100 100 200 100 200 200 100 200"). 설정 가능한 테두리 너비, 테두리 색상, 선택적 내부 채우기 색상, 불투명도, 제목, 내용, 타임스탬프를 지원한다. ISO 32000-1 §12.5.6.9 에 정의되어 있다. PDF 1.5 이상. Delphi 라이브러리와 DLL 인터페이스에서 제공된다.
- AddPolyLineAnnotation 은 열린 폴리라인 마크업 어노테이션 (PDF /Subtype /PolyLine) 을 생성한다. 동일한 꼭짓점 문자열 형식에 더해 각 끝점에서 설정 가능한 끝선 스타일 (None, Square, Circle, Diamond, OpenArrow, ClosedArrow, Butt, ROpenArrow, RClosedArrow, Slash) 을 가진다. ISO 32000-1 §12.5.6.9 에 정의되어 있다. PDF 1.5 이상. Delphi 라이브러리와 DLL 인터페이스에서 제공된다.
- 두 어노테이션 모두 최소 2 개의 꼭짓점 (4 개의 숫자) 과 짝수 개의 숫자가 필요하다. 꼭짓점 문자열이 유효한 쌍 목록으로 파싱되지 않으면 0 을 반환한다. /Rect 는 꼭짓점 범위에 테두리 너비에 비례한 패딩을 더해 계산되어 끝점 장식이 보이도록 한다.
- 두 어노테이션 모두 문서의 최소 버전이 더 낮은 값으로 잠겨 있을 때 출력 시점에 버전을 PDF 1.5 까지 자동으로 bump 한다.
v3.44.1 2026-05-21
- AddLineAnnotation 은 두 끝점 사이에 선 마크업 어노테이션 (PDF /Subtype /Line) 을 생성한다. 설정 가능한 테두리 너비, 선 색상, 선택적 내부 채우기 색상, 양쪽 끝점의 끝선 스타일 (None, Square, Circle, Diamond, OpenArrow, ClosedArrow, Butt, ROpenArrow, RClosedArrow, Slash), 불투명도, 제목, 내용, 생성/수정 타임스탬프를 가진다. ISO 32000-1 §12.5.6.7 에 정의되어 있다. PDF 1.3 이상. Delphi 라이브러리와 DLL 인터페이스에서 제공된다.
- 어노테이션 /Rect 는 두 끝점에 테두리 너비에 비례한 패딩을 더해 계산되어 끝점 장식이 어노테이션 바운딩 박스 안에 머무르도록 한다.
v3.44.0 2026-05-21
- AddSquareAnnotation 은 지정된 사각형 위치에 직사각형 마크업 어노테이션 (PDF /Subtype /Square) 을 생성한다. 설정 가능한 테두리 너비, 테두리 색상, 선택적 내부 채우기 색상, 불투명도, 제목, 내용, 생성/수정 타임스탬프를 가진다. ISO 32000-1 §12.5.6.8 에 정의되어 있다. PDF 1.3 이상. Delphi 라이브러리와 DLL 인터페이스에서 제공된다.
- AddCircleAnnotation 은 지정된 사각형에 내접하는 타원 마크업 어노테이션 (PDF /Subtype /Circle) 을 생성한다. 설정 가능한 테두리, 채우기, 불투명도, 제목, 내용, 타임스탬프는 AddSquareAnnotation 과 동일하다. ISO 32000-1 §12.5.6.8 에 정의되어 있다. PDF 1.3 이상. Delphi 라이브러리와 DLL 인터페이스에서 제공된다.
- 두 새로운 어노테이션 모두 문서의 최소 버전이 더 낮은 값으로 잠겨 있을 때 출력 시점에 PDF 1.3 까지 자동으로 bump 하고, 표준 마크업 어노테이션 필드 세트 (/Type /Subtype /Rect /C /IC /BS /Border /CA /F /M /CreationDate /NM /T /Contents /Subj /P) 를 출력한다. 이로써 Acrobat, Foxit, Edge 의 기존 리뷰 워크플로는 생성 후에도 이 어노테이션들을 편집할 수 있다.
v3.43.0 2026-05-20
- SetStructElemSpaceBefore 와 SetStructElemSpaceAfter 는 현재 열려 있는 구조 요소에 /SpaceBefore 와 /SpaceAfter 속성 (Layout owner) 을 설정한다. 블록 레벨 요소의 앞뒤 간격을 포인트 단위로 표현한다. ISO 32000-1 §14.8.5.4.2 Table 340 에 정의되어 있다. Delphi 라이브러리, ActiveX (Dispid 73008051/73008052), DLL 인터페이스에서 제공된다.
- SetStructElemStartIndent 와 SetStructElemEndIndent 는 현재 열려 있는 구조 요소에 /StartIndent 와 /EndIndent 속성 (Layout owner) 을 설정한다. 쓰기 방향을 고려한 콘텐츠 사각형의 start 와 end 가장자리로부터의 들여쓰기 거리를 포인트 단위로 표현한다. ISO 32000-1 §14.8.5.4.2 Table 340 에 정의되어 있다. Delphi 라이브러리, ActiveX (Dispid 73008053/73008054), DLL 인터페이스에서 제공된다.
- SetStructElemColor 는 /Color 속성 (Layout owner) 을 RGB 트리플 (각 성분 0.0-1.0) 로 설정하여 요소의 전경색을 기술한다. 리플로 엔진과 다운스트림 색상 대비 검사기에서 사용된다. ISO 32000-1 §14.8.5.4.2 Table 340 에 정의되어 있다. Delphi 라이브러리, ActiveX (Dispid 73008055), DLL 인터페이스에서 제공된다.
- BuildStructElemDictRef 의 직렬화 버그를 수정했다. 단일 토큰 숫자 속성 값 (SpaceBefore, SpaceAfter, StartIndent, EndIndent 등) 이 PDF 숫자가 아닌 PDF 이름으로 출력되고 있었다. 수정은 단일 owner 와 다중 owner 속성 분기 양쪽에 적용된다.
v3.42.0 2026-05-20
- CheckCompliancePDFA 는 이제 6 가지 모든 PDF/A 모드 (1a, 1b, 2a, 2b, 3a, 3b) 를 올바르게 검증한다. PDFAID 검사 (코드 00005) 는 '1B' 뿐만 아니라 6 개의 유효한 XMP 마커 중 하나를 받아들인다. 버전 상한 검사 (00002) 는 PDF/A-1 에 1.4 를, PDF/A-2 와 PDF/A-3 에 1.7 을 적용한다.
- OCProperties 검사 (코드 00003) 는 이제 조건부이다. PDF/A-1 문서에만 적용되며, PDF/A-1 에서는 optional content (레이어) 가 금지된다. PDF/A-2 와 PDF/A-3 는 레이어를 허용하므로 더 이상 플래그되지 않는다.
- 3 개의 새로운 컴플라이언스 검사를 추가했다. 코드 00006 은 암호화된 문서를 플래그한다 (암호화는 모든 PDF/A 버전에서 금지). 코드 00007 은 카탈로그에 OutputIntents 항목이 없는 문서를 플래그한다 (모든 PDF/A 버전에서 필수). 코드 00011 과 00012 는 컨포먼스 레벨이 -a (접근성) 일 때 MarkInfo 또는 StructTreeRoot 가 없는 문서를 플래그한다.
v3.41.0 2026-05-20
- PDF/A 모드는 이제 API 레벨에서 금지된 작업을 강제한다. PDF/A 모드 (1-6 중 어느 것) 가 활성화되면 SetEncryption, AddSeparationColor, SetFillColorCMYK, SetTextColorCMYK 또는 다른 CMYK/Separation/Shader API 를 호출하면 0 을 반환하고 효과가 없다. 이는 PDF/A 의 단일 sRGB 출력 인텐트 요구 사항과 일치한다.
- 투명도는 PDF/A-1 (모드 1 과 2) 에서 금지된다. SetTransparency, SetBlendMode, SetPageTransparencyGroup 은 활성 모드가 1 또는 2 일 때 0 을 반환하고 no-op 가 된다. PDF/A-2 와 PDF/A-3 (모드 3-6) 은 제한된 투명도를 허용하며 제한되지 않는다.
- JavaScript 액션은 모든 PDF/A 모드 (1-6) 에서 금지된다. SetOpenActionJavaScript, PageJavaScriptAction, DocJavaScriptAction, AddGlobalJavaScript, AddLinkToJavaScript 는 모든 PDF/A 모드가 활성화되면 0 을 반환하고 no-op 가 된다. ISO 19005-1 §6.6.1 은 PDF/A 문서에서 JavaScript 를 명시적으로 금지한다.
- 파일 첨부 API (EmbedFile, AddFileAttachment) 는 PDF/A-1 과 PDF/A-2 모드 (1-4) 에서 차단된다. 임의의 임베디드 파일을 명시적으로 허용하는 PDF/A-3 (모드 5 와 6) 에서는 계속 작동한다.
v3.40.0 2026-05-20
- SetPDFAMode 는 이제 PDF/A-2 와 PDF/A-3 컨포먼스 레벨을 지원한다. NewMode=3 은 PDF/A-2b, 4 는 PDF/A-2a, 5 는 PDF/A-3b, 6 은 PDF/A-3a 이다. PDF/A-2 는 PDF 1.7 을 대상으로 하며 레이어, 대화형 폼, JPEG2000 이미지, 제한된 투명도를 허용한다. PDF/A-3 는 PDF/A-2 를 확장하여 임의의 임베디드 파일 (모든 MIME 타입) 을 허용한다. 모든 -a 변형은 접근성 컨포먼스 레벨에서 필요한 /MarkInfo 와 태그된 PDF 구조 마커를 자동으로 기록한다.
- 수정: SetPDFAMode(1) (PDF/A-1a) 는 v3.20.0 에서 도입된 내부 라우팅 버그로 인해 no-op 였다. 이제 /MarkInfo 와 /OutputIntents 를 올바르게 기록하고 XMP pdfaid:part=1/conformance=A 를 설정한다.
- GetInformation(201) 은 새로운 모드 번호 체계와 일치하여 활성 PDF/A 모드에 해당하는 '1' 부터 '6' 까지 반환한다.
v3.39.0 2026-05-20
- SetStructElemWritingMode 는 현재 열려 있는 구조 요소에 /WritingMode 속성 (Layout owner) 을 설정한다. 유효한 값은 LrTb (좌에서 우, 라틴 스크립트의 기본값), RlTb (우에서 좌, 아랍어와 히브리어용), TbRl (위에서 아래 우에서 좌, 전통 CJK 세로 텍스트용) 이다. ISO 32000-1 §14.8.5.4.2 Table 340 에 정의되어 있다. Delphi 라이브러리, ActiveX (Dispid 73008049), DLL 인터페이스에서 제공된다.
- SetStructElemListNumbering 은 현재 열려 있는 구조 요소에 /ListNumbering 속성 (List owner) 을 설정한다. 지원되는 값은 None, Disc, Circle, Square (순서 없는 마커) 와 Decimal, UpperRoman, LowerRoman, UpperAlpha, LowerAlpha (순서 있는 번호 매기기) 를 포함한다. 속성은 L (리스트) 요소에 설정되어 보조 기술이 리스트 타입을 올바르게 안내할 수 있도록 한다. ISO 32000-1 §14.8.5.3.2 Table 336 에 정의되어 있다. Delphi 라이브러리, ActiveX (Dispid 73008050), DLL 인터페이스에서 제공된다.
v3.38.0 2026-05-20
- SetStructElemColSpan 은 현재 열려 있는 구조 요소에 /ColSpan 속성 (Table owner) 을 설정하여 셀이 걸치는 열 수를 나타낸다. ISO 32000-1 §14.8.5.7.2 Table 337 에 정의되어 있다. Delphi 라이브러리, ActiveX (Dispid 73008047), DLL 인터페이스에서 제공된다.
- SetStructElemRowSpan 은 현재 열려 있는 구조 요소에 /RowSpan 속성 (Table owner) 을 설정하여 셀이 걸치는 행 수를 나타낸다. ISO 32000-1 §14.8.5.7.2 Table 337 에 정의되어 있다. Delphi 라이브러리, ActiveX (Dispid 73008048), DLL 인터페이스에서 제공된다.
- 두 함수는 AddTagAttribute 를 Owner='Table' 과 해당 속성 이름으로 호출하는 것과 동등한 편의 래퍼이다. 복잡하거나 헤더가 걸치는 테이블에서 완전히 기술된 테이블 셀을 위해 SetStructElemScope 를 보완한다.
v3.37.2 2026-05-20
- GetPDFUADiagnostics 는 이제 N 개의 대화형 폼 필드 (Widget 어노테이션) 에 TU (툴팁 / 접근 가능한 이름) 항목이 없을 때 FORM-NO-TOOLTIP:N 을 보고한다. ISO 14289-1 §7.18.4 는 모든 대화형 폼 필드가 TU 항목을 가질 것을 요구하여, 필드가 포커스를 받을 때 보조 기술이 사용자에게 필드의 목적을 안내할 수 있도록 한다. /TU 는 스크린 리더가 읽어주는 접근 가능한 이름이며, 프로그래밍 방식의 접근과 폼 제출에 사용되는 부분 필드 이름 /T 와는 별개이다.
v3.37.1 2026-05-20
- GetPDFUADiagnostics 는 이제 N 개의 LI 또는 LBody 구조 요소가 필요한 부모 요소 밖에 나타날 때 LIST-STRUCT:N 을 보고한다. ISO 32000-1 §14.8.4.4 는 LI 가 L (리스트) 의 직접 자식이고 LBody 가 LI (리스트 항목) 의 직접 자식일 것을 요구한다. 잘못된 리스트 중첩은 보조 기술이 리스트 내용을 올바르게 순회하고 안내하지 못하게 하며, PDF/UA-1 검증기에서 문서 구조 검증 실패를 일으킬 수 있다.
v3.37.0 2026-05-20
- BeginTagEx2 는 한 번의 호출로 구조 요소를 열고 모든 주요 요소 속성을 설정하는 새로운 API 이다. BeginTagEx 의 TagType, AltText, ActualText, Lang 매개변수에 더해, BeginTagEx2 는 Title (/T, Tags 내비게이션 패널용), ElemID (/ID, 고유 요소 식별자), Expansion (/E, 약어 또는 두문자어의 전체 텍스트) 을 받는다. 이 세 추가 매개변수 중 어느 것에 빈 문자열을 전달하는 것은 해당 setter 를 생략하는 것과 동등하다. BeginTagEx2 는 잘 기술된 요소의 보일러플레이트를 줄인다 — BeginTagEx 호출 후 SetStructElemTitle, SetStructElemID, SetStructElemExpansion 을 별도로 호출하는 대신, 7 개 모든 속성을 한 번의 호출로 설정할 수 있다. 함수는 Delphi 라이브러리, ActiveX (Dispid 73008046), DLL 인터페이스에서 제공된다.
v3.36.1 2026-05-20
- GetPDFUADiagnostics 는 이제 N 개의 TH (테이블 헤더 셀) 구조 요소에 Scope 속성이 없을 때 TABLE-TH-NO-SCOPE:N 을 보고한다. ISO 32000-1 §14.8.4.3.4 Table 337 은 Scope (Row, Column, 또는 Both) 를 헤더 셀이 어떤 데이터 셀에 적용되는지 기술하는 속성으로 정의한다. 이것이 없으면 스크린 리더와 다른 보조 기술이 복잡하거나 다중 헤더 테이블에서 헤더 셀과 데이터 셀을 안정적으로 연결할 수 없으며, 이는 ISO 14289-1 §7.5 의 요구 사항이다. 각 TH 요소를 태그한 직후 SetStructElemAttr('Table','Scope', 'Column') (또는 'Row' / 'Both') 을 호출하라.
v3.36.0 2026-05-20
- SetStructElemExpansion 은 현재 열려 있는 구조 요소에 /E (확장 텍스트) 항목을 설정하는 새로운 API 이다 (ISO 32000-1 §14.9.5). 확장 텍스트는 요소에 포함된 약어 또는 두문자어의 완전히 풀어쓴 형태이다 — 예를 들어 텍스트가 "WWW" 인 Span 에 대해 "World Wide Web". 스크린 리더는 축약된 문자를 발음하려 하는 대신 확장형을 읽어주며, 이는 기술 및 과학 콘텐츠의 접근성에 매우 중요하다. PDF/UA-1 (ISO 14289-1 §7.2) 은 자연어가 명확하게 식별 가능할 것을 요구하며, /E 는 약어와 두문자어를 위한 표준 메커니즘이다. 함수는 Delphi 라이브러리, ActiveX, DLL 인터페이스에서 제공된다.
v3.35.1 2026-05-20
- GetPDFUADiagnostics 는 이제 문서 정보 사전 /Title 항목이 없거나 비어 있을 때 DOCINFO-TITLE-MISSING 을 보고한다. PDF/UA-1 (ISO 14289-1) 은 문서가 열릴 때 스크린 리더가 이를 안내할 수 있도록 문서 제목을 요구한다. 기존 DISPLAYDOCTITLE-FALSE 검사는 제목이 뷰어 타이틀 바에 표시되는지 확인하며, DOCINFO-TITLE-MISSING 은 이를 보완한다 — 제목 값 자체가 설정되었는지 확인한다. 값을 공급하려면 SetDocumentInfo('Title', ...) 을 호출하라.
v3.35.0 2026-05-20
- SetStructElemTitle 은 현재 열려 있는 구조 요소에 /T (제목) 항목을 설정하는 새로운 API 이다 (ISO 32000-1 §14.7.2 Table 324). 제목은 특정 요소 인스턴스를 식별하는 사람이 읽을 수 있는 레이블이다 — 예를 들어 "Chapter 1", "Summary Table", "Figure 3: Quarterly Sales" — 그리고 PDF 뷰어의 Tags 내비게이션 패널에 표시되어 접근성 보정 도구에서 사용된다. /T 는 /Alt (렌더링 불가 사용자를 위한 대체 텍스트) 와 /ActualText (글리프 레벨 텍스트 보정) 와는 별개이다. Table, Figure, Form, Sect, Div 와 같은 비텍스트 컨테이너 요소에서 가장 유용하다. 이전에 설정한 값을 지우려면 빈 문자열을 전달한다. 함수는 Delphi 라이브러리, ActiveX, DLL 인터페이스에서 제공된다.
v3.34.0 2026-05-20
- SetStructElemAltText 는 현재 열려 있는 구조 요소에 /Alt 항목을 설정하는 새로운 API 이다 (ISO 32000-1 §14.9.3). BeginTag 에 AltText 를 전달하는 것과 동등하지만, 요소가 열린 후에 대체 텍스트 설명을 설정하거나 갱신할 수 있게 한다 — 설명이 요소 타입과 별도로 계산될 때 유용하다. PDF/UA-1 (ISO 14289-1 §7.5) 은 Figure 와 Formula 요소에 Alt 텍스트를 요구하며, GetPDFUADiagnostics 는 이미 누락된 값에 대해 FIGURE-NO-ALT:N 을 보고한다. 함수는 Delphi 라이브러리, ActiveX, DLL 인터페이스에서 제공된다.
v3.33.1 2026-05-20
- GetPDFUADiagnostics 는 이제 문서에서 사용되지만 /RoleMap 사전에 항목이 없는 사용자 정의 구조 요소 타입 이름을 감지하는 ROLEMAP-UNMAPPED:N 검사를 포함한다. ISO 14289-1 §7.1 과 ISO 32000-1 §14.7.3 은 보조 기술이 요소를 어떻게 처리할지 결정할 수 있도록 모든 비표준 구조 타입을 표준 PDF 타입 (예: P, Span, Figure) 에 매핑할 것을 요구한다. N 개의 매핑되지 않은 타입이 발견되면, 호출자가 어떤 AddRoleMap 항목이 필요한지 알 수 있도록 이슈 설명에 타입 이름 목록이 포함된다. ISO 32000-1 Table 333 (PDF 1.7) 에 정의된 49 개의 모든 표준 구조 타입은 인식되어 보고에서 제외된다.
v3.33.0 2026-05-20
- SetStructElemLang 은 현재 열려 있는 구조 요소에 /Lang 항목을 설정하는 새로운 API 이다 (ISO 32000-1 §14.9.2). 언어 태그는 해당 요소와 그 모든 자손에 대해 SetDocumentLanguage 또는 SetPDFUAMode 로 선언된 문서 수준 언어를 재정의하여, 다국어 문서가 각 span 을 올바른 BCP 47 언어 태그 (예: 'en-US', 'fr', 'zh-Hant-TW') 로 표시할 수 있게 한다. 스크린 리더는 요소 수준 /Lang 을 사용하여 문서를 소리 내어 읽을 때 적절한 음성 합성 엔진이나 음성을 선택한다. 함수는 Delphi 라이브러리, ActiveX, DLL 인터페이스에서 제공된다.
v3.32.0 2026-05-20
- SetStructElemActualText 는 현재 열려 있는 구조 요소에 /ActualText 항목을 설정하는 새로운 API 이다 (ISO 32000-1 §14.9.4). 콘텐츠 스트림 추출이 부정확한 결과를 산출할 때 글리프 시퀀스가 나타내는 정확한 유니코드 텍스트를 지정하는 데 사용한다 — 가장 일반적인 경우는 OpenType 합자 글리프 (U+FB00 ff, U+FB01 fi, U+FB02 fl) 와 비명백한 확장형을 가진 약어이다. ActualText 는 렌더링된 내용을 대체하지 않고 보완하며, 시각적 렌더링을 억제하지 않으면서 해당 요소에 대해 보조 기술과 텍스트 추출기가 읽는 것을 재정의한다. 함수는 Delphi 라이브러리, ActiveX, DLL 인터페이스에서 제공된다.
v3.31.1 2026-05-20
- GetPDFUADiagnostics 는 이제 누락된 Alt 텍스트를 보고할 때 (FIGURE-NO-ALT:N) Figure 요소 외에 Formula 구조 요소도 검사한다. ISO 32000-1 §14.9.3 은 그래픽 figure 와 수학 공식 모두에 대체 설명을 요구한다. 이전에는 Figure 요소만 스캔되었다.
- GetPDFUADiagnostics 는 이제 문서의 PDF 버전이 1.7 미만일 때 PDF-VERSION-LOW 를 보고한다. PDF/UA-1 (ISO 14289-1) 은 PDF 1.7 (ISO 32000-1:2008) 에 대해 정의되어 있으며, PDF 1.5 또는 1.6 의 문서는 기본 사양 요구 사항을 충족하지 않는다. 버전을 1.7 로 자동 상승시키려면 SetPDFUAMode 를 호출한다.
v3.31.0 2026-05-19
- 구조 요소 ID 와 테이블 헤더 연결을 이제 지원한다. SetStructElemID 는 현재 열려 있는 구조 요소에 고유 문자열 식별자 (/ID) 를 할당한다. ID 는 문서가 저장될 때 구조 트리 루트의 /IDTree 네임 트리로 수집되어, 접근성 도구와 상호 참조가 ID 로 요소를 찾을 수 있게 한다 (ISO 32000-1 §14.7.4). SetStructElemHeaders 는 현재 테이블 셀 (TD 또는 TH) 을 이전에 할당된 ID 의 쉼표로 구분된 목록을 통해 하나 이상의 헤더 셀과 연결하고, Table 속성 owner 사전에 /Headers 배열을 작성한다 (ISO 32000-1 §14.8.5.7.2). 이 두 함수는 함께 PDF/UA-1 (ISO 14289-1 §7.10) 과 WCAG 2.x SC 1.3.1 을 위한 복잡한 테이블 마크업을 지원한다. 두 함수 모두 Delphi 라이브러리, ActiveX, DLL 인터페이스에서 제공된다. AddTagAttribute 도 이제 쉼표로 구분된 값을 가진 /Headers 속성을 PDF 텍스트 문자열 배열로 올바르게 처리한다.
v3.30.1 2026-05-19
- GetPDFUADiagnostics 는 이제 문서 순서에서 헤딩 레벨 점프 (예: H2 없이 H1 직후에 H3 이 오는 경우) 를 감지하는 HEADING-LEVEL-SKIP:N 검사를 포함한다. 검사는 전체 구조 요소 트리의 사전 순회를 수행하고 다음 헤딩 레벨이 이전 레벨보다 1 을 초과하는 발생을 세어 보고한다. 일반 H 요소는 H1 로 취급된다. 더 높은 레벨의 헤딩으로 돌아가는 것 (H3 → H1) 은 점프로 계산되지 않는다. WCAG 2.x 성공 기준 1.3.1 과 ISO 14289-1 §7.1 은 헤딩이 공백 없이 중첩될 것을 요구한다.
v3.30.0 2026-05-19
- 이제 태그된 PDF 와 PDF/UA 문서에 대해 구조 요소 속성을 지원한다. 세 개의 새로운 API 함수가 태그 스택에서 현재 빌드 중인 구조 요소에 속성을 첨부할 수 있게 한다. AddTagAttribute (범용, 모든 owner/이름/값), SetStructElemScope (Table owner 아래에 /Scope 속성을 설정하는 편의 래퍼, TH 헤더 셀용 — ISO 32000-1 §14.8.5.7.2), SetStructElemBBox (Layout owner 아래에 /BBox 속성을 설정하는 편의 래퍼, figure 와 다른 시각적으로 배치된 요소용 — ISO 32000-1 §14.8.5.4). 문서가 저장될 때, 속성은 각 구조 요소에 /A 속성 사전으로 작성된다. 동일한 owner 의 여러 속성은 하나의 dict 로 묶이고, 서로 다른 owner 의 속성은 dict 의 배열로 작성된다. 세 함수 모두 Delphi 라이브러리, ActiveX, DLL 인터페이스에서 제공된다.
v3.29.1 2026-05-19
- GetPDFUADiagnostics 는 이제 두 가지 추가 검사를 포함한다. 문서의 Figure 구조 요소 중 Alt 텍스트 값이 없는 것이 있는지 (FIGURE-NO-ALT:N 으로 보고, ISO 14289-1 §7.5 와 ISO 32000-1 §14.9.3 에 따름), 그리고 EndTag 가 호출되지 않아 아직 열려 있는 구조 요소가 있는지 (STRUCT-UNCLOSED:N 으로 보고) 검사한다. Figure 검사는 구조 요소 트리의 완전한 재귀 순회를 수행하여 모든 중첩 깊이의 요소를 다룬다.
v3.29.0 2026-05-19
- GetPDFUADiagnostics 는 문서에서 잠재적인 PDF/UA-1 (ISO 14289-1) 컴플라이언스 이슈를 검사하고 발견 사항을 줄바꿈으로 구분된 목록으로 반환하는 새로운 진단 API 이다. 6 가지 검사가 수행된다. MarkInfo/Marked 가 설정되어 있는지 (태그된 PDF), 문서 카탈로그에 /Lang 항목이 있는지, ViewerPreferences/DisplayDocTitle 이 true 인지, XMP 메타데이터에 pdfuaid:part 식별자가 있는지, Contents 항목이 없는 비면제 어노테이션의 수, AFRelationship 항목이 없는 임베디드 파일의 수이다. 각 발견 사항은 짧은 코드 (예: LANG-MISSING, ANNOT-NO-CONTENTS:3) 와 사람이 읽을 수 있는 설명으로 식별된다. 이슈가 없으면 빈 문자열을 반환한다. Delphi 라이브러리, ActiveX, DLL 인터페이스에서 제공된다.
v3.28.5 2026-05-19
- PDF/UA-1 어노테이션 접근성 개선: FileAttachment 어노테이션에 Contents 항목과 /T 필드가 모두 없을 때, 어노테이션의 임베디드 파일 사양 (/FS /UF 또는 /F) 의 파일명이 이제 대체 접근 가능한 설명으로 사용된다. 이로써 어노테이션 Contents 폴백 체인이 완성된다: /T → Link URI → Stamp 이름 → FileAttachment 파일명. 스크린 리더는 침묵 대신 첨부 파일의 이름을 받게 되어, 가장 일반적인 어노테이션 타입에 대해 ISO 14289-1 §7.18.1 을 충족한다.
v3.28.4 2026-05-19
- PDF/UA-1 어노테이션 접근성 개선: Stamp 어노테이션에 Contents 항목이 없거나 (또는 비어 있고) /T 필드가 없을 때, 어노테이션의 /Name 항목의 스탬프 타입 이름이 이제 대체 접근 가능한 설명으로 사용된다 (예: "Approved", "Draft", "Confidential", "Final"). 이는 v3.28.3 에서 도입된 어노테이션 Contents 폴백 체인을 스탬프 어노테이션을 다루도록 확장하며, 검토 또는 승인된 문서가 관련된 워크플로에서 흔하고 명시적 Contents 값이 자주 없다.
v3.28.3 2026-05-19
- PDF/UA-1 어노테이션 접근성 개선: Link 어노테이션에 Contents 항목이 없거나 (또는 비어 있고) /T 필드가 없을 때, 어노테이션의 URI 액션의 URI 가 이제 대체 접근 가능한 설명으로 사용된다. 이는 SetPDFUAMode 처리 중에만 그리고 /URI 액션을 가진 Link 어노테이션에만 적용된다. 스크린 리더는 마지막 수단의 레이블로 URL 을 받아, 작성자가 사람이 읽을 수 있는 설명을 제공하지 않고 하이퍼링크를 만드는 일반적인 경우에 ISO 14289-1 §7.18.1 을 충족한다.
v3.28.2 2026-05-19
- SetEmbeddedFileAFRelationship 는 임베디드 파일의 파일 사양 사전에 AFRelationship 값을 명시적으로 설정하기 위한 새로운 API 이다. ISO 14289-1 (PDF/UA-1) §7.11 에서 요구되며, 호출자가 다섯 가지 유효한 값 중 선택하여 임베디드 파일과 문서 콘텐츠의 의미론적 관계를 지정할 수 있게 한다: Source, Data, Alternative, Supplement, Unspecified. SetPDFUAMode 가 활성화되면 AFRelationship 키가 없는 임베디드 파일은 자동으로 Unspecified 가 할당된다. 저장 전에 이 함수를 사용하여 그 기본값을 재정의한다. Delphi 라이브러리, ActiveX, DLL 인터페이스에서 제공된다.
v3.28.1 2026-05-19
- XMP 메타데이터에 문서별 제목이 아닌 일반 라이브러리 기본 제목이 있는 문서에서 SetPDFUAMode 가 호출되면, 이제 제목이 자동으로 문서의 /Info Title 항목의 값으로 대체된다 (있는 경우). 이로써 pdfuaid:part-1 XMP 패킷이 자리표시자가 아닌 실제 문서 제목을 반영하여 PDF/UA-1 검증기 기대치를 충족한다.
- XMP 파서 (LoadFromString) 는 이제 문서가 로드될 때 기존 XMP 메타데이터에서 dc:title 값을 읽으므로, 이미 dc:title 이 있는 PDF 를 라운드트리핑할 때 해당 제목이 기본 자리표시자로 되돌아가지 않고 올바르게 보존된다.
v3.28.0 2026-05-19
- BeginArtifactEx(ArtifactType, ArtifactSubtype) 는 BeginArtifact 를 확장하여 단일 호출로 artifact /Type 과 Pagination /Subtype 을 모두 표현하는 새로운 태그된 PDF API 이다. 두 매개변수가 모두 비어 있지 않을 때 출력되는 연산자는 /Artifact << /Type /T /Subtype /S >> BMC 이며, ISO 32000-1 §14.8.2.2.1 에 따라 헤더와 푸터 같은 완전히 지정된 Pagination artifact 를 가능하게 한다. 하나의 매개변수만 비어 있지 않으면 해당 단일 키 형식이 사용된다. DLL 진입점 DLBeginArtifactEx 와 DLBeginArtifactExA 도 내보내진다.
v3.27.2 2026-05-19
- BeginArtifact 는 이제 artifact 타입을 페이지네이션 서브타입과 올바르게 구분한다. 인수가 Pagination, Layout, Page 일 때 (ISO 32000-1 §14.8.2.2.1 Table 330 에 따른 artifact 타입), 마크된 콘텐츠 연산자는 /Subtype 대신 /Type 을 작성한다. Header, Footer, Watermark 같은 다른 값은 계속 /Subtype 으로 작성된다. 이는 호출자가 페이지네이션 artifact 를 표시하려고 했을 때 /Subtype /Pagination 을 작성하던 이전의 부정확한 출력을 수정한다.
v3.27.1 2026-05-19
- PDF/UA 모드가 활성화되고 문서에 임베디드 파일이 있을 때, AFRelationship 항목이 없는 각 파일 사양 사전이 이제 저장 시 자동으로 하나를 받는다. 작성되는 값은 /Unspecified 이며, 모든 임베디드 파일이 AFRelationship 키를 가질 것을 요구하는 ISO 14289-1 §7.11 의 요구 사항을 충족한다. 이는 EmbedFile 을 통해 추가된 파일과 로드된 문서에 이미 존재하는 임베디드 파일 모두에 적용된다.
v3.27.0 2026-05-19
- AddRoleMap(CustomType, StandardType) 은 사용자 정의 (비표준) 구조 요소 타입 이름에서 표준 PDF 구조 타입으로의 매핑을 등록하는 새로운 태그된 PDF API 이다. 저장될 때 매핑은 구조 트리 루트의 RoleMap 사전에 작성되어, 애플리케이션 별 태그 이름을 사용하는 문서에 대한 ISO 14289-1 §7.1 요구 사항을 충족한다. 여러 매핑이 등록될 수 있으며, 중복 키는 마지막 호출로 덮어쓴다. DLL 진입점 DLAddRoleMap 과 DLAddRoleMapA 도 내보내진다.
v3.26.0 2026-05-19
- BeginTagEx(TagType, AltText, ActualText, Lang) 는 BeginTag 를 확장하여 명시적인 자연 언어 속성을 가지는 새로운 태그된 PDF API 이다. Lang 이 비어 있지 않으면 구조 요소의 /Lang 속성에 작성되어, 다국어 문서에 대해 ISO 14289-1 §7.2 가 요구하는 요소별 언어 어노테이션을 가능하게 한다. 빈 Lang 문자열을 전달하면 BeginTag 와 동일하게 동작한다. DLL 진입점 DLBeginTagEx 와 DLBeginTagExA 도 내보내진다.
v3.25.1 2026-05-19
- 기본 Windows 코드 페이지 (WinAnsiEncoding) 로 로드된 비서브셋 TrueType 폰트가 이제 ToUnicode CMap 스트림을 받아, 이 폰트들에 대해 신뢰할 수 있는 유니코드 텍스트 추출과 복사/붙여넣기를 가능하게 한다. 이전에는 명시적 코드 페이지 재정의나 Differences 배열이 있을 때만 ToUnicode 스트림이 작성되었으며, 일반적인 기본 인코딩 경로에서는 누락되어 있었다.
- 동일한 수정이 명시적 비기본 코드 페이지를 사용하지만 Differences 배열이 없는 TrueType 폰트와 패키지된 폰트 형식으로 로드된 폰트에도 적용된다.
v3.25.0 2026-05-19
- PDF/UA 모드가 활성화되면, Contents 항목이 비어 있지 않은 항목이 없는 비면제 어노테이션 (Widget, PrinterMark, TrapNet 을 제외한 모든 타입) 이 이제 저장 시 자동으로 하나를 받는다. 어노테이션의 /T (제목 / 작성자) 값이 폴백으로 사용되어, 제목은 있지만 명시적인 접근 가능한 설명이 없는 어노테이션에 대해 ISO 14289-1 §7.18.1 을 충족한다.
v3.24.0 2026-05-19
- PDF/UA 모드가 활성화되면, TU (툴팁 / 대체 설명) 항목이 없는 대화형 폼 필드가 이제 저장 시 자동으로 하나를 받는다. 필드의 부분 이름 (/T 항목) 이 폴백 값으로 사용되어, 스크린 리더가 모든 필드를 식별할 수 있도록 보장한다. 푸시 버튼은 ISO 14289-1 §7.18.4 에 따라 이 요구 사항에서 올바르게 제외된다.
v3.23.1 2026-05-19
- GetInformation(200) 은 선택된 문서에서 PDF/UA-1 모드가 활성화되었을 때 '1' 을 반환하여, 호출자가 런타임에 컨포먼스 모드 상태를 조회할 수 있게 한다.
- GetInformation(201) 은 PDF/A-1a 에 대해 '1', PDF/A-1b 에 대해 '2', 또는 PDF/A 모드가 꺼져 있으면 빈 문자열을 반환한다.
- GetInformation(311) 과 GetInformation(312) 는 이제 가장 최근의 버전 잠금 충돌의 버전 요구 문자열과 기능 이름을 올바르게 반환한다 (v3.20.3 항목에서 광고되었지만 아직 구현되지 않았었음).
- GetInformation(313) 은 저장 대상이 현재 잠겨 있는 PDF 버전 문자열을 반환하거나, 자유롭게 버전화되는 문서에 대해 빈 문자열을 반환한다.
v3.23.0 2026-05-19
- SetMarkInfo(Marked) 는 이제 공개 API 가 되어, MarkInfo.Marked 플래그를 SetPDFUAMode 가 수행하는 전체 PDF/UA-1 설정과 독립적으로 설정할 수 있다. Marked 가 1 일 때, ISO 14289-1 §7.18.6 의 요구에 따라 MarkInfo.Suspects 도 false 로 설정된다.
- PDF/UA 모드가 활성화되면, 모든 페이지가 저장 시 자동으로 /Tabs /S 항목을 받아, ISO 14289-1 §7.18.4 의 구조 기반 탭 순서 요구 사항을 충족한다.
- SetPDFUAMode, SetDocumentLanguage, SetMarkInfo, BeginTag, EndTag, BeginArtifact, EndArtifact 에 대한 HTML 참조 문서가 전체 구문 표와 사용 예제와 함께 추가되었다.
v3.22.0 2026-05-19
- BeginTag(TagType, AltText, ActualText) 는 현재 콘텐츠 스트림에서 태그된 PDF 구조 요소를 열고, 자동 할당된 MCID 와 함께 BDC 연산자를 작성하며, 문서 구조 트리에 요소를 등록한다. TagType 은 임의의 PDF 표준 구조 타입이다 (P, H1, Figure, Table 등). AltText 와 ActualText 는 PDF 텍스트 문자열로 인코딩된 (UTF-16BE) 선택적 접근성 문자열이다.
- EndTag 는 가장 최근에 열린 구조 요소를 닫고, 콘텐츠 스트림에 일치하는 EMC 연산자를 작성한다.
- BeginArtifact(SubType) 는 콘텐츠 영역을 PDF artifact (페이지네이션 artifact, 배경 등) 로 표시하고 BMC 연산자를 작성한다. SubType 은 선택적이며, 제공되면 /Artifact << /Subtype /SubType >> 로 작성된다.
- EndArtifact 는 artifact 영역을 EMC 연산자로 닫는다.
- 저장 시점에 태그된 구조 요소가 등록되어 있으면, 라이브러리는 자동으로 완전한 StructTreeRoot 를 구축하고, 영향을 받는 페이지에 StructParents 키를 할당하며, ParentTree 숫자 트리를 작성하여 태그된 PDF 에 대한 ISO 32000-1 §14.7 요구 사항을 충족한다.
- WinAnsi 인코딩을 사용하는 표준 Type 1 폰트 (Helvetica, Times, Courier 패밀리, Symbol) 와 임베디드 Type 1 폰트가 이제 ToUnicode CMap 스트림을 받아, 이 폰트 타입에 대해 신뢰할 수 있는 유니코드 텍스트 추출과 복사/붙여넣기를 가능하게 한다.
v3.21.0 2026-05-19
- SetPDFUAMode(Language) 는 PDF/UA-1 (ISO 14289-1) 컨포먼스 모드를 활성화한다. 문서를 PDF 1.7 로 자동 bump 하고, MarkInfo.Marked 와 MarkInfo.Suspects 를 작성하고, ViewerPreferences 의 DisplayDocTitle 을 활성화하고, Language 가 비어 있지 않으면 Catalog.Lang 을 설정하며, ISO 14289-1 Section 6.7.11 에서 요구하는 pdfuaid:part = 1 XMP 네임스페이스 항목을 작성한다.
- SetDocumentLanguage(Language) 는 Catalog /Lang 항목을 직접 작성하여, PDF/UA 모드와 독립적으로 문서 언어를 선언할 수 있게 한다.
- MarkInfo.Suspects 는 이제 MarkInfo.Marked 가 true 로 설정될 때마다 false 로 설정되어, ISO 14289-1 의 태그된 PDF 구조 요구 사항 (Section 7.18.6) 을 충족한다.
- Encrypt 는 이제 문서가 PDF/UA 모드일 때 CanCopyAccess (접근성을 위한 콘텐츠 복사) 권한 플래그를 강제하여, ISO 14289-1 Section 7.17 에서 요구하는 대로 한다.
- Choice (드롭다운) 폼 필드는 더 이상 의미 없는 하드코딩된 툴팁 값을 가지지 않는다. TU 는 설정되지 않은 채로 두어 호출자가 폼 필드 속성 API 를 통해 의미 있는 레이블을 할당할 수 있게 한다.
v3.20.3 2026-05-19
- Encrypt 와 AddSWFAnnotationFromFile 는 이제 저장 버전이 선택된 암호화 강도나 어노테이션 타입이 요구하는 최소값 아래로 잠겨 있을 때, 자동으로 진행하다가 저장 시에만 실패하는 대신, LastErrorCode 602 와 함께 즉시 0 을 반환한다.
- GetInformation(311) 과 GetInformation(312) 는 이제 잠긴 버전이 AES-256 이나 RichMedia 어노테이션 같은 확장 수준 기능을 차단할 때 작성 시점의 충돌하는 버전 요구 사항을 반영한다.
v3.20.2 2026-05-19
- AddU3DAnnotationFromFile 는 이제 더 낮은 버전의 문서에 3D 어노테이션이 추가될 때 문서 버전을 자동으로 PDF 1.6 으로 bump 하며, 다른 모든 PDF 1.6+ API 진입점의 버전 자동 bump 동작과 일치한다.
v3.20.1 2026-05-17
- PDF 1.2 저장 대상은 이제 엄격한 PDF 1.2 계약으로 강제된다. 페이지 TrimBox 데이터 같은 PDF 1.3+ 객체를 PDF 1.2 대상 아래에 저장하는 것은 혼합 버전 파일을 출력하는 대신 출력이 작성되기 전에 실패한다.
- PDF 1.7 Adobe 확장 수준 컴플라이언스가 이제 저장 사전 점검의 일부이다. AESV3, AES-256, RichMedia, Projection, geospatial 사전, ETSI 서명 subfilter 는 요구되는 ExtensionLevel 에 대해 검사된다.
- AES-256 암호화, RichMedia 어노테이션, geospatial 사전, ETSI 서명 subfilter 는 이제 PDFlib 이 문서를 PDF 1.7 확장 콘텐츠로 자동 bump 할 때 일치하는 Adobe Extensions 항목을 선언한다.
- Append 저장은 이제 전체 저장과 동일한 버전 컴플라이언스 게이트를 사용한다.
- 번들된 선택적 PDFium 런타임 DLL 이 Win32 와 Win64 용으로 새로 고침되었다. GDI+ 는 기본 렌더러로 유지되고, PDFium 은 SetPDFiumFileName 과 SelectRenderer(3) 을 통한 옵트인 상태로 유지된다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 207/207 통과했고, C++Builder Win64x GoogleTest 는 61 개 테스트 통과, 기존 샘플 의존 테스트 2 개는 스킵되었다.
v3.20.0 2026-05-17
- 8 개의 추가 PDFlib writer 진입점이 이제 Phase 3 EnsureMinVersion 을 통해 라우팅되어, 출력되는 기능이 요구하는 최소값으로 문서 버전을 자동 bump 한다: SetDocumentMetadata (PDF 1.4 - /Metadata XMP 스트림) SetPDFAMode(1 또는 2) (PDF 1.4 - /MarkInfo + /OutputIntents) PageJavaScriptAction (PDF 1.5 - Page /AA + JavaScript) DocJavaScriptAction (PDF 1.4 - Catalog /AA + JavaScript) SetTabOrderMode (PDF 1.5 - Page /Tabs) NewOptionalContentGroup (PDF 1.5 - /Type /OCG) SetNeedAppearances (PDF 1.5 - AcroForm /NeedAppearances) NewFormField(ftSignature) (PDF 1.5 - AcroForm /SigFlags AppendOnly)
- v3.15.0 세트 (SetTransparency, SetPageUserUnit, Encrypt, SetPageLayout) 와 v3.17.0 세트 (8 개의 JavaScript / 임베디드 파일 / XFA / SWF 항목) 와 결합하여, PDFlib 은 이제 21 개의 writer 진입점에 걸쳐 FVersion 을 자동 bump 한다.
- NewOptionalContentGroup 은 이전에 FVersion 을 직접 bump 했다. 이제 EnsureMinVersion 을 통과하므로 LockSaveVersion 이 존중되고 bump 가 AutoBumpedFeatures 에 기록된다.
v3.19.0 2026-05-17
- 저장 시점과 로드 시점의 PDF 버전 컴플라이언스가 이제 이전에 연기되었던 4 가지 기능도 인식한다: Btn /Ff 비트 15 NoToggleToOff (라디오 버튼 전용) -> PDF 1.4 DeviceN /Subtype /NChannel (색 공간 정제) -> PDF 1.6 FontFile3 /Subtype /OpenType (폰트 프로그램 타입) -> PDF 1.6 Sig /SubFilter ETSI.CAdES.detached 또는 ETSI.RFC3161 -> PDF 1.7
- NChannel 규칙은 인덱스 4 의 속성 사전이 /Subtype /NChannel 을 가질 때 DeviceN 색 공간 배열 형식 [/DeviceN names alternateSpace tintTransform attributes] 과 일치한다.
- FontFile3 OpenType 규칙은 스트림이 'FontFile3' 이라는 부모 키를 통해 도달했을 때만 발동되므로, 우연히 /Subtype /OpenType 을 가진 무관한 스트림은 플래그되지 않는다.
- PDFFeatureRules 테이블은 이제 103 개의 규칙을 가진다 (99 + 4 개의 새 규칙).
v3.18.6 2026-05-17
- 저장 시점과 로드 시점의 PDF 버전 컴플라이언스가 이제 컨테이너 타입을 인식하면서 /AA (추가 액션) 를 인식한다: Catalog /AA (문서 수준 트리거) -> PDF 1.4 Annot /AA (어노테이션 트리거) -> PDF 1.4 Page /AA (페이지 트리거) -> PDF 1.5
- 폼 필드 /AA (PDF 1.2) 는 기존 PDF 1.3 저장 계약으로 계속 다루어진다. 추가 규칙이 필요하지 않다.
- PDFFeatureRules 테이블은 이제 99 개의 규칙을 가진다 (96 + 3 개의 새 규칙).
v3.18.5 2026-05-17
- 저장 시점과 로드 시점의 PDF 버전 컴플라이언스가 이제 Page /Tabs 를 PDF 1.5 기능으로 올바르게 분류한다. 이전에는 PDF 1.4 로 잘못 분류되었다. PDF 1.4 사양 변경 문서 (Adobe TN #5409) 는 /Tabs 를 나열하지 않으며, PDF 1.5 Table 8.10 은 "Tabs (Optional; PDF 1.5)" 를 도입한다.
- 새 규칙: AcroForm /NeedAppearances 는 PDF 1.5 Table 218 에 따라 PDF 1.5 기능으로 인식된다.
- PDFFeatureRules 테이블은 이제 96 개의 규칙을 가진다 (95 + 1 개의 새 규칙).
v3.18.4 2026-05-13
- PDFlibZLib 는 이제 정상적인 라이브러리 빌드에서 항상 번들된 정적 zlib-ng 객체 백엔드를 사용하며, 남아 있던 System.ZLib 폴백 경로를 제거했다.
- zlib-ng 회귀 커버리지는 이제 Delphi 와 C++Builder 테스트 러너에서 경계 크기 페이로드, PNG 와 유사한 스캔라인 데이터, 저장된 다중 블록 스트림, 알려진 zlib 스트림을 포함한다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 194/194 통과했고, C++Builder Win64x GoogleTest 는 58 개 테스트 통과, 기존 샘플 의존 테스트 2 개는 스킵되었다.
v3.18.3 2026-05-12
- PDF 또는 텍스트 출력을 생성하는 Delphi 와 C++Builder 데모가 이제 성공적인 저장 후 자동으로 생성된 문서를 연다.
- 인스톨러 패키징은 이제 데모 폴더에서 빌드 산출물을 제외하고, C++Builder 샘플과 DLL 및 ActiveX/OCX 모듈을 옵트인 컴포넌트로 만든다. 일치하는 파일은 컴포넌트가 선택될 때만 설치된다.
v3.18.2 2026-05-12
- Delphi 와 C++Builder EditFormField 데모는 이제 필드 값을 갱신하기 전에 /NeedAppearances 를 지우므로, 편집된 모든 텍스트 필드가 저장된 PDF 에서 새로 고친 normal 외관 스트림을 받는다.
- 이는 저장된 /AP 스트림이 저장된 /V 값과 동기화되도록 유지하고, 필드에 포커스를 맞추면 정적 필드 외관에 누락되어 있던 텍스트가 드러나는 뷰어 의존적인 차이를 피한다.
v3.18.1 2026-05-10
- 저장 시점과 로드 시점의 PDF 버전 컴플라이언스가 이제 비트 수준 폼 필드 /Ff 플래그와 AcroForm /SigFlags AppendOnly 비트도 인식한다: /Ff 비트 21 (FileSelect, 마스크 1048576) -> PDF 1.4 /Ff 비트 22 (MultiSelect, 마스크 2097152) -> PDF 1.4 /Ff 비트 23 (DoNotSpellCheck, 마스크 4194304) -> PDF 1.4 /Ff 비트 24 (DoNotScroll, 마스크 8388608) -> PDF 1.4 /Ff 비트 25 (Comb, 마스크 16777216) -> PDF 1.5 /Ff 비트 26 (RichText / RadiosInUnison, 33554432) -> PDF 1.5 /Ff 비트 27 (CommitOnSelChange, 마스크 67108864) -> PDF 1.5 /SigFlags 비트 2 (AppendOnly, 마스크 2) -> PDF 1.5
- /Parent 상속은 따르지 않는다. /Ff 또는 /SigFlags 를 명시적으로 가진 사전만 규칙을 발동한다.
- PDFFeatureRules 테이블은 이제 95 개의 규칙을 가진다 (87 + 8 개의 새 비트 수준 규칙).
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 191/191 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
v3.18.0 2026-05-10
- 저장 시점과 로드 시점의 PDF 버전 컴플라이언스가 이제 9 가지 추가 서브키와 비트 수준 기능도 인식한다: 비트 수준 어노테이션 플래그 (/F 마스크): Locked (128) -> PDF 1.4 ToggleNoView (256) -> PDF 1.5 LockedContents (512) -> PDF 1.7 구분되는 카탈로그와 페이지 서브키: /BoxColorInfo (페이지) -> PDF 1.4 /Permissions, /Legal, /PresSteps -> PDF 1.5 /VP (페이지 geospatial 뷰포트) -> PDF 1.6 /Collection (카탈로그 portable collection) -> PDF 1.7
- PDFFeatureRules 테이블은 이제 87 개의 규칙을 가진다 (78 개의 챕터 수준 + 9 개의 서브키 / 비트 수준).
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 189/189 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
v3.17.0 2026-05-10
- 8 개의 추가 PDFlib writer 진입점이 이제 Phase 3 EnsureMinVersion 을 통해 라우팅되어, 출력되는 기능이 요구하는 최소값으로 문서 버전을 자동 bump 한다: AddLinkToJavaScript, SetOpenActionJavaScript, AddGlobalJavaScript, FormFieldJavaScriptAction (PDF 1.3 - JavaScript 액션) AddEmbeddedFile, AddFileAttachment (PDF 1.3 - 파일 첨부) SetXFAFromString (PDF 1.5 - XFA 폼) AddSWFAnnotationFromFile (PDF 1.7 - RichMedia 어노테이션)
- v3.15.0 세트 (SetTransparency, SetPageUserUnit, Encrypt, SetPageLayout) 와 결합하여, PDFlib 은 이제 13 개의 고버전 writer 진입점을 종단 간 다룬다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 187/187 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
v3.16.3 2026-05-10
- 새로운 PDFlib API: LockSaveVersion(Version) 은 문서를 Version 으로 고정하고 Phase 3 writer 측 EnsureMinVersion 이 그 위로 자동 bump 하는 것을 막는다. UnlockSaveVersion 은 잠금을 해제한다.
- 저장 시점 게이트는 변경되지 않았다. 잠긴 버전 위의 writer 출력 기능은 헤더를 silently bump 하는 대신 저장 시점에 여전히 LastErrorCode 602 를 생성한다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 184/184 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
v3.16.2 2026-05-10
- 로드된 PDF 가 이제 GetInformation(103) ("ContributorFeatures") 을 통해 로드 시점 기능 감지의 기여자 전용 뷰를 노출한다. 목록은 최소 요구 버전이 HeaderVersion (키 100) 보다 엄격히 큰 기능만 포함하며, "왜 효과적인 버전이 파일 헤더보다 높은가?" 라는 질문에 직접 답한다.
- GetInformation(101) ("DetectedFeatures") 은 변경되지 않으며 기여 여부에 관계없이 일치한 모든 기능을 계속 나열한다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 181/181 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
v3.16.1 2026-05-10
- 로더 측 감지 테스트 커버리지를 6 개의 추가 합성 픽스처로 확장했다: 페이지 내 투명도 ExtGState (버전 bump 없음), Catalog /MarkInfo (PDF 1.3 -> PDF 1.4), /OCProperties + OCG 콘텐츠 (PDF 1.4 -> PDF 1.5), /Type /3DStream (PDF 1.5 -> PDF 1.6), 다중 기능 조합 픽스처, 스냅샷 안정성 검사.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 179/179 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
v3.16.0 2026-05-10
- 로드된 PDF 문서는 이제 콘텐츠 기반 버전 감지 패스를 거친다. 모든 간접 객체가 저장 시점 게이트가 사용하는 기능 대 최소 버전 테이블을 통해 순회되며, 콘텐츠가 실제로 더 높은 버전을 요구할 때 FVersion 이 리터럴 %PDF-X.Y 헤더 값 위로 bump 된다. 예를 들어 /UserUnit 페이지 항목은 파일 헤더가 PDF 1.4 라고 하더라도 효과적인 버전을 PDF 1.6 으로 bump 한다.
- 새 GetInformation 키: 100 은 HeaderVersion (리터럴 %PDF-X.Y) 을 반환하고, 101 은 DetectedFeatures (로드 시 일치한 CRLF 로 구분된 기능) 를 반환하며, 102 는 AutoBumpedFeatures (writer 측 EnsureMinVersion 을 트리거한 CRLF 로 구분된 기능) 를 반환한다.
- 저장 시점 게이트는 영향을 받지 않는다. 로드 시 효과적인 버전이 bump 된 후 SetInformation(0, ...) 으로 명시적으로 다운그레이드된 문서도 저장 시점에 여전히 LastErrorCode 602 를 생성한다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 173/173 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
v3.15.0 2026-05-10
- 특정 최소 PDF 버전을 요구하는 기능을 생성하는 Writer 진입점은 이제 문서의 PDF 버전을 자동으로 bump 한다. PDF 1.3 으로 표시된 문서에 SetTransparency 를 호출하면 LastErrorCode 602 로 저장을 실패하는 대신 헤더를 PDF 1.4 로 승격한다.
- 동일한 자동 bump 가 SetPageUserUnit (>=1.6), Strength 1/2/3/4 의 Encrypt (각각 >=1.4/1.6/1.7/1.7), SetPageLayout 의 2 페이지 변형 (>=1.5) 에 연결되었다.
- 3.14.x 와의 동작 변화: 이전에 v3.12.6 의 "저장 대상이 writer 출력 기능을 거부한다" 게이트에 의존하던 애플리케이션은 이제 bump 된 버전에서 성공한다. 이미 더 높은 버전의 기능을 포함하는 로드된 PDF 는 여전히 기존 저장 시점 게이트를 통과하므로, 태그된 PDF 를 로드하고 PDF 1.3 을 선택하면 여전히 LastErrorCode 602 로 실패한다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 170/170 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
v3.14.3 2026-05-10
- 저장 시점 PDF 버전 컴플라이언스가 이제 나머지 PDF 1.6 3D 사전 타입 (/Type /3DStream /3DRef /3DBackground /3DRenderMode /3DLightingScheme /3DCrossSection /3DNode) 과 PDF 1.7 Redact, RichMedia, Projection 어노테이션 서브타입 및 /Type /Requirement 와 /ReqHandler 동반 사전도 인식한다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 168/168 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
v3.14.2 2026-05-10
- 저장 시점 PDF 버전 컴플라이언스가 이제 PDF 1.5 기능도 인식한다: /XFA 폼, /AlternatePresentations, /Renditions 네임 트리, /Type /Rendition /MediaCriteria /MediaPermissions /MediaPlayers 멀티미디어 사전, Screen 어노테이션 서브타입.
- PDF 1.4 로 저장하면 이제 LastErrorCode 602 와 함께 이 기능을 가진 문서를 거부한다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 166/166 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
v3.14.1 2026-05-10
- 저장 시점 PDF 버전 컴플라이언스가 이제 PDF 1.4 기능도 인식한다: 태그된 PDF /StructTreeRoot /MarkInfo 와 StructElem 사전, 문서 /Lang 과 페이지 /Tabs 항목, /OutputIntents 와 /OutputIntent 사전, /UR3 사용 권한 서명, PDF 1.4 어노테이션 서브타입 Polygon, PolyLine, Caret, Ink, Popup, Watermark.
- PDF 1.3 으로 저장하면 이제 LastErrorCode 602 와 함께 이 기능을 가진 문서를 거부한다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 165/165 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
v3.14.0 2026-05-10
- 저장 시점 PDF 버전 컴플라이언스가 이제 PDF 1.3 기능도 인식한다: smooth shading, 함수 객체, ICCBased 와 DeviceN 색 공간, /TrimBox /BleedBox /ArtBox 페이지 항목, /ToUnicode CMap, 파일 첨부와 /Sound 및 /Movie 어노테이션, /Type /Filespec 와 /Type /EmbeddedFile 사전, /Group /EF /Alternates /Mask 키, JavaScript 액션.
- PDF 1.2 호출자는 이제 PDF 1.3 계약 아래에서 저장한다. 리터럴 %PDF-1.2 헤더는 보존되지만 게이트는 PDF 1.3 기능을 받아들인다. PDF 1.4 이후 기능은 여전히 LastErrorCode 602 로 거부된다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 162/162 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
v3.13.0 2026-05-10
- 저장 시점에 후기 버전 기능을 거부하는 PDF 버전 컴플라이언스 게이트를 전용 모듈로 리팩터링하여, 규칙 세트가 문서 코어를 휘젓지 않고도 성장할 수 있도록 했다.
- v3.12.7 대비 사용자에게 보이는 동작 변화는 없다. 동일한 버전 외 기능이 여전히 LastErrorCode 602 와 함께 거부된다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 155/155 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
v3.12.7 2026-05-09
- Delphi DUnitX 와 C++Builder GoogleTest 스위트 모두에서 PdfToImage 직접 액세스 렌더링 워크플로에 대한 자동 테스트 커버리지를 확장했다.
- Delphi VCL GUI 테스트 러너는 이제 Syntax 와 XRef 픽스처를 등록하여 콘솔 러너 커버리지와 일치시킨다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 147/147 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
v3.12.6 2026-05-09
- PDF 1.3, 1.4, 1.5, 1.6, 1.7 로 저장하면 이제 선택된 버전을 전체 저장 출력 계약으로 강제한다.
- 전체 저장은 카탈로그 /Version 재정의를 제거하고, 더 낮은 대상에 대한 지원되지 않는 카탈로그 확장과 메타데이터 항목을 제거하며, PDF 1.3 으로 저장할 때 PDF 1.4 XMP 메타데이터 스트림을 억제한다.
- SaveToFile, SaveToString, SaveToStream 은 이제 선택된 PDF 대상 버전이 투명도, optional content, JPX, UserUnit, 3D, AES 암호 필터 기능 같은 문서에 여전히 존재하는 기능보다 낮을 때 LastErrorCode 602 와 함께 실패한다.
v3.12.5 2026-05-09
- PDF 1.7 리터럴 문자열 파싱을 개선하여 알 수 없는 이스케이프 시퀀스가 표준에서 요구하는 대로 백슬래시를 무시하도록 했다.
- 리터럴 문자열 8 진수 이스케이프는 이제 8 진수 자릿수만 소비하고 뒤따르는 비 8 진수 자릿수를 일반 문자열 데이터로 보존한다.
- 알 수 없는 리터럴 문자열 이스케이프와 혼합된 8 진/비 8 진 이스케이프 시퀀스에 대한 회귀 커버리지를 추가했다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 141/141 통과했다.
v3.12.4 2026-05-09
- PDF 1.7 어휘 파싱을 개선하여 이름 객체가 이제 오른쪽 중괄호 구분자에서 올바르게 멈추도록 했다.
- 객체 스트림 번호가 PDF 바이트 길이보다 큰 xref 스트림 압축 객체 항목의 SmartAccess 로딩을 수정했다.
- 오른쪽 중괄호 이름 구분자와 희소 압축 객체 xref 스트림 항목에 대한 회귀 커버리지를 추가했다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 139/139 통과했다.
v3.12.3 2026-05-08
- StrF, StmF, EFF, Identity, None 또는 이름이 있는 StdCF 스타일 암호 필터를 사용하는 표준 보안 핸들러 파일에 대한 PDF 1.7 암호화된 문서 호환성을 개선했다.
- 메타데이터 스트림은 이제 일반 스트림처럼 처리되는 대신 복호화, 암호화, 복사/저장 워크플로 중에 EncryptMetadata=false 를 존중한다.
- 임베디드 파일 스트림은 이제 /Type /EmbeddedFile 을 가지고, 암호화된 문서가 로드되거나 저장될 때 임베디드 파일 암호 필터 결정 경로를 사용한다.
- 외부 임베디드 파일 스트림은 이제 FFilter 가 Filter 로 승격될 때 FDecodeParms 를 DecodeParms 로 승격하여 스트림 디코드 매개변수를 보존한다.
- 새 AES 암호화 PDF 는 이제 PDF 1.7 암호 필터 사전 계약과 일치하도록 암호 필터 Length 값을 비트 길이로 작성한다.
- XRef 스트림 Prev/XRefStm 값과 큰 숫자 오프셋은 이제 파서와 SmartAccess 경로를 통해 64 비트 정밀도를 유지한다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 137/137 통과했다.
v3.12.2 2026-05-08
- PDF 1.7 스트림 디코딩 호환성을 개선했다. 일반 스트림 디코딩은 이제 /DP 를 DecodeParms 별칭으로 존중하고, 간접 디코드 매개변수 배열 항목을 해석하며, /AHx 와 /LZW 표준 필터 약어를 받아들인다.
- 큰 파일 PDF 출력은 이제 xref, startxref, linearization, 디지털 서명 ByteRange 오프셋을 32 비트 정수 헬퍼를 통해 좁히는 대신 64 비트 형식 경로를 통해 작성한다.
- 로드된 문서는 이제 카탈로그 /Version 항목이 파일 헤더 버전보다 새로울 때 이를 효과적인 PDF 버전으로 취급한다.
- 재작성된 xref 스트림 트레일러는 PDFlibPas 가 이들을 고전적 트레일러 사전으로 저장할 때 더 이상 스트림 전용 DecodeParms 키를 유지하지 않는다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 134/134 통과했다.
v3.12.1 2026-05-06
- 생성된 PDF 는 이제 첫 페이지가 뷰어 창의 사용 가능한 높이에 맞게 크기 조정되어 열리므로, 창에 맞는 가장 큰 줌에서 전체 첫 페이지가 위에서 아래까지 보인다. 이 기본값을 재정의하려면 문서에 사용자 정의 OpenAction (SetOpenActionDestination, SetOpenActionMenu, SetOpenActionJavaScript) 을 구성하라.
v3.12.0 2026-05-06
- Windows 정적 백엔드는 이제 Win32 와 Win64 용 libjpeg-turbo NASM SIMD 객체와 Win64x zlib-ng 세트용 zlib-ng x86 SIMD 디스패치 객체를 포함한다.
- zlib-ng 리빌드 스크립트를 재작업하여 Win64x bcc64x 와 진단 MSVC 빌드가 하나의 글로벌 컴파일러 스위치에 의존하는 대신 generic, SSE2, SSSE3, SSE4.1/SSE4.2, PCLMULQDQ, AVX2 소스 파일을 파일별 기능 플래그로 컴파일하도록 했다.
- 정적 C 라이브러리에 32 바이트 정렬 malloc/calloc/realloc/free CRT 스텁을 추가하고, TPDFJPEGImage.Compress 가 jpeg_mem_dest 버퍼를 할당된 동일한 C free 경로를 통해 해제하도록 수정했다.
- 이 릴리스를 뒷받침하는 엄격한 자동 커버리지를 강조하도록 공개 검증 노트를 확장했다: 라이브러리 빌드, 압축 라운드트립, HelloWorld /FlateDecode 출력, JPEG 렌더링, 이미지 워크플로, 폰트, 폼, 보안, 서명, 인쇄, C++Builder 데모에서 파생된 워크플로.
v3.11.0 2026-05-05
- Windows Flate 압축과 압축 해제를 zlib 호환 모드의 zlib-ng 로 전환했다. Win32, Delphi Win64, C++Builder Win64x 는 이제 Lib\thirdparty\Win32, Lib\thirdparty\Win64, Lib\thirdparty\Win64x 의 ABI 일치 zlib-ng 정적 객체 세트를 링크한다.
- Win64 경로는 더 이상 Delphi 의 System.ZLib 유닛을 통해 라우팅되지 않으므로, PDF 스트림 압축/압축 해제는 32 비트 빌드와 마찬가지로 zlib-ng 백엔드의 이점을 누릴 수 있다.
- Win64 빌드용 작은 zlib-ng 브리지 객체를 추가하여 Pascal 코드가 안정적인 zlib 호환 진입점을 유지하면서 Delphi 와 C++Builder 가 각자의 링커 호환 객체 세트를 소비할 수 있도록 했다.
- 모든 C++Builder 데모 프로젝트가 PDFLIB_CPPBUILDER 를 정의하도록 갱신하여 GoogleTest 러너와 일치시키고 Win64x 데모가 Delphi Win64 zlib-ng 객체를 링크하지 않도록 방지했다.
v3.10.3 2026-05-01
- C++Builder GoogleTest 스위트를 확장하여 Demo\C++Builder 아래의 모든 데모를 다루도록 했다. 7 픽스처 phase-1 레이아웃이 15 픽스처 / 52 GoogleTest 케이스로 성장하여, 모두 Win64x 에서 통과했다. 새로 다루는 데모: AddFormattedTitle, AddTextImage, AddTrueTypeSubsettedFont, AddWebLink, CanvasText, CaptureToNewSize, CopyPageRanges, CreateWithImage, CreateWithImageToStream, DoInTheStream, DrawWrappedText, EditFormField, EmbeddedFonts, ExtractAnnotAttach, ExtractEmbeddedFonts, ExtractImage, ImageToPdf, ImportEMF, MultiFunction (렌더러 스위치), PageOperations, PdfDecrypt, PdfPermission, PrintPDF, TextMeasure, TextPaging.
v3.10.2 2026-05-01
- Tests\C++Builder 아래에 C++Builder GoogleTest 러너를 추가하여 Lib\PDFlibrary.pas 를 C++Builder 데모가 사용하는 동일한 {$JPHNE} 출력 HPP 헤더를 통해 실행한다. 첫 단계는 7 가지 핵심 Delphi 시나리오 (HelloWorld, DrawShapes, CreateTable, PdfEncrypt, ExtractText, PdfSigning, PdfToImage 렌더링) 를 17 GoogleTest 케이스로 미러링하며, 모두 Win64x 에서 통과했다.
- Delphi DUnitX 스위트를 Tests.Print 로 확장하여 PrintPDF 와 ShowPrinterBins 데모 (기본 프린터 열거, 사용자 정의 프린터 설정, 인쇄 옵션, 파일로 리디렉트하는 인쇄 작업) 를 다루고, MultiFunction 데모의 GDI+ / PDFium / Cairo 엔진 선택을 동일한 소스 PDF 에서 실행하는 Tests.Render 렌더러 스위치 테스트를 추가했다.
v3.10.1 2026-05-01
- SetPageSize에 57개의 명명된 페이지 크기를 추가하여 동일한 표준 페이지 크기 이름이 여기서도 작동하도록 했다: SIZE8X11, QUADA0, DOUBA0, B0PLUS, ENVB4/B5/C6/DL/MONARCH, ENV9/10/11, ANSIA/B/C/D/E, ARCHA/B/C/D/E1/E, SHIROKU, G1K, USBC/EUBC/ASBC, ID1/ID2/ID3, ONEINCH/TWOINCH/L2INCH/USVISA, P2R..P24R / S8R / P4D photo prints, plus the Chinese / Taiwanese octavo and sextodecimo sheet formats LARGE/STANDARD/CROWN/ROC 8K and the matching 16K halves.
v3.10.0 2026-04-30
- Demo 아래 모든 Delphi 샘플에 대한 네이티브 C++Builder 버전을 추가했다. PDF 생성, 페이지 조작, 폰트, 이미지, 보안, 서명, 렌더링, 인쇄 데모는 이제 Delphi 측 래퍼 없이 C++Builder 에서 빌드하고 실행할 수 있다.
- 각 새 데모는 Demo\C++Builder\<Name>\ 에 콘솔 프로젝트로 위치하며 Lib\PDFlibrary.pas 를 직접 소비하고 실행에 필요한 입력 파일을 동봉한다.
- 각 Delphi 데모 폴더에 데모가 보여주는 것, 집중하는 API, 실행 방법을 설명하는 간단한 영어 Readme.txt 를 추가했다. Demo\Delphi\index.html 의 HTML 개요가 주제별로 그룹화하여 모두 링크한다.
- 각 C++Builder 데모에 동일한 Readme.txt 를 미러링하고 Run 섹션을 콘솔 워크플로에 맞게 다시 작성했다 (Open/SaveDialogs 대신 argv 인수). 일치하는 Demo\C++Builder\index.html 이 동일한 주제 그룹으로 모든 C++Builder 데모를 나열한다.
- ImportEMF 데모의 메모리 누수를 수정했다 (TPDFlib 인스턴스가 생성되었지만 해제되지 않았다).
v3.9.14 2026-04-30
- 페이지 범위 복사 데모가 항상 실패를 보고하는 대신 실제로 페이지를 복사하도록 수정했다.
- 래핑된 텍스트와 HTML 페이지네이션 데모를 정리하여 각각이 자신의 API 에 집중하고 단일 버튼에서 실행되도록 했다.
- 두 데모 프로젝트 (EmbeddedFonts 와 PdfPermission) 의 이름을 변경하여 컴파일된 실행 파일이 오래된 프로토타입 이름이 아닌 폴더 이름과 일치하도록 했다.
v3.9.13 2026-04-30
- 내부 버퍼 리더의 스트림 위치 버그를 수정했다. 2 바이트 word 읽기가 읽기 커서를 2 바이트가 아닌 4 바이트만큼 진행시키고 있었다. 2 바이트보다 긴 버퍼에서 후속 읽기는 잘못된 오프셋에 도달하여 silently 잘못된 데이터를 반환했다. 그 효과는 바이트와 word 읽기가 섞인 이진 데이터 구조를 파싱할 때 가장 두드러졌다.
- 유틸리티 유닛 (buffer, AES, ZLib, Unicode, 다이제스트 해싱) 과 문서 생성, 파일 저장과 스트림 저장, 로드 라운드트립, AES-128/AES-256 암호화를 포함한 라이브러리 수준 워크플로를 다루는 자동 DUnitX 테스트 스위트 (콘솔과 VCL GUI 러너) 를 도입했다.
v3.9.12 2026-04-30
- GDI+ 이미지 렌더링이 이제 래스터 이미지를 화면 또는 출력 해상도로 스케일링할 때 기본적으로 부드러운 고품질 bicubic 보간을 사용한다. 이전에는 기본값이 nearest-neighbour 였으며, 이는 화면 미리보기나 고 DPI 출력을 위해 확대된 작은 이미지 (로고, 썸네일) 에서 눈에 띄는 계단 모양 아티팩트를 생성했다. 더 선명한 nearest-neighbour 모드를 선호하는 호출자는 SetGDIPlusOptions 를 통해 이전 동작을 복원할 수 있다.
v3.9.11 2026-04-30
- 컬러 키 투명도 (이미지 사전의 /Mask 색 범위 배열) 를 사용하는 PDF 이미지의 Cairo 렌더링을 수정했다. 이전에는 페이지가 이 형식의 투명도를 가진 이미지를 포함하면 Cairo 렌더러는 이미지를 페이지 배경에 합성하는 대신 완전히 생략했다. 수정은 선언된 컬러 키 범위로부터 픽셀별 알파 채널을 도출하고 결과를 투명 이미지로 렌더링하여 GDI+ 렌더러와 시각적으로 일관된 출력을 생성한다.
v3.9.10 2026-04-30
- 클리핑된 이미지 시퀀스 다음의 모든 페이지 콘텐츠가 이미지의 클리핑 사각형 내에 잘못 제한되었던 Cairo 렌더링 회귀를 수정했다. 그래픽 상태를 저장하고 클립 경로를 적용하고 이미지를 페인트한 후 상태를 복원하는 PDF 페이지 — 액자 또는 테두리 이미지의 일반적인 레이아웃 기법 — 는 이후의 모든 텍스트, 모양, 그래픽을 클리핑된 영역 내에만 렌더링했다. Cairo 상태 저장과 복원은 이제 PDF q/Q 연산자에 올바르게 매핑되므로 이미지가 그려진 후에 클리핑 영역이 폐기된다.
v3.9.9 2026-04-29
- GDI+ 및 PDFium 과 함께 세 번째 렌더링 옵션으로 Cairo 기반 PDF 렌더링 엔진을 추가했다. 활성화하려면 렌더링 전에 SelectRenderer(2) 를 호출하라. 엔진은 번들된 DLL\Cairo 폴더의 cairo.dll 을 요구한다. Cairo 렌더링은 GDI+ 와 동일한 출력 모드를 지원한다: 비트맵 파일과 스트림 내보내기 (BMP, JPEG, PNG, GIF, TIFF, G4 TIFF), 디바이스 컨텍스트 렌더링, 직접 프린터 출력.
- MultiFunction View/Print 데모는 이제 사용자가 코드 변경 없이 동일한 문서에서 GDI+, PDFium, Cairo 출력을 나란히 비교할 수 있도록 3 방향 렌더러 선택기를 노출한다.
v3.9.8 2026-04-29
- RAD Studio 13.1 이상에서 나타난 Win32 C 런타임 shim 의 두 가지 가짜 컴파일러 진단을 억제했다. 컴파일러 버전 기능 가드가 Delphi 2009 이후의 컴파일러로 전파되지 않아 deprecated 메모리 관리자 API 에 대해 컴파일되어 deprecation 경고 (W1000) 가 발생했다. Delphi 7 빌드에만 필요한 내부 호환성 변수에 대해 사용되지 않은 변수 힌트 (H2164) 가 발생했으며, 이제는 해당 버전의 조건 블록으로 범위가 지정된다. 두 문제 모두 진단 전용이며 런타임에 영향이 없다.
v3.9.7 2026-04-29
- Windows 에서 옵션의 PDFium 기반 페이지 렌더링을 추가했으며, BMP 스트림 렌더링, 디바이스 컨텍스트 렌더링, 메모리 렌더링, 프린터 출력을 포함한다.
- Delphi MultiFunction View/Print 데모를 렌더러 선택기로 갱신하여 사용자가 기존 GDI+ 렌더러와 PDFium 사이를 전환할 수 있게 했다.
v3.9.6 2026-04-29
- 전체 PDFlibPas 패키지와 트라이얼 패키지를 위한 별도의 Inno Setup 스크립트를 추가했으며, 버전 관리 메타데이터, 빌드 출력, IDE 캐시, 로컬 에이전트 파일, 출시 패키지의 일부가 아닌 번들 서드파티 소스 트리에 대한 릴리스 중심의 제외를 포함한다.
- 트라이얼 인스톨러는 이제 셋업 실행 파일이 생성되기 전에 RAD Studio 11.3, 12.3, 13.1 용 트라이얼 바이너리 라이브러리와 트라이얼 Delphi 데모를 빌드하고 패키지한다.
v3.9.5 2026-04-29
- RAD Studio 9.0 / Delphi XE2 에서의 Win32 라이브러리 빌드를 수정했다. 빌드 스크립트가 Delphi 2010 이후에만 존재하는 DCU 출력 디렉터리 플래그를 전달하고 있었다. XE2 의 컴파일러는 그 플래그를 다르게 해석하여, 소스 파일이 처리되기 전에 깨진 출력 경로와 치명적인 오류를 생성했다. 스크립트는 이제 대상 컴파일러 버전에 따라 적절한 플래그를 자동으로 선택한다.
- 라이브러리 소스의 관련 컴파일러 버전 가드를 수정했다. XE2+ 조건 아래에서 XE4 에 도입된 이름 한정 런타임 함수를 호출하고 있었다. XE2 와 XE3 을 대상으로 하는 빌드는 이제 올바른 호환성 import 를 해석한다.
v3.9.4 2026-04-29
- 네트워크와 서버 공유 프린터의 프린터 셋업을 수정하기 위해 용지함, 미디어, 양면, 품질 및 기타 인쇄 설정을 프린터 디바이스 컨텍스트 핸들이 아닌 프린터 DEVMODE 핸들을 통해 적용하도록 했다.
v3.9.3 2026-04-29
- 번들된 AES 백엔드를 Win32 와 Win64 모두에서 Brian Gladman 의 2018 AES 소스로 새로 고쳤다. 재현 가능한 빌드 스크립트는 이제 언제든지 정적 AES 객체를 소스에서 다시 빌드할 수 있게 한다. 그 과정에서 Pascal 바인딩의 ABI 결함이 발견되어 수정되었다: AES-CBC 암호화와 복호화 함수는 C 호출 규약 선언이 누락되어 있어, Win32 빌드가 silently 인수를 잘못된 레지스터 순서로 전달하여 잠재적으로 잘못된 암호화된 출력을 생성할 수 있었다. Win64 빌드는 플랫폼이 균일한 호출 규약을 강제하므로 영향을 받지 않았다.
- 서드파티 리빌드 스크립트를 강화하여 MSVC 기반 zlib, JPEG, CRT 스텁 스크립트를 thirdparty 디렉터리뿐만 아니라 리포지토리 루트에서도 시작할 수 있도록 했다. 이전에는 작업 디렉터리가 thirdparty 폴더로 설정되어 있어야 했다.
v3.9.2 2026-04-29
- JPEG 2000 백엔드를 Win32 와 Win64 모두에서 레거시 OpenJPEG 1.5 에서 OpenJPEG 2.5.4 로 업그레이드했다. 두 플랫폼 모두 이제 정적 객체 링킹을 사용하므로 JPEG 2000 인코딩과 디코딩이 추가 런타임 DLL 없이 작동한다. 현대 코덱은 현재의 JP2/J2K 헤더 처리, 콜백 기반 스트림 API, 그리고 upstream 프로젝트에서 누적된 버그와 보안 수정을 가져온다. 공개 TJpeg2000Bitmap API 는 변경되지 않았다.
v3.9.1 2026-04-29
- libjpeg-turbo 업그레이드 후 JPEG 페이지 렌더링과 이미지 내보내기를 수정하여 Win32 와 Win64 에서 PdfToImage JPG 변환과 TPDFJPEGImage.SaveToStream 출력을 복원했다.
- Win32 libjpeg-turbo ABI 바인딩을 수정하여 콜백, 구조 정렬, 부울 필드, 메모리 기반 JPEG 대상이 libjpeg-turbo 3.1.90 과 일치하도록 했다.
- 번들 zlib 1.3.2 백엔드를 사용하는 Win32 FlateDecode 스트림 압축 해제를 수정하여 PdfToImage 샘플 문서 같은 파일에 대한 PDF xref 스트림 로딩을 복원했다.
v3.9.0 2026-04-29
- 번들된 JPEG 2000 백엔드를 레거시 OpenJPEG 1.5 에서 OpenJPEG 2.5.4 로 업그레이드했다. JPEG 2000 로딩과 저장은 이제 현대 코덱, 콜백 기반 스트림 API, 현재의 JP2/J2K 헤더 처리를 사용하면서 공개 TJpeg2000Bitmap API 를 보존한다.
- JPEG 2000 출력은 이제 작은 이미지에 대해 유효한 OpenJPEG 해상도 수를 자동으로 선택하고, Win32 정적 백엔드는 더 이상 누락된 MSVCRT 헬퍼 내보내기에 의존하지 않는다.
v3.8.1 2026-04-29
- Win32 와 Win64 의 모든 16 개 화장적 링커 W1028 "Bad global symbol definition" 경고를 제거했다. 소스 수준 이름 변경은 중복된 Pascal 측 복제를 제거한다 (jpeg_std_error 와 jmemnobs 할당자 스텁은 이제 obj 레이어에서만 해석된다). Pascal 측 데이터에 대해 링크 해석된 채로 유지되어야 하는 나머지 3 개의 bcc32 / vc64 obj 심볼 (jpeg_natural_order, jpeg_aritab, jpeg_nbits_table) 은 이제 thirdparty\build-jpeg-vc64.bat 의 ObjConv 후처리 패스를 통해 COFF 심볼 이름이 벗겨진다. 공개 API 변경 없음. Delphi Win32 와 Win64 빌드 모두에 대한 깨끗한 링커 출력.
v3.8.0 2026-04-29
- Win64 JPEG 코덱을 IJG 스타일 libjpeg 에서 libjpeg-turbo 3.1.90 으로 업그레이드하여 v3.7.0 (Win32) 에서 시작된 JPEG 마이그레이션을 완료했다. Win32 와 Win64 경로 모두 이제 동일한 현대 JPEG 코덱을 공유하며, 동일한 SIMD 최적화 내부 루프와 upstream 에서 누적된 30 개 이상의 CVE / fuzz 수정을 가진다. 공개 PDFlibPas API 는 변경되지 않았다.
v3.7.0 2026-04-28
- Win32 JPEG 코덱을 IJG libjpeg-6b 에서 libjpeg-turbo 3.1.90 으로 업그레이드했다. SIMD 최적화 내부 루프를 통한 상당히 빠른 JPEG 인코드/디코드와, libjpeg-turbo upstream 에서 누적된 30 개 이상의 CVE / fuzz 수정. 공개 PDFlibPas API (TPDFJPEGImage 클래스, DumpJPEG 함수) 는 변경되지 않았다. 기존 PDF/JPEG 코드 경로는 소스 변경 없이 더 빠르게 실행된다.
v3.6.0 2026-04-28
- Win32 zlib 를 1.2.x 에서 1.3.2 로 업그레이드했다. 1.2.8 이후 upstream 에서 누적된 표준 25 개 이상의 CVE / fuzz 수정과, 64 비트 윈도 스트림에서 사용되는 새 inflateBack9 / inflateTree9 진입점이 포함된다. 공개 PDFlibPas API (DeflateStr / InflateStr / InflateStrParms) 는 변경되지 않았다.
- 이 릴리스에서 Win64 zlib 경로는 변경되지 않았다 — 계속해서 Delphi 번들의 System.ZLib 유닛을 사용한다.
- Win32 zlib 경로에 Win64 링크 시점 CRT shim PDFlibCLibs.pas (v3.5.0 에서 도입) 를 활성화하여, 새 zlib 1.3.2 obj 파일이 참조하는 memcpy / memset / malloc / free 심볼을 제공한다.
v3.5.0 2026-04-28
- 번들된 C 이미지 / 압축 라이브러리를 위한 새로운 빌드 인프라를 벤더링했다: zlib 1.3.2, libjpeg-turbo 3.1.90, libtiff 4.7.1. Embarcadero bcc32 (Win32) 와 MSVC cl.exe (Win64) 모두를 위한 빌드 스크립트는 소스 트리와 함께 Lib/thirdparty/ 에 있어, RAD Studio + VS2022 를 가진 누구나 깨끗한 소스에서 정적 obj 파일을 다시 빌드할 수 있다.
- OpenJPEG 2.5.4 용 빌드 인프라를 추가했다. OpenJPEG 소스 트리 자체는 사용자가 독립적으로 가져와 (git clone uclouvain/openjpeg 를 Lib/thirdparty/OpenJPEG/ 로) PDFlibPas 의 빌드 구성을 건드리지 않고 업그레이드할 수 있다.
- Win64 백엔드에서 사용하는 Win64 링크 시점 CRT shim인 Lib/PDFlibCLibs.pas를 추가했다. 이 파일은 MSVC로 컴파일된 C obj 파일과 msvcrt.dll을 자동으로 끌어오지 않는 Delphi Win64 링커(dcc64 / Win64x ld.lld / BCB ilink64) 사이의 차이를 메운다.
v3.4.0 2026-04-28
- 암호화 키, AES 초기화 벡터, Perms 권한 블록 생성을 예측 가능한 난수 소스에 대해 강화했다. 벽시계 시간 근처에서 시작된 시스템에서 생성된 암호화된 PDF 는 더 이상 사소하게 상관 관계를 맺을 수 없으며, AES-256 문서는 이제 완전한 키 강도를 유지한다.
- 비합리적인 Width, Height, BitsPerComponent 또는 DeviceN 컴포넌트 수를 선언하는 잘못되었거나 적대적인 PDF 에 대해 이미지 사전 파싱을 강화했다. 범위를 벗어난 값은 픽셀 버퍼 산술 전에 클램프되어 그러한 파일을 열 때 충돌을 방지한다.
- /Prev xref 체인이나 /Parent 페이지 링크가 사이클을 형성하거나 과도하게 깊은 문서에 대해 교차 참조와 페이지 트리 순회를 강화했다. 리더는 이제 스택이 소진될 때까지 재귀하는 대신 잘못된 구조를 깔끔하게 거부한다.
v3.3.1 2026-04-27
- 컴포넌트별 Windows 빌드 스크립트를 간소화했다. DLL/, OCX/, Dylib/ 폴더는 더 이상 별도의 build12-* / build13-* 변종을 가지지 않는다. 각 플랫폼은 이제 단일 build-Win32 / build-Win64 스크립트를 가지며 최신 RAD Studio 에 고정되고 선택적 "debug" 인수를 받는다.
- 초기 Git 베이스라인에 이미 존재했던 PDFlibRenderer.pas 렌더 수정 주변에 인라인 근거 주석을 추가했다. 주석은 SetPen 이 활성 캔버스 변환으로 stroke 너비를 스케일링하는 이유와 Type 3 폰트 CharProc d0/d1 연산자가 그들의 피연산자를 소비해야 하는 이유를 문서화한다. 런타임 동작 변경 없음.
v3.3.0 2026-04-26
- PDFlibRenderer.pas 의 변환된 stroke 렌더링을 수정했다. SetPen 은 이제 Picasso 를 호출하기 전에 PDF 선 너비에 현재 캔버스 변환 스케일을 적용하여, 좌표가 이미 변환된 경로에서 stroke 가 과도하게 크거나 작아지는 것을 방지한다. 이는 Type 3 글리프 윤곽선이 두껍고 불규칙한 블록으로 렌더링될 수 있는 문제를 수정한다.
- 콘텐츠 스트림 파서의 Type 3 폰트 CharProc d0/d1 처리를 수정했다. d0 는 이제 두 너비 피연산자를 소비하고, d1 은 후속 드로잉 명령이 실행되기 전에 여섯 개의 너비/바운딩 박스 피연산자를 소비하여, 오래된 피연산자가 글리프나 경로 기하를 손상시키는 것을 방지한다.