변경 내역
릴리스 이력
PDFlibPas 라이브러리의 버전 이력입니다. 최신순으로 나열되며, 각 릴리스는 프로젝트 릴리스 정책에 따라 시맨틱 버저닝을 준수합니다.
최신 릴리스
- 최신 버전: v3.75.6; 릴리스 날짜: 2026-06-23
Version 3.333.0
Added
- 증분 개정 검사. 서명은 그것이 기록된 개정의 바이트를 덮고, 그 후에 추가되는 모든 것은 별도의 갱신이며 그 내용이 서명이 현재 문서에 대해 여전히 유효한지를 결정합니다.
GetDocumentRevisionCount,GetDocumentRevisionStart및GetDocumentRevisionEnd가 그러한 개정들을 배치하고,GetSignatureRevisionIndex가 서명이 어느 개정에서 끝나는지 말합니다 GetDocumentRevisionKind는 갱신이 한 일을, 그것이 다룬 객체 중 가장 영향이 큰 것으로 보고합니다. 즉, 장부 정리, 검증 자료, 문서 타임스탬프, 서명, 양식 필드, 주석 또는 문서 내용입니다. 따라서 장기 검증을 위한 검증 자료 추가는 더 이상 문서 편집처럼 보이지 않습니다GetDocumentRevisionChanges는 갱신이 추가, 변경 또는 삭제한 모든 객체를, 각각이 무엇인지, 그리고 변경된 사전의 경우 실제로 어떤 키가 다른지와 함께 나열합니다GetDocumentRevisionsComplete는 전체 기록이 복구 가능한지 보고합니다. 끊어지거나, 순환하거나, 리더가 따를 길이보다 긴 체인은 가장 오래된 갱신을 보지 못한 채로 남기며, 그럴 때 카운트는 답이 아닌 하한이 됩니다- 이전 버전을 읽을 수 없거나 스트림 본문이 비교된 적 없는 객체는 무해한 것이 아니라 미정으로 보고됩니다. 사전을 그대로 둔 채 페이지를 다시 쓰는 갱신은 재포장으로 오인되지 않습니다
Version 3.332.0
Added
ApplyPAdESLongTermValidation은 이미 서명된 PDF를 한 번의 호출로 PAdES-B-LT로 승격시킵니다. 서명 자체에서 서명자 인증서 경로를 구축하고, 인증서가 지정한 주소를 통해 각 링크의 OCSP 및 CRL 자료를 수집하며, 서명을 위한 VRI 항목과 함께 인증서와 폐기 데이터를 단일 증분 갱신으로 문서 보안 저장소에 기록합니다.ApplyPAdESLongTermValidationToStream은 결과를 파일 대신 스트림에 기록합니다- 이 동작은
PADES_LTV_*옵션 마스크를 통해 구성 가능합니다. VRI 항목을 기록할지, OCSP 응답자에 문의할지, CRL로 대체할지, 경로를 완성하기 위해 발행자 주소를 따를지, 그리고 자기 발행 루트에 대한 폐기 확인을 건너뛸지 여부입니다 - 빈 필드 이름은 모든 서명을 하나의 개정으로 처리하고, 명명된 필드는 그 하나만 처리합니다
GetPAdESLTVCertificateCount,GetPAdESLTVCRLCount,GetPAdESLTVOCSPCount및GetPAdESLTVError는 마지막 호출이 무엇을 수집했고 왜 중단했는지 보고하므로, 도달할 수 없는 응답자에 대한 부분 결과가 조용히 무시되지 않고 보입니다- 이미 준비된 것과 동일한 자료는 한 번 기록되고 그것이 필요한 모든 서명에서 참조되며, 읽을 수 있는 인증서를 휴대하지 않는 서명은 성공적인 승격으로 가장되지 않고 보고됩니다
Version 3.331.0
Added
- 서명은 자체 인증 경로를 휴대하므로, 장기 검증 프로필에 필요한 자료는 서명된 파일만에서 읽을 수 있습니다.
GetSignatureSignerCertificateDER,GetSignatureEmbeddedCertificateCount및GetSignatureEmbeddedCertificateDER는 서명이 삽입하는 인증서를 반환하고,GetSignatureCertificateChainLength와GetSignatureCertificateChainDER는 그것들을 서명자로부터 바깥쪽으로 향하는 경로로 정렬합니다 GetSignatureContentsHashHex는AddPAdESDSSVRI항목이 주소 지정되는 키를 서명 자체에서 계산하여 반환합니다- 서명이 발행자와 일련 번호로 서명자 인증서를 식별하든 주체 키 식별자로 식별하든 서명자 인증서가 일치되며, 경로는 서명이 실제로 휴대하는 마지막 발행자에서 멈추고 완전한 척하지 않습니다
Fixed
- DER 리더는 최대치에 가까운 값이 경계 검사를 감싸게 내버려 두는 대신, 데이터보다 큰 선언된 요소 길이를 거부하며, 인증서 확장 탐색은 더 이상 잘리거나 지나치게 긴 인증서의 끝을 넘어 읽지 않습니다. 둘 다 조작된 문서에서 도달 가능하므로 위의 접근자들은 신뢰할 수 없는 입력에서도 안전합니다
- 서명 접근자는 공유 핸들로 문서를 읽으므로, 검증자나 뷰어가 이미 파일을 열고 있는 동안에도 응답하며 서명이 없는 것처럼 실패하지 않습니다
Version 3.330.0
Added
- OCSP status requests.
BuildOCSPRequestencodes an RFC 6960 request for a certificate and its issuer,FetchOCSPResponseposts it to the responder and returns the reply, andAddPAdESDSSOCSPFromCertificatesdoes both and files the result in the document security store - The responder address is optional: when it is omitted, the one the certificate itself names is used, so a caller that has the certificate chain needs no further configuration
- A certificate pair that does not actually belong together is refused before anything is sent, instead of producing the "unknown" answer such a request earns from the responder and which reads like a revocation problem
- Only a successful response is stored; a responder that answered
tryLaterorunauthorizedis reported throughGetTimeStampErrorrather than filed as if it were a status answer
Version 3.329.0
Fixed
- Reusing one result array across successive enumeration calls no longer leaks the strings held in the array slots that a later call does not fill. This affected the documented "call once for the count, resize, call again" pattern whenever a later call returned fewer items than the array could hold, and the stranded text accumulated for the lifetime of the process
- Affected entry points include
EnumPageContentStates,EnumPageContentStatesEx,EnumAttachments,EnumDocumentFonts,EnumPageElements,EnumNamedDestinations,EnumSignatures,EnumFormFields,GetFormValues,GetTextInAreaEx, and the text-search, form-field-action and certificate enumeration calls
Changed
- The result-array parameter of those calls is now passed as
varrather thanout. Existing Delphi and C++Builder code compiles and links unchanged; the only visible difference is that array slots past the returned count keep whatever they held before instead of being silently blanked
Version 3.328.0
Added
- Certificates now tell the library where their status can be checked:
GetCertificateOCSPURLs,GetCertificateIssuerURLsandGetCertificateCRLURLsread the responder, issuing-certificate and CRL addresses out of a certificate, so assembling long-term validation material no longer requires knowing where a given authority publishes FetchRevocationMaterialdownloads material from those addresses, andAddPAdESDSSCRLFromURLandAddPAdESDSSCertificateFromURLdownload and file it in the document security store in one step- Addresses that name no fetchable resource, such as a directory name or a mail address, are skipped rather than reported as something that can be downloaded
Version 3.327.0
Added
- A built-in RFC 3161 time-stamp client.
SetTimeStampServerandSetTimeStampOptionsconfigure the authority, hash algorithm, requested policy, nonce use and timeout;FetchTimeStampTokenreturns a TimeStampToken for any digest ApplyPAdESSignatureTimeStampcompletes a PAdES-B-T signature in one call: it hashes the signature value, obtains the token from the configured authority and attaches it as the signature time-stamp attribute, replacing the previous three-step exchange the caller had to wire up itself- When a nonce is used the token is checked to carry the same value back, so a replayed or substituted response is rejected instead of being embedded in the document
GetTimeStampStatusandGetTimeStampErrorreport the authority's own status and failure text, so a refused request explains itself
Version 3.326.0
Added
- The PDFium renderer now writes the same image formats the GDI+ and Cairo renderers write.
RenderPageToFile,RenderPageToStreamandRenderPagesToFilesaccept BMP (option 0), JPEG (1), PNG (5), GIF (6), TIFF (7) and G4 TIFF (10) afterSelectRenderer(3), instead of accepting BMP alone - The JPEG quality set through
SetJPEGQualityand the active TIFF compression settings now apply to PDFium output as well, so switching renderers no longer changes the encoding of the file that is produced
Fixed
- Requesting PNG or any other non-BMP format from the PDFium renderer used to return 0 and leave an empty file behind. Applications that offered a renderer choice silently produced unreadable output whenever PDFium was the selected engine
- Asking the PDFium renderer for a metafile format it cannot produce (WMF, EMF, EPS, EMF+, HTML5) now reports which formats are available through
LastRenderErrorinstead of naming BMP as the only option
Version 3.324.0
Changed
- The PDFium renderer now feeds the document to the engine through a streaming data source instead of one resident buffer. Rendering and printing previously serialised the document and then copied it again into a string, so every page cost twice the document size in memory; the copy is gone and PDFium reads only the blocks it needs
- Rendering a page range to files parses the document once for the whole batch instead of once per page, so a long range no longer re-reads the entire file for every image it writes
- Older PDFium builds that do not export the streaming entry point keep working unchanged through the in-memory path
Fixed
- The renderer smoke test located the optional PDFium and Cairo libraries one directory too high and silently skipped both engines; it now finds them and exercises the real rendering paths
Version 3.323.0
Added
CreateValidationReport와SaveValidationReport는 구조화된 PDF/A 및 PDF/UA-1 검증 보고서를 XML 또는 JSON으로 생성합니다. 각 발견 항목은 규칙 id, 이를 관장하는 표준, 짧은 규칙 이름, 이행하는 ISO 조항, 심각도, 영향받는 객체 수를 담고 있으며, 보고서는 표준별 및 문서 수준의 합격/불합격 통계로 마무리됩니다- 요청되지 않은 표준은 자동 합격이 아니라
not-checked로 보고되므로, 부분 실행이 정상 완료로 오인되지 않습니다 - 빌드 파이프라인은 이제 산문体的 부분 문자열 일치 대신 규칙 id나 ISO 조항을 기준으로 게이트할 수 있습니다. 프리플라이트 보고서군은 먼저 사람용 보고서를 렌더링한 뒤 그 텍스트를 JSON, HTML, CSV로 변환하지만, 검증 보고서는 원시 검사 출력에서 조립되어 기계 판독 가능한 필드를 그대로 보존합니다
Version 3.322.0
Added
- 참조 문서가 이제 전용 페이지가 없던
TPDFlib표면 전반에 사용되는 4개의 외부 선언된 공개 형식을 문서화합니다:TPDFlibProgressEvent,TPDFlibLogger,TPDFlibCertificateInfo,TPDFlibWatermarkBase로, 공개 이벤트, 로거, 열거 결과, 워터마크 형식에 대한覆盖를 완성합니다
Version 3.321.0
Added
CheckDocumentPolicy는Fonts.NotEmbedded = 0,Security.Encrypted = no,Document.Pages <= 500과 같은 선언적 사내 규칙을 문서에 대해 평가하고, 각 규칙을 실제 값과 함께 합격 또는 불합격으로 보고합니다. 이를 통해 출판사, 아카이브, 인쇄소의 수집 게이트를 손으로 작성한 검사 코드가 아닌 구성으로 표현할 수 있습니다
Version 3.320.1
Fixed
- PDF/A 모드에서 폰트를 먼저 로드하지 않고 텍스트를 그려도 더 이상 fault가 발생하지 않습니다. PDF/A는 모든 폰트 프로그램의 임베딩을 요구하므로 내장 폰트로의 암묵적 지름길이 거부되었고 선택된 폰트가 남지 않아,
DrawText와 다른 텍스트 호출이 그리는 대신 충돌했습니다 - 암묵적 폰트 경로는 PDF/A 모드가 활성인 동안 실제 임베드 가능한 페이스를 해석하므로, 명시적
AddTrueTypeFont호출 없이 그려진 텍스트는 임베드되어 적합 상태를 유지합니다. PDF/A 하에서 직접AddStandardFont호출은 여전히 거부됩니다 - 임베드 가능한 페이스를 해석할 수 없는 호스트에서는, 그리기가 fault 대신 내장 메트릭으로 폴백하고
LastErrorCode605를 통해 적합성 부족을 보고합니다. 이로 인해 파일이 적합한 것으로 게시되기 전에 잡을 수 있습니다
Version 3.320.0
Added
GetDocumentFeatureReport는 한 번의 호출로 구조화된 기능 보고서를 반환합니다 — 문서 메타데이터, 페이지와 객체 수, 암호화 상태, 폰트와 이미지 인벤토리, 태깅과 아웃라인, 양식 필드, 서명, 첨부파일, 카테고리별 바이트 내역 — 으로, 카탈로그화나 수집 파이프라인이 이전에 조립해야 했던 1다스의 개별 쿼리를 대체합니다
Version 3.319.0
Added
SetCollectionView,AddCollectionField,SetCollectionSort,SetCollectionItemValue는 기존 첨부파일 위에 PDF 포트폴리오를 구축합니다. 이로 인해 임베드된 파일 집합이 단순한 첨부 목록이 아니라 자체 열, 정렬 순서, 파일별 값을 갖는 탐색 가능한 패키지로 표시됩니다GetCollectionView와GetCollectionFieldCount는 로드된 포트폴리오의 표시 모드와 선언된 열 수를 보고합니다
Version 3.318.1
Fixed
- 텍스트 추출 옵션 12(회전 텍스트 무시)는 이제 회전 방향에 관계없이 회전된 실행을 버립니다. 시계 방향으로 4분의 1회전과 반시계 방향으로 4분의 1회전이 이전에는 다르게 처리되었으므로, 옆으로 누운 여백 메모가 한 방향에서는 버려지고 다른 방향에서는 반환되었습니다
- 같은 옵션은 합성 이탤릭처럼 단지 기울어지기만 한 텍스트를 유지하며, 허용 오차가 이제 텍스트 크기와 페이지 변환에 따라 조정되므로, 큰 기울어진 제목이 회전된 것처럼 버려지지 않습니다
Version 3.318.0
Added
DecodeAllStreams는 문서의 압축된 스트림을 제자리에서 확장합니다. 저장하면 콘텐츠 스트림, 메타데이터, 구조를 diff 도구, 포렌식 검토, 지원 워크플로가 직접 읽을 수 있는 사본이 생성됩니다. 이미지, 예측 스트림, 교차 참조 스트림은 인코딩을 유지하고, 객체 스트림은 먼저 구체화되므로 아무것도 손실되지 않습니다
Version 3.317.0
Added
SetTrapped와GetTrapped는 PDF/X가 요구하는 문서 트래핑 상태를 선언하고 읽으며, 사양이 요구하는 텍스트 문자열이 아니라/Trapped이름으로 작성됩니다SetOutputIntentSubtype과GetOutputIntentSubtype은 출력 인텐트를 재태깅합니다. 이로 인해 로드된 색상 프로필이 PDF/A 모드가 생성하는GTS_PDFA1보관 조건 대신GTS_PDFX인쇄 조건을 기술할 수 있습니다
Version 3.316.0
Added
SetEncryptEmbeddedFilesOnly와GetEncryptEmbeddedFilesOnly는 AES 암호화를 임베드된 파일로 제한합니다. 문서는 비밀번호 프롬프트 없이 임의의 리더에서 열리고 렌더링되는 반면 첨부파일은 암호화된 상태로 유지됩니다. 이는 표지는 공개이되 페이로드는 비공개인 청구서, 의료 기록, 사례 파일을 위한 표준 배열입니다
Version 3.315.0
Added
- 텍스트 추출 옵션 18은 90, 180, 270도로 그려진 실행을 수평 읽기 프레임으로 회전시키고 각 4분의 1회전을 개별적으로 그룹화합니다. 이로 인해 회전된 여백 메모, 표 헤더, 차트 축 레이블이 똑바로 선 텍스트와 교차하거나 버려지는 대신 읽을 수 있는 줄로 추출됩니다
Fixed
DASetTextExtractionOptions는 옵션 16(하이픈 제거)과 옵션 17(문자 간격 단어 분할)을 거부하는 대신 수용하며, 직접 액세스 추출 경로는 옵션 15, 16, 17을 추출기로 전달합니다. 이로 인해 밑줄 규칙 제거, 하이픈 제거, 문자 간격 분할이 로드된 문서와 동일하게 파일 핸들에도 적용됩니다
Version 3.314.0
Added
GetFontHasToUnicode는 선택된 폰트가 Unicode 매핑을 갖는지 보고하며, 폰트 인벤토리에는 일치하는 폰트별HasToUnicode필드와NoToUnicodeCount요약이 추가됩니다. 이로 인해 처리 전에 문서를 추출에 안전하고 PDF/A-*u 또는 PDF/UA 변환 가능한 폰트인지 검사할 수 있습니다
Version 3.313.0
Added
SetPDFAMode에 PDF/A-2u(ISO 19005-2 Level U)를 위한 모드 8이 추가되었습니다. 이는 임베드된 파일을 허용하지 않으면서 Unicode 텍스트 매핑을 선언하는 적합 수준으로, 기존 2b와 2a 모드와 함께 PDF/A-2 제품군을 완성합니다
Version 3.312.0
Added
GetObjectByPath와GetObjectByPathCount는Root/Pages/Kids[0]/MediaBox[2]나pages[0]/Type과 같은 경로 표현식을 통해 객체 트리의 임의 노드를 읽습니다 — 형식, 스칼라 값, 직렬화된 형태, 요소 수를 한 번의 호출로 얻어, 메타데이터 프로브, 컴플라이언스 표본 검사, 지원 진단을 위한 손으로 작성한 객체 순회를 대체합니다
Version 3.311.0
Added
SetBlackPointCompensation은 PDF 2.0의/UseBlackPtComp그래픽 상태를 통해 후속 그리기에 대해 블랙 포인트 보상(ON, OFF, Default)을 선언합니다. 이로 인해 프리프레스와 교정 출력이 이전에는 뷰어 전용이던 어두운 톤의 ICC 변환을 고정할 수 있습니다. 문서 버전은 자동으로 올라가며 PDF/A 모드는 이 상태를 거부합니다
Version 3.310.0
Added
SetCompressionLevel과GetCompressionLevel은 라이브러리가 수행하는 모든 압축의 deflate 수준을 노출합니다: 0은 기본 SIMD 가속 엔진을 유지하고, 1은 처리량을 선호하며, 9는 아카이브를 가장 작게 압축합니다RecompressStreams는 선택된 문서의 모든 일반 FlateDecode 스트림을 현재 수준에서 다시 deflate하고 스트림별로 더 작은 인코딩을 유지합니다. 이로 인해 원래 빠른 압축 설정으로 작성된 문서가 콘텐츠를 건드리지 않고 축소됩니다
Version 3.309.0
Added
SetObjectStreamMode와GetObjectStreamMode는 3상태 객체 스트림 제어를 추가합니다: 비활성, 생성(기본값), 보존이며, 보존은 로드된 파일의 원래 압축 그룹화를 유지하고 컨테이너를 있는 그대로 기록하여 기존 PDF 1.5+ 파일의 변환이 아무것도 풀리거나 재그룹화되지 않기 때문에 더 저렴해집니다
Changed
- 보존 모드에서는 로드 이후 편집된 멤버가 최상위 객체로 승격되어 변경 사항이 저장되며, 나머지 압축 멤버는 자동으로 이진 교차 참조 스트림 형식을 선택합니다
Version 3.308.0
Added
CheckDocumentStructure는 한 번의 호출로 구조 건강 검사를 실행합니다. 모든 객체와 스트림이 해당 디코더를 통과하고, 일반 Flate 스트림은 zlib 종료 표식에 대해 엄격히 검증되어 잘린 데이터가 잡힙니다. 보고서는 누락된 트레일러, 해결할 수 없는 카탈로그와 페이지, 지원되지 않는 암호화 핸들러, 바이트 스캔으로 복구된 파일을 객체별 발견 항목과 요약 줄로 표시합니다
Version 3.307.0
Fixed
- 교차 참조 스트림을 사용하는 손상된 문서가 이제 성공적으로 복구됩니다. 원시 재구성은 압축된 객체 스트림의 멤버를 복구하고, 파일 어디에도 트레일러 키워드가 없을 때는 가장 최근에 도달 가능한 문서 카탈로그에서 트레일러를 합성하므로, 깨진 startxref 오프셋이 더 이상 그런 파일을 열 수 없게 만들지 않습니다
Version 3.306.0
Added
ExportDocumentData는 문서 정보 키, 전체 책갈피 트리, 페이지 레이블 범위를 클래식 dump_data 줄 형식의 편집 가능한 일반 텍스트로 기록합니다ImportDocumentData는 같은 형식을 다시 적용합니다 — 정보 키가 업데이트되고, 책갈피 트리가 중첩 수준과 대상 페이지로 재구축되며, 페이지 레이블 범위가 교체됩니다 — 이로 인해 각 방향으로 한 번의 호출로 문서 간 일괄 책갈피 편집과 메타데이터 마이그레이션이 가능합니다
Version 3.305.0
Added
AuditDocumentSpace는 문서의 바이트 사용량을 카테고리별로 분류합니다 — 이미지, 폰트 프로그램과 사전, 콘텐츠 스트림, 양식 XObject, 객체 스트림, 임베드된 파일, 메타데이터, 구조 트리, 주석, 페이지 트리 및 기타 — 객체 수, 바이트 총계, 백분율과 함께, 파일이 왜 그만큼 큰지, 어느 최적화가 가장 보람 있는지를 답합니다
Version 3.304.0
Added
StructTreeItemCount,GetStructTreeItemText,GetStructTreeItemIntProperty는 태그된 문서의 구조 트리를 평탄화된 깊이 우선 항목 목록으로 읽습니다 — 요소 형식(원본과 역할 매핑됨), 대체 및 실제 텍스트, 언어, 제목, 표시 콘텐츠 id, 페이지 번호 및 부모/자식 관계
Changed
- 구조 트리 리더는 손상된 문서로부터 보호합니다: 참조 순환, 범위를 벗어난 객체 번호, 64수준을 초과해 중첩된 트리는 루프하는 대신 잘립니다
Version 3.303.1
Fixed
StampText와StampImage가 만든 반투명 밑바탕 스탬프는 더 이상 불투명도를 원래 페이지 콘텐츠로 번지지 않습니다 — 투명도 상태가 이제 스탬프 자체로 한정되어 페이지가 온전한 불투명도를 유지합니다
Version 3.303.0
Added
OverlayDocumentPages는 다른 열린 문서의 페이지를 선택된 문서의 페이지에 스탬프합니다, 타겟 페이지당 하나의 소스 페이지를 기존 콘텐츠 위 또는 아래에 — 레터헤드 용지, 연속 페이지 배경, 스캔된 양식 템플릿을 한 번의 호출로- 소스 고갈은 구성 가능합니다: 중지, 소스 페이지를 순환, 마지막 소스 페이지를 반복, 중 하나이며, 추가 옵션은 스탬프가 자연 크기 이상으로 확대되는 것을 막습니다
Changed
- 문서 스탬프는 타겟 페이지의 CropBox에 맞춰지고
/Rotate항목을 갖는 페이지에는 똑바로 배치되며, 각 소스 페이지는 공유 Form XObject로 한 번만 임포트되므로 반복된 템플릿이 자원을 중복하지 않습니다
Version 3.302.0
Fixed
- AES-256 비밀번호가 이제 해싱 전에 SASLprep (RFC 4013)으로 처리됩니다. 이로 인해 비 ASCII 공백, 소프트 하이픈, 호환 문자 또는 조합 시퀀스를 포함한 비밀번호가 Acrobat 및 기타 적합 리더에서 올바르게 열립니다
- AES-256 문서를 열 때 표준 준비된 비밀번호를 먼저 시도하고 기존 바이트 형식으로 폴백하므로, 비 ASCII 비밀번호로 이전 릴리스가 작성한 파일이 계속 열립니다
Added
- 오류 코드 604는 금지된 코드 포인트를 포함하거나 양방향 규칙을 위반하여 SASLprep에 거부된 AES-256 비밀번호를 보고합니다
Version 3.301.0
Added
SplitDocumentToFiles는 선택된 문서를 각각 고정된 수의 페이지를 갖는 출력 파일 배치로 분할합니다.%p파일 이름 자리 표시자를 사용합니다
Changed
- 배치 분할은 소스 문서를 한 번만 분석하고 모든 청크를 동일한 메모리 내 구조에서 복사하여,
ExtractFilePages에 대한 루프가 각 범위마다 수행하던 반복된 전체 재분석을 대체합니다
Version 3.300.0
Added
CollateDocuments는 여러 열린 문서의 페이지를 선택된 문서에 로테이션으로 병합하며, 각 라운드마다 각 소스에서 구성 가능한 수의 페이지를 취합니다 (A1, B1, A2, B2, …)CollateDocumentsEx는 소스별 페이지 범위 목록을 받아들이며,3-1과 같은 내림차순 범위가 소스를 반전시키므로, 앞면과 뒤집힌 뒷면 스캐너 패스를 한 번의 호출로 읽기 순서로 병합할 수 있습니다
Changed
- 병합 정렬은 각 소스를 단일 객체 맵을 통해 임포트하고 페이지 재정렬로 교차하므로, 소스 내에서 공유되는 폰트와 이미지는 그룹 크기에 관계없이 한 번만 기록됩니다
Version 3.299.0
Added
SetDeterministicDocumentID와GetDeterministicDocumentID는 트레일러 파일 식별자를 재현 가능한 값으로 전환하여, 동일한 입력이 동일한 출력 바이트를 생성하므로 빌드 캐싱, 콘텐츠 주소 지정 가능 저장소, 바이트 수준 회귀 비교에 사용할 수 있습니다SetDocumentIDSeed는 재현 가능한 파일 식별자에 명시적 시드를 제공합니다. 시드가 없으면 식별자는 문서 메타데이터, 버전 헤더, 페이지 수에서 파생됩니다
Changed
- 재현 가능한 파일 식별자는 전체 저장 시에만 새로고침됩니다. 증분 업데이트와 암호화된 문서는 기존 식별자를 유지하므로 서명과 비밀번호로 보호된 파일이 계속 올바르게 열립니다
Version 3.298.0
Added
AddLinkToArticleThread와SetOutlineArticleThread는 표준 Thread 액션으로 페이지 핫스팟과 아웃라인을 아티클 스레드 또는 비즈에 연결AddActionNextArticleThread와PDF_ACTION_BUILDER_THREAD는 체인, 양식, 페이지 및 문서 액션 워크플로에 Thread 액션을 추가
Changed
- Thread 액션 대상은 안정적인 간접 스레드 및 비즈 참조를 사용하고 대상 컨테이너를 변경하지 않고 잘못된 인덱스를 거부
- 양식 필드 액션 빌더는 PDF/A 모드가 활성화된 동안 추가 액션을 거부하여 필드 및 위젯
/AA사전에 대한 PDF/A 금지를 유지
Version 3.297.0
Added
DL플랫 DLL 참조가 이제 모든A접미사 ANSI(char) 진입점을 문서화하며, Unicode 대응 항목을 정확한PAnsiCharDelphi 및const char *C 시그니처로 미러링하는 353개의 참조 페이지를 추가BufferUtilities,DirectAccessFunctionality,MiscellaneousFunctions를 공유 카테고리 체계로 구동되는 깔끔한 함수 그룹 색인 페이지로 재구축하고, 깨진 마크업, 잘못 표시된 섹션, 누락된 칩을 수정- 탐색 색인과 공유 검색 색인이 Unicode와 ANSI 호출자 모두에 대해 전체 DLL 표면을 포괄
Fixed
- 소스에 일치하는 기호가 없는 오래된
SetLogger항목을 제거했으며, 문서화된 속성은Logger
Version 3.296.0
Added
AddAlternateImage,AlternateImageCount,GetAlternateImageInfo,RemoveAlternateImage가 표시 및 인쇄 이미지 변형의 형식화된 작성과 검사를 제공- 대체 이미지는 선택적 콘텐츠 그룹 또는 멤버십 사전과 연결될 수 있으며, 베이스 이미지당 하나의 변형을 인쇄 기본값으로 선택할 수 있음
Changed
- 내장 렌더러는 베이스 이미지가 숨겨져 있을 때 선택적 콘텐츠 대체 이미지를 선택하고, 인쇄 대상에서는 인쇄 기본값을 준수
FindImages가 페이지 리소스에서 도달 가능한 대체 이미지 XObject를 등록하여 가져온 변형이 사용 가능한 이미지 핸들을 받도록 함
Version 3.295.0
Added
AddArticleThread가 형식화된 메타데이터, 정렬된 페이지 사각형, 순환 비즈 링크, 페이지별 비즈 배열로 표준을 준수하는 아티클 탐색을 생성ArticleThreadCount,GetArticleThreadInfo,GetArticleThreadBead가 생성되거나 가져온 아티클 스레드를 검사하며 손상된 링크 순환을 제한적으로 순회
Changed
DeletePages가 모든 비즈를 잃은 아티클 스레드를 제거하고 남은 스레드의 순환 링크를 복구- 삭제된 페이지 추적이 안정적인 간접 페이지 참조를 유지하여 페이지 트리 커서가 이동함에 따라 아웃라인과 아티클 정리가 어긋나지 않도록 함
Version 3.294.0
Added
SearchTextBatch는 각 페이지 추출이 상주하는 동안 여러 텍스트 쿼리를 검색하고 모든 히트와 함께 발원 0 기반 쿼리 인덱스를 반환SearchTextBatchEach는 스트리밍 콜백을 통해 동일한 단일 패스 검색을 제공하며 진행 보고와 취소를 지원
Changed
- 단일 쿼리와 배치 텍스트 검색이 하나의 매칭 코어를 공유하여 대소문자 구분, 전체 단어, 페이지 범위 의미를 유지하면서 반복된 페이지 추출, 텍스트 접기, 히트 기하 작업을 회피
Version 3.293.1
Fixed
- 메시 셰이딩 래스터화가 어떤 Delphi 버전에서도 컴파일에 실패하지 않으며, GDI+ 페인터의 실수에서 부동소수점으로의 캐스트에 대한
E2089 Invalid typecast를 해결 - 병렬 배치 페이지 렌더링이
System.Threading을 사용할 수 없는 Delphi XE5와 XE6에서 컴파일되며, 오래된 툴체인은 비 Windows와 마찬가지로 직렬 렌더링 경로로 대체 - 프린터 기능 프로브가
SetPrinter호출을 나머지 인쇄 코드와 정렬하여 레거시 Delphi 버전에서 호환되지 않는 형식 오류를 더 이상 발생시키지 않음 - 인증서 저장소 열거가 RAD Studio 10.3 Rio에서 빌드되며, 이전에는 열거 루틴을 최적화하는 동안 내부 컴파일러 오류로 중단되었음
Version 3.293.0
Added
- 선택적 콘텐츠 멤버십 사전을
AnyOn,AllOn,AnyOff,AllOff호환 정책으로 생성, 갱신, 열거할 수 있음 - 중첩된 PDF 1.6
/VE가시성 식이 Delphi와 C++Builder가 공유하는 간결한 접두 표현을 통해And,Or,Not을 지원
Changed
- 선택적 콘텐츠 범위, 콘텐츠 스트림, 캡처된 페이지, 이미지, 양식 필드, 주석이 이제 그룹 핸들 또는 멤버십 핸들 중 하나를 허용
- 렌더링은 유효한
/VE식을 먼저 평가하고, 잘못되었거나 지원되지 않는 식은/OCGs와/P로 대체
Fixed
- 중첩된 선택적 콘텐츠가 둘러싸는 그룹이나 멤버십이 숨겨져 있을 때 콘텐츠를 표시하지 않게 됨
- 유효한 선택적 콘텐츠 그룹이 없는 멤버십 사전은 PDF 사양이 요구하는 대로 가시성을 변경하지 않음
Version 3.292.0
Added
EnumAttachments가 문서와 주석 첨부 파일 모두에 대해 생성 및 수정 날짜, 16진수 체크섬, 관련 파일 관계, 파일 사양 객체 번호를 보고ValidateAttachmentChecksum가 요청 시 저장된 체크섬에 대해 첨부 페이로드를 검증하며, 새로 임베드된 파일은 자동으로 체크섬 메타데이터를 받음
Fixed
SetEmbeddedFileAFRelationship가 단일 첨부 문서를 포함하여 나머지 첨부 API와 동일한 1 기반 임베드 파일 인덱스를 허용
Version 3.291.0
Added
DeduplicateResources가 로드된 문서 전체에서 정확히 중복되는 이미지, Form, 패턴, 셰이딩, 함수, ICC 프로필, 글꼴 프로그램, CMap, Type 3 CharProc, 임베드 파일, 메타데이터, PostScript 스트림을 통합- 리소스 중복 제거는 독립적인 형식 플래그, 드라이런 분석, 선택적 고아 수집, 상세한 해싱, 비교, 페이로드, 참조, 카테고리별 통계를 제공
Changed
- 중복 감지는 전체 스트림 사전을 키 순서에 관계없이 정규화하고, 각 후보 페이로드를 SHA-256으로 한 번 해시하며, 참조를 리디렉션하기 전에 일치하는 버킷을 바이트 단위로 확인
- 정확히 동등한 그룹은 결정적 출력을 위해 가장 낮은 객체 번호와 세대를 유지하며, 잘못된 직접 객체 순환과 의미론적 사전 차이는 병합되지 않은 상태로 남음
Version 3.290.0
Changed
PurgeUnusedResources가 타일링 패턴, Type 3 글리프, 주석 모양 상태, ExtGState 소프트 마스크 그룹, 이미지, 셰이딩, 중첩된 색상 공간 전체에서 전이적 종속성 클로저를 계산- 기본 정리 옵션이 패턴, Type 3, 모양, 소프트 마스크, 이미지 종속성 분석을 활성화하며, 더 좁은 스캔이 필요한 호출자를 위한 독립적인 플래그를 제공
- 중첩된 콘텐츠 프로그램과 종속성 항목은 캐시되고, 공유 리소스 범위는 가지치기 전에 사유화되며, 잘못된 순환은 활성 스트림과 깊이 가드로 제한됨
Fixed
- 이미지 색상 공간, Indexed 베이스, Separation 또는 DeviceN 대체, Pattern 기반 공간, ICCBased 대체, 셰이딩 사전을 통해서만 사용되는 페이지 리소스가 더 이상 미사용으로 제거되지 않음
- Type 3 CharProcs, 타일링 패턴 셀, 주석 모양, 투명도 소프트 마스크 그룹에 의해서만 사용되는 리소스가 자체 또는 상속된 범위에서 더 이상 제거되지 않음
Version 3.289.0
Added
PurgeUnusedResources가 선택된 콘텐츠 레이어에서 참조되지 않는 명명된 페이지 리소스를 제거하며 상세한 카테고리별 통계를 반환할 수 있음- 리소스 정리가 페이지 범위, 드라이런 보고, 진행 및 취소, 재귀적 Form XObject 분석, 더 이상 사용되지 않는 ProcSet 제거, 선택적 고아 객체 수집을 지원
Changed
- 리소스 분석이 PDF 이름 대소문자 구분, 상속된 Form 리소스, 사용자 정의 인라인 이미지 색상 공간, 일곱 가지 표준 리소스 카테고리를 모두 따름
- 반복된 Form 프로그램은 캐시되고, 사용된 리소스 집합은 정렬된 조회를 사용하며, 사전 항목은 대규모 문서 성능을 예측 가능하게 하기 위해 내림차순으로 제거됨
Fixed
- 사전 항목 제거가 대형 사전 키 인덱스를 무효화하여 이후 조회가 오래된 항목을 반환하지 않도록 함
- 잘못된 스트림과 알 수 없는 연산자는 기본적으로 전체 리소스 범위를 유지하며, 공유 또는 상속된 리소스 사전은 변경 전에 복제됨
Version 3.288.0
Added
- 디지털 서명이 완전한 DocMDP 인증과 FieldMDP 필드 잠금 구조를 내보낼 수 있으며, 선택된 각 서명에 대한 구조적 권한 보고서를 제공
- RFC 3161 문서 타임스탬프, 서명 타임스탬프, PAdES-B-T 토큰 주입, 인증서 체인 검증, OCSP 증거, DSS 또는 VRI 검증 자료에 완전한 작성과 검증 워크플로가 있음
- RichMedia 주석이 임베드된 자산, 활성화 및 비활성화 설정, 포스터 모양, 열거, 추출, 제거를 지원
- 포스터 인쇄가 벡터 페이지 부과, 겹침 및 crop marks, 하드 마진 인식 배치, 재사용 가능한 타일 계획을 지원
- 태그가 지정된 표가 안정적인 식별자, 헤더 연관, 범위, 반복 헤더, 장식의 아티팩트화를 통해 의미론적 Table, TR, TH, TD 구조를 내보냄
- 뷰어가 텍스트, 선택, 확인란, 라디오, 누름 단추 필드에 대해 키보드로 접근 가능한 AcroForm 편집을 제공하면서 호스트 애플리케이션에 액션을 전달
Changed
- Type 1 함수 기반 셰이딩과 Type 4부터 7까지의 메시 셰이딩이 네이티브 함수 평가와 제한된 메시 테셀레이션을 통해 렌더링
- ICCBased 색상 렌더링이 보정된 색상 공간 동작을 유지하면서 이미지와 셰이딩 전체에서 캐시된 변환을 공유
- 증분 저장이 객체 스트림과 교차 참조 스트림을 일관되게 재구축하고, 선택된 서명은 자체 서명된 개정판에 대해 검증됨
Fixed
- SHA-1 서명 타임스탬프 요청이 SHA-256으로 대체되는 대신 서명자 서명 값을 SHA-1로 해시
- 거부된 필드 잠금 교체가 이전에 유효했던 필드 잠금 구성을 더 이상 폐기하지 않음
- 중복된 모양 상태 이름을 가진 라디오 위젯이 선택된 위젯을 유지하고 형제 위젯을 꺼진 상태로 유지
Version 3.287.0
Changed
- 인라인 이미지 사전이 PDF 주석, 구분 기호, 리터럴, 16진수, 배열, 사전 경계를 따르며 제한된 중첩을 가짐
- 인라인 이미지 페이로드가 raw, DCT, ASCII85, ASCIIHex, RunLength, Flate 데이터에 대해 형식 인식 종료를 사용
- Flate 페이로드 발견이 콘텐츠 스트림 오프셋에서 정확한 압축 바이트 회계와 함께 하나의 제한된 inflate를 수행하며, 연쇄된 무손실 필터는 종단 간 출력 상한을 공유
- ASCII85, ASCIIHex, LZW, 예측자, 색상 프로필, 보조 이미지 스트림이 과도한 임시 할당 없이 제한된 중간 출력을 강제
Fixed
- 잘못되거나 잘린 인라인 이미지가 소스 데이터를 넘어 읽거나, 종료되지 않은 값에서 반복하거나, 디코더 재사용 간에 오래된 상태를 유지하지 않음
- 패킹된 이미지 행이 바이트 반올림 전에 구성 요소 비트를 계산하여 저비트 RGB와 다중 행 이미지의 잘못된 길이를 방지
- 리소스 색상 공간이 원래 이름을 유지하면서 Lab, 간접 ICCBased, DeviceN 구성 요소 수를 도출하고 Indexed 팔레트 스트림을 엄격한 제한 하에 디코딩
- 인라인 이미지 경계가 잘못된 치수, 비트 깊이, 지원되지 않는 필터, 안전하지 않은 필터 체인, 압축 스트림, 모호한 종료 마커를 일관되게 거부
- Indexed 색상 렌더링이 모든 팔레트 접근을 검증하고 디코딩된 표를 넘어 읽는 대신 잘린 조회 데이터를 거부
- PNG 예측자 10부터 15가 Flate와 LZW 스트림에 대해 올바르게 디코딩되고, 잘못된 행 필터를 거부하며, 할당 전에 모든 행과 상태 크기를 검증
- JPEG과 JPEG 2000 페이로드가 이미지 할당 전에 인코딩된 치수, 구성 요소, 정밀도, 마커 구조, 박스 길이, 디코딩된 저장 공간을 검증
- 인라인 이미지 검증이 패킹과 확장된 비트맵 저장을 모두 제한하고 ICC 프로필, JBIG2 글로벌, 터미널 필터 매개변수를 제한
- 종료 마커 텍스트를 포함하는 바이너리 필터 페이로드가 제한된 형식 검증을 통과하는 첫 번째 후보까지 계속
Version 3.286.0
Changed
- Content stream tokenization now follows PDF whitespace, comment, delimiter, literal string, hexadecimal string, and name boundaries
- Text splitting and resource replacement now use geometrically grown output buffers for linear processing of large content streams
- Reusable content stream processors now reset derived output and parser state before every
Processcall
Fixed
- Malformed or truncated literal and hexadecimal strings no longer read beyond the source buffer or emit an extra empty token
- Resource replacement now preserves case-sensitive PDF name semantics, accepts optional leading slashes, and updates duplicate mappings deterministically
- XObject and shading operands at the beginning of a stream are now excluded from text output, while unmatched restore operators no longer cancel later saved graphics states
Version 3.285.0
Changed
- LZW encoding now uses constant-time dictionary lookup and buffered stream writes, while decoding uses compact prefix and suffix tables with geometric output growth
- Flate predictor decoding now processes rows directly in the output buffer and supports packed, 8-bit, and 16-bit TIFF samples with arbitrary colour counts
- Stored Deflate streams now write into an exact pre-sized result, and zlib wrappers release temporary buffers safely when compression or decompression fails
Fixed
- LZW code-width changes now follow PDF
EarlyChangesemantics across 9-bit through 12-bit codes, including dictionary resets andEarlyChange=0 - LZW decoding now rejects invalid future codes and truncated bit streams without reading beyond the source buffer
- PNG predictors now use the ceiling byte width of a pixel, preserve previous decoded rows, and safely pad a partial final row
- TIFF predictor decoding now handles 1-bit, 2-bit, 4-bit, 8-bit, and 16-bit components consistently in both LZW and Flate paths
Version 3.284.0
Changed
- Buffer searches now scan fixed 64 KiB blocks, use byte lookup tables for set membership, and preserve the caller's position across every search path
- Unicode, Latin-1, hexadecimal digest, and ARC4 conversions now reserve bounded output once instead of repeatedly growing strings or temporary arrays
- ASCII85 encoding now reads input streams in 32 KiB blocks, while decoding uses exact integer arithmetic and writes directly into a pre-sized output buffer
- MD5 string hashing now avoids a temporary memory stream, digest comparison examines every byte, and ARC4 key scheduling no longer allocates an expanded key array
Fixed
DistanceToAnyBytenow returns the correct offset beyond its first block instead of rereading the same prefix and overcounting skipped bytes- Stream-backed buffer reads now honour the actual byte count returned by custom streams, shrinking results and advancing positions only by bytes received
- Buffer length reductions now clamp the current position, and nil pointer or stream sources behave as empty inputs instead of exposing invalid memory
- Latin-1 decoding now maps the complete byte range 0x00-0xFF instead of replacing bytes 0x7F-0xFF
- ASCII85 decoding now preserves the valid maximum 32-bit group
s8W-!and stops at the first end marker without floating-point boundary loss
Version 3.283.0
Added
TPDFlibSignatureVerifiercan now enumerate signature fields and CMS signers, open files, streams, or strings, and verify a selected field and signer by index or field name- Detailed verification reports now separate cryptographic integrity from signed-revision coverage, current-file coverage, later revisions, strict Contents-gap validation, and native crypto errors
Changed
- Detached CMS validation now streams both ByteRange segments through Windows CryptoAPI in bounded chunks instead of materialising the complete PDF in memory
- Signature fields under nested AcroForm Kids arrays and inherited
/FT /Sigentries are now enumerated with fully qualified names, and direct signature value dictionaries are supported
Fixed
- ByteRange validation now rejects overflow, overlap, truncation, a gap that is not exactly the selected hexadecimal
/Contentstoken, and a signed revision that does not end at its own%%EOF - Certificate lookup no longer falls back to an unrelated embedded certificate when the selected CMS signer identifier has no exact issuer-and-serial match
- Incremental updates that use cross-reference streams now include the cross-reference stream object's own type 1 entry, preventing strict PDF validators from reporting a missing self entry after signing
Version 3.282.1
Changed
- Full saves now rebuild imported object streams from the live object graph, preserve private trailer roots, and retain free-object generations without reusing structural object numbers
- Cross-reference streams now size their offset fields for large files, preallocate their payload, include their own entry, and preserve trailer extension keys
Fixed
- Object-stream packing now writes real
/ObjStmcontainers and type 2 member entries instead of only switching to an xref stream - Garbage collection no longer writes missing object numbers as in-use entries at offset zero and now emits a linked free-object chain in both plaintext and stream cross-references
- Loaded packed PDFs can now be saved repeatedly with packing enabled or disabled without retaining stale object streams, losing live members, or requiring cross-reference repair
Version 3.282.0
Added
- Imported ICCBased colours now use the embedded ICC profile across vector painting, function and mesh shadings, indexed palettes, raw bitmap, CCITT and JBIG2 images, CMYK JPEG images, and JPEG 2000 images
Changed
- ICC transforms now use a bounded Windows Color System lookup table with multilinear interpolation, replacing the temporary PNG round trip used during image rendering
- The renderer now honours content-stream and graphics-state rendering intents, ICCBased
/Range, image/Decode, and original-domain colour-key masks while validating profile channel counts against the PDF colour-space dictionary - Repeated uses of the same profile and rendering intent now share one lookup table across vector colours, patterns, shadings, and images
Fixed
- Encrypted ICC profile streams are now decrypted only while decoded and restored afterward, and embedded profiles are no longer compressed twice while writing image output
Version 3.281.0
Added
- The built-in GDI+ renderer now paints imported PDF function-based shadings and free-form, lattice, Coons, and tensor mesh shadings (types 1 and 4-7), including transparency and clipping
- Shading dictionaries now support component Function arrays, calibrated Lab, CalGray, and CalRGB spaces, Separation and DeviceN tint transforms, PatternType 2 Background fills, and BBox clipping across the GDI+ and Cairo renderers
Changed
- Type 1 shading functions now use bounded adaptive colour sampling with additional quarter-cell probes for higher narrow-feature accuracy and lower work on constant or smooth regions
- PatternType 2 matrices around mesh shadings are now composed exactly once in both GDI+ and Cairo, preserving translated, scaled, and rotated pattern placement
- Mesh colour components are now interpolated in their source colour space before Function evaluation and conversion to RGB, preserving nonlinear functions, DeviceCMYK gradients, and the correct ordering for managed colour transforms
- Coons and tensor surfaces now use bounded device-pixel error subdivision for smoother high-curvature output at large render sizes
- Encrypted shading and Function streams are decoded through the document crypt callbacks, and Type 5 vertex records honour their required byte alignment
Version 3.280.1
Fixed
MergeFileList/MergeFileListFast/MergeFileListStrictleaked aTSmartPDFReader/TSmartPDFDocumentpair (and everything they own) when a non-PDF file appeared in the merge list: the reader and document were constructed before thetryblock that frees them, so a parse failure on the malformed file's content orphaned the already-constructed reader instead of being cleaned up by the surrounding exception handler; construction now happens inside the protectingtryin both the single-file and multi-file prescan paths- Mesh shading parsing (
TPLMeshShading.Parse, shading types 1 and 4-7) leaked the decoded/Functionobject on every parse - every early-exit path and the normal completion skipped freeing it; the function is now released in afinallyblock regardless of howParseexits TPDFlibSignDoc.Closenow nils its smart-reader/document/info fields after freeing them, and the exception paths inOpen,OpenStreamandOpenStringnow release any partially-constructed smart objects instead of only clearing the stream reference, preventing a leak when opening a signing target fails partway through
Version 3.280.0
Added
- Error category enumeration
TPDFlibErrorCategory(ecSuccess/ecStructure/ecSave/ecCrypto/ecGeneric/ecCompliance/ecAcroForm) layered on top of the existing numericLastErrorCodetaxonomy, so callers can classify failures without memorising code ranges; exposed viaTPDFlib.LastErrorCategory,TPDFlib.ErrorCategory(Code)andTPDFlib.ErrorMessage(Code) - Form-field error codes 701-704 (field not found, field read-only, no AcroForm, invalid value) with human-readable messages, letting callers distinguish "field is locked" from "no such field" instead of receiving a single generic failure
SetFormFieldValueForcedforce-write variant that bypasses the read-only guard, used internally bySetFormValues(SkipReadOnly=False)so bulk imports can still overwrite locked fields when the caller explicitly opts out
Changed
SetFormFieldValuenow setsLastErrorCodeto 701/702/703 on failure (field not found / read-only / no AcroForm) instead of returning 0 silently;LastErrorCategoryis a non-consuming read so callers can inspect the category before retrieving the numeric code
Version 3.279.0
Added
ReplacePageRangesreplaces visual page content from another open document without changing the target page count or target page object identities, preserving bookmarks, links, annotations, and form widgets already attached to those pages
Changed
- Cross-document page copying no longer creates and removes an extra placeholder page before importing the requested range
Version 3.278.0
Added
PrintPagesAdvancedapplies copies, collation, duplex, orientation, color, quality, paper-size and input-bin settings to arbitraryPrintPagesrange expressions while retaining one printer profile and one print job
Changed
- Advanced print settings are validated before the job starts, positive print-quality values above the four named presets are applied as DPI, and paper or input-bin identifiers may use the full positive range supported by the corresponding
DEVMODEfields
Fixed
- Damaged cross-reference recovery now dispatches its bounded block reads through the traditional
TStream.Readoverride on Win64, preserving instrumentation and custom-stream behavior while retaining 64 KiB sequential I/O
Version 3.277.0
Changed
- Damaged cross-reference recovery now scans source data in 64 KiB sequential blocks instead of seeking once for every matching character, keeping auxiliary memory bounded while scaling to large PDF files and non-memory streams
- Recovery validates complete indirect-object tokens, skips object-like data inside comments, strings, and streams, confirms stream endings with a following
endobjtoken, preserves headers split across read boundaries, and selects the last valid trailer dictionary
Fixed
- Trailer reconstruction now supports nested dictionaries and delimiter text inside literal strings and is no longer truncated to the first 2048 bytes or the first apparent
>>pair
Version 3.276.0
Added
ActivateWebLinksandActivateWebLinksExscan existing page text once per page and create non-duplicate URI link annotations for HTTP, HTTPS,www., FTP,mailto:, and bare email targets with selectable detection and border options- Generated links use matched-character geometry, precise quadrilaterals for rotated or skewed text when permitted, PDF/A print flags, progress and cancellation support, and selected-page restoration; tagged PDF and PDF/UA documents are protected from incomplete structure-tree updates
Changed
SetAutoCreateWebLinksnow uses the same boundary-aware detector and target normalization when creating links for newly drawn text, addingwww., FTP, and bare email support
Fixed
- Updating annotation
/Contents, name, date, title, or subject properties no longer overwrites the subtype of an existing action dictionary, so URI and other actions remain valid after annotation metadata changes
Version 3.275.0
Added
ExtractPageRangeText,SavePageRangeTextToStream, andSavePageRangeTextToFileextract a parsed page range in one traversal with caller-defined page separators; stream and file output writes UTF-8 data incrementally so large documents do not require a complete document-sized text bufferSetPageBoxRangeandRemovePageBoxRangeapply page-boundary changes across the standard page-range syntax while preserving the caller's selected pageSetPageTransitionRangeandSetPageTransitionRangeExapply legacy or extended presentation transitions to page ranges with per-page progress and cancellation supportGeneratePageThumbnailsrenders requested pages directly into reusable memory and attaches their/Thumbimages without intermediate files or nested progress operations
Version 3.274.0
Fixed
- GDI+ rendering of axial shading patterns now honours the PDF
/Extendarray:SetupGDIPlusPatternpassesWrapModeClampwhen either end is extended (matching the Cairo backend) instead of always usingWrapModeTile, so end colours paint the area outside the gradient axis correctly
Added
- The scroll-hint bubble (
"Page N / M") shown while dragging the vertical scrollbar now auto-hides after 3 seconds of inactivity via aWM_TIMERhandler, so it no longer lingers until a separate scroll event dismisses it ZoomInStep/ZoomOutStepnow snap ontoActualSize(100%),FitWidthandFitPagepercentages when they fall between the current zoom and the next preset on the 14-step ladder, matching the behaviour of professional PDF viewers- The viewer disk page cache writes a build-version marker (
cache.version) and wipes the whole cache root when the library version changes, so a build upgrade never reuses stale bitmaps rendered by an older code path
Version 3.273.1
Fixed
- Object-stream container and xref-stream objects created during save were leaked because they bypassed
TPDFStructure.AddObjectregistration; both call sites now use theNewStreamWithDictownership-tracking factory, eliminating theTPDFStreamleak reported by the test runner underReportMemoryLeaksOnShutdown - Cross-reference stream
/Sizewas off by one: it must be one past the highest object number in the whole file, and the xref stream is itself an indirect object numberedMaxObj+1, so/Sizeis nowMaxObj+2
Changed
- Peephole content-stream optimiser now also removes identity text-matrix operators (
1 0 0 1 0 0 Tm), covering bothcmandTmwith the same six-operand identity check - Mark-sweep GC preserves object 1 (the
/Linearizedparameter dictionary) when the source document was loaded linearized, since that dictionary is never referenced from/Rootbut must survive
Version 3.273.0
Added
- Object-stream packing on save (
TPDFDocument.PackObjectsIntoStreams) collects eligible non-stream indirect objects, serialises them into PDF 1.5 object streams (/Type /ObjStm) with Flate compression, and emits a binary cross-reference stream (/Type /XRef) carrying type-0, type-1 and type-2 entries, reducing the size of saved files 10-40% on object-dense documents TPDFlibSaveOptions.PackObjectStreamsflag plusTPDFlib.SetPackObjectStreams/GetPackObjectStreamsAPI; defaults to enabled, auto-gated by PDF version (1.5+ activates packing and xref streams, 1.4 and below keep the traditional plaintext xref for compatibility), andTPDFlib.GetLastSaveUsedObjectStreamsreports whether the last save actually packed
Version 3.272.0
Added
- Mark-sweep garbage collection of unreferenced indirect objects (
TPDFDocument.GarbageCollectUnusedObjects) walks the object graph from the trailer roots (/Root,/Info,/Encrypt) and removes every indirect object that is not reachable, stopping the file-size growth that accumulates when pages are deleted and their font, content and XObject resources become orphans TPDFlibSaveOptions.GarbageCollectflag plusTPDFlib.SetGarbageCollect/GetGarbageCollectAPI let callers opt in to GC during a full save (defaults to off for backward compatibility), andTPDFlib.GarbageCollectObjectsruns GC immediately and returns the number of orphaned objects removed
Version 3.271.0
Added
- Peephole content-stream optimiser (
TPDFContentPeepholeOptimizer) rewrites a parsed page content stream before Flate compression, removing semantically redundant PDF operators: identitycmmatrices, emptyq/Qpairs, emptyBT/ETobjects, no-op paths terminated bynwith no clip, duplicate graphics-state setters (colour, line width, cap/join, dash, text state), and deadnafter a painting operator - all transforms are output-equivalent so visible page output is unchanged TPDFlibSaveOptions.OptimizeContentStreamsflag and matchingTPDFlib.SetOptimizeContentStreams/GetOptimizeContentStreamsAPI let callers opt in or out of the peephole rewrite duringCompressContent/CompressPage; enabled by default
Changed
TPDFDocument.CompressPagenow forwards the optimisation flag to the page tree so the peephole pass runs insideTPDFPageTree.Compressbefore the existing Flate compression, stacking operator-level reduction on top of byte-level compression
Version 3.270.0
Added
- New
PLParseDefaultAppearancedecodes a/DAdefault-appearance byte string (ISO 32000-2 12.7.4.3) into the font resource name, font size and fill colour, covering therg,kandGcolour operators so form-field and annotation appearance generators can paint text with the author-intended styling
Changed
- Page content-stream assembly (
TPDFRenderer.GetContents) now concatenates multi-part/Contentsarrays through aTStringBuilderinstead of repeatedResult := Result + chunk, removing the O(n^2) string growth that penalised pages with many content-stream parts
Version 3.269.0
Added
- New
BeginMarkedContent/EndMarkedContentwrite inline marked-content sequences with accessibility properties (/Alt,/ActualText,/Lang,/E) directly in the BDC property list per ISO 32000-2 14.9.2–14.9.5, so screen readers and accessibility tooling can read substitute text without a structure-tree entry - Annotation reader exposes
GetAnnotEffectiveBorderimplementing the Errata #287 precedence (border style dict/BSwins over the legacy/Borderarray) and resolving width, style and dash pattern into one call - Signature documents expose
GetSignatureSeedValueto read the seed-value dictionary (/SV, ISO 32000-2 12.7.5.5 Tables 236–237): required filter, allowed SubFilters and allowed digest methods, so a signer can honour the constraints the author embedded GetSignatureFieldLockreads the/LockFieldMDP seed dictionary (Table 238): action (/All,/Include,/Exclude) and the affected field names that must be locked at sign time
Version 3.268.0
Added
- New
PLParsePDFDateparses ISO 32000-2 7.9.4 date strings (D:YYYYMMDDHHmmSSOHH'mm') into a localTDateTime, honouring the mandatoryD:prefix, the field-dependency ladder (each field only when all preceding fields are present) and the UT offset (+/-/Zwith optional apostrophe-minute), returning the local equivalent of the documented instant - Text-string decoding (
PLDecodeTextString) now recognises the PDF 2.0 UTF-8 BOM (EF BB BF) per 7.9.2.2.1, so UTF-8-authored metadata decodes correctly instead of being misread as PDFDocEncoding - File specifications expose
GetFileNamehonouring the PDF 2.0 precedence (Path > UF > F) per Errata #444, plusGetEmbeddedFileStreamandGetRelatedFilesaccessors for the/EFand/RFdictionaries - Annotation readers expose appearance-precedence helpers
GetAnnotNormalAppearance,GetAnnotDefaultAppearanceandGetAnnotOffStateAppearanceimplementing the Errata #23/#34/#42/#170 rules (AP/N is authoritative; DA is the byte-string fallback; Off state lives under the nameOff) - PDF/UA validation reports a new code 10045 when a non-standard structure type fails to terminate at a standard type through the role-map chain (ISO 14289-1:2014 7.1), with cycle protection to a depth of 8
- PDF/A and PDF/UA font audits now validate that embedded CIDFontType2 fonts carry a
/CIDToGIDMapwhose value is either the nameIdentityor a stream, not merely present (ISO 32000-1 9.7.4)
Changed
- Name-tree lookup (
NameTreeLookup) now binary-searches the sortedNamesarray per ISO 32000-2 7.9.6 before falling back to a linear scan, turning large EmbeddedFiles/JavaScript/Dests lookups from O(n) into O(log n) on conformant files - PDF/UA standard-structure-type set expanded with PDF 2.0 additions (
Artifact,DocumentFragment,FENote,MarkedContent,Title) so the role-map no-remap and chain-termination checks recognise the full tag vocabulary
Version 3.267.0
Added
EnumPageContentStatesExcan recursively enumerate Form XObject instructions with configurable depth, cycle protection and depth-first execution ordering- Content snapshots now expose invocation-tree identity, containing stream and parent XObject information, resource-scope identity, Form traversal status and descendant counts
- Standalone content trackers can register scoped fonts and initialise isolated Form execution state with matrix concatenation and bounding-box clipping
Changed
- Recursive content tracing selects each Form resource dictionary independently, inherits invoking resources for compatible legacy Forms, preserves inherited font identity and caches decoded Form programs across repeated invocations
Version 3.266.0
Added
- Text runs returned by
GetTextRunsnow carry the glyph origin (OriginX/OriginY) and the full text matrix components (Tm11/Tm12/Tm21/Tm22/TmDX/TmDY) captured by replaying BT, Td, TD, Tm and T* alongside the show operators, so consumers can locate glyphs without a separate text-funnel pass - Mesh shading decoding now routes Lab, CalRGB and CalGray colour spaces through the colour manager instead of falling through to black, producing correct fills for non-DeviceRGB free-form and coons patches
- Redaction now emits a real
/Subtype /Redactannotation with/Rect,/ICinterior colour and optional overlay text alongside the existing content removal, so redaction-aware viewers mark the sanitized region - Library operations emit structured log records at load and save boundaries through the previously dormant
Logger, with ISO-8601 UTC timestamps and a cachedTStreamWriterfile sink that no longer reopens the log file on every line - New
Tests.Memoryfixture guards create/draw/save/free andNewDocumentcycles against heap regression, and the console test runner now enablesReportMemoryLeaksOnShutdown - EMF interpretation now counts unknown or private records via the
UnknownRecordCountproperty so silent metafile gaps are observable
Changed
- Dictionary key lookup (
TPDFDictionary.FindIndexByKeyName) builds a lazy open-addressing hash index for dictionaries with more than 16 entries, turning the linear scan that dominated renderer Resources/ColorSpace/Font/ExtGState lookups into an O(1) probe - sRGB gamma conversion (
XYZ2RGB) uses a shared 4096-entry lookup table instead of threePower(x, 1/2.4)calls per pixel, and Lab-to-XYZ cubing now uses direct multiplies; both are the dominant per-pixel cost when decoding Lab or ICC-based images - Page lookup (
TPDFPageTree.GetPage) returns the cached page dictionary on repeat access instead of re-walking the page tree every call - Content-stream operator dispatch (
ContentOperatorFromName) buckets the 73 operators by first byte, cutting the per-token linear scan to a short residual compare - PDF/A colour-space audit now recurses into the base or alternate space of Indexed, Separation, DeviceN and ICCBased up to a depth of 8, so a hidden DeviceCMYK tint transform or bare Lab name is flagged rather than passing silently
- Shaped-font finalize now walks the used-glyph set recorded at draw time instead of scanning all 65536 glyph slots four times per save
- String escape routines (literal-string, XFDF, stamp and variable token expansion) build output through
TStringBuilderor two-pass allocation, removing O(n^2) concatenation from save and form-export hot paths - AES stream encrypt/decrypt reuse their chunk buffer across loop iterations instead of reallocating per block
- Composite-glyph parsing in the TrueType parser grows the components array geometrically instead of one element at a time
- Mesh shading
ReadBitsreads the minimum covering bytes in one pass andWriteBitspre-sizes the output buffer, eliminating per-bit reallocation - Painter circle control point uses a precomputed kappa constant and arc squaring uses
Sqrinstead ofPower
Fixed
- Fixed a non-Windows compile break in
PDFlibParallelwhere the stub body signature forPDFlibRenderPagesParalleldid not match the interface declaration
Version 3.265.0
Added
- Added 59 C++Builder console demos to align the C++Builder demo suite with Delphi, bringing the total from 33 to 92 demos covering the same API surfaces
- Added Demo/C++Builder/index.html expansion from 35 to 92 entries with Navigation, Color & ICC, Barcode & media, and Structure & compliance sections
Fixed
- Fixed all 33 existing C++Builder cbproj files that were missing 20 library units (PDFlibMeshShading, PDFlibGraphics, PDFlibWindows, PDFlibParallel, PDFlibLogger, PDFlibMail, PDFlibViewer, etc) from their DelphiCompile list, which prevented every C++Builder demo from compiling
Version 3.264.0
Added
- Content graphics-state snapshots now resolve
Dooperands as image, form or PostScript XObjects and report their resource names, object numbers and transformed bounds - Form snapshots expose the original
/Matrixand/BBoxtogether with resource, group, transparency-group and reference-form indicators - Standalone content trackers can pre-register XObject streams through
RegisterXObject
Changed
- Page content-state enumeration now precompiles selected-page XObject resources and calculates invocation bounds from all four transformed corners
Version 3.263.0
Added
- Content graphics-state snapshots now expose current path bounds, current point, path complexity, pending clipping rules and effective clipping bounds
- Standalone content trackers can initialise an explicit clipping boundary through
SetInitialClipBounds
Changed
- Page content-state enumeration now follows delayed
WandW*clipping, exact transformed cubic extrema,q/Qclipping restoration and selected-pageCropBoxboundaries
Version 3.262.0
Added
- Content graphics-state snapshots now report font writing mode, exact per-instruction text displacement and whether font metrics were resolved
- Standalone content trackers can provide font measurements through
OnMeasureText
Changed
- Page content-state enumeration now advances text matrices for
Tj,TJ,'and"using simple or composite font metrics, horizontal scaling, spacing and vertical writing rules
Version 3.261.0
Added
- Content graphics-state tracing can now resolve page
ExtGStateresources, including transparency, blending, overprint, soft masks, device controls and embedded font references TPDFContentStateTrackercan pre-register external graphics-state dictionaries for standalone content-program analysis
Changed
- External graphics-state parameters now apply cumulatively and participate in complete
q/Qsave and restore snapshots
Version 3.260.0
Added
- Added single-pass effective graphics-state tracing for structured content programs and complete selected pages
- Snapshots expose CTM, text matrices, line style, dash pattern, colours, text state and graphics-state stack depth before or after each instruction
Changed
- Image placement enumeration now maps all four unit-square corners, producing correct bounds under rotation and shear
Version 3.259.0
Added
- Added typed time, special-pattern and arbitrary-mask helpers for interactive form fields
- Added range validation with independently optional zero-safe bounds
- Added sum, average, product, minimum and maximum field calculations with automatic calculation-order registration
Security
- Generated JavaScript string values now escape quotes, backslashes, control characters and JavaScript line separators
Version 3.258.0
Added
- Added typed
SetOCGStateaction creation for form-field events, existing actions and action chains - Optional-content actions preserve left-to-right state changes, repeated groups and the optional radio-button relationship preference
Changed
- Optional-content action enumeration now returns canonical group handles that round-trip through the writer APIs
Version 3.257.0
Added
- Added complete explicit remote-destination writing with zero-based pages, all standard fit types, nullable XYZ values and tri-state window preferences
- Added complete launch-action writing for portable files, Windows parameters, default directories and open or print operations
- Existing action handles can now update these payloads or append them to action chains without container-specific duplicate APIs
Security
- Remote go-to and launch action builders now reject PDF/A mode before modifying an action chain
Version 3.256.0
Added
- Remote go-to action inspection now reports named and explicit destinations, zero-based target pages, fit types, coordinates and zoom values
- Launch action inspection now reports Windows application parameters, default directories and open or print operations
- Action information distinguishes an absent
/NewWindowpreference from an explicit false value and identifies array-based targets
Version 3.255.0
Added
- Added typed builders for remote named-destination and external application launch actions
- URI action builders now support coordinate-map requests through the standard
/IsMapflag - The new action kinds work across lifecycle, form-field and chained-action APIs through the existing extended builder interface
Version 3.254.0
Added
- Added 14 Delphi API-coverage demos for library surfaces that had no dedicated demo: OutlineBuilder, NamedDestinations, DocumentActions, EmbeddedFiles, LinearizeDemo, BarcodeGallery, XfaFields, TaggedPDF, OutputIntent, HtmlTextFlow, RichMediaAnnotations, MailSendDemo, TextBlockExtraction, and PadesDssDemo
- Added a Navigation section, Color & ICC section, Barcode & media section, and Structure & compliance section to the Delphi demo index, bringing the total from 56 to 92 listed demos
- Added Readme.en-us.html guides for the 20 demos that previously shipped without one
Changed
- Applied the project Formatter.config across all Delphi demo sources so operator spacing, indentation, and keyword casing follow one style, and set NewLineBeforeThen to False so If...Then stays on a single line
- Hardened error handling across the classic GUI demos: SaveToFile return values are now consistently checked, TPDFlib and secondary object lifetimes are always protected by try/finally, and failure messages include LastErrorCode
Fixed
- Fixed inverted SaveToFile polarity in ImageToPdf that treated success as failure, and stopped AddTrueTypeSubsettedFont from opening a stale file when the save failed
- Fixed resource leaks in CreateWithImageToStream, DoInTheStream, CanvasText, ExtractText, ExtractImage, PdfDecrypt, PdfEncrypt, and PdfPermission where TPDFlib, TStream, TBitmap, TOpenDialog, or TStringList instances could escape on an exception path
- Removed dead code in AddFormattedTitle (unused RectParts allocation, redundant try/except around StrToFloatDef) and MultiFunction (overwritten SetTextSize call)
Version 3.253.0
Added
- Added typed action details for thread, sound, movie, optional-content, rendition, transition and 3D-view actions
- Added reusable action-handle lookup and ordered optional-content state enumeration
- Added complete PDF transition records covering replacement, Fly, Push, Cover, Uncover and Fade styles
Fixed
- Wipe and Glitter transitions now store their direction in
/Di, read page display duration from the page dictionary and clear both transition and timing entries - Standard pre-PDF-1.5 transition styles no longer force a PDF 1.5 output version
Version 3.252.0
Added
- Added single-pass form-field action discovery with typed action details across primary, widget and field triggers
- Added complete calculation-order enumeration, per-field lookup and removal for interactive forms
- Extended bulk form-field snapshots with calculation order and action count
Changed
- Widget lifecycle triggers now support page-open, page-close, page-visible and page-hidden actions with the required PDF 1.5 version handling
Version 3.251.0
Added
- Added single-pass named-destination enumeration across legacy catalog entries and modern name trees with resolved page and view parameters
- Added named-destination removal, complete push-button captions, button text positioning and form-field mapping names
- Extended bulk form-field snapshots with mapping names, button captions and button text position
Fixed
- Name-tree editing now supports direct destination values and uses unambiguous multi-node index encoding
Version 3.250.0
Added
- Added single-pass form field snapshots with field identity, type, page, flags, values and Choice state
- Added typed Choice-field flag queries plus validated selected-index and top-visible-index accessors
Fixed
- Single-selection Choice fields no longer retain a multi-selection
/Iarray, and switching from multi-select to single-select now replaces the old/Varray with a string value
Version 3.249.0
Added
- Added one-pass stateful text search traversal so applications can iterate cached hits without extracting pages twice
- Added bulk form value export and name-based application with optional read-only field protection
Version 3.248.0
Added
- Added retained Viewer selections with page-space geometry, extracted text, enumeration, clearing and a vetoable marquee event
- Added exact current-viewport bitmap capture and file output including persistent overlays
Version 3.247.0
Added
- Added independent Viewer controls for user form editing and annotation activation
- Added configurable foreground colour for text and choice form editors
Version 3.246.0
Added
- Added typed line ending styles, shape interior colours, link highlight modes, FreeText alignment, Text annotation open state and Caret symbols
- Annotation setters validate compatible subtypes and automatically raise the minimum PDF version where required
Version 3.245.1
Fixed
- Corrected FastReport export page sizing and memo layout so A4 reports retain their intended scale, text stays within memo bounds and unconfigured memo frames remain hidden
Version 3.245.0
Added
- Added
OnPasswordso applications can supply another password after an encrypted document rejects the initial credential - Password retries now work consistently for file, stream and string loads, expose the next attempt number and allow the handler to cancel
Security
- Password callbacks are limited to sixteen total attempts and every retry uses a fresh parser and decryption state
Version 3.244.0
Added
- Added
SetXMPPropertyExfor safely writing scalar properties in caller-defined XMP namespaces - Custom XMP values are escaped through the XML DOM, repeated writes replace the matching namespace property and invalid or reserved XML names are rejected
Version 3.243.0
Added
- Added typed document lifecycle actions for before close, before save, after save, before print and after print triggers
- Added typed page open and close actions with shared support for URI, named, JavaScript, form and destination action builders
- Added action inspection and removal methods for every document and page lifecycle trigger
Version 3.242.0
Added
- Added
SaveChangesto append changes to the originally loaded file and automatically reload the updated xref chain for repeated incremental saves SaveChangesvalidates the reload password before writing and preserves the selected public document handle after reload
Changed
AppendToFilenow rejects a target whose current length differs from the loaded source, preventing stale incremental offsets from being appended to an externally changed file
Version 3.241.0
Added
- Added
GetLastOutlineandGetLastChildOutlinefor direct access to the tail of a bookmark list - Added
GetOutlineChildCountandGetOutlineSiblingIndexfor lightweight bookmark tree inspection without allocating a full tree snapshot
Version 3.240.0
Added
- Added
SaveAllAttachmentsExwith overwrite, skip and automatic rename conflict policies plus a per-attachment naming callback - Attachment exports now reduce requested names to safe leaf names and protect Windows reserved device names
Fixed
- Fixed
SaveAllAttachmentsreturning without writing files because its attachment snapshot was counted but not allocated and populated
Version 3.239.0
Added
- Added
OnPageMouseDown,OnPageMouseMoveandOnPageMouseUpso Viewer hosts receive one-based page numbers and top-down PDF point coordinates independent of zoom, scrolling and view rotation - Added
RegionAtClientPoint,ActiveRegionandOnActiveRegionChangeto distinguish links, non-link annotations and form fields as the pointer enters or leaves them - Added
CreatePDFlibViewerDefaultPopupMenuandInstallPDFlibViewerDefaultPopupMenu, which compose the existing Viewer action classes into a ready context menu for copy, zoom, fit, rotate, navigation, save and print
Version 3.238.0
Added
- Added
OnOperationProgresswith typed operation kind, lifecycle phase, current and total units, percentage and detail text while preserving the classicOnProgresspercentage callback - Load, save, search, merge and page-render file, stream and string entry points now report starting and terminal phases; operations with intermediate progress also report
opRunning - Setting
CancelduringopStartingoropRunningactivates the existingAbortstate, providing one cancellation path for old and new callers
Fixed
LoadFromFilenow preserves error code 404 for a wrong password instead of overwriting it with the generic load error 401 after cleanup
Version 3.237.0
Added
- Added
SearchTextEachandTPDFlibSearchHitEventto emit every text hit immediately without allocating or sizing a result array SearchTextandSearchTextEachnow report page progress throughOnProgressand honour bothAbortand callback cancellation; callback cancellation uses the existing abort state untilResetAbort- The Viewer search panel and search-highlight layer now consume the streaming API in one pass, removing their former 256-row and 512-highlight limits
Fixed
- Whole-word search now continues past an earlier substring occurrence in the same text block to find a later correctly bounded match
Version 3.236.0
Added
- Added
GetPrinterCapabilitiesto capture a live printer-driver snapshot without starting a print job - The typed
TPDFlibPrinterCapabilitiesresult includes paper IDs, names and millimetre dimensions, input-bin IDs and names, duplex, colour, landscape and collation support, the printer port and the maximum driver-reported copy count - Drivers that omit paper or bin metadata still return the remaining capabilities with empty arrays, while invalid printer names return a fully cleared snapshot
Version 3.235.0
Added
- Added
SendDocumentByMailfor saving the loaded document to a temporary PDF and delivering it as an SMTP attachment through the built-in Windows CDO provider - Added the reference-counted
IPDFlibMailProviderextension point so applications can supply another transport, support non-Windows hosts and test mail workflows without network access - Each send uses an isolated temporary directory, sanitises the attachment display name and removes both the PDF and its directory after the provider returns;
GetLastMailErrorreports validation, save, transport and platform failures
Version 3.234.0
Added
- Added variable placeholders to stamp, header and footer text:
<%PageNo%>,<%TotalPages%>,<%ShortDate%>,<%LongDate%>,<%ShortTime%>and<%LongTime%>expand per page alongside the classic &-tokens - Any custom
<%name%>placeholder resolves through the newOnCalcVariableevent, which receives the name and the page number and supplies the replacement - running numbers, batch codes and client fields stamp without pre-processing the text; without a handler unknown placeholders stay verbatim
Version 3.233.0
Added
- Added superscript/subscript detection to text extraction: the new
GetTextBlockVAlignreports each extracted text block's baseline classification (0 = baseline, 1 = superscript, 2 = subscript) relative to its visual line, so chemical formulas, exponents and footnote markers can be recognised - A block classifies as super-/subscript when it is markedly smaller than the line's dominant text and its vertical centre sits above/below the dominant centre within one text height
Version 3.232.0
Added
- Added character-level word splitting to text extraction:
SetTextExtractionOptions(17, 1)re-splits show-text runs that carry no space characters into words wherever a per-character advance step is much wider than the run's median glyph advance - documents that paint whole lines as a single operator with kerning gaps standing in for spaces now extract as separate words inGetPageTextmodes 7 and 9-11 - The advance arrays stay aligned with the widened text, so block quads and per-character width outputs remain consistent
Version 3.231.0
Added
- Added layout-preserving fixed-grid text export:
GetPageText(11)maps the page geometry onto a monospace character grid - rows cluster by baseline, every block lands at its column computed from the average character width, and shorter cells pad with real spaces - so tables and forms keep their visual alignment in plain-text viewers, terminals and diffs without relying on tab stops - The reference page for
GetPageTextnow documents the reading-order (9), tab-separated table (10) and fixed-grid (11) modes
Version 3.230.0
Added
- Added dehyphenation to text extraction:
SetTextExtractionOptions(16, 1)re-joins words hyphenated across line breaks ("inter-" at a line end followed by "national" becomes "international") in the line-oriented outputs ofGetPageTextmodes 7 and 9 - The heuristic only merges when a letter precedes the hyphen and a lowercase letter starts the next line, so numeric ranges, proper nouns and sentence-initial capitals keep their hyphens
Version 3.229.0
Added
- Added the
OnBeforeSnapshotevent to theTPDFlibViewercontrol: it fires before a snapshot drag is captured with the dragged region, and setting Handled cancels the default clipboard capture so applications can process the region themselves - Exposed
PrefetchEnabled: the background pre-render worker can now be switched off and on at run time (the worker stops immediately and restarts on the open document) - Exposed
DiskCacheMaxDocuments: the number of documents the cross-session disk page cache keeps before pruning is now tunable (default 10)
Version 3.228.0
Added
- Added precise navigation to the
TPDFlibViewercontrol:GoToPagePointjumps to a page and scrolls a given page point to the top-left of the viewport, so link destinations and search hits land exactly in view - Added programmatic scroll control:
ScrollBypixel stepping, read/writeHScrollPos/VScrollPosproperties (ideal for synchronising two side-by-side viewers over the same document), andGetScrollPosForPagereporting each page's scroll anchor in continuous mode - Added public coordinate bridges
ClientPointToPageandPageRectToClientRectconverting between client pixels and page user space through zoom, rotation and scroll; the internal hit-testing now shares the exact geometry of the paint path and also works on unparented (headless) controls
Version 3.227.0
Added
- Added view-state events to the
TPDFlibViewercontrol:OnZoomChangefires on every effective-zoom move (explicit zoom, preset steps, fit-mode recomputation on resize, rotation or DPI change) andOnHScroll/OnVScrollfollow the scroll position, so toolbars and status displays stay in sync without polling - Dragging the vertical scrollbar thumb now shows a floating "Page N / M" bubble that previews the page the view will land on - a big help in long documents; the
ScrollHintEnabledproperty (on by default) turns it off
Version 3.226.0
Added
- Completed the fill-and-save loop in the
TPDFlibViewercontrol:SaveToFileandSaveToStreamwrite the displayed document - committed form edits included - back to disk or a stream (any open in-place editor commits first) - Multiline text fields now edit in a proper multi-line memo: Enter inserts a line break, Ctrl+Enter commits, Escape cancels; single-line fields keep the plain Enter-commits behaviour
- Tab and Shift+Tab cycle the in-place editor through the document's editable text and choice fields, following each field's page;
FocusNextFormFieldexposes the same navigation programmatically
Version 3.225.0
Added
- Added preset-ladder zooming to the
TPDFlibViewercontrol:ZoomInStepandZoomOutStepsnap the zoom to the standard preset sequence (1, 5, 10, 25, 50, 75, 100, 150, 200, 400, 800, 1600, 2400, 3200 percent), starting from the zoom currently in effect so fit modes step naturally; the toolbar zoom actions now use the same ladder - Ctrl+mouse wheel now zooms along the preset ladder while a plain wheel keeps scrolling
- Added keyboard shortcuts: Ctrl+'+'/'-' step the zoom, Ctrl+1/2/3 switch to actual size, fit width and fit page, and Shift+Up/Down jump to the first and last page
Version 3.224.0
Added
- Added
CreateSelfSignedCertificatewith Delphi, DLL and ActiveX entry points: generates a self-signed RSA certificate (SHA-256 signature, configurable subject, validity and key length) and exports it with its private key to a password-protected PFX file, ready forSignFileand the sign-process APIs - so signing workflows can be built and tested without an external certificate authority - The certificate is created in a throwaway key container that is deleted after the export; only the PFX keeps the key material. Self-signed certificates are meant for testing and internal documents - viewers flag them as untrusted unless installed explicitly
Version 3.223.0
Added
- Added
TPDFlibShapeWatermarkto the composable watermark layer: rectangles, circles, ellipses, polygons, Bezier curve chains and straight lines stamp onto a page range with fill and stroke colours, line width and opacity, through the sameApplyWatermarkentry point as text and image watermarks - Rectangle, circle and ellipse shapes size themselves from Width/Height; polygon, curve and line shapes take their geometry from
SetPoints(local X,Y pairs), so the nine-point Position grid and custom placement apply to every shape kind; degenerate geometry (too few points) is rejected
Version 3.222.0
Added
- Added
AddLinkToEmbeddedPDFwith Delphi, DLL and ActiveX entry points: a page hotspot that opens a PDF embedded in the current document (by its EmbeddedFiles name) and jumps to a chosen page there, using the standard embedded go-to (/GoToE) action of ISO 32000-1 §12.6.4.4 with an optional new-window request; the document version rises to PDF 1.6 automatically GetAnnotActionInfoand its outline/form-field siblings now recognise embedded go-to actions, reporting the newakGoToEkind together with the embedded target name, the parent/child target relationship, the optional file specification and the /NewWindow flag
Version 3.221.0
Added
- Added
SetSignProcessAppearanceTextwith Delphi, DLL and ActiveX entry points: digital signatures can now show an automatically generated visible text appearance composed of the signer name, reason, location and signing date, with optional descriptive labels ("Signed by:", "Reason:", ...) selected through a bit mask - The text block lays out inside the signature field rectangle in Helvetica with a configurable colour; font size 0 auto-fits the lines to the field. A field image set through
SetSignProcessFieldImageFromFilekeeps precedence, and document time-stamp processes ignore the text appearance
Version 3.220.0
Added
- Added interactive form filling to the
TPDFlibViewercontrol: clicking a checkbox or radio button toggles it, and clicking a text or choice field opens an in-place editor over the field (Enter commits, Escape cancels, leaving the editor commits); read-only fields are left alone and the changed page re-renders automatically - Every write fires the new
OnFormFieldValueChangedevent, andHighlightFormFieldswithFormHighlightColorpaints a translucent backdrop over each fillable area so users can spot form fields - Added the programmatic counterparts
FormFieldAtPagePoint,GetFormFieldPageRect,ToggleCheckBoxField,SetFormFieldValueAndRefresh,BeginEditFormFieldandCommitInplaceEditor, driving the same machinery without mouse input
Version 3.219.0
Added
- Added annotation interaction to the
TPDFlibViewercontrol: clicking a non-link annotation fires the newOnAnnotClickevent with the page, annotation index and subtype, andAnnotAtPagePointexposes the hit test programmatically (Popup companions are skipped) - Hovering an annotation now shows its Contents text as the control's hint (the
AnnotHintsswitch, on by default, works with the standardShowHintproperty) - Added
SaveAnnotAttachmentToFileto write a FileAttachment annotation's embedded file to disk, completing click-to-save attachment workflows in the viewer
Version 3.218.0
Added
- Added a cross-session disk page cache to the
TPDFlibViewercontrol: settingDiskCacheFolderpersists rendered pages on disk so a recently viewed document reopens instantly without re-rendering - Cached pages are keyed by a fingerprint of the document's path, size and last write time, so editing the file automatically invalidates its stale pages; the cache keeps up to ten documents and prunes the least recently used ones
- Added the
DiskCacheHitscounter reporting how many page renderings the disk cache saved
Version 3.217.0
Added
- Added the
PDFlibViewerActionsunit with twenty ready-madeTActiondescendants forTPDFlibViewer, so toolbars and menus work without glue code: page navigation (First/Prior/Next/Last), zoom (In/Out/FitWidth/FitPage/ActualSize), view rotation (clockwise/anticlockwise), printing, file open and save-as dialogs, copy selected text, and the five mouse-tool mode switches - Each action targets a viewer through its
Viewerproperty and keeps its enabled state (document open, page position, selection present) and checked state (active zoom fit or mouse tool) up to date automatically; all actions register in the losLab PDF category for the Action List editor - Added
TPDFlibViewer.EffectiveZoomPercentreporting the zoom actually in effect (including computed fit-width/fit-page factors) so zoom steps can build on it
Version 3.216.0
Added
- Added search-hit highlighting to the
TPDFlibViewercontrol:HighlightSearchHitssearches the whole document and paints a translucent bar over every match that stays in place while scrolling, zooming and rotating, withClearSearchHighlights,SearchHighlightCountand a configurableSearchHighlightColor TPDFlibSearchPanel.RunSearchnow also paints the hit bars in the attached viewer (the newHighlightInViewproperty, on by default, turns this off), so search results are visible on the pages, not just in the hit list
Version 3.215.0
Added
- Added mouse tool modes to the
TPDFlibViewercontrol through the newViewerModeproperty:vmSelecttext selection (default),vmHandpan-by-dragging with a grab cursor (a plain click still follows links),vmZoommarquee zoom that magnifies the dragged band to fill the viewport,vmSnapshotregion capture to the clipboard, andvmHighlightpersistent translucent region highlighting - Added
CaptureRegionto render any client region (pages plus highlights) into a caller-owned bitmap, theOnSnapshotevent andSnapshotToClipboardswitch for snapshot handling, andAddHighlightRegion/ClearHighlightRegions/HighlightRegionCountwith a configurableHighlightColorfor page-anchored highlights that survive zoom, rotation and navigation
Version 3.214.0
Added
- Added printing to the
TPDFlibViewercontrol:PrintDocshows the standard Windows print dialog (printer choice, page range, copies, collation) and hands the job to the library's printing engine, whilePrintDoc(False)prints the whole document to the default printer without any UI - Added
PrintDocRangefor fully programmatic viewer printing with an explicit printer name, page range, copy count and collation flag
Version 3.213.0
Added
- Added view rotation to the
TPDFlibViewercontrol:RotateClockwise90andRotateAntiClockwise90turn the displayed pages in 90-degree steps, and theViewRotationproperty reads or sets the angle directly (0, 90, 180 or 270) - Rotation is a pure view attribute: the document is never modified, link clicking and text selection keep working at every angle, fit-width and fit-page zoom modes adapt to the rotated page shape, and opening a new document resets the view to 0 degrees
- Rotated page bitmaps are cached per angle, so switching between angles reuses previous renderings instead of re-rendering
Version 3.212.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept simple FormCalc-style predicate selectors such as$data.Receipt.Detail.[Total_Price > 200].Descriptionand update every matching data node when a predicate selects a subset
Version 3.211.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept Data DOM class selectors#dataGroupand#dataValuewith numeric or wildcard occurrences, allowing class-based paths such as$data.Receipt.#dataGroup[0].#dataValue[0]
Version 3.210.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept the$recordroot in non-record-processing packets, so paths such as$record.Taxand$record/Detail[0]/Total_Priceresolve from the outer data record element
Version 3.209.0
Changed
- Improved XFDF annotation interchange: annotation exports now write standard border style attributes
width,style, anddashesfrom PDF annotation/BSvalues, and annotation imports restore those attributes on inserted annotations
Version 3.208.0
Changed
- Improved XFDF annotation interchange: annotation exports now write standard
creationdateandopacityattributes from PDF annotation/CreationDateand/CAvalues, and annotation imports restore those attributes on inserted annotations
Version 3.207.0
Changed
- Improved XFDF annotation interchange: annotation exports now write standard
flagsnames from PDF annotation/Fvalues, and annotation imports restore those names to the inserted annotation flags
Version 3.206.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept direct child wildcard selectors such as$data.Receipt.*.Total_Priceto read or update matching child branches without selecting same-name fields on the parent node
Version 3.205.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept descendant selectors such as$data..Total_Priceand$data.Receipt..Total_Priceto read or update the first matching descendant data node
Version 3.204.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept theparentproperty in paths such as$data.Receipt.Detail[1].parent.Taxto read or update a selected node's parent sibling data
Version 3.203.0
Changed
- Improved XFA datasets SOM occurrence handling:
GetXFAFormFieldValueandSetXFAFormFieldValuenow support[*]selectors such as$data.Receipt.Detail[*].Total_Priceto read or update every matching repeated data node
Version 3.202.0
Changed
- Improved XFA SOM path compatibility: XFA datasets and template field APIs now preserve literal periods in slash-delimited field paths and accept escaped periods such as
Line\.Itemin dot-delimited SOM paths
Version 3.201.0
Changed
- Improved XFA datasets path compatibility: XFA field value APIs now accept slash-delimited paths after standard data SOM roots such as
$data/...,xfa.datasets.data/..., andxfa.datasets/...
Version 3.200.0
Changed
- Improved XFA datasets SOM compatibility: XFA field value APIs now accept the standard
!data...short form, including slash-delimited!data/...paths
Version 3.199.0
Changed
- Improved XFA template path compatibility: template editing APIs now accept slash-delimited field paths returned by XFA field-name enumeration, including
$template/...paths
Version 3.198.0
Changed
- Improved XFA datasets namespace compatibility: field value APIs now read and update data nodes by local XML name when the business data inside the datasets packet uses its own namespace prefix, and field-name enumeration returns prefix-free paths
Version 3.197.0
Changed
- Improved XFDF annotation interchange: annotation exports now include the common
nameanddateattributes from PDF/NMand/M, annotation imports restore those values on inserted annotations, andSetAnnotStrPropertynow accepts tag 104 for annotation modified dates
Version 3.196.0
Changed
- Improved XFA field-name enumeration: field list APIs now scan every top-level data record in the datasets packet and return leaf data fields without adding container groups as fields
Version 3.195.0
Changed
- Improved XFA datasets compatibility: XFA field value APIs now read and update complete XDP packets whose datasets packet uses an unprefixed
dataelement
Version 3.194.0
Fixed
- Improved XFA template field updates: XFA template field APIs now accept standard template SOM roots such as
$templateandxfa.template, and template-only changes in complete XDP streams are saved correctly
Version 3.193.0
Changed
- Improved XFA field addressing: XFA field value APIs now accept standard data SOM roots such as
$dataandxfa.datasets.datain addition to relative field paths
Version 3.192.0
Changed
- Improved XFA XML packet handling: XFA streams with UTF-16 byte order marks or UTF-16 XML byte patterns now decode before XML parsing, so UTF-16 encoded form values remain available through XFA field read/write APIs
Version 3.191.0
Changed
- Improved XFA packet authoring:
SetXFAFromStringnow creates the requiredAcroFormcontainer when a document does not already have form data, replaces stale parsed XFA state when a complete XFA packet is stored, and keeps the saved packet available through XFA field read/write APIs
Version 3.190.0
Changed
- Improved XFDF annotation interchange: annotation exports now write the common
colorattribute from the PDF/CRGB array, and annotation imports now restorecolor="#RRGGBB"values into the inserted annotation color array
Version 3.189.0
Added
- Added XFDF annotation interchange APIs:
ExportAnnotationsToXFDF,ExportAnnotationsToXFDFString,ImportAnnotationsFromXFDFandImportAnnotationsFromXFDFStringnow read and write ISO 19444<annots>data for text-style annotation comments, including page, rectangle, title, subject and plain contents data
Version 3.188.0
Changed
- Improved XFDF rich text field import: fields with
<value-richtext>now preserve the rich text XML in the fieldRVvalue while still applying the plain<value>fallback when present
Version 3.187.0
Changed
- Improved XFDF form-data interchange for multi-select choice fields: repeated
<value>elements now import into the selected-value array, and exporting a multi-select choice field now writes one<value>element per selected item instead of flattening them into one escaped text node
Version 3.186.0
Changed
- Improved XFDF form-data export for rich text fields: fields with an
RVrich text value now include a<value-richtext>element while preserving the plain<value>fallback
Version 3.185.0
Changed
- Improved XFDF form-data import for rich text fields: when a field provides
<value-richtext>without a plain<value>, the importer now extracts the XHTML text content and applies it to the matching AcroForm field instead of skipping the field
Version 3.184.0
Changed
- Improved XFDF form-data interchange: exports now use the standard XFDF namespace with
xml:space="preserve", emit nested<field>elements for hierarchical AcroForm names, skip non-terminal parent field values, write file exports as UTF-8, and import whitespace-flexible XFDF with nested fields, single-quoted attributes, CDATA, XML entities, and numeric character references
Version 3.183.0
Added
- Added
SanitizeDocument(Flags)which strips sensitive content in one call: removes all global JavaScript, removes the catalog OpenAction, strips /A actions from every annotation, blanks Author/Subject/Keywords/Creator/Producer metadata (both /Info and XMP), and optionally deletes all annotations. Flag bitsSANITIZE_JAVASCRIPT/SANITIZE_ACTIONS/SANITIZE_METADATA/SANITIZE_ANNOTATIONS/SANITIZE_OPEN_ACTIONcombine;SANITIZE_ALLapplies every strip. Closes the classic data-leak hole where redaction removes visible content but leaves metadata or hidden scripts recoverable - Added
TPDFAnnots.RemoveAnnotAction(Index)to strip the /A action dictionary from an individual annotation (used by SanitizeDocument, also useful standalone)
Version 3.182.0
Added
- Image elements returned by
EnumPageElementsnow carry their real placement rectangle (Left/Top/Right/Bottom) instead of zeros. Backed by a newTPDFContentProgram.EnumImagePlacementsmethod that walks the content stream tracking the CTM (cm/q/Q) and maps eachDooperator's 1x1 unit square into page coordinates - Added four showcase demos: DocumentProperties (DocInfo/page-box/rotation/transition/viewer-preferences/XMP round-trip), FormProperties (per-field property grid: type/value/readonly/MaxLength/MultiLine/description), SignatureValidator (enumerate signature fields + verify + signer certificate), Reader (VCL TPDFlibViewer with open/navigate/zoom/copy-text)
Version 3.181.0
Added
- Added
SetXMPPropertyexposing the existing schema-aware XMP engine (PDFlibXMP) through the public facade: set any Dublin Core (dc:), XMP Basic (xmp:), Adobe PDF (pdf:), PDF/A ID (pdfaid:), PDF/UA ID (pdfuaid:), or XMP Media Management (xmpMM:) property by namespace + key without hand-writing RDF XML - Added
ImportFormDataFromFDF/ImportFormDataFromFDFStringwhich parse an FDF /Fields array (each<< /T (name) /V (value) >>) and apply each value to the matching AcroForm field by title, inverting the EscapePDFText octal/paren escaping. Closes the asymmetric export-only gap - Added
ExportFormDataToXFDF/ExportFormDataToXFDFString/ImportFormDataFromXFDF/ImportFormDataFromXFDFStringfor XFDF (XML Forms Data Format) bidirectional interchange - the modern XML counterpart of FDF - Made the six namespace-scoped XMP setters (
SetDublinCore,SetXMPBasic,SetAdobePDF,SetPDFA,SetPDFUA,SetXMPMM) public onTPDFlibXMPso advanced callers can drive the engine directly
Version 3.180.0
Added
- Added
SearchAndReplaceTextInContentwhich performs TRUE content-stream text replacement (rewriting the Tj/TJ/'/" show-text operators in place viaTPDFContentProgram.ReplaceTextRun), unlike the existing mask-basedSearchAndReplaceTextthat only overlays a rectangle on top of the original glyphs. The original text is gone from the stream and cannot be recovered. Locates hits viaSearchText, maps each hit rect to its covering instruction viaFindInstructionsInRect, rewrites, and writes the layer back
Version 3.179.0
Added
- Added a structured internal logger (
TPDFlibLogger) in a newLib/PDFlibLogger.pasunit with four levels (Debug/Info/Warn/Error), a host callback (OnLog), an optional thread-safe file sink, and an error-code-to-message map (PDFlibErrorMessage) that finally gives the existing numeric codes (1xx/3xx/4xx/5xx) human text. Exposed onTPDFlibvia theLoggerproperty - Added
RenderPagesToFilesParallelwhich renders a page range to one file per page using aTTaskpool with oneTPDFlibinstance per worker (TPDFlib is not thread-safe) and per-threadCoInitializefor GDI+ apartment safety. Scales near-linearly with CPU cores for CPU-bound raster output
Version 3.178.0
Added
- Added
EnumCertificatesto enumerate every certificate in a Windows system store ("MY", "Root", ...) returning subject, issuer, serial number, validity window, HasPrivateKey, and Qualified (eIDAS QCStatements extension, OID 0.4.0.1862.1.7, detected via a new built-in DER decoder in PDFlibASN1) - replaces the previous single-cert-by-CNSetSignProcessCertFromStorelimitation - Added
SetSignProcessCertFromStoreByHandleto select a signing certificate by raw PCCERT_CONTEXT handle obtained from enumeration, letting callers pick by any criterion (qualified filter, validity, fingerprint) rather than only by Subject CN - Added
RedactRegionwhich truly removes text, vector paths, and image XObjects whose painted area intersects a rectangle (editing the content stream so removed content cannot be recovered, unlikeMaskRectwhich only covers it), with optional black fill and /Redact annotation. Backed by a CTM-tracking content-stream analyser in PDFlibContentModel (FindInstructionsInRect) - Added minimal DER decoder functions (
DERDecodeLength,DERFindExtensionByOID) to PDFlibASN1 for in-process certificate extension inspection without CryptDecodeObjectEx
Version 3.177.0
Added
- Added page stitching APIs that compose existing pages into new layouts via vector Form XObject capture (preserving full vector fidelity, unlike content-stream concatenation):
StitchPageOverlayoverlays one page onto another at a position with optional opacity,StitchPagesSideBySideplaces two pages left/right on a new wider page, andStitchPagesVerticallystacks a page range into a new tall poster-style page - Added a composable watermark template layer in a new
Lib/PDFlibWatermark.pasunit:TPDFlibWatermarkBasewith nine-point positioning (wpTopLeft..wpBottomRightpluswpCustom),TPDFlibTextWatermark,TPDFlibImageWatermark, andTPDFlibCompositeWatermarkwhich applies a list of sub-watermarks recursively across a shared page range - Added
TPDFlib.ApplyWatermarkas a convenience entry point that delegates to a watermark template's own page range and settings
Version 3.176.0
Added
- Added named render-output format constants (
PDF_RENDER_BMP,PDF_RENDER_EMF,PDF_RENDER_EMFPLUS,PDF_RENDER_EMF_DUAL, etc.) that map 1:1 to the integerOptionsvalues accepted byRenderPageToFile,RenderPageToStream,RenderPagesToFiles, andRenderDocumentToFile - Added
TPDFlibMetafileFormatenum and the convenience methodsRenderPageToMetafileStreamandRenderPageToMetafileFile, which accept a named metafile variant (mfEMF, mfEMFPlus, mfEMFDual, mfWMF) instead of a bare integer - Added EMF+ Dual output mode (Options value 11 / mfEMFDual), which records both GDI and GDI+ commands in the same metafile for compatibility with older GDI-only consumers
- Added
TPDFlibClipboardFormatenum andRenderPageToClipboard, which places a rendered page on the Windows clipboard as an enhanced metafile (CF_ENHMETAFILE), a DIB bitmap (CF_DIB), the page Unicode text (CF_UNICODETEXT), or all three at once - Added a new
Lib/PDFlibClipboard.pasunit with low-level Win32 clipboard placement helpers used byRenderPageToClipboard - Added full per-monitor DPI awareness to
TPDFlibViewer: a new publicScreenDPIproperty, aCreateWndoverride that auto-detects the host monitor DPI viaGetDpiForWindow(with aGetDeviceCapsfallback), and aWM_DPICHANGEDhandler that rebuilds the layout and clears the bitmap cache when the window moves between monitors - Added
TPDFRenderer.SetEMFPlusMetafileTypeto select between EMF+ Only and EMF+ Dual recording at the renderer level
Fixed
- Fixed the
RenderPageToFilereference page where the Options value list was misplaced in the Page row and the Options cell was empty
Version 3.175.3
Added
- Added a Lib/PDFlibTableExport.pas unit that renders any TDataSet (FireDAC, ClientDataSet, query result) into a paginated PDF table with styled header, zebra striping, right-aligned numeric columns, and automatic page continuation, plus a Demo/Delphi/DataSetExport console demo that loads the RAD Studio customer.FDS sample via FireDAC and exports it
Version 3.175.2
Added
- Added end-to-end Demo/ReportBridges projects that build a minimal report in FastReport, QuickReport, and ReportBuilder and export it to PDF through the matching Addons bridge, with a dedicated build-ReportBridges.cmd that supplies the engine source paths and gating symbols so the standard demo build still compiles the projects as stubs
Version 3.175.1
Added
- Added a Delphi JBIG2 options matrix demo that sweeps SymbolExtract, SkipBlackDots, BlackDotSize, and LossyLevel combinations against CCITT G4 and Flate baselines, with per-row PDF, CSV, and summary outputs
- Added a Delphi Pattern showcase demo covering axial and radial RGB shaders, a Coons-patch mesh shader, and a custom tiling pattern applied as fill, stroke, and text colour
- Added a Delphi CCITT fax matrix demo comparing Group 3 1-D, Group 3 2-D, and Group 4 compression with BlackIs1 and Interpolate option bits, reporting each output size and the resulting /Filter name
- Added FastReport, QuickReport, and ReportBuilder export bridges under Addons that render a prepared report into a PDFlibPas PDF via the engine's native object, metafile, and DrawCommand surfaces respectively
Version 3.175.0
Changed
- Expanded the WorkflowGallery demo with an annotation variant matrix that records text highlight fills, markup styles, note icons, free text, caret, and stamp annotations in companion CSV and HTML reports
Version 3.174.0
Changed
- Expanded the C++Builder AdvancedWorkflowMatrix demo to map action navigation, PDF/A and AcroForm workflows, font diagnostics, streaming delivery, and the latest scan-compression helpers into the generated matrix reports
Version 3.173.0
Added
- Added the DeliveryWorkflowMatrix Delphi demo for streamed Web and CGI PDF output, page-thumbnail validation, and watermark delivery workflows using one generated PDF byte buffer
Version 3.172.0
Added
- Added outline tree convenience APIs for ordered sibling insertion, child creation, subtree deletion, and preorder outline enumeration with parent, sibling, level, destination page, open-state, and title details
Version 3.171.0
Added
- Added the FontDiagnosticsMatrix Delphi console demo for CJK and Unicode font paths, TrueType subset updates, installed-font probes, document font enumeration, and font diagnostics reports
Version 3.170.0
Added
- Added the CanvasMigrationMatrix Delphi console demo for Canvas DC migration, raw content and path entry points, Delphi color helpers, pattern-filled text, watermarking, page thumbnail workflows, and rendered validation previews
Version 3.169.0
Added
- Added dedicated LayerCompositionMatrix, TransparencyMaskMatrix, and ComplianceFormWorkflowMatrix Delphi console demos for optional-content print/export policy, Pattern/Form XObject composition, transparency mask comparison, PDF/A-1b success and failure examples, AcroForm action workflows, appearance rebuilds, and visible signature templates
Version 3.168.0
Added
- Added dedicated ImageCompressionMatrix and SecurityPermissionMatrix Delphi console demos with generated PDF, CSV, and HTML reports for image compression strategy selection, scan compression, JPEG render quality, and encrypted permission profile auditing
Version 3.167.0
Added
- Added named helper APIs for JBIG2 bitmap encoding, EMF import options, AcroForm event actions, and chained actions so callers can use explicit option switches instead of composing integer bitmasks manually
Version 3.166.0
Added
- Added a runnable C++Builder AdvancedWorkflowMatrix console demo with PDF, CSV, and HTML outputs that map advanced canvas migration, EMF import, image compression, AcroForm, signature, security, PDF/A, optional-content, pattern, and Form XObject workflows to C++Builder project entry points
Version 3.165.0
Added
- Added a Delphi action navigation matrix demo that demonstrates open-document actions, document-level JavaScript, embedded-file links, remote GoTo links, AcroForm event actions, Submit/Reset/Hide link helpers, and chained Next actions with PDF, CSV, and HTML outputs
Fixed
- Fixed remote file link helpers so AddLinkToFile, AddLinkToFileEx, AddLinkToFileDest, and local file launch links create one annotation and return instead of looping indefinitely
Version 3.164.0
Added
- PDF/A 모드 설정, 투명도, 블렌드 모드, 암호화, JavaScript, 멀티미디어, 임베디드 파일, 그리고 PDF/A-3 연결 파일 워크플로에 대해 조기 거부 또는 허용 경로 결정을 검사하는 Delphi PDF/A 가드 매트릭스 데모를 추가했으며, 생성된 PDF, CSV, HTML 보고서를 제공
Version 3.163.0
Added
- FastReport, QuickReport, ReportBuilder, DBGrid, 그리고 사용자 지정 캔버스 내보내기 경로를 위한 명시적 ReportAdapter 브리지 매트릭스를 추가했으며, 재사용 가능한 어댑터 전략을 보여 주는 PDF 페이지와 함께 생성된 CSV 및 HTML 매핑 출력도 포함
Version 3.162.0
Added
- canvas 마이그레이션, EMF 가져오기 옵션, 이미지 압축 비교, AcroForm 작업 워크플로, 표시되는 빈 서명, 보안 권한, PDF/A-1b 검사, 선택적 콘텐츠, 타일링 패턴, Form XObject, DBGrid 스타일 테이블 내보내기, 대용량 파일 피크 메모리 보고를 위한 구체적 출력을 생성하는 고급 워크플로 데모 매트릭스를 추가
Version 3.161.0
Added
- compact open-document action 구성, 폼 필드 표시 이벤트 작업, TColor 및 회색 색상 설정, direct raw content, path, text, matrix content stream 삽입을 위한 Delphi 헬퍼를 추가
Version 3.160.0
Added
- 비트맵-to-JBIG2 스캔 이미지 압축, 한 번에 수행하는 이미지 마스크 및 color-key 투명도 설정, GoTo 작업 연결, JavaScript 또는 기존 작업 할당을 위한 읽기 쉬운 AcroForm 이벤트 이름을 위한 Delphi 헬퍼를 추가하고,
ImportEMFFromFileEx및ImportEMFFromStreamEx의Options플래그로 비트맵 가져오기 강제, EMF 컬러 이미지 JPEG 재압축 활성화, GDI+ 처리 제어 요청을 가능하도록 확장 ImportEMFFromFileEx와ImportEMFFromStreamEx를 확장하여Options플래그로 비트맵 가져오기를 강제하고, EMF 컬러 이미지 JPEG 재압축을 활성화하며, GDI+ 처리 제어를 요청할 수 있게 했다
Version 3.159.1
Changed
SaveToStream과 bound output stream 저장을 개선하여 큰 PDF stream object를 각 stream object마다 하나의 중간 출력 문자열로 복사하는 대신 제한된 청크로 기록하도록 했다
Version 3.159.0
Added
- 지정한 이미지를 그리거나 맞춘 뒤 즉시 핸들을 해제하는 image placement 헬퍼를 추가하고, 1회용 이미지 생성 워크플로에서 피크 메모리를 낮추기 위한 Delphi, DLL, ActiveX 엔트리 포인트를 제공
- 임계값 변환과 isolated black-pixel cleanup을 거친 뒤 스캔 이미지 압축 워크플로로 넘기는 1-bit BMP 렌더링용
RenderPageToMonochromeFileEx를 추가
Version 3.158.1
Added
- 재사용 가능한 report-style export, RichEdit-to-EMF rich text import, page-thumbnail, annotation, form XObject, table, compression, JavaScript, bound-stream 출력 시나리오를 결합한 Delphi 워크플로 데모를 추가
Version 3.158.0
Added
- Delphi, DLL, ActiveX 엔트리 포인트를 가진 metadata encryption control APIs를 추가하고,
SetEncryptMetadata로 unencrypted XMP metadata streams를 가진 Standard-security PDF를 쓸 수 있으며,GetEncryptMetadata는 대기 중이거나 로드된/EncryptMetadata상태를 보고하게 했다
Version 3.157.0
Added
- Delphi, DLL, ActiveX 엔트리 포인트를 가진 direct tiling-pattern drawing APIs를 추가하고,
BeginTilingPattern이 임시 pattern cell drawing surface를 만들고,EndTilingPattern이 이를 재사용 가능한 pattern으로 등록하며,CancelTilingPattern이 이름 있는 pattern을 남기지 않고 빌드를 폐기하도록 했다
Version 3.156.0
Added
- Delphi의 bound-output stream 헬퍼로
BeginOutputToStream,EndOutputStream,CancelOutputStream,OutputStreamActive를 추가해 streaming, web, report-export 코드가 targetTStream을 바인딩하고 기존 chunked writer로 마치거나 스트림 소유권을 넘기지 않고 대기 중인 target을 취소할 수 있게 했다
Version 3.155.0
Added
Abort,Aborted,ResetAbort를 Delphi, DLL, ActiveX 호출자용으로 추가해 애플리케이션이 인스턴스를 cancelled로 표시하고 플래그가 지워질 때까지 save 또는 append output 작업이 시작되지 않도록 했다
Version 3.154.0
Added
- 이미지 가져오기 옵션과 in-memory source용 page-thumbnail 헬퍼, 그룹 이름으로 optional-content group을 찾고 상태를 설정하는 기능, 문서 열기 시 named destination으로 이동하는
SetOpenActionNamedDestination를 추가
Fixed
GetDestName은 이름이 지정된 문서 열기 작업에서 반환된 배열을 포함해 명시적 대상 배열 핸들을 해석합니다
Version 3.153.0
Added
- 연결된 form action, Hide 및 ImportData field trigger, 초기 optional-content group 상태, optional EMF 가져오기, color-key transparent image 가져오기를 위한 편의 APIs를 추가
Version 3.152.0
Added
- 텍스트 그리기를 위한 자동 URL link 생성, CCITT Group 3/4 image import 헬퍼, JBIG2 direct-image 헬퍼, EMF extended import 래퍼, image mask attachment 헬퍼, visible signature field 생성, JavaScript, SubmitForm, ResetForm 워크플로용 form-field event/action 헬퍼를 추가
Version 3.151.0
Added
DrawPie,DrawChord,DrawEllipticPie,DrawEllipticChord를 추가해 명시적인 closed circular 및 elliptic arc drawing을 outline, fill, fill-and-outline 모드로 수행할 수 있게 했다
Version 3.150.0
Added
NewGraphicsState와SetGraphicsState를 추가해 호출자가 fill transparency, stroke transparency, line width, line cap, line join, miter-limit 설정을 묶은 재사용 가능한 ExtGState resource를 만들 수 있게 했다
Version 3.149.1
Fixed
- Form XObject와 miter-limit 메서드의 중복된 ActiveX dispatch ID를 수정해 late-bound COM 호출자가 각 메서드를 모호함 없이 해석할 수 있게 했다
Version 3.149.0
Added
- miter join을 사용하는 path의 stroke miter-limit ratio를 제어하는
SetMiterLimit를 추가 BeginFormXObject,EndFormXObject, 및CancelFormXObject를 DLL 및 ActiveX API를 통해 공개했습니다
Version 3.148.0
Added
- 재사용 가능한 Form XObject builder APIs를 추가해
BeginFormXObject,EndFormXObject,CancelFormXObject로 일반 page drawing calls를 사용해 재사용 가능한 template를 그리고 captured-page drawing APIs로 반복 배치할 수 있게 했다
Version 3.147.0
Added
SetTextTilingPattern와SetLineTilingPattern을 추가해 captured-page tiling patterns를 text, underline, stroked graphics에 대해 drawing commands를 복제하지 않고 재사용할 수 있게 했다
Fixed
- 획질 셰이더와 타일링 패턴 색상은 이제 비스트로킹 색 상태를 갱신하는 대신 스트로킹 패턴 색 연산자를 기록합니다
Version 3.146.0
Added
BeginOptionalContent와EndOptionalContent를 추가해 기존 content stream을 다시 쓰지 않고 이후 drawing commands만 optional content group으로 표시할 수 있게 했다
Fixed
- optional content, tagged PDF, artifact scope가 content stream 끝에서 닫힐 때 scope-closing marked-content operators를 즉시 flush하도록 했다
Version 3.145.0
Added
SetTransparencyEx를 추가해 기존 PDF 1.4 auto-upgrade 동작을 유지하면서 이후에 그리는 text와 graphics에 대해 fill 및 stroke transparency 값을 각각 설정할 수 있게 했다
Version 3.144.0
Added
AddLinkToNamedDestination를 추가해 페이지 hotspot이 링크 생성 시 target page를 해결하지 않고도 같은 문서의 named destination으로 이동할 수 있게 했다
Fixed
- annotation이 없는 페이지에서는 annotation action readers가 비어 있는 annotation cache를 역참조하지 않고 action 없음으로 반환하도록 했다
Version 3.143.0
Added
- form-field action management APIs를 추가해 호출자가 기존 action을 field trigger에 연결하고, typed trigger action을 검사하고, primary 또는 additional field actions를 제거할 수 있게 했다
Fixed
FormFieldJavaScriptAction가 PDF/A 문서와 잘못된 trigger 이름을 거부하고 비준수 field action dictionaries를 쓰지 않도록 했다
Version 3.142.0
Added
- action chaining APIs를 추가해 호출자가 URI, named, JavaScript next-actions를 기존 annotation, outline, form-field action에 추가하고
GetActionNextCount와GetActionNextInfo로 연결된 action을 검사할 수 있게 했다
Version 3.141.0
Added
- Added
AddLinkToSubmitFormandAddLinkToResetFormso page hotspots can submit or reset AcroForm fields through standard PDF actions without JavaScript
Version 3.140.0
Added
- Added
AppendToStreamso incremental update workflows can write directly to a caller-provided stream instead of first materialising the update as anAnsiString
Changed
SaveToStreamnow serializes directly into the target stream, andAppendToString(1)now returns only the incremental update section without copying the original source bytes into a temporary buffer
Version 3.139.0
Added
- Added
GetAnnotReplyToandGetAnnotReplyTypeso threaded annotation replies can be inspected through named read-side accessors instead of generic annotation property tags
Version 3.138.0
Added
- Added the Delphi
DocumentInspectionWorkbenchsample to batch-inspect PDFs with combined font diagnostics, image sampling, color-space discovery, load timing, and JSON, CSV, and HTML reports
Version 3.137.0
Added
- Added the Delphi
ImageDecodeBenchmarksample to measure page image discovery, decoded image bytes, and page color-space discovery with CSV and HTML timing reports
Version 3.136.0
Added
- Added
GetDocumentFontDiagnosticsandTPDFlibFontDiagnosticsto summarize document font embedding, subsetting, Standard 14, CID, Type3, and unknown-font counts in one call
Version 3.135.0
추가
TPDFlibSignatureVerifier.VerifySignerCertificateChain은 이제 Windows CryptoAPI를 사용하여 내장된 서명자 인증서 체인을 구축하고, 체인이 Windows 기본 신뢰 정책을 만족할 때만vsValid를 반환하며, 자체 서명되거나 신뢰할 수 없는 서명자 인증서는VerifySignature의 콘텐츠 무결성 결과에 영향을 주지 않고vsInvalid를 반환합니다.
Version 3.134.0
수정
TPDFlibSignatureVerifier.VerifySignature는 이제 레거시adbe.pkcs7.sha1서명을 검증하며, 서명된 다이제스트가 적용된/ByteRange바이트와 일치하면vsValid를 반환하고, 덮인 콘텐츠가 변경된 후에는vsInvalid를 반환합니다.
Version 3.133.0
추가
- 선택한 페이지 간에 렌더러 설정을 재사용하면서 임의의 페이지 범위를 번호가 매겨진 출력 파일로 렌더링하는
RenderPagesToFiles및DARenderPagesToFiles가 추가되었습니다.
Version 3.132.0
추가
- 왼쪽/가운데/오른쪽 정렬과 토큰 확장(
&P현재 페이지,&N전체 페이지,&D날짜,&T문서 제목,&&리터럴 앰퍼샌드)을 사용하여 지정된 범위의 모든 페이지의 고정된 위쪽 또는 아래쪽 여백에 텍스트를 배치하는AddPageHeader및AddPageFooter편의 스탬퍼가 추가되었습니다. soUnderlay를 사용하는StampText및StampImage는 이제 새로운 콘텐츠 레이어를 앞에 추가하여 기존 페이지 콘텐츠 아래에 콘텐츠를 확실하게 배치합니다(이전에는soOverlay처럼 위에 그렸습니다). 이는 새로운PrependContentLayer페이지 트리 메서드에 의해 지원됩니다.
Version 3.131.0
추가
- 모든 콘텐츠 레이어를
q sx 0 0 sy tx ty cm ... Q그래픽 상태 블록으로 감싸고 MediaBox 및 CropBox의 크기를 조정하여 선택한 페이지의 콘텐츠 비율을 조정하는ScalePage(ScaleX, ScaleY, Anchor)가 추가되었습니다. 앵커는 왼쪽 아래 원점을 유지하거나(0), 콘텐츠를 가운데로 맞추거나(1), 왼쪽 위를 유지합니다(2). - 새로운
ekPath요소 종류로EnumPageElements를 확장했습니다: 각 페이지는 구조화된 콘텐츠 모델을 통해 콘텐츠 스트림에서 추출된 경계 상자, 점 개수, 닫힘 플래그 및 페인트 연산자와 함께 벡터 경로를 보고합니다.
Version 3.130.0
추가
- 다시 저장할 때 로드된 문서를 축소하는 3개의 파일 크기 최적화 API가 추가되었습니다:
SubsetEmbeddedFonts는 FontSub.dllCreateFontPackage서비스를 통해 문서가 실제로 렌더링하는 유니코드 문자로 모든 내장된 TrueType 글꼴 프로그램(FontFile2)을 다시 작성합니다.DownsampleImages(MaxDPI, Quality, Filter)는 대상 DPI 이상의 각 이미지 XObject를 디코딩하고, 리샘플링(box 또는 bilinear)한 다음 JPEG 또는 PNG로 다시 인코딩합니다.NormalizeLZWStreams는 기존 LZW 디코더 및 Flate 인코더를 통해 Predictor 매개변수를 유지하면서 LZWDecode로 필터링된 모든 스트림을 FlateDecode로 다시 작성합니다.
Version 3.129.0
추가
- 이전에는 읽기/구문 분석만 지원했던 4가지 음영 유형에 대한 메시 음영 생성 API가 추가되었습니다:
NewRGBFreeFormTriangleMesh(ShadingType 4, 자유 형태 Gouraud 삼각형),NewRGBLatticeTriangleMesh(ShadingType 5, 격자 형태 Gouraud),NewRGBCoonsPatchMesh(ShadingType 6, Coons 패치 메시) 및NewRGBTensorPatchMesh(ShadingType 7, 텐서 제품 패치 메시) — 각각은 선택 가능한 좌표/색상 비트 깊이와 경계 상자가 있는 평면 정점 또는 패치 목록에서 명명된 메시 음영 패턴을 구축하며, 기존의 축 및 방사형 셰이더처럼SetFillShader/SetLineShader/SetTextShader로 선택할 수 있습니다.
Version 3.128.0
추가
- 뷰어용 축소판(thumbnail) 스트립 추가:
TPDFlibThumbnailBar는 모든 페이지의 미니어처를 보여주며 행이 화면에 스크롤될 때 지연 렌더링(lazy rendering)되고 그 아래에 페이지 번호를 표시합니다. 축소판을 클릭하면 연결된 뷰어가 해당 페이지로 이동합니다 — 이로써 뷰어 컨트롤 제품군(뷰어, 책갈피 패널, 검색 패널, 축소판)이 완성되었습니다.
Version 3.127.0
추가
- 뷰어용 검색 패널 추가:
TPDFlibSearchPanel.RunSearch는 연결된 전체 문서를 검색하고 검색 결과당 페이지 번호와 일치하는 텍스트를 한 행씩 나열합니다. 검색 결과를 클릭하면 뷰어가 해당 페이지로 이동합니다.
Version 3.126.0
추가
- 뷰어용 책갈피 패널 추가:
TPDFlibOutlineViewer는 들여쓰기와 함께 문서 개요 트리를 나열하고 클릭 시 연결된 뷰어(AttachViewer를 통해)를 책갈피의 대상 페이지로 이동시킵니다. 나중에 측면 패널이 공유할 재사용 가능한 패널 기본 클래스 위에 구축됩니다.
Version 3.125.0
추가
- 뷰어 컨트롤에 텍스트 선택 추가: 마우스 왼쪽 버튼을 드래그하여 선택하고 Ctrl+C를 누르거나
CopySelectedText를 호출하여 선택 항목을 클립보드에 복사할 수 있습니다. 캡처된 텍스트는SelectedText속성을 통해 사용할 수 있으며 위에서 아래로 순서대로 정렬되고 대역(band) 사이에 줄 바꿈이 있습니다. - 사각형 페이지 영역의 텍스트를 직접 반환하는
GetTextInRegion추가 — 마우스 선택이 사용하는 것과 동일한 블록 기반 조회로 사용자 지정 선택 인터페이스에서 사용할 수 있습니다.
Version 3.124.0
추가
- 이제 뷰어 컨트롤은 백그라운드 스레드에서 인접한 페이지를 사전 렌더링하므로 앞뒤로 페이지를 넘길 때 다음 페이지가 즉시 표시됩니다. 작업자는 자체 문서 인스턴스를 사용하고 UI를 차단하지 않고 완성된 렌더링을 캐시에 전달합니다.
- 뷰어에 링크 상호 작용 추가: 링크 주석을 클릭하면 페이지 번호 및
GetAnnotActionInfo가 생성하는 동일한 형식의 동작 요약(웹 주소, 문서 대상, 명명된 동작 등)과 함께OnLinkClick이 발생합니다.LinkActionAtPagePoint는 사용자 지정 처리를 위해 기본 적중 테스트(hit test)를 노출합니다.
Version 3.123.0
추가
- 뷰어 컨트롤에 연속 스크롤 추가:
SetDisplayMode는TPDFlibViewer를 단일 페이지 표시와 전체 문서의 연속 수직 스크롤 간에 전환하며, 뷰포트에 보이는 페이지만 렌더링되고 현재 페이지는 스크롤 위치를 추적합니다(페이지가 보일 때OnPageChange발생). - 렌더링된 페이지는 이제 LRU(least-recently-used) 비트맵 캐시에 보관되므로 앞뒤로 스크롤해도 다시 렌더링되지 않습니다. 메모리 예산은 기본적으로 128MB이며
SetCacheLimit으로 조정되어 예산이 줄어들거나 꽉 차면 가장 오래된 페이지를 축출합니다. - 뷰어에 마우스 휠 스크롤 및 키보드 탐색 추가: PageUp/PageDown(단일 페이지 모드에서는 페이지 단계, 연속 모드에서는 뷰포트 단계), 화살표 키, Home 및 End
Version 3.122.0
추가
- 대화형 PDF 뷰어 컨트롤 추가:
TPDFlibViewer는 파일에서 문서를 열거나 기존TPDFlib인스턴스에 연결하고, 선택한 렌더링 엔진(GDI+, Cairo 또는 PDFium)을 통해 페이지를 표시하며, 페이지 탐색(GoToPage/NextPage/PrevPage및OnPageChange이벤트)과 줌 컨트롤 — 고정 비율, 너비에 맞춤 또는 페이지에 맞춤, 컨트롤 크기가 조정될 때 자동으로 다시 계산됨 — 을 제공하는 VCL 스크롤 컨트롤입니다. 뷰포트보다 넓은 페이지는 스크롤되고, 좁은 페이지는 가운데에 맞춰집니다. - IDE에서 끌어서 놓기 용도로 사용할 수 있도록 컨트롤을 losLab PDF 팔레트 페이지에 등록하는 디자인 타임 패키지(
Package\PDFlibViewerPkg.dpk) 추가
Version 3.121.0
추가
DrawText의 자동 복잡한 스크립트 셰이핑(shaping): 아랍어, 히브리어, 인도계 및 기타 복잡한 스크립트 문자가 포함된 텍스트는 이제 자동으로 감지되고 모양이 지정됩니다 — contextual 문자 형식, 필수 합자 및 오른쪽에서 왼쪽 방향 지정이 코드 변경 없이 올바르게 출력됩니다. 표준 14 이름은 매트릭 호환 설치 글꼴(Helvetica는 Arial로, Times는 Times New Roman으로, Courier는 Courier New로)에 매핑되며GetTextWidth는 동일한 셰이핑 패스를 통해 측정되므로 정렬이 일관되게 유지됩니다. 라틴어, 키릴어, 그리스어 및 CJK 텍스트는 기존 그리기 경로를 바이트 단위로 유지합니다.- 자동 라우팅을 전환하는
SetTextShaping추가(기본적으로 사용 설정됨. 정확한 이전 셰이핑 동작을 복원하려면 0을 전달)
Version 3.120.0
변경
- 이제 셰이핑된 텍스트 컴패니언 글꼴은 저장 시 문서에 표시되는 글리프(glyph)로만 부분 집합화(subsetted)되어 출력 파일을 극적으로 축소시킵니다(1메가바이트가 넘는 전체 글꼴 프로그램이 사용된 글리프로 축소됨). 부분 집합 글꼴은 자체 글리프 번호 매기기를 유지하고, 부분 집합으로 태그가 지정된
BaseFont이름과 실제 글리프당/W너비를 가지며, 각 셰이핑된 글리프를 원본 문자로 다시 변환하는 ToUnicode 맵을 얻습니다 — 따라서DrawShapedText출력을 복사하거나 추출하면 lam-alef 합자 뒤의 두 글자를 모두 포함하여 원래 문자열이 반환됩니다.
Version 3.119.0
추가
- 복잡한 스크립트 텍스트 그리기 추가:
DrawShapedText는 아랍어, 히브리어 및 기타 복잡한 스크립트 문자열을 그리기 전에 셰이핑합니다 — contextual 문자 형식, lam-alef와 같은 필수 합자 및 오른쪽에서 왼쪽 방향 지정이 모두 올바르게 출력됩니다 — 그리고 전체 글꼴 프로그램을 포함하는 컴패니언 Type0 (Identity-H) 글꼴을 통해 모양이 지정된 글리프를 기록하므로, 자체 문자 코드가 없는 형식도 정확하게 렌더링됩니다. 컴패니언 글꼴은 글꼴 종류(face)당 하나씩 생성되어 호출 전반에 걸쳐 재사용됩니다. - 동일한 셰이핑 패스를 통해 텍스트를 측정하여 합자가 적용된 텍스트가 실제 그려진 너비로 측정되도록 하는
GetShapedTextWidth추가 — 셰이핑된 단락을 오른쪽 정렬하거나 가운데에 맞출 때 사용하세요.
Version 3.118.0
추가
- 복잡한 스크립트 텍스트 셰이핑을 위한 기반 추가: 새로운 Uniscribe(usp10.dll) 바인딩은 아랍어, 히브리어 및 기타 복잡한 스크립트 문자열을 올바르게 정렬되고 모양이 지정된 글리프 실행(contextual 아랍어 형식, lam-alef와 같은 필수 합자, 오른쪽에서 왼쪽 방향 지정 등)으로 변환하고 각 글리프의 글꼴 글리프 인덱스, advance 및 원본 문자 클러스터를 보고합니다. 이 셰이핑 엔진을 바탕으로 이후 버전에서 그리기 경로를 빌드하며, 지연 로드되므로 Uniscribe가 없는 플랫폼은 기존의 문자 단위 경로를 그대로 유지합니다.
Version 3.117.0
추가
- ICC 프로필 인트로스펙션(introspection) 추가:
GetOutputIntentICCInfo는 문서의 OutputIntent에 연결된 ICC 프로필을 구문 분석하고 그 버전, 디바이스 클래스, 데이터 색상 공간, 프로필 연결 공간, 렌더링 의도 및 구성 요소 수를 보고하므로 PDF/A 및 PDF/X 파일의 인쇄 조건을 검사할 때 유용합니다. 또한 렌더러의 ICCBased 색상 공간 처리는 이제 음영의 색상 공간에/Alternate나/N이 없을 때 프로필 헤더 자체에서 구성 요소 수를 파생합니다.
Version 3.116.0
추가
- 테이블 인지 텍스트 추출 모드 추가:
GetPageText옵션 10은 페이지 텍스트 블록의 왼쪽 가장자리를 전역 열 위치로 클러스터링하고 탭으로 구분된 행을 내보내므로 표 형식 레이아웃이 가져오기 준비가 완료된 TSV로 추출되며 세로로 정렬된 셀이 행 간에 계속 정렬된 상태를 유지합니다.
Version 3.115.0
추가
- 페이지 임포지션(터잡기) 추가:
ImposePagesNUp는 문서의 모든 페이지를 n-up 그리드(2-up, 4-up, 9-up 또는 임의의 열 x 행 배열)의 새 시트에 배치하며 각 페이지의 종횡비를 맞추고 셀의 중앙에 라이브 벡터 콘텐츠로 배치하거나 booklet 옵션을 사용하여 양면 인쇄 후 쌓을 때 책자로 접히는 중철 시트를 생성합니다.
Version 3.114.0
추가
- 입력된 동작 판독기인
GetAnnotActionInfo및GetOutlineActionInfo를 Hide(숨겨진 대상 수 및 숨기기/표시 플래그 포함), SubmitForm(제출 URL 및 필드 수), ResetForm(필드 수) 및 ImportData(원본 파일) 등 4가지 추가 동작 종류로 확장하고 Named 동작(예:NextPage)의 이름 페이로드를 노출합니다. 이제 두 판독기가 하나의 구문 분석기를 공유하므로 주석 링크와 북마크가 동일한 정보를 보고합니다.
Version 3.113.0
추가
- 양식 필드 서식 도우미 추가:
SetFormFieldNumberFormat(소수 자릿수, 구분 기호 스타일, 음수 스타일 및 통화 배치),SetFormFieldPercentFormat및SetFormFieldDateFormat(mm/dd/yyyy등 Acrobat 날짜 그림 문자열)은 각각 표준 Acrobat 서식 JavaScript 쌍을 필드의 추가 작업(키 입력 필터 + 표시 서식 지정자)에 기록하므로 호환되는 뷰어가 수기 JavaScript 없이 입력을 유효성 검사하고 서식이 지정된 값을 렌더링할 수 있습니다.
Version 3.112.0
추가
- 소리 주석 생성 추가:
AddSoundAnnotationFromFile은 압축되지 않은 PCM WAV 파일(8비트 또는 16비트, 모노 또는 스테레오)을 읽어와 그 샘플을 PDF 소리 메커니즘에서 예상하는 서명된 인코딩의/Sound스트림으로 스피커 아이콘 주석 뒤에 삽입하여 기존의GetAnnotSoundToFile/GetAnnotSoundToString판독기와 함께 라운드트립을 완료합니다.
Version 3.111.0
추가
- 스레드형 주석 답글 추가(ISO 32000-1 §12.5.6.3):
AddAnnotationReply는 기존 주석에 답글을 숨겨진 Text 주석으로 추가하며, 그/IRT는/RT답글 관계를 통해 대상을 참조하므로 Acrobat 및 기타 뷰어는 댓글 패널의 대상 아래에 스레드 형태로 이를 표시합니다.AddAnnotationState및 FDF 주석 교환과 결합하면 완벽한 협업 검토 라운드트립이 가능합니다.
Version 3.110.0
추가
- 메쉬 및 함수 기반 음영 렌더링을 추가하여 7가지 PDF 음영 유형의 지원을 완료했습니다. 자유 형식 Gouraud 삼각형 메쉬(유형 4), 격자 형식 Gouraud 메쉬(유형 5), Coons 패치 메쉬(유형 6) 및 텐서 곱 패치 메쉬(유형 7)는 비트 패킹된 데이터 스트림(공유 가장자리 패치 플래그,
/Decode값 매핑 및 선택적 색상/Function램프 포함)에서 디코딩되어 Cairo 엔진의 기본 메쉬 그레이디언트를 통해 그려집니다. 함수 기반 음영(유형 1)은 해당 도메인에 걸쳐 미세한 패치 그리드로 음영 함수를 샘플링하여 근사화되며, 지원되는 색상 공간은 DeviceRGB, DeviceGray, DeviceCMYK 및 ICCBased 대체 색상을 포함합니다(GDI+ 엔진에는 메쉬 그레이디언트 기본 형식이 없으므로 메쉬 음영 처리된 영역은 그려지지 않은 상태로 둡니다).
Version 3.109.0
추가
- 텍스트 수준 편집을 통해 콘텐츠 편집 프레임워크(4단계)를 완료했습니다.
TPDFContentProgram.GetTextRuns는 각각에서 활성화된 글꼴 리소스 및 크기와 함께 페이지의 텍스트 표시 명령을 열거하며(저장/복원 중첩을 통해 글꼴 상태 추적),ReplaceTextRun은 표시된 텍스트를 그 자리에서 바꿉니다. 이는 이전 텍스트를 마스킹하고 그 위에 다시 그리는 오버레이 기반 접근 방식과 달리 원본 위치, 글꼴 및 색상을 유지하는 진정한 콘텐츠 스트림 교체입니다.
Version 3.108.0
추가
- 페이지 지오메트리용 개체 모델을 콘텐츠 편집 프레임워크(3단계)에 추가했습니다.
TPDFContentProgram.LiftPath는 경로 개체(이동/선/곡선/사각형 구성 연산자 및 이를 종료하는 클리핑/페인팅 연산자)를 편집 가능한 하위 경로 및 세그먼트의TPDFPath로 끌어올립니다.TPDFPath.Transform은 모든 지점에 아핀 행렬을 적용하며(기존 아트워크 이동, 크기 조절, 회전 또는 기울이기),LowerPath는 수정된 기하학적 구조를 원래 명령 위에 다시 써WritePageContentLayer를 준비합니다.
Version 3.107.0
추가
TPDFContentProgram에서 명령어 수준의 편의 기능으로 콘텐츠 편집 프레임워크(2단계)를 확장했습니다.InsertFromSource는 콘텐츠 스니펫을 구문 분석하고 임의 위치에 해당 명령어를 연결하며,SetOperand는 소스 구문에서 단일 피연산자를 재작성하고(좌표 번호 변경, 채우기 색상 변경),OperandText는 피연산자를 다시 읽어옵니다.InstructionGroup,FindNextOp및FindNextGroup은 연산자 또는 ISO 32000-1 연산자 범주별로 명령 목록을 탐색합니다.
Version 3.106.0
추가
- 구조화된 콘텐츠 편집 프레임워크의 첫 번째 단계를 추가했습니다.
ParsePageContentLayer는 페이지 콘텐츠 레이어를 편집 가능한TPDFContentProgram(각 PDF 콘텐츠 연산자(ISO 32000-1 표 51의 73개 연산자 모두)와 디코딩된 피연산자 개체가 포함된 명령 목록)으로 디코딩하며,WritePageContentLayer는 프로그램을 페이지로 다시 직렬화하므로 호출자가 그리기 명령을 구문 분석, 검사, 삭제 또는 재정렬하고 페이지를 다시 작성할 수 있습니다.GetPageContentLayerCount는 개별적으로 편집되는 콘텐츠 레이어 수를 보고합니다. 에미터(emitter)는 동작을 보존하며(수정되지 않은 왕복은 픽셀이 똑같이 렌더링됨), 알 수 없는 연산자는 변경되지 않고 그대로 유지되고 인라인 이미지는 그대로 전달됩니다.
Version 3.105.0
추가
- 읽기 순서 텍스트 추출 모드 추가:
GetPageText옵션 9는 재귀적 공백 분석(XY 절단)을 사용하여 페이지 텍스트를 시각적 읽기 순서로 반환하므로 다단 레이아웃이 기존의 위에서 왼쪽 순서 방식처럼 여러 단을 줄 단위로 교차하는 대신 단 단위로 추출됩니다(전체 너비 제목을 먼저 추출한 후 전체 왼쪽 단, 전체 오른쪽 단 순서로 진행).
Version 3.104.0
추가
- 서명 확인자에 서명자 인증서 인트로스펙션(introspection) 추가:
GetSignerCertificate는 첫 번째 서명 필드의 PKCS#7 페이로드를 디코딩하고 포함된 서명자 인증서의 요약 정보(제목 및 발급자 표시 이름, 기존의 16진수 형식의 일련 번호, UTC 유효성 범위(NotBefore/NotAfter) 및 현재 인증서가 해당 범위 내에 있는지를 보고하는 편의 플래그)를 반환합니다. 서명자는 발급자와 일련 번호를 통해 포함된 인증서 중에서 일치 항목을 찾습니다.
Version 3.103.0
추가
NewRGBAxialShader의 방사형 버전에 해당하는NewRGBRadialShader추가: 원 밖으로 선택적 색상을 확장하여 두 RGB 색상 간에 혼합되는 명명된 두 원형 방사형 그레이디언트(ShadingType 3, ISO 32000-1 §8.7.4.5.3)를 등록합니다. 기존SetFillShader,SetLineShader또는SetTextShader를 사용하여 이 항목을 선택하여 원형 "글로우" 채우기, 선 및 텍스트를 칠합니다.
Version 3.102.0
추가
- 방사형(ShadingType 3) 그레이디언트 렌더링(ISO 32000-1 §8.7.4.5.4) 추가: 페이지 렌더러는 이전에 지원되던 축방향(ShadingType 2) 그레이디언트 외에도
sh연산자가 사용하는 2원 방사형 음영 및 음영 패턴 채우기를 칠합니다. 다중 중지 색상 함수, DeviceRGB/DeviceCMYK/DeviceN/Separation/ICCBased 색상 공간 및/Extend처리를 통해 GDI+ 및 Cairo 래스터 엔진에서 모두 지원됩니다.
Version 3.101.0
추가
- 구름 모양 테두리 효과 추가(ISO 32000-1 §12.5.4):
SetAnnotCloudyEffect는 강도 1 또는 2를 적용해 Acrobat의 Cloudy 스타일과 일치시키고 0을 입력하면 효과를 제거하여/BE테두리 효과 딕셔너리를 기록함으로써 Square, Circle, Polygon 또는 FreeText 주석의 테두리를 연결된 반원형 "수정 기호(revision cloud)"로 변환합니다.GetAnnotCloudyEffect는 이 설정을 읽어옵니다(0 = 구름 없음, 그렇지 않으면 강도 1~2).
Version 3.100.0
추가
- 주석 검토 상태 추가(ISO 32000-1 §12.5.6.3):
AddAnnotationState는 기존 주석의 검토 상태 변경 사항을 기록하기 위해 대상을 가리키는/IRT와 상태를 전달하는/State+/StateModel이 포함된 숨겨진 Text 주석을 추가하여 Acrobat의 주석-검토 워크플로에서 사용하는Review모델(없음/수락/거절/취소/완료)과Marked모델(표시 없음/표시됨)을 지원합니다.GetAnnotState및GetAnnotStateModel은 모든 주석에서 기록된 문자열을 읽어옵니다(없는 경우 빈 칸).
수정
- 최신 개발 버전으로 빌드된 응용 프로그램의 시작을 막았던 로드 시간 실패(Windows 인증서 이름 조회가 존재하지 않는 DLL 진입점에 바인딩됨)를 수정하고 FDF 주석 가져오기, 페이지 범위 회전 및 서명 플래그 경로의 컴파일 재발(regression) 버그를 복구했습니다.
Version 3.99.0
Added
- 문서 지문 및 전환 읽기 API 추가:
GetDocumentFileID는 트레일러의/ID배열에서 영구 문서 식별자(16진수로 인코딩된 첫 번째 요소)를 반환하며, 이는 안정적인 캐시 키나 문서 지문으로 유용합니다.GetPageTransition은SetPageTransition에 대응하는 읽기 전용 기능으로, 저장된/Trans의/S,/Dm및/M항목을 역으로 매핑하여 형식화된TPDFlibPageTransition값으로 된 전환 스타일과 표시 시간, 전환 시간을 반환합니다.
Version 3.98.0
Added
- 페이지 범위 회전 및 축소판 검사 추가:
RotatePageRange는 범위 내의 모든 페이지에 0/90/180/270도 회전을 적용합니다(기존 단일 페이지RotatePage를 래핑하여 호출자가 더 이상 페이지 단위 루프를 사용할 필요가 없습니다).HasPageThumbnail은 페이지에/Thumb항목이 포함되어 있는지 보고합니다.GetPageThumbnailInfo는 축소판 이미지 XObject의 너비, 높이 및 구성 요소당 비트(bits-per-component)를 읽습니다.
Version 3.97.0
Added
- 확장된 주석 속성 리더 추가:
GetAnnotColor는/C색상 배열(0..1 RGB, “명시적 색상 없음”과 “명시적 검은색”을 구분하는 HasColor 플래그 포함)을 읽습니다.GetAnnotBorderWidth는/BS /W를 읽고, 없으면 기존의/Border배열을 대신 읽습니다.GetAnnotOpacity는/CA획(stroke) 알파 값(기본값 1.0)을 읽습니다.GetAnnotCreationDate는/CreationDate타임스탬프를 읽습니다.GetAnnotFlags는/F가시성/인쇄 플래그 바이트를 읽습니다.
Version 3.96.0
Added
- 읽기 전용 보안 검사 API 추가:
IsEncrypted는 로드된 문서에/Encrypt딕셔너리가 있는지 보고합니다.GetEncryptionLevel은 쓰기 측 암호화 옵션과 일치하는 형식화된 강도(0=none, 1=RC4-40, 2=RC4-128, 3=AES-128, 4=AES-256, 5=AES-256 Acrobat X)를 반환합니다.GetUserPermissions는 직접 비트 테스트를 위한 원시/P권한 단어(permission word)를 반환합니다.IsOwnerPassword는 소유자 자격 증명으로 문서가 열렸는지 보고합니다.
Version 3.95.0
Added
- 고급 인쇄 및 텍스트 교체 추가:
PrintDocumentAdvanced는 부수/정렬과 함께, 형식화된TPDFlibPrintSettings레코드를 통해 전체 프린터 DEVMODE(양면, 방향, 색상, 인쇄 품질, 용지 크기, 용지함)를 제어하고, 기존 사용자 지정 프린터 프로필 메커니즘으로 각 비기본 필드를 적용합니다.SearchAndReplaceText는 페이지 범위를 검색하여 각 검색 결과마다 원래 텍스트 블록을 불투명한 흰색 사각형으로 가리고, 호출자가 선택한 글꼴을 사용해 블록 시작 지점에 교체 텍스트를 다시 그리며, PDFtoolkit SearchAndReplace의 오버레이 교체 동작을 동일하게 수행합니다.
Version 3.94.0
Added
- 주석 FDF 상호 변환 기능 추가 (Acrobat “주석 내보내기/가져오기”):
ExportAnnotationsToFDFString및ExportAnnotationsToFDF는 모든 페이지의/Annots를 탐색하고, 각 주석을 FDF/Annots배열 내에/Type /Annot항목으로 직렬화하여/Subtype,/Contents,/Rect,/T작성자 레이블,/Subj및 0부터 시작하는/Page인덱스와 함께 저장합니다.ImportAnnotationsFromFDFString및ImportAnnotationsFromFDF는 소규모 상태 기계(state machine)로 해당 FDF를 분석하고 스티키 노트로 축소하지 않은 채 전체 주석 딕셔너리를 보존하여 일치하는 페이지에 각 항목을 새 주석으로 다시 만듭니다.
Version 3.93.0
Added
- 서명 인증 및 양식 필드 속성 API 추가:
SetSignProcessDocMDP는 DocMDP/Reference변환을 1/2/3 수준(변경 불가 / 양식 채우기 / 주석)으로 연결하고 AcroForm의/SigFlagsAppendOnly 비트를 설정하여, 서명 프로세스로 생성된 다음 서명을 인증(작성자) 서명으로 변경합니다.GetSigFlags/SetSigFlags는 원시 AcroForm/SigFlags바이트를 직접 읽고 씁니다.GetFormFieldIsComb,GetFormFieldIsMultiLine,GetFormFieldJustification및GetFormFieldAllowedValues는 필드별/Ff스타일 비트,/Q텍스트 정렬,/Opt선택 배열을 형식화된 값으로 노출합니다.
Version 3.92.0
Added
- 첨부 파일 내보내기 및 양식 필드 편의 API 추가:
SaveAllAttachments는 통합 첨부 파일 목록(문서 수준/EmbeddedFiles및 페이지별/FileAttachment주석)을 순회하며 각 스트림을 파일 스펙 이름으로 지정된 디렉터리에 쓰고, 충돌이 있을 경우 숫자 접미사로 구분합니다.RemoveFormFieldByName은 정규화된 필드 이름으로 인덱스를 찾아 삭제합니다.RenameFormField는 별도의 인덱스 조회 없이 이름으로 필드의 이름을 바꿉니다.
Version 3.91.0
Added
- 문서 전체 열거 API 추가:
EnumDocumentFonts는 모든 Font 딕셔너리를 탐색하여(필요한 경우FindFonts를 먼저 호출) 객체 번호,/BaseFont이름, 종류, 인코딩 및 포함/부분 집합 상태를 갖는 각 글꼴당 하나의TPDFlibDocumentFont를 반환하므로 각 항목에SelectFont를 사용하거나 스칼라 getter를 조회할 필요가 없습니다.EnumAttachments는 문서 수준의/EmbeddedFiles이름 트리와 페이지별/FileAttachment주석을 단일TPDFlibAttachment목록으로 통합하여 각 항목의 소스, 1부터 시작하는 소스 인덱스, 파일 이름, MIME 하위 유형, 설명 및 바이트 크기를 기록합니다.
Version 3.90.0
Added
- 주석, 책갈피 및 문서 버전에 대한 읽기 전용 검사 API 추가:
GetPDFVersion은 유효한 PDF 버전 문자열(예:1.7)을 반환합니다.GetAnnotType,GetAnnotTitle,GetAnnotSubject,GetAnnotContentsEx,GetAnnotModifiedDate,GetAnnotName및GetAnnotRectEx는 기존AnalyseAnnot캐시 위에 명명된 래퍼로 주석별 필드를 노출하므로 호출자가 더 이상 매직 속성 Tag 번호를 알 필요가 없습니다.GetOutlineLevel은 개요 루트에 대한 책갈피의 깊이를 반환하고,GetOutlineIsOpen은 뷰어에서 책갈피가 확장되어 있는지(음수/Count는 축소되었음을 의미) 보고하여 책갈피 패널이 렌더링할 레이아웃 상태를 동일하게 반영합니다.
Version 3.89.0
추가됨
- JBIG2 이미지 인코더 유닛인
PDFlibJBIG2Enc(TPLJBIG2Encoder.EncodeToByteArray)를 추가했습니다. 이 유닛은 자매 제품인 HotPDF에서 포팅되었으며 두 개의 백엔드를 갖습니다: Win64에서는 C++jbig2enc산술 코더(ITU-T T.88)가PDFlibJBIG2EncC+HPDFCLibs(thirdparty/Win64x/아래의 228개 leptonica/jbig2enc 객체)를 통해 정적으로 연결되고 기본 백엔드로 등록되어 HotPDF의 프로덕션 경로와 일치합니다; 다른 대상 환경이거나UseExternalEncoder가 False일 경우, 순수 Pascal MMR 폴백이 CCITT G4 인코더를 사용하여 이진(bi-level) 스캔라인을 압축하고 이를 JBIG2 세그먼트 헤더(page-info 유형 48 + immediate generic-region 유형 38)로 감쌉니다 - 기존
PDFlibLZW디코더에 대응하는 인코더인 LZW 인코더 유닛PDFlibLZWEnc(TPLLZWEncoder.Compress)를 추가했습니다. 이는 9..12비트 가변 길이 코드, ClearCode/EOI 및 PDF 기본 EarlyChange 의미 체계를 가진 PDF 사양/LZWDecode스트림을 생성하며, 디코더를 통과하는 왕복 프로세스에서 원본 바이트를 재현할 수 있도록 선택적인 TIFF Predictor 2(가로 차등)를 제공합니다
Version 3.88.0
추가됨
- 기존
PDFlibCCITT디코더에 대응하는 인코더인 CCITT Group 3 / Group 4 (T.6) 이진 이미지 인코더 유닛PDFlibCCITTEnc(TPLCCITTEncoder)를 추가했습니다. 이 유닛은 자매 제품인 HotPDF에서 포팅되었으며(두 제품 모두 losLab 라이선스 공유),CompressImage/Execute를 통해pf1bit비트맵을 CCITT G3 1D / G3 2D / G4 (T.6) 바이트 스트림으로 인코딩합니다; 이를 통해CCITTFaxDecode출력용 흑백 이미지 데이터를 생성할 수 있는 누락된 인코더를 제공하며, 전체 이미지 파이프라인 및RenderPageToMonochromeFileG4-출력 통합이 뒤따를 예정입니다
Version 3.87.0
추가됨
- 분리된(detached) PKCS#7 서명에 대한 암호화 서명 확인 기능을 구현했습니다:
TPDFlibSignatureVerifier.VerifySignature(이전에는vsUnknown을 반환하는 스텁)는 이제 두 개의/ByteRange세그먼트에 대해 문서 다이제스트를 다시 계산하고 서명된messageDigest속성과 Windows CryptoAPI(CryptVerifyDetachedMessageSignature)를 통한 서명자의 공개 키를 대조하여 확인합니다.adbe.pkcs7.detached및ETSI.CAdES.detached하위 필터(subfilter)에 대해vsValid/vsInvalid를 반환합니다; 이는 첫 번째 확인 계층이며 다이제스트+서명 무결성만 다룹니다(인증서 체인, CRL/OCSP 해지 및 RFC 3161 타임스탬프 토큰 확인은 여전히 범위 밖이며 향후 계층에서 추가될 예정입니다)
Version 3.86.0
추가됨
- 병합 시점의 책갈피(bookmark) 단위 콜백을 추가했습니다:
MergeFileList/MergeFileListFast/MergeFileListStrict가 병합된 개요(outline) 트리를 연결하는 동안 각 최상위 원본 개요에 대해OnMergeOutline이벤트가 발생하여, 호출자가 들어오는 책갈피가 대상 문서에 저장되기 전에 이름을 바꾸거나(Title) 삭제(Skip=True)할 수 있게 합니다; 콜백은 0부터 시작하는 원본 문서 인덱스를 받으므로 호출자가 문서별 정책을 적용할 수 있습니다
Version 3.85.0
추가됨
- Windows 시스템 인증서 저장소에서 서명하는 기능을 추가했습니다:
SetSignProcessCertFromStore는 명명된 저장소("MY"/"Root"/...)에서 주체 단순 표시 이름(일반적으로 CN이며, 대소문자를 구분하지 않고 일치시킴; 빈 이름은 개인 키가 있는 첫 번째 인증서를 선택함)으로 서명 인증서를 확인하고 기존 PKCS#7 서명 파이프라인을 재사용하므로,.pfx/.p12파일을 제공하지 않고도 문서에 서명할 수 있습니다;CURRENT_USER(1)와LOCAL_MACHINE(2) 중에서 선택하려면SetSignProcessKeyset과 쌍을 이루어 사용하십시오
Version 3.84.0
추가됨
- 이미 로드된 문서를 위한 글꼴 프로그램 포함 기능을 추가했습니다:
EmbedMissingFonts는 모든 글꼴 딕셔너리를 탐색하고 BaseFont 이름과 일치하는 설치된 시스템 글꼴 프로그램을 읽은 후FontFile2또는FontFile3를 다시 작성하여, 프로그램을 얻은 글꼴 수를 반환합니다;EmbedFontProgram은 설치된 시스템 글꼴을 사용하여 이름으로 단일 글꼴을 포함합니다;EmbedFontProgramFromFile은 시스템에 설치되지 않은 글꼴에 대해 호출자가 제공한.ttf또는.otf파일을 사용하여 단일 글꼴을 포함합니다 - 새로 만든 문서가 PDF/A 모드 외에서도 실수로 포함되지 않은 시스템 글꼴을 참조할 수 없도록
AddTrueTypeFontEmbed=0을Embed=1로 승격시키는 작성자 측(writer-side) 가드인SetEmbedAllFonts를 추가했습니다
Version 3.83.0
추가됨
- 렌더링 편의 API 추가:
RenderPageToMonochromeFile은 페이지를 1비트 흑백 비트맵(팩스/보관/OCR 시나리오)으로 렌더링하며, 렌더링 코어 변경 없이 GDI 하프톤 디더링을 통해 24비트에서 다운그레이드합니다;RenderPageRegionToFile은 페이지의 지정된 하위 직사각형(“Left,Top,Width,Height”)만 비트맵으로 렌더링하며, 이전에 끊어졌던RenderPageToDCClip클립 파이프라인을 연결합니다
Version 3.82.0
추가됨
- FDF 양식 데이터 내보내기 추가:
ExportFormDataToFDF는 현재 문서의 모든 양식 필드 이름과 값을 독립된 FDF 파일(%FDF-1.2로 감싼/Fields배열)에 씁니다.ExportFormDataToFDFString은 동일한 구조의 문자열을 반환하여 양식 데이터를 PDF에서 분리하여 저장하거나 나중에 병합하기 쉽게 합니다. 비 ASCII 바이트는 ISO 32000-1에 따라 3자리 8진수로 이스케이프됩니다
Version 3.81.0
추가됨
- 페이지 및 구조 편의 API 추가:
SetPageTransition은 지정된 페이지에 프레젠테이션 전환 효과(Split/Blinds/Wipe/Dissolve/Glitter 등을 포함한/Trans의 17가지 표준 전환)와 페이지 표시 시간을 기록합니다;GetPageFontCount,GetPageFontID는 지정된 페이지에서 참조하는 글꼴을 열거합니다;SetMeasurementUnit은 형식화된 단위 열거형을 허용하며(기존 픽셀/밀리미터/인치에 twips와 points 추가),ConvertToPoints,ConvertFromPoints단위 변환 도우미를 제공합니다;SaveToFileOptions는 단일 레코드를 사용하여 압축, 선형화 및 수정 날짜 유지 등 저장 옵션을 통합합니다
Version 3.80.0
추가됨
- 보안 및 서명 편의 API 추가:
EncryptFileEx는 원시 권한 비트 정수 대신 형식화된 명명 권한 집합(저해상도 인쇄와 고해상도 인쇄 등을 구분하는 8개의 명명된 권한 비트인TPDFlibUserPermissions)을 허용합니다;TPDFlibSignatureVerifier.GetSignatureMetadata는 PKCS#7 디코딩 없이 서명 딕셔너리에서 필드 이름, Filter, SubFilter, 서명 시간, 이유, 위치, 연락처 정보, 서명자 및 ByteRange 구조 확인을 직접 읽습니다;PrintDocumentEx는 한 번의 호출로 인쇄 매수와 정렬 방식을 지정합니다
Version 3.79.0
추가됨
- 편집 편의 API 추가:
MaskRect는 지정된 페이지에 불투명한 채우기 사각형 덮어쓰기 영역을 그립니다(마스킹/모자이크).SetPageThumbnailFromFile은 내용 스트림 그리기 상태를 오염시키지 않고 이미지 파일에서 직접 페이지/Thumb을 연결합니다.FlattenFormFieldsOnPageRange는 페이지 범위에 따라 모든 양식 필드를 평면화합니다(모양을 정적 콘텐츠로 굽고 활성 필드 제거).InsertAnnotation은 지정된 위치에 생성된 주석 딕셔너리를 삽입합니다.NewMarkupAnnotation은 강조/취소선/밑줄/물결선 마크업 주석을 한 번에 생성하고 쿼드 점, 색상 및 투명도를 기록합니다.StampText,StampImage는 페이지 범위에 따라 워터마크를 추가하며 투명도, 회전 각도 및 겹침 위치를 지원합니다
Version 3.78.0
추가됨
- 텍스트 쿼리 및 페이지 요소 열거 API 추가:
SearchText는 지정된 페이지 범위에서 쿼리 단어를 검색하고, 일치하는 각 항목의 페이지 번호와 경계 사각형을 반환하며, 대소문자 구분 및 전체 단어 일치 옵션을 지원합니다;EnumPageElements는 지정된 페이지의 모든 텍스트 블록과 포함된 이미지 요소를 열거하고, 요소 종류, 사각형, 텍스트, 글꼴 이름 및 이미지 ID를 통합 반환합니다;GetTextInAreaEx는GetTextInArea의 직사각형이 포함된 버전으로, 영역 내의 각 텍스트 블록과 그 경계 사각형을 반환합니다
Version 3.77.0
추가됨
- 읽기 전용 인트로스펙션 API 추가, 이전의 "쓰기는 가능하지만 읽을 수는 없는" 비대칭성 보완:
FindOutlineByTitle은 제목으로 책갈피를 찾습니다(동일 수준만/자식 수준만/전체 하위 트리의 세 가지 깊이 지원).GetOutlineActionInfo및GetAnnotActionInfo는 책갈피 또는 주석의 동작 종류(GoTo/GoToR/URI/Launch/Named/JavaScript)와 URI, JavaScript, 파일 이름 페이로드를 형식화된 구조로 반환합니다.GetOutlineDestinationInfo는 대상 페이지와 Fit 유형(XYZ/Fit/FitH/FitV/FitR/FitB/FitBH/FitBV) 및 좌표를 반환합니다.EnumSignatures,GetSignatureFieldCount,GetSignatureFieldInfo는 서명 필드를 열거하고 서명되었는지 보고합니다
Version 3.76.3
변경됨
- E-Invoice 데모의 Factur-X EXTENDED 프로필이 이제 표준 conformance 값과 표준 guideline ID를 사용하며, ZUGFeRD 1.0 인보이스에
ChargeTotalAmount와AllowanceTotalAmount합산 요소를 추가했습니다; 이제 6개 프로필 모두 veraPDF(PDF/A 적합성)와 Mustang(전자 인보이스 비즈니스 규칙) 검증을 동시에 통과하는 PDF/A-3b 및 PDF/A-3u 출력을 생성합니다
Version 3.76.2
수정됨
- Factur-X/ZUGFeRD 하이브리드 인보이스의 XMP 메타데이터가 이제
fx:인보이스 속성을 설명하기 위해 PDF/A 확장 스키마(pdfaExtension:schemas)를 선언합니다; 이전에는 이 선언이 누락되어 생성된 PDF/A-3이 veraPDF 같은 검증기에서 비적합으로 판정되었습니다
변경됨
- E-Invoice 데모의 인보이스 XML에 판매자와 구매자의 전자 주소 및 판매자 전화번호가 추가되어 더 많은 프로필이 ZUGFeRD/Factur-X 비즈니스 규칙 검증을 통과합니다
- E-Invoice 데모의 프로필 카탈로그, XML 생성, PDF/A-3 생성 흐름이 공유 unit으로 추출되어 GUI와 새 외부 검증기 테스트 도구가 모두 재사용합니다
Version 3.76.1
수정됨
- E-Invoice 데모에서 생성 클릭 시 충돌하는 문제를 수정했습니다: PDF/A 모드에서는 내장 표준 글꼴을 사용할 수 없으므로, 데모는 이제 인보이스 페이지를 렌더링하기 위해 TrueType 글꼴을 내장합니다
변경됨
- E-Invoice 데모가 PDF/A-3a 옵션을 제거하고(전자 인보이스에서 거의 사용되지 않음) XRechnung 프로필의 기본 모드를 PDF/A-3u로 변경했습니다
Version 3.76.0
변경됨
- E-Invoice GUI 데모가 이제 데이터 기반으로 작동합니다: 인보이스 번호, 발행일, 구매자와 판매자, 순액, 세율 및 통화를 편집할 수 있으며, 인보이스 XML이 고정 자리 표시자 콘텐츠 대신 페이지에 표시되는 금액과 정확히 일치합니다
- 데모는 프로필별로 구조적으로 올바른 인보이스 XML을 생성합니다: Factur-X, XRechnung 및 ZUGFeRD 2.0은
CrossIndustryInvoice구조를 사용하고, ZUGFeRD 1.0 COMFORT는 라인 항목, 세금 합계 및 결제 조건과 함께 자체CrossIndustryDocument구조를 사용합니다 - 금액은 고정 영어식 소수점 형식으로 XML에 기록되어 현지화된 천 단위 구분 기호나 쉼표가 스키마를 손상시키지 않도록 하며, 사용자 입력은 기록 전에 이스케이프됩니다
- 데모는 실시간 XML 미리보기, 프로필 수준 콘텐츠 자체 검사, 동일한 이름의 외부
.validation.json검증 보고서 구문 분석을 추가하고, 생성 시 리포지토리의 sRGB ICC 출력 인텐트를 명시적으로 로드합니다
Version 3.75.6
추가
SetPDFAMode에 모드7을 추가하여 PDF/A-3 관련 파일은 계속 허용하면서 PDF/A-3u 메타데이터를 생성할 수 있습니다. E-Invoice GUI 데모도 PDF/A-3u 옵션을 제공하며 ZUGFeRD 2.0 BASIC profile은 기본적으로 PDF/A-3u를 사용합니다
Version 3.75.5
추가
- Factur-X, ZUGFeRD, XRechnung profile을 선택하고, PDF/A-3 하이브리드 송장을 생성하며, 일치하는 XML 파일 이름과 guideline ID를 포함하고, 인터페이스에서 컨테이너 검증을 실행하며, XMP 송장 정보, 검증 문제, 추출된 XML을 표시할 수 있는 Delphi E-Invoice GUI 데모를 추가합니다
Version 3.75.4
추가
- PDF/A-3 관련 파일 및 전자 송장 XML 지원을 추가합니다.
AddPDFA3AssociatedFileFromString은 메모리 바이트에서 직접 Catalog/AF관련 파일을 만들 수 있고,AddFacturXAssociatedFileFromString은 Factur-X, ZUGFeRD, XRechnung XML을 쓰고 XMP 메타데이터를 동기화하며 파일 이름, profile, XMP namespace, XML guideline ID 조합을 검증할 수 있습니다. 읽기 측에는 감지, 검증, 문제 목록, XML 추출 API가 추가됩니다
Version 3.75.3
수정
- PDF 병합 함수: 지역 변수
GlobalRootObjNum,GlobalRootGenNum,StructRootGlobalObjNum및StructRootGlobalGenNum는 조건 블록 안에서만 할당되어 Delphi Win64 컴파일러 26 및 29(RAD Studio 12 및 16)에서 W1036 “variable might not be initialized” 경고를 일으켰으므로, 함수 진입 시 0으로 초기화하도록 추가했다
Version 3.75.2
수정
- 멀티 버전 빌드 호환성: hex-string parser(
PDFlibStruct)의for루프가Int64제어 변수를 사용해 Delphi XE3/XE5(컴파일러 26/27)에서 비순서형으로 거부되므로, RAD Studio 12 및 14와의 호환성을 복원하도록While루프로 다시 작성했다 - Reference XObject checker (
PDFlibPDFUA): dictionary pointerD가 비스트림/비사전 분기에서 초기화되지 않아 모든 대상에서 컴파일러 힌트를 유발했으므로,Assigned검사 전에 항상D를 할당하도록 분기를 다시 구성했다 CreateFontPackagewrapper (PDFlibFont): Delphi ≤ XE8에서 가끔 잘못 뜨는 W1035 “return value might be undefined”를 억제하면서, 더 최신 컴파일러에서 상호보완적인 H2077 dead-assignment 힌트가 생기지 않도록{$IF CompilerVersion}가드를 사용했다- BMP DPI writer 및 PDF incremental-save 경로: 더 이상 사용되지 않는
TStream.Seek(Longint, Word)호출을Position :=대입으로 바꾸었다 (PDFlibPDFium,PDFlibDocument)
Version 3.75.1
수정
- TIFF 다중 페이지 파서: 과도하게 큰 페이지 수에 대한 루프 종료 가드가
FPageCount가Word(최대 65 535)로 선언되어 있어> 65535비교가 항상 false가 되는 바람에 무력했으므로, 문제 파일에서 가드가 올바르게 발동하도록Integer로 변경했다 - CFF/Type 2 charset parser (Format 1 and Format 2): 바로 뒤에
Break가 와서 절대 읽히지 않던 deadDone := True대입을 제거해 compiler hints를 없앴다
Version 3.75.0
보안
- 신뢰할 수 없는 임베디드 글꼴(TrueType, Type 1, CFF 및 CMap) 파싱을 강화해, 잘못된 글꼴 데이터로 인한 범위 밖 쓰기, 무제한 charstring 재귀, 과도한 메모리 할당을 막았다
- 이미지 디코더(PNG, GIF, TIFF, JBIG2 및 CCITT Group 3 및 4)를 강화해 범위 밖 읽기와 쓰기, width 및 height 계산의 정수 오버플로, 악성 이미지의 empty-palette 역참조를 막았다
- 스트림 필터(LZW, ASCII85 및 Flate predictors)를 강화해 조작된 스트림 데이터에서의 buffer over-reads, division by zero, non-terminating loops를 막았다
- cross-reference, document-rebuild 및 name-tree 파싱을 강화해 잘못되었거나 순환하는 cross-reference 데이터로 인한 범위 밖 접근과 무한 루프를 막았다
- AES-CBC 복호화가 이제 ciphertext block 정렬을 검증하고 출력 버퍼를 0으로 초기화하므로, 초기화되지 않은 힙 메모리가 복호화된 문자열과 스트림으로 새어 나가는 일을 막는다
수정
- SHA-256, SHA-384 및 SHA-512 detached-signature 다이제스트는 이제 올바른 암호화 provider로 생성된다. 이전에는 빈 다이제스트를 반환해 잘못된 서명을 만들었다
- ASCII85 및 RC4 디코딩은 더 이상 초기화되지 않은 데이터를 반환하거나, 잘린 입력이나 빈 키에서 예외를 발생시키지 않는다
- GIF 배경색은 이제 녹색 채널을 복제하지 않고 올바른 파란색 채널로 읽는다
Version 3.74.1
수정
- PAdES signature validation data(VRI) 지원의 E2010 incompatible-types 컴파일 오류를 수정해 라이브러리가 컴파일되지 못하던 문제를 해결했다
- 마지막 컴파일러 경고와 unused-variable 힌트를 제거해, 모든 Win32 및 Win64 trial 및 release library 빌드가 이제 경고 없이 깨끗하게 컴파일된다
Version 3.74.0
추가
- 직접 파일 경로의
EncryptFile및DecryptFile이 이제 cross-reference 데이터가 cross-reference streams 안에 있는 PDF도 읽는다. incrementally updated chains 및/XRefStmside section이 있는 hybrid-reference 파일도 포함되며, 더 느린 full reader로 되돌아가지 않는다: 1.25 GB 벤치마크 문서의 AES-256 보호는 약 4.4초에서 2.5초로, 복호화는 약 1.7초에서 1.3초로 줄었다 - 압축된 object streams에 저장된 object를 포함한 rewrite는 이제 cross-reference stream trailer를 내보내, 암호화되거나 복호화된 출력에서 그 object에 계속 접근할 수 있게 한다
수정
- incrementally updated 파일에서 문서
/ID가 없는 revision은 이제 direct rewrite 중에 이전 revision에서 상속한 식별자를 지우지 않는다
Version 3.73.2
변경
DASaveAsFile이 이제 출력 쓰기를 집계하고, 단계별 문자열 할당 없이 각 object의 닫는 키워드를 찾아 1백만 개가 넘는 object를 가진 2 GB 벤치마크 문서의 rewrite 시간을 약 57초에서 11초로 줄인다
Version 3.73.1
변경
- 직접 파일 경로의
EncryptFile및DecryptFile이 이제 슬라이딩 윈도로 소스를 읽고 출력 쓰기를 집계하므로, 수백만 개의 object가 있는 매우 큰 PDF의 AES-256 보호가 여러 배 빨라졌다: 2 GB 벤치마크 문서에서 암호화는 약 123초에서 32초로, 복호화는 약 127초에서 23초로 줄었다 - 읽기 윈도에 들어오는 object body는 direct AES-256 rewrite 중에 더 이상 디스크에서 두 번 가져오지 않는다
수정
- hybrid-reference PDF(
/XRefStmtrailer 항목이 있는 파일)의 direct AES-256 rewrite는 이제 압축된 object가 빠질 위험 대신 full reader로 되돌아간다 - direct file path의 cross-reference 파싱은 이제 cross-reference 섹션부터 파일 끝까지를 한 번에 모두 읽지 않으므로,
/Prev체인이 파일 시작 근처를 가리키는 수 기가바이트 파일에서 메모리를 고갈시킬 수 없고, 끊어진/Prev체인도 불완전한 문서를 만드는 대신 full reader로 되돌아간다
Version 3.73.0
추가
- SigningWorkbench 데모는 이제 Windows CryptoAPI를 통해 detached CMS 서명(
adbe.pkcs7.detached및ETSI.CAdES.detached)의 완전한 cryptographic digest 검증을 수행한다: 서명된 byte range를 다시 해시해 CMS 서명과 대조하고, 변경된 문서는 새로운 SG203 실패 코드로 보고되며, 각 서명은 JSON, CSV 및 HTML 보고서에 3-statedigestValid필드를 가진다 - 새 SigningWorkbench 자동화 스위치:
--quiet는 batch summary와 report path만 출력하고,--fail-fast는 첫 번째 실패 파일에서 batch를 중단하며, JSON report는 이제 library version을 기록한다
Version 3.72.0
추가
- ComplianceWorkbench 데모는 이제 전문적인 batch workflow를 제공한다:
--policy-file는 JSON 파일에서 audit policy를 불러와 팀이 문서 규칙을 버전 관리하고 공유할 수 있게 하고,--baseline은 실행 결과를 이전 compliance-report.json과 비교해 새 실패, 수정된 파일, 계속 실패하는 파일을 나열하며,--preflight-details는 preflight issue line을 JSON 및 HTML 보고서에 포함한다 - 새 ComplianceWorkbench 자동화 스위치:
--quiet는 batch summary와 report path만 출력하고,--fail-fast는 첫 번째 실패 파일에서 batch를 중단하며, JSON report는 이제 library version을 기록한다
Version 3.71.2
수정
AppendToFile이 이제 다시LoadFromFile로 불러온 같은 PDF 파일에 incremental update를 덧붙인다. streaming loader는 이제 업데이트에 필요한 write handle을 막지 않으면서 source file을 읽을 수 있게 유지한다
Version 3.71.1
추가
- ComplianceWorkbench 및 SigningWorkbench 보고서는 이제 finding severity label, 파일별 최고 severity 필드, batch severity frequency summary, 그리고 더 빠른 policy triage를 위한 JSON, CSV, HTML, console 출력을 함께 포함한다
Version 3.71.0
추가
- SigningWorkbench 데모 검사 는 이제 각 서명의 revision order와 DocMDP certification level을 보고하고,
--forbid-weak-digest(SG303/SG405) 로 약한 MD5/SHA-1 certificate signature algorithm과 기존 adbe.pkcs7.sha1 SubFilter를,--forbid-self-signed(SG406) 로 self-signed certificates를,--require-certified(SG304) 로 certification signature가 없는 문서를 표시하며, signing time이 certificate validity period 안에 있는지도 항상 검사한다 (SG407) - SigningWorkbench sign mode는 이제 새
--subfilter(sha1, detached, 또는 PAdES baseline signatures용 cades) 및--digest(auto to sha512) 스위치와 함께 sign process API를 사용하며, 최신adbe.pkcs7.detached와 SHA-256 이 새로운 기본 signing 값이다 - 새
TPDFlibSignDoc.GetSignatureDocMDPLevelByNameread-side accessor 는 ISO 32000-1 §12.8.2.2에 따라 signature field의 DocMDP certification level을 반환한다
Version 3.70.0
추가
- ComplianceWorkbench 데모는 이제 permission, metadata 및 size policy도 강제한다:
--require-print-allowed및--require-copy-allowed는 document permission bits(PC205/PC206)를 검사하고,--require-author및--require-creation-date는 metadata completeness(PC306/PC307)를 검사하며,--max-pages및--max-file-size는 document scale(PC308/PC309)을 제한한다 - archive profile은 이제 author와 creation date도 요구하고, accessible profile은 assistive technology가 의존하는 copy permission을 요구한다
- ComplianceWorkbench 보고서는 이제 batch 전체의 failure-code frequency summary를 집계하고, per-file metrics에는 author, creation date, file size, 그리고 print 및 copy permission 상태가 포함된다
Version 3.69.1
수정
DecryptFile이 이제 AES-128 및 RC4 보호 문서에서 encryption을 다시 제거한다. owner password만 가진 문서도 포함된다; v3.67.4 이후 large-file fast path가 이런 문서를 regular decryption path 대신 잘못된 password(error 404)로 보고했지만, AES-256 문서는 영향을 받지 않았다
Version 3.69.0
추가
- 새 SigningWorkbench Delphi 데모: 하나의 PDF 또는 전체 디렉터리의 signature field를 검사하고(SubFilter, signing time, ByteRange coverage, signing certificate expiry checks), PKCS #12 certificate로 PDF를 batch-sign하며, PFX 파일을 감사하는 signature and certificate workbench console tool이다. 모든 위반은 안정적인 policy failure code(SG101–SG501) 에 매핑되며, 결과는 18개 문서 언어 모두를 위한 localized demo guide와 함께 JSON, CSV 및 HTML 보고서로 작성된다
- TPDFlibSignDoc의 새 signature read-side accessor:
GetSignatureFieldNames는 문서의 signature field를 나열하고,GetSignatureTextValueByName는 /M signing time, /Name, /Reason, /Location, /ContactInfo 및 /Type 항목을 반환하며(암호화 문서는 복호화 포함),GetSignatureValueByName는 /Filter, /SubFilter, /Contents 및 ByteRange 항목을 field 이름으로 반환한다
수정
- Windows CryptoAPI import
CertCloseStore를 수정해 flags parameter 없이 선언되어 certificate store가 닫힐 때 Win32에서 caller stack을 손상시킬 수 있던 문제를 해결했다
Version 3.68.0
추가
- 새 ComplianceWorkbench Delphi 데모: PDF/A 및 PDF/UA preflight, encryption rules, PDF version range, Tagged PDF, linearization, document title를 포함한 configurable compliance policy에 대해 하나의 PDF 또는 전체 디렉터리를 검사하고, 모든 위반을 안정적인 policy failure code(PC101–PC501)로 보고하며, automation-friendly exit code와 함께 JSON, CSV 및 HTML 보고서를 작성하는 batch policy audit console tool이다
- 새 데모는 archive, accessible, secure, web 같은 공통 요구 집합을 묶은 policy profile을 제공하며, 명시적 command-line switch가 profile 값을 덮어쓰고, 18개 문서 언어 모두를 위한 localized demo guide를 포함한다
Version 3.67.4
변경
EncryptFile및DecryptFile이 이제 large classic-xref PDFs에 direct AES-256 rewrite path를 사용해, 모든 object를 불러와 다시 직렬화하는 대신 암호화된 데이터를 파일 간 스트리밍한다; 2 GB 벤치마크 파일은 이제 Direct File API를 통해 file-to-file AES-256 암호화와 복호화를 result code 1 및LastErrorCode0으로 완료한다
수정
- Direct AES-256 string-token 처리를 수정해 dictionary delimiter가 hex string으로 잘못 인식되지 않도록 하고, 암호화된 빈 문자열이 올바르게 복호화되도록 했다
Version 3.67.3
변경
- DrawShapes, CreateWithImage, CreateTable, EditFormField, EmbeddedFonts용 Delphi 및 C++Builder 데모를 확장하여 생성된 PDF가 이제 최소한의 단일 작업 출력이 아니라 실제적인 그리기, 이미지 배치, 표 레이아웃, 양식 필드 스타일 지정, 글꼴 포함 비교 워크플로를 보여줍니다
수정
- CreateTable 데모가 표를 렌더링하기 전에 명시적인 A4 페이지 크기를 설정하도록 수정되어 Delphi 샘플의 이전 미초기화 페이지 크기 변수를 피합니다
Version 3.67.2
수정됨
- v3.67.0에서 도입된 로더 측 지연 감지로 인한 회귀를 수정했습니다. 콘텐츠 기능 감지가 저장 시점에 실행되어 명시적으로 요청한 저장 버전(SetInformation 0)이나 잠긴 버전(LockSaveVersion)을 덮어쓸 수 있었고, 그 결과 엄격한 하위 버전 저장이 상위 버전 콘텐츠를 더 이상 거부하지 않거나 잠긴 버전이 위로 이동할 수 있었습니다. 이제 감지는 명시적 버전 설정보다 먼저 실행되며, 로드된 문서가 아니라 새로 생성된 문서에서는 실행되지 않아 지연 로딩 시간 절감은 유지하면서 v3.67.0 이전의 버전 제어 동작을 복원합니다
Version 3.67.1
변경됨
- 기능 감지는 이제 객체 사전만 검사하고 스트림 본문은 건너뛰는 얕은 파싱으로 스트림 객체를 읽습니다. 감지 스캔은 스트림 내용을 검사하지 않으므로 큰 이미지 스트림이 있는 문서에서 감지 중 본문 바이트를 읽지 않게 되어, 한 번의 감지 패스에서 객체 읽기 시간이 약 40% 줄어듭니다(2 GB, 160만 개 객체 파일에서 약 20 s 대신 13 s). 감지된 기능 목록과 유효 PDF 버전은 동일하게 유지됩니다
Version 3.67.0
변경
- 로더 측 콘텐츠 기능 감지가 이제 지연 실행(lazy)됩니다 – 로딩 중 전체 문서를 스캔하는 대신, 유효 PDF 버전이나 감지된 기능 목록을 조회할 때 또는 문서를 저장할 때 같은 첫 사용 시점에 실행되며, 페이지 수 계산, 텍스트 또는 이미지 추출, 렌더링처럼 버전을 조회하지 않고 다시 저장하지도 않는 읽기 전용 작업은 스캔을 완전히 건너뛰어 매우 큰 문서의 로딩 시간을 약 80% 단축하고(2 GB, 160만 객체 파일에서 56초 대신 약 10초), 감지된 기능 집합과 유효 PDF 버전은 감지가 실행된 후에도 동일하게 유지됩니다
Version 3.66.1
변경
- 여러 페이지로 된 매우 큰 문서의 로딩이 이제 훨씬 빨라졌습니다: 로더 측 콘텐츠 기능 감지가 결과를 바꿀 수 없는 규칙 검사(이미 일치한 규칙과 특정 객체에 적용할 수 없는 규칙 모두)를 건너뛰어, 감지된 기능과 유효 PDF 버전을 동일하게 유지하면서 거대한 파일의 로딩 시간을 약 절반으로 줄입니다
Version 3.66.0
변경됨
- 매우 큰 다중 페이지 문서를 로드할 때 최대 메모리 사용량이 대폭 줄어듭니다. 로더 측 콘텐츠 기능 감지가 더 이상 전체 객체 모델을 한 번에 구현하지 않고 – 랜덤 액세스 리더를 통해 객체를 하나씩 스트리밍합니다 – 이를 통해 대용량 파일에서 working set 최댓값이 약 90 % 감소하며 감지된 기능과 유효한 PDF 버전은 동일하게 유지됩니다.
Version 3.65.0
추가됨
- 이제 2 GB보다 큰 문서를 열 수 있습니다. 문서 크기를 약 2 GB로 제한하던 기존 메모리 내 버퍼가 제거되었습니다.
변경됨
- 파일에서 PDF를 로드할 때 전체 문서를 메모리에 버퍼링하는 대신 객체 데이터를 소스에서 필요 시 읽어오므로 대용량 파일의 최대 메모리 사용량이 크게 줄어듭니다.
- 파일에서 로드한 문서는 문서를 닫거나 지울 때까지 공유 읽기 액세스로 해당 파일을 열어 둡니다.
수정됨
- %PDF- 헤더 앞에 선행 바이트가 있는 문서를 로드할 때와 잘못된 형식의 cross-reference 데이터를 처리할 때의 견고성이 향상되었습니다.
Version 3.64.0
변경됨
- 매우 크거나 객체가 많은 PDF에 대한 Direct API 작업 – EncryptFile, DecryptFile, DASaveAsFile – 이 이제 훨씬 빨라졌으며 더 이상 멈추지 않습니다. 이전에는 완료할 수 없었던 약 160 만 개의 객체가 있는 2 GB 문서가 이제 약 1분 만에 암호화되며, 처리 시간은 객체 수가 증가함에 따라 급격히 악화되지 않고 문서 크기에 거의 선형으로 비례합니다.
- 대용량 문서의 암호화가 크게 빨라졌습니다 – 이전에 몇 분이 걸리던 작업이 이제 몇 초에서 약 1분 만에 완료됩니다 – 암호화 강도, 암호문 호환성 또는 출력의 변경 없이.
Version 3.63.0
수정됨
- 내부 바이트 오프셋이 32비트 경계(약 2 GB)를 넘는 대용량 PDF 파일을 로드할 때 발생하는 프로세스 충돌을 수정했습니다. 이제 로더가 전체적으로 64비트 오프셋을 사용하므로 2 GB에 가까운 파일이 안정적으로 로드되고, 2 GB 이상의 파일은 충돌하지 않고 로드 오류를 정상적으로 보고합니다.
Version 3.62.0
변경됨
- AES-256-CBC 암호화 및 복호화가 이제 64비트뿐만 아니라 32비트 Windows에서도 하드웨어 가속 AES-NI 경로를 사용하며, AES-NI가 없는 프로세서에서는 이식 가능한 C 구현으로 자동 폴백이 계속 유지됩니다. 암호문은 모든 플랫폼에서 변경되지 않습니다.
Version 3.61.0
변경됨
- AES-256-CBC 암호화 및 복호화가 이제 64비트 Windows에서 하드웨어 가속 AES-NI 백엔드를 사용하며, AES-NI가 없는 프로세서에서는 이식 가능한 소프트웨어 구현으로 자동 폴백됩니다. 암호문은 모든 플랫폼에서 동일하며, 비밀번호 기반 AES-256 PDF 암호화의 속도만 변경됩니다.
Version 3.60.0
추가됨
MergeFileList은(는) 이제 입력 문서의 논리 구조(Tagged PDF) 트리를 첫 번째 문서의 트리만 보존하고 나머지를 도달할 수 없는 객체로 남겨 두는 대신, 도달 가능한 단일 구조 트리로 병합합니다. 최상위 구조 요소, parent tree(페이지/StructParents및 주석/StructParent키 재매핑 포함),/RoleMap,/ClassMap,/IDTree가 결합되며 병합된 카탈로그는 Tagged로 표시됩니다(/MarkInfo /Marked true).
변경됨
/RoleMap,/ClassMap또는/IDTree키가 충돌하는 문서를 병합할 때는 첫 번째 항목이 유지됩니다. 빠른 경로(MergeFileListFast)는 계속해서 구조 정보를 삭제합니다.
Version 3.59.0
변경됨
MergeFileList가 이제 문서를 단일 패스로 병합하여(O(N²)가 아닌 O(N)) 많은 파일의 병합 속도가 크게 빨라지며, 빠른 경로에 추가된 다중 문서 북마크 병합 기능도 제공합니다.- 기본적으로
MergeFileList는 이제 읽을 수 없거나 암호화된 입력 파일을 건너뛰고 나머지를 계속 병합하며, 첫 번째 잘못된 파일에서 전체 작업을 중단하지 않습니다. 이전의 첫 실패 시 중단 동작을 복원하려면 새로운MergeFileListStrict를 사용하세요. - 입력의 논리 구조(Tagged PDF) 객체가 이제
MergeFileList에 의해 보존됩니다(빠른 경로는 계속 이를 삭제합니다).
추가됨
MergeFileListStrict는 파일 목록을 병합하지만 첫 번째 읽을 수 없거나 암호화된 파일에서 중단하여 이전 버전의 엄격한 실패 시 중단 의미를 유지합니다.
Version 3.58.0
추가됨
MergeFileListFast가 이제 모든 입력 파일의 문서 개요(북마크)를 병합하므로, 빠른 병합 경로가 AcroForm 양식 필드뿐만 아니라 북마크도 유지합니다.- 병합된 북마크는 계층 구조와 페이지 대상을 유지하며, 병합된 출력의 최상위 북마크 수는 입력의 합계와 같습니다.
Version 3.57.1
변경됨
- 매우 큰 문서에서 Direct File API 저장(
DASaveAsFile,DASaveToStream,DASaveCopyToStream)이 크게 빨라졌습니다. 변경되지 않은 객체는 다시 구문 분석하거나 직렬화하지 않고 원본 파일 바이트를 그대로 재사용합니다. 60,000페이지 / 883 MB 문서의 다시 저장이 약 33초에서 약 23초로 단축되었습니다.
Version 3.57.0
변경됨
TPDFlib.MergeFileListFast의 다중 문서 병합 성능이 더욱 최적화되었습니다. 추가된 문서의 변경되지 않은 비스트림 객체는 이제 바이트 수준 간접 참조 이동을 통해 원본 소스 바이트에서 직접 재사용되어 파싱 및 재직렬화 왕복 처리를 건너뛰고 다중 페이지 문서의 처리량을 개선합니다. 병합 출력은 변경되지 않으며 페이지 수가 동일합니다.- 스트림을 포함하거나 구조 트리에 속하는 객체는 기존 디코드 경로를 계속 사용하므로 더 빠른 바이트 경로는 안전하다고 증명된 경우에만 적용됩니다.
Version 3.56.44
변경됨
TPDFlib.MergeFileListFast는 병합 메타데이터를 미리 할당하고 첫 번째 문서의 변경되지 않은 객체를 원본 소스 데이터에서 직접 쓰도록 최적화되었습니다. 빠른 다중 파일 병합에서 메모리 이동과 피할 수 있는 객체 디코드/출력 작업을 줄입니다.- Delphi
MergePDFGUI는 이제 빠른 모드 결과 로그를 일괄 기록하고 메모 전체 텍스트를 반복 스캔하지 않아, 병합 완료 후 큰 입력 목록에서도 더 나은 응답성을 유지합니다.
Version 3.56.43
변경됨
- 일반
TPDFlib.MergeFileList병합 경로를 최적화하여 추가 입력마다 커지는 중간 PDF를 복사하지 않고 중간 임시 파일을 번갈아 사용하도록 했습니다. 여러 파일 워크플로에서 디스크 I/O를 줄이면서 기존 반환 개수 계약을 유지합니다.
Version 3.56.42
추가됨
- 저장 중 암호화된 stream을 되돌릴 때 입력 버퍼와 결과 대상이 같은 경우를 위한 AES 회귀 테스트를 추가했으며, 이전 실패를 드러낸 504 KB 대형 페이로드도 포함했습니다.
변경됨
- 일반 API의
LoadFromFile,Encrypt,SaveToFile, 다시 로드,Decrypt,SaveToFile워크플로가 큰 로드된 PDF에서도 다시 완료되며, 복사량을 줄인 AES-CBC 복호화 최적화는 유지됩니다.
수정됨
- v3.56.41에서 도입한 버퍼 기반 AES-256 복호화 경로를 수정하여 호출자가 암호문 버퍼를 제공한 동일한
AnsiString에 복호화 결과를 다시 대입해도 액세스 위반이 발생하지 않도록 했습니다.
Version 3.56.41
추가됨
- 전체 일반 객체 그래프를 구축하지 않고 페이지 수와 변경 없는 파일 복사본이 필요한 Direct Access 워크플로를 위해
TPDFlib.DACopyFile을 추가했습니다. - Delphi
HugeFileBenchmarkdemo에direct-copy행과 대용량 파일 집중 실행을 위한--ops,--skip필터를 추가했습니다.
변경됨
- 버퍼 기반 AES-CBC 복호화 경로를 추가하고 로드된 문자열과 stream 복호화에 사용하여 AES-256 복호화를 최적화했으며, 큰 암호화 stream에서 추가 암호문 복사를 줄였습니다.
Version 3.56.40
변경됨
- Delphi 및 C++Builder
HelloWorld데모는 이제 동일한 빌드 및 실행 흐름을 유지하면서 문서 정보, 선택된 표준 글꼴 출력, 스타일이 적용된 제목 블록, 간단한 벡터 그리기, 다음 단계 안내를 포함하는 더 풍부한 시작 PDF를 만듭니다. - Delphi 및 C++Builder 데모의 모든 노트를 브라우저 친화적인
Readme.html페이지로 교체했습니다. 암호, 제한된 파일, 서명 결과에 대한 보조 노트도 포함되며, 데모 인덱스는 이제 사용자를 HTML 노트로 안내합니다.
Version 3.56.39
변경됨
- 직접 파일 API 저장 경로는 이제 교차 참조 조회 테이블을 선형으로 생성하므로, 객체 수가 매우 많거나 페이지 트리가 조밀한 PDF에서
DASaveAsFile및 관련 직접 저장 경로가 훨씬 빨라집니다. - 최적화된 writer는 동일한 free-object chain 의미를 유지하면서 전체 xref 생성 중 반복적인 객체 번호 스캔을 피합니다. 이를 통해 공개 API나 출력 계약을 변경하지 않고 대형 직접 저장 워크플로를 개선합니다.
Version 3.56.38
변경됨
- 일반 API의
LoadFromFile,Encrypt,SaveToFile, 다시 로드,Decrypt,SaveToFile워크플로는 이제 명시적Decrypt전까지 암호화 상태를 유지하며, 큰 레거시 PDF에 대한 직접 파일 API 동작과 일치합니다.
수정됨
- 일반 API 암호화 출력을 수정하여
Encrypt가 AES-256 보안 데이터를 쓰기 전에 trailer/ID를 생성하거나 유지하도록 했습니다. 따라서 암호화된 PDF를 다시 로드해도EncryptionStatus로 감지할 수 있습니다.
Version 3.56.37
추가됨
TPDFlib.ComparePreflightReports가 추가되었습니다. 일반 텍스트 preflight 보고서를 줄 단위로 비교하고, 변동되는Generated:타임스탬프 줄은 무시하며, 안정적인 보고서 내용이 일치하면 빈 문자열을 반환합니다.- Delphi
PreflightReport데모는 이제 단일 파일 모드에서--compare <file>을 지원하며, 생성된 텍스트 보고서가 baseline과 다를 때 UTF-8.diff.txt보고서를 쓰고 종료 코드 2를 반환합니다.
Version 3.56.36
추가됨
- Delphi
PreflightReport데모는 이제--input-dir,--output-dir,--recursive를 사용한 디렉터리 일괄 실행을 지원하며, 각 PDF마다<basename>.preflight.<ext>형식의 보고서를 씁니다.
변경됨
- 일괄 모드는 각 원본 PDF, pass/fail 상태, 문제 수, 생성된 보고서 경로를 기록하는 UTF-8
preflight-summary.csv파일을 쓰며, 자동화를 위한 기존 종료 코드 계약은 유지됩니다.
Version 3.56.35
추가됨
ReportFormat = 3은TPDFlib.CreatePreflightReportEx와TPDFlib.SavePreflightReportEx에 CSV 출력을 추가하여 보고서 메타데이터, 선택된 각 준수 검사, 개별 문제 코드와 메시지, 최종 요약을 UTF-8 행으로 생성합니다.- Delphi
PreflightReport데모는 이제--format csv와--csv를 지원하므로 명령줄 preflight 실행 결과를 JSON 후처리나 텍스트 추출 없이 스프레드시트 또는 간단한 CI 파서에 전달할 수 있습니다.
Version 3.56.34
추가됨
- 형식 인식 API
TPDFlib.CreatePreflightReportEx및TPDFlib.SavePreflightReportEx를 추가하여 기존 텍스트 전용 보고서 API를 유지하면서 PDF/A 및 PDF/UA-1 preflight 보고서를 일반 텍스트, JSON 또는 독립 HTML로 생성할 수 있게 했습니다. - Delphi
PreflightReport데모는 이제--format text|json|html과--json,--html단축 옵션을 지원하므로 같은 명령줄 워크플로에서 사람이 읽는 보고서나 기계가 읽는 CI 산출물을 만들 수 있습니다.
Version 3.56.33
추가됨
TPDFlib.CreatePreflightReport및TPDFlib.SavePreflightReport를 추가하여 애플리케이션이 문자열 목록 핸들을 직접 열거하지 않고도 내장 PDF/A 및 PDF/UA-1 준수 검사에서 재사용 가능한 일반 텍스트 보고서를 생성할 수 있게 했습니다.
변경됨
- Delphi
PreflightReport데모는 이제 라이브러리 수준 보고서 API를 직접 호출하므로, 예제는 명령줄 워크플로, 선택된 검사, 첫 번째 문제 모드, 자동화에 적합한 종료 코드에 집중합니다.
Version 3.56.32
추가됨
- 새 Delphi 콘솔 데모
PreflightReport를 추가했습니다. 이 데모는CheckFileCompliance로 PDF/A 및 PDF/UA-1 검사를 실행하고,GetStringListCount와GetStringListItem으로 문제 목록을 열거한 뒤 일반 텍스트 preflight 보고서를 작성합니다.
변경됨
- 이 데모는
--input,--output,--pdfa,--pdfua,--both,--first-issue옵션과 자동화에 적합한 통과, 문제 발견, 런타임 오류 종료 코드를 지원합니다.
Version 3.56.31
변경됨
GetCustomKeys(2)는 이제 라이브러리에서 관리하는 Catalog 시스템 항목을 일관되게 숨기며, 여기에는 /OutputIntents, /Extensions, /Requirements, /Collection 및 /NeedsRendering가 포함됩니다.
수정됨
SetPDFAMode함수에 의해 생성되는 PDF/A 출력 설정은 더 이상 사용자 정의 카탈로그 키로 표시되지 않으며, 이를 통해 애플리케이션 메타데이터 열거를 PDF 규정 준수 구조와 분리할 수 있습니다.
Version 3.56.25
변경됨
- 작성 측면에서 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 탐색 패턴을 사용합니다.
Version 3.56.24
변경됨
- PDF/UA-1 감사 기능에 ISO 14289-1 §7.4.4 H 태그 고유성 검사가 추가되었습니다.
10044은 하나 이상의 직접 하위 요소인 H를 가진 모든 구조 노드를 보고합니다. —은 사양이 엄격하게 구조화된 문서에서 이를 금지하며, 전체 구조 모드와 관계없이 모든 태그 트리 노드에 동일한 제약이 적용됩니다. 다른 § 7.4.4 SHALL (문서는 엄격하거나 약하게 구조화되어야 하며, 둘 다일 수 없음)은 문서 전체에 대한 휴리스틱이 필요하며, 의도적으로 이 감사에서는 제외되었습니다. - 새로운 전위 구조 트리 탐색기 (UAVisitStructNodeForHUniqueness / ScanStructTreeForHUniqueness)는 각 노드에서 직접 H 하위 요소의 개수를 세고 깊이 우선 방식으로 재귀합니다. 기존의 제목/목록/참조 탐색기와 동일한 K-형 디코더를 재사용합니다.
Version 3.56.23
추가됨
- 새로운
Lib/PDFlibPDFUAFontInspect.pas은 허용적인 SFNT 테이블 디렉토리 탐색기 및 cmap 하위 테이블 디렉토리 파서를 구현합니다. 이전 인프라 커밋에서 스캐폴드로 추가된 4281개의 이름을 가진 Adobe Glyph List 테이블이 Differences 검사를 통해 연결되었습니다. SFNT (Type 1 PFB / PFA, OpenType 컬렉션, 임의의 쓰레기)로 파싱되지 않는 프로그램은 조용히 건너뜁니다. 감사 단계에서는 오탐보다 오탐이 선호됩니다.
변경됨
- 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에 포함되어야 한다고 명시하고 있습니다.
Version 3.56.22
변경됨
- 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 시리즈 이후의 첫 번째 하위 클래스입니다.
Version 3.56.21
추가됨
- 새로운
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항목과 함께 사용하는 것을 금지합니다. 호출자는 두 항목을 모두 설정하지 않도록 해야 합니다.
Version 3.56.20
추가됨
- 새로운
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태그를 사용하여 카탈로그를 탐색하는 도구가 부모 경로를 다시 확인하지 않고도 구조를 인식할 수 있습니다.
Version 3.56.19
추가됨
- 새로운 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플레이스홀더에 삽입합니다. - 새로운
SetSignProcessReserveContentsBytes은 초기 서명 시점에/Contents플레이스홀더를 확장하여 사후 증강된 CMS이 원래 예약 공간을 초과하지 않도록 합니다. 일반적으로 TSA에서 발급된 TimeStampTokens은 SignerInfo에 2-6 KB을 추가합니다. 여유 공간을 확보하려면 1024-8192를 전달하십시오. 충분한 여유 공간이 없으면 증강 호출은13(출력 오버플로우)을 반환합니다.
변경됨
BuildPAdESSignatureTimeStampAttribute은 상태가 없는 도우미 함수로, TSA에서 발급된 TimeStampToken을 CMS 속성 SEQUENCE에 래핑하며,SignerInfo.unsignedAttrs이 예상하는 형식입니다. 따라서 이미 CMS 라이브러리를 가지고 있는 호출자는 OID + SET과 같은 복잡한 부분을 건너뛸 수 있습니다.- 라이브러리는 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 바이트 경로를 대신 사용합니다.
Version 3.56.18
추가됨
- 새로운 ASN.1 도우미 함수
DER_IntegerFromLittleEndian(Win32CRYPT_INTEGER_BLOB바이트 순서를 처리) 및DER_ContextTagExplicit(페이로드를 컨텍스트별 태그가 포함된 구성된 컨텍스트에 래핑)는PDFlibASN1마이크로 인코더를 완성합니다. 새로운CERT_INFO/CRYPT_ALGORITHM_IDENTIFIER/CRYPT_INTEGER_BLOB/PCERT_CONTEXT선언은PDFlibCryptoAPI에서 서명 경로가 파싱된 인증서 필드에 액세스할 수 있도록 합니다.
변경됨
- 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참조만 제공했습니다.
Version 3.56.17
추가됨
- 새
PDFlibASN1유닛은SigningCertificateV2속성 값을 구성하는 데 사용되는 집중된 DER (X.690) 마이크로 인코더 — length prefix, OCTET STRING, SEQUENCE, SET, OBJECT IDENTIFIER — 를 제공한다. 이 인코더는 base-128 OID arc 의 표준 규칙을 따르며, 선택적인hashAlgorithm필드가 단지 SHA-256 의 기본값을 반복할 뿐이라면 이를 생략한다. 이는 OpenSSL 와 BouncyCastle 의 출력과 일치한다.
변경됨
- 내장
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는 필수 속성만 보유한다. 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 으로 업그레이드된다.
Version 3.56.16
추가됨
- 새
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 를 사용한다.
Version 3.56.15
추가됨
- 새
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 을 선언한다.
Version 3.56.14
추가됨
- 새 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 를 미러링한다.
Version 3.56.8
변경됨
- 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 을 식별하지 않았다.
Version 3.56.13
변경됨
- 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 이 이슈를 마스킹할 것임을 안내하며, 따라서 사용자는 누락된 속성과 자동 복구 동작 양쪽을 이해할 수 있다.
Version 3.56.12
변경됨
- 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 사전은 인라인과 동일하게 동작한다.
Version 3.56.11
변경됨
- 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 태그는 이들 중 하나가 필요하다.
Version 3.56.10
변경됨
- 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 존재) 은 같은 이유로 범위 밖에 머문다 — 폰트 프로그램 검사가 필요하다.
Version 3.56.9
변경됨
- 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로 보고된다. 이는 동일한 위반이 두 코드 아래 이중으로 계산되는 것을 방지한다.
Version 3.56.7
변경됨
- 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 가 저장 시점에 이를 자동 제거함을 안내한다.
Version 3.56.6
변경됨
- 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 였다" 스타일의 문제도 잡는 동반자를 가지게 된다.
Version 3.56.5
변경됨
- 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로 재발행되도록 안내한다.
Version 3.56.4
변경됨
- 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 문자열 목록) 차이를 제외하면 인메모리 진단에서도 도달할 수 있다.
Version 3.56.3
변경됨
- 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 를 깨뜨리지 않고 진화를 계속할 수 있고 그 반대도 마찬가지이다.
Version 3.56.2
변경됨
- 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) 으로 유지한다.
Version 3.56.1
변경됨
- 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 는 없다.
Version 3.56.0
추가됨
- 새 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, 폰트 서브셋) 은 동일한 감사 프레임워크 위에 후속 패치 릴리스로 추적된다.
Version 3.55.6
변경됨
- 새로 생성된 모든 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 경로로 폴백한다.
Version 3.55.5
변경됨
- 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 를 발행한다.
Version 3.55.4
변경됨
- 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 에서 추가) 는 검증 시점에 비컨포밍 출력을 플래그한다.
Version 3.55.3
변경됨
- 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 에서 추가) 는 검증 시점에 누락을 플래그하여 사용자가 문제를 볼 수 있도록 한다.
Version 3.55.2
변경됨
- 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 검증기는 금지된 필터를 출력에 여전히 슬쩍 흘리는 모든 간접 경로에 대해 검증 시점에 두 번째 방어선을 제공한다.
Version 3.55.1
변경됨
- 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 에 대해서만 발동한다.
Version 3.55.0
변경됨
- 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) 로 노출된다.
Version 3.54.0
변경됨
- 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 이다.
Version 3.53.0
변경됨
- 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 와 일치하지 않을 때만 거부할 것이다.
Version 3.52.0
변경됨
- 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.
Version 3.51.0
변경됨
- 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 규약을 사용한다.
Version 3.50.0
변경됨
- 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 값을 플래그한다.
- 필터별 검사 (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 부분에 적용된다.
수정됨
- 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 에서 추가된 유니코드 매핑 컨포먼스 레벨은 이제 검증기에 의해 인식된다.
Version 3.49.0
변경됨
- 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 형식) 로 제공된다.
Version 3.48.0
변경됨
- 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 형식) 로 제공된다.
Version 3.47.0
변경됨
- 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 인터페이스에서 제공된다.
Version 3.46.1
변경됨
- 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 어노테이션을 생성할 수 있다.
Version 3.46.0
변경됨
- 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 는 모든 스트로크의 결합 범위에 작은 패딩을 더해 자동으로 계산되며, 스트로크가 어노테이션 바운딩 박스 안에 들어오도록 한다.
Version 3.45.0
변경됨
- 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 한다.
Version 3.44.1
변경됨
- 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 는 두 끝점에 테두리 너비에 비례한 패딩을 더해 계산되어 끝점 장식이 어노테이션 바운딩 박스 안에 머무르도록 한다.
Version 3.44.0
변경됨
- 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 의 기존 리뷰 워크플로는 생성 후에도 이 어노테이션들을 편집할 수 있다.
Version 3.43.0
변경됨
- 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 속성 분기 양쪽에 적용된다.
Version 3.42.0
변경됨
- 3 개의 새로운 컴플라이언스 검사를 추가했다. 코드 00006 은 암호화된 문서를 플래그한다 (암호화는 모든 PDF/A 버전에서 금지). 코드 00007 은 카탈로그에 OutputIntents 항목이 없는 문서를 플래그한다 (모든 PDF/A 버전에서 필수). 코드 00011 과 00012 는 컨포먼스 레벨이 -a (접근성) 일 때 MarkInfo 또는 StructTreeRoot 가 없는 문서를 플래그한다.
수정됨
- 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 는 레이어를 허용하므로 더 이상 플래그되지 않는다.
Version 3.41.0
변경됨
- 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) 에서는 계속 작동한다.
Version 3.40.0
추가됨
- 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 구조 마커를 자동으로 기록한다.
변경됨
- GetInformation(201) 은 새로운 모드 번호 체계와 일치하여 활성 PDF/A 모드에 해당하는 '1' 부터 '6' 까지 반환한다.
수정됨
- 수정: SetPDFAMode(1) (PDF/A-1a) 는 v3.20.0 에서 도입된 내부 라우팅 버그로 인해 no-op 였다. 이제 /MarkInfo 와 /OutputIntents 를 올바르게 기록하고 XMP pdfaid:part=1/conformance=A 를 설정한다.
Version 3.39.0
변경됨
- 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 인터페이스에서 제공된다.
Version 3.38.0
변경됨
- 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 를 보완한다.
Version 3.37.2
변경됨
- GetPDFUADiagnostics 는 이제 N 개의 대화형 폼 필드 (Widget 어노테이션) 에 TU (툴팁 / 접근 가능한 이름) 항목이 없을 때 FORM-NO-TOOLTIP:N 을 보고한다. ISO 14289-1 §7.18.4 는 모든 대화형 폼 필드가 TU 항목을 가질 것을 요구하여, 필드가 포커스를 받을 때 보조 기술이 사용자에게 필드의 목적을 안내할 수 있도록 한다. /TU 는 스크린 리더가 읽어주는 접근 가능한 이름이며, 프로그래밍 방식의 접근과 폼 제출에 사용되는 부분 필드 이름 /T 와는 별개이다.
Version 3.37.1
변경됨
- GetPDFUADiagnostics 는 이제 N 개의 LI 또는 LBody 구조 요소가 필요한 부모 요소 밖에 나타날 때 LIST-STRUCT:N 을 보고한다. ISO 32000-1 §14.8.4.4 는 LI 가 L (리스트) 의 직접 자식이고 LBody 가 LI (리스트 항목) 의 직접 자식일 것을 요구한다. 잘못된 리스트 중첩은 보조 기술이 리스트 내용을 올바르게 순회하고 안내하지 못하게 하며, PDF/UA-1 검증기에서 문서 구조 검증 실패를 일으킬 수 있다.
Version 3.37.0
변경됨
- 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 인터페이스에서 제공된다.
Version 3.36.1
변경됨
- 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') 을 호출하라.
Version 3.36.0
변경됨
- 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 인터페이스에서 제공된다.
Version 3.35.1
변경됨
- GetPDFUADiagnostics 는 이제 문서 정보 사전 /Title 항목이 없거나 비어 있을 때 DOCINFO-TITLE-MISSING 을 보고한다. PDF/UA-1 (ISO 14289-1) 은 문서가 열릴 때 스크린 리더가 이를 안내할 수 있도록 문서 제목을 요구한다. 기존 DISPLAYDOCTITLE-FALSE 검사는 제목이 뷰어 타이틀 바에 표시되는지 확인하며, DOCINFO-TITLE-MISSING 은 이를 보완한다 — 제목 값 자체가 설정되었는지 확인한다. 값을 공급하려면 SetDocumentInfo('Title', ...) 을 호출하라.
Version 3.35.0
변경됨
- 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 인터페이스에서 제공된다.
Version 3.34.0
변경됨
- 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 인터페이스에서 제공된다.
Version 3.33.1
추가됨
- 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 개의 모든 표준 구조 타입은 인식되어 보고에서 제외된다.
Version 3.33.0
변경됨
- SetStructElemLang 은 현재 열려 있는 구조 요소에 /Lang 항목을 설정하는 새로운 API 이다 (ISO 32000-1 §14.9.2). 언어 태그는 해당 요소와 그 모든 자손에 대해 SetDocumentLanguage 또는 SetPDFUAMode 로 선언된 문서 수준 언어를 재정의하여, 다국어 문서가 각 span 을 올바른 BCP 47 언어 태그 (예: 'en-US', 'fr', 'zh-Hant-TW') 로 표시할 수 있게 한다. 스크린 리더는 요소 수준 /Lang 을 사용하여 문서를 소리 내어 읽을 때 적절한 음성 합성 엔진이나 음성을 선택한다. 함수는 Delphi 라이브러리, ActiveX, DLL 인터페이스에서 제공된다.
Version 3.32.0
변경됨
- SetStructElemActualText 는 현재 열려 있는 구조 요소에 /ActualText 항목을 설정하는 새로운 API 이다 (ISO 32000-1 §14.9.4). 콘텐츠 스트림 추출이 부정확한 결과를 산출할 때 글리프 시퀀스가 나타내는 정확한 유니코드 텍스트를 지정하는 데 사용한다 — 가장 일반적인 경우는 OpenType 합자 글리프 (U+FB00 ff, U+FB01 fi, U+FB02 fl) 와 비명백한 확장형을 가진 약어이다. ActualText 는 렌더링된 내용을 대체하지 않고 보완하며, 시각적 렌더링을 억제하지 않으면서 해당 요소에 대해 보조 기술과 텍스트 추출기가 읽는 것을 재정의한다. 함수는 Delphi 라이브러리, ActiveX, DLL 인터페이스에서 제공된다.
Version 3.31.1
변경됨
- 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 를 호출한다.
Version 3.31.0
수정됨
- 구조 요소 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 텍스트 문자열 배열로 올바르게 처리한다.
Version 3.30.1
추가됨
- GetPDFUADiagnostics 는 이제 문서 순서에서 헤딩 레벨 점프 (예: H2 없이 H1 직후에 H3 이 오는 경우) 를 감지하는 HEADING-LEVEL-SKIP:N 검사를 포함한다. 검사는 전체 구조 요소 트리의 사전 순회를 수행하고 다음 헤딩 레벨이 이전 레벨보다 1 을 초과하는 발생을 세어 보고한다. 일반 H 요소는 H1 로 취급된다. 더 높은 레벨의 헤딩으로 돌아가는 것 (H3 → H1) 은 점프로 계산되지 않는다. WCAG 2.x 성공 기준 1.3.1 과 ISO 14289-1 §7.1 은 헤딩이 공백 없이 중첩될 것을 요구한다.
Version 3.30.0
변경됨
- 이제 태그된 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 인터페이스에서 제공된다.
Version 3.29.1
추가됨
- GetPDFUADiagnostics 는 이제 두 가지 추가 검사를 포함한다. 문서의 Figure 구조 요소 중 Alt 텍스트 값이 없는 것이 있는지 (FIGURE-NO-ALT:N 으로 보고, ISO 14289-1 §7.5 와 ISO 32000-1 §14.9.3 에 따름), 그리고 EndTag 가 호출되지 않아 아직 열려 있는 구조 요소가 있는지 (STRUCT-UNCLOSED:N 으로 보고) 검사한다. Figure 검사는 구조 요소 트리의 완전한 재귀 순회를 수행하여 모든 중첩 깊이의 요소를 다룬다.
Version 3.29.0
변경됨
- 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 인터페이스에서 제공된다.
Version 3.28.5
변경됨
- PDF/UA-1 어노테이션 접근성 개선: FileAttachment 어노테이션에 Contents 항목과 /T 필드가 모두 없을 때, 어노테이션의 임베디드 파일 사양 (/FS /UF 또는 /F) 의 파일명이 이제 대체 접근 가능한 설명으로 사용된다. 이로써 어노테이션 Contents 폴백 체인이 완성된다: /T → Link URI → Stamp 이름 → FileAttachment 파일명. 스크린 리더는 침묵 대신 첨부 파일의 이름을 받게 되어, 가장 일반적인 어노테이션 타입에 대해 ISO 14289-1 §7.18.1 을 충족한다.
Version 3.28.4
변경됨
- PDF/UA-1 어노테이션 접근성 개선: Stamp 어노테이션에 Contents 항목이 없거나 (또는 비어 있고) /T 필드가 없을 때, 어노테이션의 /Name 항목의 스탬프 타입 이름이 이제 대체 접근 가능한 설명으로 사용된다 (예: "Approved", "Draft", "Confidential", "Final"). 이는 v3.28.3 에서 도입된 어노테이션 Contents 폴백 체인을 스탬프 어노테이션을 다루도록 확장하며, 검토 또는 승인된 문서가 관련된 워크플로에서 흔하고 명시적 Contents 값이 자주 없다.
Version 3.28.3
변경됨
- PDF/UA-1 어노테이션 접근성 개선: Link 어노테이션에 Contents 항목이 없거나 (또는 비어 있고) /T 필드가 없을 때, 어노테이션의 URI 액션의 URI 가 이제 대체 접근 가능한 설명으로 사용된다. 이는 SetPDFUAMode 처리 중에만 그리고 /URI 액션을 가진 Link 어노테이션에만 적용된다. 스크린 리더는 마지막 수단의 레이블로 URL 을 받아, 작성자가 사람이 읽을 수 있는 설명을 제공하지 않고 하이퍼링크를 만드는 일반적인 경우에 ISO 14289-1 §7.18.1 을 충족한다.
Version 3.28.2
변경됨
- SetEmbeddedFileAFRelationship 는 임베디드 파일의 파일 사양 사전에 AFRelationship 값을 명시적으로 설정하기 위한 새로운 API 이다. ISO 14289-1 (PDF/UA-1) §7.11 에서 요구되며, 호출자가 다섯 가지 유효한 값 중 선택하여 임베디드 파일과 문서 콘텐츠의 의미론적 관계를 지정할 수 있게 한다: Source, Data, Alternative, Supplement, Unspecified. SetPDFUAMode 가 활성화되면 AFRelationship 키가 없는 임베디드 파일은 자동으로 Unspecified 가 할당된다. 저장 전에 이 함수를 사용하여 그 기본값을 재정의한다. Delphi 라이브러리, ActiveX, DLL 인터페이스에서 제공된다.
Version 3.28.1
변경됨
- XMP 메타데이터에 문서별 제목이 아닌 일반 라이브러리 기본 제목이 있는 문서에서 SetPDFUAMode 가 호출되면, 이제 제목이 자동으로 문서의 /Info Title 항목의 값으로 대체된다 (있는 경우). 이로써 pdfuaid:part-1 XMP 패킷이 자리표시자가 아닌 실제 문서 제목을 반영하여 PDF/UA-1 검증기 기대치를 충족한다.
- XMP 파서 (LoadFromString) 는 이제 문서가 로드될 때 기존 XMP 메타데이터에서 dc:title 값을 읽으므로, 이미 dc:title 이 있는 PDF 를 라운드트리핑할 때 해당 제목이 기본 자리표시자로 되돌아가지 않고 올바르게 보존된다.
Version 3.28.0
변경됨
- 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 도 내보내진다.
Version 3.27.2
수정됨
- 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 을 작성하던 이전의 부정확한 출력을 수정한다.
Version 3.27.1
변경됨
- PDF/UA 모드가 활성화되고 문서에 임베디드 파일이 있을 때, AFRelationship 항목이 없는 각 파일 사양 사전이 이제 저장 시 자동으로 하나를 받는다. 작성되는 값은 /Unspecified 이며, 모든 임베디드 파일이 AFRelationship 키를 가질 것을 요구하는 ISO 14289-1 §7.11 의 요구 사항을 충족한다. 이는 EmbedFile 을 통해 추가된 파일과 로드된 문서에 이미 존재하는 임베디드 파일 모두에 적용된다.
Version 3.27.0
변경됨
- AddRoleMap(CustomType, StandardType) 은 사용자 정의 (비표준) 구조 요소 타입 이름에서 표준 PDF 구조 타입으로의 매핑을 등록하는 새로운 태그된 PDF API 이다. 저장될 때 매핑은 구조 트리 루트의 RoleMap 사전에 작성되어, 애플리케이션 별 태그 이름을 사용하는 문서에 대한 ISO 14289-1 §7.1 요구 사항을 충족한다. 여러 매핑이 등록될 수 있으며, 중복 키는 마지막 호출로 덮어쓴다. DLL 진입점 DLAddRoleMap 과 DLAddRoleMapA 도 내보내진다.
Version 3.26.0
변경됨
- BeginTagEx(TagType, AltText, ActualText, Lang) 는 BeginTag 를 확장하여 명시적인 자연 언어 속성을 가지는 새로운 태그된 PDF API 이다. Lang 이 비어 있지 않으면 구조 요소의 /Lang 속성에 작성되어, 다국어 문서에 대해 ISO 14289-1 §7.2 가 요구하는 요소별 언어 어노테이션을 가능하게 한다. 빈 Lang 문자열을 전달하면 BeginTag 와 동일하게 동작한다. DLL 진입점 DLBeginTagEx 와 DLBeginTagExA 도 내보내진다.
Version 3.25.1
변경됨
- 기본 Windows 코드 페이지 (WinAnsiEncoding) 로 로드된 비서브셋 TrueType 폰트가 이제 ToUnicode CMap 스트림을 받아, 이 폰트들에 대해 신뢰할 수 있는 유니코드 텍스트 추출과 복사/붙여넣기를 가능하게 한다. 이전에는 명시적 코드 페이지 재정의나 Differences 배열이 있을 때만 ToUnicode 스트림이 작성되었으며, 일반적인 기본 인코딩 경로에서는 누락되어 있었다.
- 동일한 수정이 명시적 비기본 코드 페이지를 사용하지만 Differences 배열이 없는 TrueType 폰트와 패키지된 폰트 형식으로 로드된 폰트에도 적용된다.
Version 3.25.0
변경됨
- PDF/UA 모드가 활성화되면, Contents 항목이 비어 있지 않은 항목이 없는 비면제 어노테이션 (Widget, PrinterMark, TrapNet 을 제외한 모든 타입) 이 이제 저장 시 자동으로 하나를 받는다. 어노테이션의 /T (제목 / 작성자) 값이 폴백으로 사용되어, 제목은 있지만 명시적인 접근 가능한 설명이 없는 어노테이션에 대해 ISO 14289-1 §7.18.1 을 충족한다.
Version 3.24.0
변경됨
- PDF/UA 모드가 활성화되면, TU (툴팁 / 대체 설명) 항목이 없는 대화형 폼 필드가 이제 저장 시 자동으로 하나를 받는다. 필드의 부분 이름 (/T 항목) 이 폴백 값으로 사용되어, 스크린 리더가 모든 필드를 식별할 수 있도록 보장한다. 푸시 버튼은 ISO 14289-1 §7.18.4 에 따라 이 요구 사항에서 올바르게 제외된다.
Version 3.23.1
변경됨
- GetInformation(200) 은 선택된 문서에서 PDF/UA-1 모드가 활성화되었을 때 '1' 을 반환하여, 호출자가 런타임에 컨포먼스 모드 상태를 조회할 수 있게 한다.
- GetInformation(201) 은 PDF/A-1a 에 대해 '1', PDF/A-1b 에 대해 '2', 또는 PDF/A 모드가 꺼져 있으면 빈 문자열을 반환한다.
- GetInformation(313) 은 저장 대상이 현재 잠겨 있는 PDF 버전 문자열을 반환하거나, 자유롭게 버전화되는 문서에 대해 빈 문자열을 반환한다.
수정됨
- GetInformation(311) 과 GetInformation(312) 는 이제 가장 최근의 버전 잠금 충돌의 버전 요구 문자열과 기능 이름을 올바르게 반환한다 (v3.20.3 항목에서 광고되었지만 아직 구현되지 않았었음).
Version 3.23.0
변경됨
- 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 참조 문서가 전체 구문 표와 사용 예제와 함께 추가되었다.
Version 3.22.0
변경됨
- 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 스트림을 받아, 이 폰트 타입에 대해 신뢰할 수 있는 유니코드 텍스트 추출과 복사/붙여넣기를 가능하게 한다.
Version 3.21.0
변경됨
- 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 를 통해 의미 있는 레이블을 할당할 수 있게 한다.
Version 3.20.3
변경됨
- Encrypt 와 AddSWFAnnotationFromFile 는 이제 저장 버전이 선택된 암호화 강도나 어노테이션 타입이 요구하는 최소값 아래로 잠겨 있을 때, 자동으로 진행하다가 저장 시에만 실패하는 대신, LastErrorCode 602 와 함께 즉시 0 을 반환한다.
- GetInformation(311) 과 GetInformation(312) 는 이제 잠긴 버전이 AES-256 이나 RichMedia 어노테이션 같은 확장 수준 기능을 차단할 때 작성 시점의 충돌하는 버전 요구 사항을 반영한다.
Version 3.20.2
변경됨
- AddU3DAnnotationFromFile 는 이제 더 낮은 버전의 문서에 3D 어노테이션이 추가될 때 문서 버전을 자동으로 PDF 1.6 으로 bump 하며, 다른 모든 PDF 1.6+ API 진입점의 버전 자동 bump 동작과 일치한다.
Version 3.20.1
변경됨
- 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 개는 스킵되었다.
Version 3.20.0
변경됨
- 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 에 기록된다.
Version 3.19.0
변경됨
- 저장 시점과 로드 시점의 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 개의 새 규칙).
Version 3.18.6
변경됨
- 저장 시점과 로드 시점의 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 개의 새 규칙).
Version 3.18.5
추가됨
- 새 규칙: AcroForm /NeedAppearances 는 PDF 1.5 Table 218 에 따라 PDF 1.5 기능으로 인식된다.
변경됨
- PDFFeatureRules 테이블은 이제 96 개의 규칙을 가진다 (95 + 1 개의 새 규칙).
수정됨
- 저장 시점과 로드 시점의 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)" 를 도입한다.
Version 3.18.4
추가됨
- zlib-ng 회귀 커버리지는 이제 Delphi 와 C++Builder 테스트 러너에서 경계 크기 페이로드, PNG 와 유사한 스캔라인 데이터, 저장된 다중 블록 스트림, 알려진 zlib 스트림을 포함한다.
변경됨
- PDFlibZLib 는 이제 정상적인 라이브러리 빌드에서 항상 번들된 정적 zlib-ng 객체 백엔드를 사용하며, 남아 있던 System.ZLib 폴백 경로를 제거했다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 194/194 통과했고, C++Builder Win64x GoogleTest 는 58 개 테스트 통과, 기존 샘플 의존 테스트 2 개는 스킵되었다.
Version 3.18.3
변경됨
- PDF 또는 텍스트 출력을 생성하는 Delphi 와 C++Builder 데모가 이제 성공적인 저장 후 자동으로 생성된 문서를 연다.
- 인스톨러 패키징은 이제 데모 폴더에서 빌드 산출물을 제외하고, C++Builder 샘플과 DLL 및 ActiveX/OCX 모듈을 옵트인 컴포넌트로 만든다. 일치하는 파일은 컴포넌트가 선택될 때만 설치된다.
Version 3.18.2
변경됨
- Delphi 와 C++Builder EditFormField 데모는 이제 필드 값을 갱신하기 전에 /NeedAppearances 를 지우므로, 편집된 모든 텍스트 필드가 저장된 PDF 에서 새로 고친 normal 외관 스트림을 받는다.
- 이는 저장된 /AP 스트림이 저장된 /V 값과 동기화되도록 유지하고, 필드에 포커스를 맞추면 정적 필드 외관에 누락되어 있던 텍스트가 드러나는 뷰어 의존적인 차이를 피한다.
Version 3.18.1
변경됨
- 저장 시점과 로드 시점의 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 통과했다.
Version 3.18.0
변경됨
- 저장 시점과 로드 시점의 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 통과했다.
Version 3.17.0
변경됨
- 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 통과했다.
Version 3.16.3
추가됨
- 새로운 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 통과했다.
Version 3.16.2
변경됨
- 로드된 PDF 가 이제 GetInformation(103) ("ContributorFeatures") 을 통해 로드 시점 기능 감지의 기여자 전용 뷰를 노출한다. 목록은 최소 요구 버전이 HeaderVersion (키 100) 보다 엄격히 큰 기능만 포함하며, "왜 효과적인 버전이 파일 헤더보다 높은가?" 라는 질문에 직접 답한다.
- GetInformation(101) ("DetectedFeatures") 은 변경되지 않으며 기여 여부에 관계없이 일치한 모든 기능을 계속 나열한다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 181/181 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
Version 3.16.1
추가됨
- 로더 측 감지 테스트 커버리지를 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 통과했다.
Version 3.16.0
추가됨
- 새 GetInformation 키: 100 은 HeaderVersion (리터럴 %PDF-X.Y) 을 반환하고, 101 은 DetectedFeatures (로드 시 일치한 CRLF 로 구분된 기능) 를 반환하며, 102 는 AutoBumpedFeatures (writer 측 EnsureMinVersion 을 트리거한 CRLF 로 구분된 기능) 를 반환한다.
변경됨
- 로드된 PDF 문서는 이제 콘텐츠 기반 버전 감지 패스를 거친다. 모든 간접 객체가 저장 시점 게이트가 사용하는 기능 대 최소 버전 테이블을 통해 순회되며, 콘텐츠가 실제로 더 높은 버전을 요구할 때 FVersion 이 리터럴 %PDF-X.Y 헤더 값 위로 bump 된다. 예를 들어 /UserUnit 페이지 항목은 파일 헤더가 PDF 1.4 라고 하더라도 효과적인 버전을 PDF 1.6 으로 bump 한다.
- 저장 시점 게이트는 영향을 받지 않는다. 로드 시 효과적인 버전이 bump 된 후 SetInformation(0, ...) 으로 명시적으로 다운그레이드된 문서도 저장 시점에 여전히 LastErrorCode 602 를 생성한다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 173/173 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
Version 3.15.0
변경됨
- 특정 최소 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 통과했다.
Version 3.14.3
변경됨
- 저장 시점 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 통과했다.
Version 3.14.2
변경됨
- 저장 시점 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 통과했다.
Version 3.14.1
변경됨
- 저장 시점 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 통과했다.
Version 3.14.0
변경됨
- 저장 시점 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 통과했다.
Version 3.13.0
변경됨
- 저장 시점에 후기 버전 기능을 거부하는 PDF 버전 컴플라이언스 게이트를 전용 모듈로 리팩터링하여, 규칙 세트가 문서 코어를 휘젓지 않고도 성장할 수 있도록 했다.
- v3.12.7 대비 사용자에게 보이는 동작 변화는 없다. 동일한 버전 외 기능이 여전히 LastErrorCode 602 와 함께 거부된다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 155/155 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
Version 3.12.7
추가됨
- Delphi DUnitX 와 C++Builder GoogleTest 스위트 모두에서 PdfToImage 직접 액세스 렌더링 워크플로에 대한 자동 테스트 커버리지를 확장했다.
변경됨
- Delphi VCL GUI 테스트 러너는 이제 Syntax 와 XRef 픽스처를 등록하여 콘솔 러너 커버리지와 일치시킨다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 147/147 통과했고, C++Builder Win64x GoogleTest 는 57/57 통과했다.
Version 3.12.6
변경됨
- 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 와 함께 실패한다.
Version 3.12.5
추가됨
- 알 수 없는 리터럴 문자열 이스케이프와 혼합된 8 진/비 8 진 이스케이프 시퀀스에 대한 회귀 커버리지를 추가했다.
변경됨
- PDF 1.7 리터럴 문자열 파싱을 개선하여 알 수 없는 이스케이프 시퀀스가 표준에서 요구하는 대로 백슬래시를 무시하도록 했다.
- 리터럴 문자열 8 진수 이스케이프는 이제 8 진수 자릿수만 소비하고 뒤따르는 비 8 진수 자릿수를 일반 문자열 데이터로 보존한다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 141/141 통과했다.
Version 3.12.4
추가됨
- 오른쪽 중괄호 이름 구분자와 희소 압축 객체 xref 스트림 항목에 대한 회귀 커버리지를 추가했다.
변경됨
- PDF 1.7 어휘 파싱을 개선하여 이름 객체가 이제 오른쪽 중괄호 구분자에서 올바르게 멈추도록 했다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 139/139 통과했다.
수정됨
- 객체 스트림 번호가 PDF 바이트 길이보다 큰 xref 스트림 압축 객체 항목의 SmartAccess 로딩을 수정했다.
Version 3.12.3
추가됨
- 새 AES 암호화 PDF 는 이제 PDF 1.7 암호 필터 사전 계약과 일치하도록 암호 필터 Length 값을 비트 길이로 작성한다.
변경됨
- StrF, StmF, EFF, Identity, None 또는 이름이 있는 StdCF 스타일 암호 필터를 사용하는 표준 보안 핸들러 파일에 대한 PDF 1.7 암호화된 문서 호환성을 개선했다.
- 메타데이터 스트림은 이제 일반 스트림처럼 처리되는 대신 복호화, 암호화, 복사/저장 워크플로 중에 EncryptMetadata=false 를 존중한다.
- 임베디드 파일 스트림은 이제 /Type /EmbeddedFile 을 가지고, 암호화된 문서가 로드되거나 저장될 때 임베디드 파일 암호 필터 결정 경로를 사용한다.
- 외부 임베디드 파일 스트림은 이제 FFilter 가 Filter 로 승격될 때 FDecodeParms 를 DecodeParms 로 승격하여 스트림 디코드 매개변수를 보존한다.
- XRef 스트림 Prev/XRefStm 값과 큰 숫자 오프셋은 이제 파서와 SmartAccess 경로를 통해 64 비트 정밀도를 유지한다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 137/137 통과했다.
Version 3.12.2
변경됨
- PDF 1.7 스트림 디코딩 호환성을 개선했다. 일반 스트림 디코딩은 이제 /DP 를 DecodeParms 별칭으로 존중하고, 간접 디코드 매개변수 배열 항목을 해석하며, /AHx 와 /LZW 표준 필터 약어를 받아들인다.
- 큰 파일 PDF 출력은 이제 xref, startxref, linearization, 디지털 서명 ByteRange 오프셋을 32 비트 정수 헬퍼를 통해 좁히는 대신 64 비트 형식 경로를 통해 작성한다.
- 로드된 문서는 이제 카탈로그 /Version 항목이 파일 헤더 버전보다 새로울 때 이를 효과적인 PDF 버전으로 취급한다.
- 검증: Delphi Win32 와 Win64 DUnitX 스위트가 각각 134/134 통과했다.
수정됨
- 재작성된 xref 스트림 트레일러는 PDFlibPas 가 이들을 고전적 트레일러 사전으로 저장할 때 더 이상 스트림 전용 DecodeParms 키를 유지하지 않는다.
Version 3.12.1
변경됨
- 생성된 PDF 는 이제 첫 페이지가 뷰어 창의 사용 가능한 높이에 맞게 크기 조정되어 열리므로, 창에 맞는 가장 큰 줌에서 전체 첫 페이지가 위에서 아래까지 보인다. 이 기본값을 재정의하려면 문서에 사용자 정의 OpenAction (SetOpenActionDestination, SetOpenActionMenu, SetOpenActionJavaScript) 을 구성하라.
Version 3.12.0
추가됨
- 정적 C 라이브러리에 32 바이트 정렬 malloc/calloc/realloc/free CRT 스텁을 추가하고, TPDFJPEGImage.Compress 가 jpeg_mem_dest 버퍼를 할당된 동일한 C free 경로를 통해 해제하도록 수정했다.
- 이 릴리스를 뒷받침하는 엄격한 자동 커버리지를 강조하도록 공개 검증 노트를 확장했다: 라이브러리 빌드, 압축 라운드트립, HelloWorld /FlateDecode 출력, JPEG 렌더링, 이미지 워크플로, 폰트, 폼, 보안, 서명, 인쇄, C++Builder 데모에서 파생된 워크플로.
변경됨
- 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 소스 파일을 파일별 기능 플래그로 컴파일하도록 했다.
Version 3.11.0
추가됨
- Win64 빌드용 작은 zlib-ng 브리지 객체를 추가하여 Pascal 코드가 안정적인 zlib 호환 진입점을 유지하면서 Delphi 와 C++Builder 가 각자의 링커 호환 객체 세트를 소비할 수 있도록 했다.
변경됨
- Windows Flate 압축과 압축 해제를 zlib 호환 모드의 zlib-ng 로 전환했다. Win32, Delphi Win64, C++Builder Win64x 는 이제 Lib\thirdparty\Win32, Lib\thirdparty\Win64, Lib\thirdparty\Win64x 의 ABI 일치 zlib-ng 정적 객체 세트를 링크한다.
- 모든 C++Builder 데모 프로젝트가 PDFLIB_CPPBUILDER 를 정의하도록 갱신하여 GoogleTest 러너와 일치시키고 Win64x 데모가 Delphi Win64 zlib-ng 객체를 링크하지 않도록 방지했다.
수정됨
- Win64 경로는 더 이상 Delphi 의 System.ZLib 유닛을 통해 라우팅되지 않으므로, PDF 스트림 압축/압축 해제는 32 비트 빌드와 마찬가지로 zlib-ng 백엔드의 이점을 누릴 수 있다.
Version 3.10.3
추가됨
- 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.
Version 3.10.2
추가됨
- 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 렌더러 스위치 테스트를 추가했다.
Version 3.10.1
추가됨
- 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.
Version 3.10.0
추가됨
- Demo 아래 모든 Delphi 샘플에 대한 네이티브 C++Builder 버전을 추가했다. PDF 생성, 페이지 조작, 폰트, 이미지, 보안, 서명, 렌더링, 인쇄 데모는 이제 Delphi 측 래퍼 없이 C++Builder 에서 빌드하고 실행할 수 있다.
- 각 Delphi 데모 폴더에 데모가 보여주는 것, 집중하는 API, 실행 방법을 설명하는 간단한 영어 Readme.txt 를 추가했다. Demo\Delphi\index.html 의 HTML 개요가 주제별로 그룹화하여 모두 링크한다.
변경됨
- 각 새 데모는 Demo\C++Builder\<Name>\ 에 콘솔 프로젝트로 위치하며 Lib\PDFlibrary.pas 를 직접 소비하고 실행에 필요한 입력 파일을 동봉한다.
- 각 C++Builder 데모에 동일한 Readme.txt 를 미러링하고 Run 섹션을 콘솔 워크플로에 맞게 다시 작성했다 (Open/SaveDialogs 대신 argv 인수). 일치하는 Demo\C++Builder\index.html 이 동일한 주제 그룹으로 모든 C++Builder 데모를 나열한다.
수정됨
- ImportEMF 데모의 메모리 누수를 수정했다 (TPDFlib 인스턴스가 생성되었지만 해제되지 않았다).
Version 3.9.14
변경됨
- 래핑된 텍스트와 HTML 페이지네이션 데모를 정리하여 각각이 자신의 API 에 집중하고 단일 버튼에서 실행되도록 했다.
- 두 데모 프로젝트 (EmbeddedFonts 와 PdfPermission) 의 이름을 변경하여 컴파일된 실행 파일이 오래된 프로토타입 이름이 아닌 폴더 이름과 일치하도록 했다.
수정됨
- 페이지 범위 복사 데모가 항상 실패를 보고하는 대신 실제로 페이지를 복사하도록 수정했다.
Version 3.9.13
추가됨
- 유틸리티 유닛 (buffer, AES, ZLib, Unicode, 다이제스트 해싱) 과 문서 생성, 파일 저장과 스트림 저장, 로드 라운드트립, AES-128/AES-256 암호화를 포함한 라이브러리 수준 워크플로를 다루는 자동 DUnitX 테스트 스위트 (콘솔과 VCL GUI 러너) 를 도입했다.
수정됨
- 내부 버퍼 리더의 스트림 위치 버그를 수정했다. 2 바이트 word 읽기가 읽기 커서를 2 바이트가 아닌 4 바이트만큼 진행시키고 있었다. 2 바이트보다 긴 버퍼에서 후속 읽기는 잘못된 오프셋에 도달하여 silently 잘못된 데이터를 반환했다. 그 효과는 바이트와 word 읽기가 섞인 이진 데이터 구조를 파싱할 때 가장 두드러졌다.
Version 3.9.12
변경됨
- GDI+ 이미지 렌더링이 이제 래스터 이미지를 화면 또는 출력 해상도로 스케일링할 때 기본적으로 부드러운 고품질 bicubic 보간을 사용한다. 이전에는 기본값이 nearest-neighbour 였으며, 이는 화면 미리보기나 고 DPI 출력을 위해 확대된 작은 이미지 (로고, 썸네일) 에서 눈에 띄는 계단 모양 아티팩트를 생성했다. 더 선명한 nearest-neighbour 모드를 선호하는 호출자는 SetGDIPlusOptions 를 통해 이전 동작을 복원할 수 있다.
Version 3.9.11
수정됨
- 컬러 키 투명도 (이미지 사전의 /Mask 색 범위 배열) 를 사용하는 PDF 이미지의 Cairo 렌더링을 수정했다. 이전에는 페이지가 이 형식의 투명도를 가진 이미지를 포함하면 Cairo 렌더러는 이미지를 페이지 배경에 합성하는 대신 완전히 생략했다. 수정은 선언된 컬러 키 범위로부터 픽셀별 알파 채널을 도출하고 결과를 투명 이미지로 렌더링하여 GDI+ 렌더러와 시각적으로 일관된 출력을 생성한다.
Version 3.9.10
수정됨
- 클리핑된 이미지 시퀀스 다음의 모든 페이지 콘텐츠가 이미지의 클리핑 사각형 내에 잘못 제한되었던 Cairo 렌더링 회귀를 수정했다. 그래픽 상태를 저장하고 클립 경로를 적용하고 이미지를 페인트한 후 상태를 복원하는 PDF 페이지 — 액자 또는 테두리 이미지의 일반적인 레이아웃 기법 — 는 이후의 모든 텍스트, 모양, 그래픽을 클리핑된 영역 내에만 렌더링했다. Cairo 상태 저장과 복원은 이제 PDF q/Q 연산자에 올바르게 매핑되므로 이미지가 그려진 후에 클리핑 영역이 폐기된다.
Version 3.9.9
추가됨
- 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 방향 렌더러 선택기를 노출한다.
Version 3.9.8
수정됨
- RAD Studio 13.1 이상에서 나타난 Win32 C 런타임 shim 의 두 가지 가짜 컴파일러 진단을 억제했다. 컴파일러 버전 기능 가드가 Delphi 2009 이후의 컴파일러로 전파되지 않아 deprecated 메모리 관리자 API 에 대해 컴파일되어 deprecation 경고 (W1000) 가 발생했다. Delphi 7 빌드에만 필요한 내부 호환성 변수에 대해 사용되지 않은 변수 힌트 (H2164) 가 발생했으며, 이제는 해당 버전의 조건 블록으로 범위가 지정된다. 두 문제 모두 진단 전용이며 런타임에 영향이 없다.
Version 3.9.7
추가됨
- Windows 에서 옵션의 PDFium 기반 페이지 렌더링을 추가했으며, BMP 스트림 렌더링, 디바이스 컨텍스트 렌더링, 메모리 렌더링, 프린터 출력을 포함한다.
변경됨
- Delphi MultiFunction View/Print 데모를 렌더러 선택기로 갱신하여 사용자가 기존 GDI+ 렌더러와 PDFium 사이를 전환할 수 있게 했다.
Version 3.9.6
추가됨
- 전체 PDFlibPas 패키지와 트라이얼 패키지를 위한 별도의 Inno Setup 스크립트를 추가했으며, 버전 관리 메타데이터, 빌드 출력, IDE 캐시, 로컬 에이전트 파일, 출시 패키지의 일부가 아닌 번들 서드파티 소스 트리에 대한 릴리스 중심의 제외를 포함한다.
변경됨
- 트라이얼 인스톨러는 이제 셋업 실행 파일이 생성되기 전에 RAD Studio 11.3, 12.3, 13.1 용 트라이얼 바이너리 라이브러리와 트라이얼 Delphi 데모를 빌드하고 패키지한다.
Version 3.9.5
수정됨
- RAD Studio 9.0 / Delphi XE2 에서의 Win32 라이브러리 빌드를 수정했다. 빌드 스크립트가 Delphi 2010 이후에만 존재하는 DCU 출력 디렉터리 플래그를 전달하고 있었다. XE2 의 컴파일러는 그 플래그를 다르게 해석하여, 소스 파일이 처리되기 전에 깨진 출력 경로와 치명적인 오류를 생성했다. 스크립트는 이제 대상 컴파일러 버전에 따라 적절한 플래그를 자동으로 선택한다.
- 라이브러리 소스의 관련 컴파일러 버전 가드를 수정했다. XE2+ 조건 아래에서 XE4 에 도입된 이름 한정 런타임 함수를 호출하고 있었다. XE2 와 XE3 을 대상으로 하는 빌드는 이제 올바른 호환성 import 를 해석한다.
Version 3.9.4
수정됨
- 네트워크와 서버 공유 프린터의 프린터 셋업을 수정하기 위해 용지함, 미디어, 양면, 품질 및 기타 인쇄 설정을 프린터 디바이스 컨텍스트 핸들이 아닌 프린터 DEVMODE 핸들을 통해 적용하도록 했다.
Version 3.9.3
변경됨
- 번들된 AES 백엔드를 Win32 와 Win64 모두에서 Brian Gladman 의 2018 AES 소스로 새로 고쳤다. 재현 가능한 빌드 스크립트는 이제 언제든지 정적 AES 객체를 소스에서 다시 빌드할 수 있게 한다. 그 과정에서 Pascal 바인딩의 ABI 결함이 발견되어 수정되었다: AES-CBC 암호화와 복호화 함수는 C 호출 규약 선언이 누락되어 있어, Win32 빌드가 silently 인수를 잘못된 레지스터 순서로 전달하여 잠재적으로 잘못된 암호화된 출력을 생성할 수 있었다. Win64 빌드는 플랫폼이 균일한 호출 규약을 강제하므로 영향을 받지 않았다.
보안
- 서드파티 리빌드 스크립트를 강화하여 MSVC 기반 zlib, JPEG, CRT 스텁 스크립트를 thirdparty 디렉터리뿐만 아니라 리포지토리 루트에서도 시작할 수 있도록 했다. 이전에는 작업 디렉터리가 thirdparty 폴더로 설정되어 있어야 했다.
Version 3.9.2
수정됨
- JPEG 2000 백엔드를 Win32 와 Win64 모두에서 레거시 OpenJPEG 1.5 에서 OpenJPEG 2.5.4 로 업그레이드했다. 두 플랫폼 모두 이제 정적 객체 링킹을 사용하므로 JPEG 2000 인코딩과 디코딩이 추가 런타임 DLL 없이 작동한다. 현대 코덱은 현재의 JP2/J2K 헤더 처리, 콜백 기반 스트림 API, 그리고 upstream 프로젝트에서 누적된 버그와 보안 수정을 가져온다. 공개 TJpeg2000Bitmap API 는 변경되지 않았다.
Version 3.9.1
수정됨
- 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 스트림 로딩을 복원했다.
Version 3.9.0
변경됨
- 번들된 JPEG 2000 백엔드를 레거시 OpenJPEG 1.5 에서 OpenJPEG 2.5.4 로 업그레이드했다. JPEG 2000 로딩과 저장은 이제 현대 코덱, 콜백 기반 스트림 API, 현재의 JP2/J2K 헤더 처리를 사용하면서 공개 TJpeg2000Bitmap API 를 보존한다.
수정됨
- JPEG 2000 출력은 이제 작은 이미지에 대해 유효한 OpenJPEG 해상도 수를 자동으로 선택하고, Win32 정적 백엔드는 더 이상 누락된 MSVCRT 헬퍼 내보내기에 의존하지 않는다.
Version 3.8.1
수정됨
- 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 빌드 모두에 대한 깨끗한 링커 출력.
Version 3.8.0
보안
- Win64 JPEG 코덱을 IJG 스타일 libjpeg 에서 libjpeg-turbo 3.1.90 으로 업그레이드하여 v3.7.0 (Win32) 에서 시작된 JPEG 마이그레이션을 완료했다. Win32 와 Win64 경로 모두 이제 동일한 현대 JPEG 코덱을 공유하며, 동일한 SIMD 최적화 내부 루프와 upstream 에서 누적된 30 개 이상의 CVE / fuzz 수정을 가진다. 공개 PDFlibPas API 는 변경되지 않았다.
Version 3.7.0
보안
- Win32 JPEG 코덱을 IJG libjpeg-6b 에서 libjpeg-turbo 3.1.90 으로 업그레이드했다. SIMD 최적화 내부 루프를 통한 상당히 빠른 JPEG 인코드/디코드와, libjpeg-turbo upstream 에서 누적된 30 개 이상의 CVE / fuzz 수정. 공개 PDFlibPas API (TPDFJPEGImage 클래스, DumpJPEG 함수) 는 변경되지 않았다. 기존 PDF/JPEG 코드 경로는 소스 변경 없이 더 빠르게 실행된다.
Version 3.6.0
변경됨
- 이 릴리스에서 Win64 zlib 경로는 변경되지 않았다 — 계속해서 Delphi 번들의 System.ZLib 유닛을 사용한다.
- Win32 zlib 경로에 Win64 링크 시점 CRT shim PDFlibCLibs.pas (v3.5.0 에서 도입) 를 활성화하여, 새 zlib 1.3.2 obj 파일이 참조하는 memcpy / memset / malloc / free 심볼을 제공한다.
보안
- Win32 zlib 를 1.2.x 에서 1.3.2 로 업그레이드했다. 1.2.8 이후 upstream 에서 누적된 표준 25 개 이상의 CVE / fuzz 수정과, 64 비트 윈도 스트림에서 사용되는 새 inflateBack9 / inflateTree9 진입점이 포함된다. 공개 PDFlibPas API (DeflateStr / InflateStr / InflateStrParms) 는 변경되지 않았다.
Version 3.5.0
추가됨
- 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) 사이의 차이를 메운다.
변경됨
- 번들된 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 파일을 다시 빌드할 수 있다.
Version 3.4.0
보안
- 암호화 키, AES 초기화 벡터, Perms 권한 블록 생성을 예측 가능한 난수 소스에 대해 강화했다. 벽시계 시간 근처에서 시작된 시스템에서 생성된 암호화된 PDF 는 더 이상 사소하게 상관 관계를 맺을 수 없으며, AES-256 문서는 이제 완전한 키 강도를 유지한다.
- 비합리적인 Width, Height, BitsPerComponent 또는 DeviceN 컴포넌트 수를 선언하는 잘못되었거나 적대적인 PDF 에 대해 이미지 사전 파싱을 강화했다. 범위를 벗어난 값은 픽셀 버퍼 산술 전에 클램프되어 그러한 파일을 열 때 충돌을 방지한다.
- /Prev xref 체인이나 /Parent 페이지 링크가 사이클을 형성하거나 과도하게 깊은 문서에 대해 교차 참조와 페이지 트리 순회를 강화했다. 리더는 이제 스택이 소진될 때까지 재귀하는 대신 잘못된 구조를 깔끔하게 거부한다.
Version 3.3.1
추가됨
- 초기 Git 베이스라인에 이미 존재했던 PDFlibRenderer.pas 렌더 수정 주변에 인라인 근거 주석을 추가했다. 주석은 SetPen 이 활성 캔버스 변환으로 stroke 너비를 스케일링하는 이유와 Type 3 폰트 CharProc d0/d1 연산자가 그들의 피연산자를 소비해야 하는 이유를 문서화한다. 런타임 동작 변경 없음.
수정됨
- 컴포넌트별 Windows 빌드 스크립트를 간소화했다. DLL/, OCX/, Dylib/ 폴더는 더 이상 별도의 build12-* / build13-* 변종을 가지지 않는다. 각 플랫폼은 이제 단일 build-Win32 / build-Win64 스크립트를 가지며 최신 RAD Studio 에 고정되고 선택적 "debug" 인수를 받는다.
Version 3.3.0
수정됨
- PDFlibRenderer.pas 의 변환된 stroke 렌더링을 수정했다. SetPen 은 이제 Picasso 를 호출하기 전에 PDF 선 너비에 현재 캔버스 변환 스케일을 적용하여, 좌표가 이미 변환된 경로에서 stroke 가 과도하게 크거나 작아지는 것을 방지한다. 이는 Type 3 글리프 윤곽선이 두껍고 불규칙한 블록으로 렌더링될 수 있는 문제를 수정한다.
- 콘텐츠 스트림 파서의 Type 3 폰트 CharProc d0/d1 처리를 수정했다. d0 는 이제 두 너비 피연산자를 소비하고, d1 은 후속 드로잉 명령이 실행되기 전에 여섯 개의 너비/바운딩 박스 피연산자를 소비하여, 오래된 피연산자가 글리프나 경로 기하를 손상시키는 것을 방지한다.