ChangeLog
Historia wydań
« Wróć do indeksu dokumentacji
Historia wersji biblioteki PDFlibPas. Wpisy są uporządkowane od najnowszych do najstarszych; każde wydanie stosuje semantyczne wersjonowanie zgodnie z polityką wydań projektu.
Języki:English (US)English (UK)Español (España)Español (Latinoamérica)DeutschFrançaisItaliano日本語Português (Brasil)NederlandsSvenskaPolskiTürkçe한국어العربيةРусский简体中文繁體中文
v3.56.42 2026-05-27
- Naprawiono buforową ścieżkę deszyfrowania AES-256 wprowadzoną w v3.56.41, aby wywołujący mogli przypisać wynik deszyfrowania z powrotem do tego samego
AnsiString, który dostarczył bufor szyfrogramu, bez naruszeń dostępu. - Zwykły przepływ API
LoadFromFile,Encrypt,SaveToFile, ponowne wczytanie,DecryptiSaveToFileponownie kończy się poprawnie dla dużych wczytanych PDFów, zachowując optymalizację deszyfrowania AES-CBC z mniejszą liczbą kopii. - Dodano regresyjne testy AES dla przypadków aliasowania bufora wejściowego i wyniku używanych przy przywracaniu zaszyfrowanych streamów podczas zapisu, w tym duże payloady 504 KB, które wcześniej ujawniały problem.
v3.56.41 2026-05-27
- Dodano
TPDFlib.DACopyFiledla przepływów Direct Access, które wymagają liczby stron i niezmienionej kopii pliku bez budowania pełnego normalnego grafu obiektów. - Zoptymalizowano deszyfrowanie AES-256 przez dodanie buforowych ścieżek deszyfrowania AES-CBC i używanie ich podczas deszyfrowania wczytanych łańcuchów oraz streamów, co zmniejsza dodatkowe kopiowanie szyfrogramu w dużych zaszyfrowanych streamach.
- Demo Delphi
HugeFileBenchmarkzawiera teraz wierszdirect-copyoraz filtry--opsi--skipdo ukierunkowanych testów dużych plików.
v3.56.40 2026-05-26
- Dema
HelloWorlddla Delphi i C++Builder tworza teraz bogatszy startowy PDF z informacjami dokumentu, tekstem w wybranej standardowej czcionce, stylizowanym blokiem tytulowym, prostym rysunkiem wektorowym i wskazowkami nastepnych krokow, zachowujac ten sam przeplyw budowania i uruchamiania. - Wszystkie notatki demo Delphi i C++Builder zastapiono przyjaznymi dla przegladarki stronami
Readme.html, wlacznie z dodatkowymi notatkami dotyczacymi hasel, plikow z ograniczeniami i wynikow podpisywania; indeksy demo kieruja teraz uzytkownikow do notatek HTML.
v3.56.39 2026-05-26
- Ścieżki zapisu bezpośredniego API plików tworzą teraz tabele wyszukiwania odwołań krzyżowych liniowo, dzięki czemu
DASaveAsFilei powiązane ścieżki zapisu bezpośredniego są znacznie szybsze w PDF-ach z bardzo dużą liczbą obiektów lub gęstymi drzewami stron. - Zoptymalizowany writer zachowuje tę samą semantykę łańcucha wolnych obiektów i unika wielokrotnego skanowania numerów obiektów podczas pełnego generowania xref, usprawniając duże przepływy zapisu bezpośredniego bez zmiany publicznego API ani kontraktu wyjścia.
v3.56.38 2026-05-26
- Naprawiono normalne wyjście szyfrowania API, tak aby
Encrypttworzyło lub zachowywało trailer/IDprzed zapisaniem danych zabezpieczeń AES-256, dzięki czemu zaszyfrowane pliki PDF pozostają wykrywalne przy ponownym wczytaniu przezEncryptionStatus. - Normalny przepływ pracy API
LoadFromFile,Encrypt,SaveToFile, reload,DecryptiSaveToFilezachowuje teraz stan zaszyfrowania przed jawnymDecrypt, odpowiadając zachowaniu bezpośredniego API plikowego dla dużych starszych plików PDF.
v3.56.37 2026-05-26
- Dodano
TPDFlib.ComparePreflightReports, porównywarkę raportów preflight w zwykłym tekście działającą wiersz po wierszu, która ignoruje zmienne wiersze znaczników czasuGenerated:i zwraca pusty ciąg, gdy stabilna treść raportu jest zgodna. - Demo Delphi
PreflightReportobsługuje teraz--compare <file>w trybie pojedynczego pliku, zapisując raport UTF-8.diff.txti zwracając kod wyjścia 2, gdy wygenerowany raport tekstowy różni się od wartości bazowej.
v3.56.36 2026-05-26
- Demo Delphi
PreflightReportobsługuje teraz wsadowe uruchomienia katalogów z--input-dir,--output-diri--recursive, zapisując po jednym raporcie dla każdego pliku PDF jako<basename>.preflight.<ext>. - Tryb wsadowy zapisuje plik UTF-8
preflight-summary.csv, który rejestruje każdy źródłowy PDF, status powodzenia/niepowodzenia, liczbę problemów i ścieżkę wygenerowanego raportu, zachowując istniejący kontrakt kodów wyjścia dla automatyzacji.
v3.56.35 2026-05-26
ReportFormat = 3dodaje wyjście CSV doTPDFlib.CreatePreflightReportExiTPDFlib.SavePreflightReportEx, tworząc wiersze UTF-8 dla metadanych raportu, każdej wybranej kontroli zgodności, poszczególnych kodów i komunikatów problemów oraz końcowego podsumowania.- Demo Delphi
PreflightReportobsługuje teraz--format csvi--csv, dzięki czemu uruchomienia preflight z wiersza poleceń mogą zasilać arkusze kalkulacyjne lub proste parsery CI bez przetwarzania JSON ani wydobywania tekstu.
v3.56.34 2026-05-26
- Dodano świadome formatu API
TPDFlib.CreatePreflightReportExiTPDFlib.SavePreflightReportExdo generowania raportów preflight PDF/A i PDF/UA-1 jako zwykły tekst, JSON lub samodzielny HTML, przy zachowaniu istniejących API raportów wyłącznie tekstowych. - Demo Delphi
PreflightReportobsługuje teraz--format text|json|htmloraz skróty--jsoni--html, dzięki czemu ten sam przepływ pracy z wiersza poleceń może tworzyć raporty czytelne dla człowieka lub artefakty CI czytelne maszynowo.
v3.56.33 2026-05-26
- Dodano
TPDFlib.CreatePreflightReportiTPDFlib.SavePreflightReport, aby aplikacje mogły generować wielokrotnego użytku raporty w zwykłym tekście z wbudowanych kontroli zgodności PDF/A i PDF/UA-1 bez ręcznego wyliczania uchwytów list ciągów. - Demo Delphi
PreflightReportwywołuje teraz bezpośrednio API raportów na poziomie biblioteki, utrzymując przykład skupiony na przepływie pracy z wiersza poleceń, wybranych kontrolach, trybie pierwszego problemu i kodach wyjścia przyjaznych automatyzacji.
v3.56.32 2026-05-26
- Dodano nowe konsolowe demo Delphi
PreflightReport, które uruchamia kontrole PDF/A i PDF/UA-1 zCheckFileCompliance, wylicza listy problemów za pomocąGetStringListCountiGetStringListItemoraz zapisuje raport preflight w zwykłym tekście. - Demo obsługuje opcje
--input,--output,--pdfa,--pdfua,--bothi--first-issue, a także kody wyjścia dla przyjaznych automatyzacji wyników: powodzenie, znaleziono problem i błąd wykonania.
v3.56.31 2026-05-25
GetCustomKeys(2)teraz konsekwentnie ukrywa zarządzane przez bibliotekę wpisy systemowe Catalog, w tym/OutputIntents,/Extensions,/Requirements,/Collectioni/NeedsRendering.- Intencje wyjściowe PDF/A tworzone przez
SetPDFAModenie pojawiają się już jako niestandardowe klucze Catalog, oddzielając wyliczanie metadanych aplikacji od struktur zgodności PDF.
v3.56.25 2026-05-23
- Strona writer GetPDFUADiagnostics otrzymuje odpowiadający problem
MULTIPLE-H-CHILDREN:N, zachowując parytet z reader10044z v3.56.24. ISO 14289-1 §7.4.4 zabrania więcej niż jednego bezpośredniego dziecka H na węzeł drzewa znaczników — kontrola po stronie writer uruchamia się zawsze, gdy drzewo FStructElems w pamięci zawiera takie naruszenie. - Nowy zagnieżdżony helper CountMultipleHChildren przechodzi drzewo w głąb, zliczając dzieci H na każdym poziomie. Kontrola działa obok istniejących przejść LIST-STRUCT / LIST-NO-NUMBERING i współdzieli ten sam wzorzec przechodzenia FStructElems.
v3.56.24 2026-05-23
- Audyt PDF/UA-1 otrzymuje kontrolę unikalności tagów H z ISO 14289-1 §7.4.4.
10044zgłasza każdy węzeł struktury, który zawiera więcej niż jedno bezpośrednie dziecko H — specyfikacja zabrania tego w dokumentach silnie ustrukturyzowanych, a to samo ograniczenie dotyczy każdego węzła drzewa znaczników niezależnie od ogólnego trybu struktury. Pozostały wymóg SHALL z §7.4.4 (dokument musi być albo silnie, albo słabo ustrukturyzowany, nie oba naraz) wymaga heurystyk obejmujących cały dokument i celowo pozostaje poza tym audytem. - Nowy walker drzewa struktur w porządku pre-order (UAVisitStructNodeForHUniqueness / ScanStructTreeForHUniqueness) zlicza bezpośrednie dzieci H dla każdego węzła i rekurencyjnie przechodzi w głąb. Ponownie używa tego samego dekodera kształtu K co istniejące walkery nagłówków / list / notatek.
v3.56.23 2026-05-23
- Audyt PDF/UA-1 otrzymuje dwie kontrole programów fontów z ISO 14289-1 §7.21.6, które kontrole warstwy słowników z v3.56.10 musiały odłożyć do czasu dostępności parsera TrueType.
10034zgłasza niesymboliczne programy TrueType, których osadzona tabela SFNT cmap zawiera wyłącznie wpis symboliczny (platformID=3, encodingID=0) — pierwszy akapit §7.21.6 wymaga co najmniej jednej niesymbolicznej podtabeli cmap, aby program mógł renderować punkty kodowe zadeklarowane przez swoje /Encoding.10035zgłasza niesymboliczne tablice TrueType/Encoding /Differences, których nazwy glifów nie są elementami Adobe Glyph List (z wyjątkiem.notdef) — trzeci akapit §7.21.6 wymaga, aby każdy wpis Differences trafiał do AGL. - Nowe
Lib/PDFlibPDFUAFontInspect.pasimplementuje tolerancyjny walker katalogu tabel SFNT i parser katalogu podtabel cmap. Tabela Adobe Glyph List z 4281 nazwami, dodana jako szkielet w poprzednim commicie infrastruktury, jest teraz podłączona przez kontrolę Differences. Programy, których nie da się sparsować jako SFNT (Type 1 PFB / PFA, OpenType collection, dowolne śmieci), są cicho pomijane — na warstwie audytu preferowane są wyniki fałszywie negatywne zamiast fałszywie pozytywnych.
v3.56.22 2026-05-23
- Audyt PDF/UA-1 otrzymuje kontrole danych klipów multimedialnych z ISO 14289-1 §7.18.6.
10042zgłasza słowniki danych klipów multimedialnych (identyfikowane przez/S /MCD, opcjonalnie/Type /MediaClip) bez wymaganego wpisu typu zawartości/CT.10043zgłasza te same słowniki bez wymaganej tablicy/Alt. ISO 32000-1 Table 274 wymienia oba klucze jako opcjonalne, ale ISO 14289-1 §7.18.6 podnosi je do wymaganych, aby czytniki ekranu mogły ogłosić znaczący opis osadzonych multimediów. - To jest Phase 6 planu głębokiego audytu PDF/UA (
.superpowers/plans/2026-05-23-pdfua-deep-audit-plan.md). Działa bez zależności od parsera programów fontów ani strumieni zawartości, więc jest pierwszą kolejną podklasą po serii v3.56.0..v3.56.13.
v3.56.21 2026-05-23
- Nowe
SetSignProcessCommitmentTypeemituje podpisany atrybut CAdEScommitment-type-indication(OID 1.2.840.113549.1.9.16.2.16, ETSI EN 319 122-1 v1.2.1 §5.2.3) wewnątrz PAdES-B-B SignerInfo. Akceptuje kody całkowite 1..6 mapowane na dobrze znane OID zobowiązań ETSI odid-cti-ets-proofOfOrigindoid-cti-ets-proofOfCreation; przekaż 0, aby wyczyścić. Kody spoza zakresu są odrzucane. - Nowe
SetSignProcessSignaturePolicyemituje podpisany atrybut CAdESsignature-policy-identifier(OID 1.2.840.113549.1.9.16.2.15, §5.2.9). Przyjmuje OID polityki w notacji dziesiętnej z kropkami, hash dokumentu polityki jako ciąg szesnastkowy wielkimi literami oraz kod algorytmu skrótu (1=SHA-1, 2=SHA-256, 3=SHA-384, 4=SHA-512, 0=auto/SHA-256). Atrybut niesie SEQUENCESignaturePolicyIdzsigPolicyId+sigPolicyHash(SEQUENCEOtherHashAlgAndValue). - Oba atrybuty działają tylko wtedy, gdy SubFilter to
ETSI.CAdES.detached(ścieżka PAdES-B-B); rozszerzają istniejącą tablicęrgAuthAttrobokcontent-typeisigning-certificate-v2. PAdES Table 1 row d) zabrania łączeniacommitment-type-indicationz wpisem PDF Signature Dictionary/Reason; wywołujący odpowiada za nieustawianie obu naraz.
v3.56.20 2026-05-23
- Nowe
AddPAdESDSSVRIdołącza wpis podsłownika Signature VRI do składanego DSS, uzupełniając strukturę Validation Related Information z klauzuli 5.4.2.3 ETSI EN 319 142-1 v1.2.1. Wpis jest kluczowany przez SHA-1 wielkimi literami w formacie hex z bajtów/Contentspodpisu'; jego podtabliceCert/CRL/OCSPsą wypełniane przez odwołania do odpowiednich nadrzędnych strumieni DSS przez indeksy 0-based podane jako listy rozdzielane przecinkami (np."0,2,5"). - Bazowe
TSmartPDFDocument.AddPAdESDSSWithVRIśledzi numery obiektów strumieni emitowanych dla każdego cert / CRL / OCSP i używa ich do zapisu podtablic VRI jako pośrednich odwołań z powrotem do tych samych strumieni, na które wskazują już nadrzędne tablice DSS, spełniając wymaganie specyfikacji, aby wpisy VRI współdzieliły magazyn z nadrzędnym słownikiem DSS. Oryginalny punkt wejściaAddPAdESDSSnadal działa bez zmian dla wywołujących, którzy nie potrzebują VRI. - Każdy podsłownik VRI dla podpisu zawiera opcjonalny znacznik
/Type /VRI, aby narzędzia przechodzące po katalogu według tagówTypemogły rozpoznać strukturę bez ponownego rozwiązywania ścieżki nadrzędnej.
v3.56.19 2026-05-23
- Nowy przepływ pracy PAdES-B-T do dołączania znacznika czasu podpisu RFC 3161 / RFC 5816 (id-aa-signatureTimeStampToken, OID 1.2.840.113549.1.9.16.2.14) do istniejącego podpisu PAdES-B-B.
NewPAdESSignatureTimeStampProcessFromFile/FromStream/FromStringotwierają podpisany PDF,SetPAdESSignatureTimeStampFieldwskazuje nazwę pola,GetPAdESSignatureValueHashHexzwraca hash SHA-256 (lub 384 / 512)signatureValuepodpisującego' do przesłania do TSA,GetPAdESSignatureCMSBytesudostępnia istniejący ładunek CMS,SetPAdESSignatureCMSBytesprzyjmuje rozszerzone bajty CMS składane przez wywołującego za pomocą wybranej biblioteki CMS, aEndPAdESSignatureTimeStampProcessToFile/ToStream/ToStringwstawia nowy CMS do oryginalnego placeholdera/Contents. BuildPAdESSignatureTimeStampAttributeto bezstanowy helper, który opakowuje wydany przez TSA TimeStampToken w CMS Attribute SEQUENCE oczekiwane przezSignerInfo.unsignedAttrs, więc wywołujący, którzy już mają pod ręką bibliotekę CMS, mogą pominąć warstwę OID + SET-of.- Nowe
SetSignProcessReserveContentsBytesposzerza placeholder/Contentsw momencie początkowego podpisywania, aby później rozszerzony CMS zmieścił się bez przepełnienia pierwotnej rezerwacji. Typowe TimeStampTokens wydane przez TSA dodają 2-6 KB do SignerInfo; przekaż tutaj 1024-8192, aby zostawić zapas. Bez wystarczającej rezerwy wywołanie rozszerzające zwraca13(przepełnienie wyjścia). - Biblioteka nie dostarcza klienta HTTP TSA; wywołujący pobiera TimeStampToken (zwykle 30-50 wierszy żądania TSP + HTTP POST np. do FreeTSA lub DigiCert). Windows CryptoAPI
CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTRzasadniczo automatyzowałoby wstrzyknięcie CMS w bibliotece, ale zwracaCRYPT_E_INVALID_INDEX(0x80091008) dla odłączonego kształtu SignedData emitowanego przez PAdES, więc zamiast tego używana jest ścieżka bajtów CMS dostarczanych przez wywołującego.
v3.56.18 2026-05-23
- Atrybut PAdES
signing-certificate-v2osadza teraz opcjonalne poleIssuerSerialzdefiniowane przez RFC 5035 (ESSCertIDv2). Distinguished Name wystawcy certyfikatu podpisującego' jest opakowany w CHOICEGeneralName [4] EXPLICIT directoryNamewewnątrzGeneralNames, po którym następuje numer seryjny certyfikatu jako ASN.1 INTEGER. Bajty numeru seryjnego przychodzą little-endian z Windows CryptoAPI (CRYPT_INTEGER_BLOB) i są odwracane do big-endian z dodanym bajtem dopełnienia liczby dodatniej, gdy ustawiony jest wysoki bit, zgodnie ze sposobem emitowania tego samego pola przez OpenSSL i BouncyCastle. - Weryfikatory, które krzyżowo sprawdzają parę nazwa wystawcy + numer seryjny względem zestawu kandydatów budowania ścieżki (zwłaszcza EU DSS w trybie ścisłym), znajdują teraz oba identyfikatory w atrybucie signing-cert-v2; poprzednie wyjście v3.56.17 dostarczało tylko odwołanie
certHash. - Nowe helpery ASN.1
DER_IntegerFromLittleEndian(obsługuje kolejność bajtów Win32CRYPT_INTEGER_BLOB) iDER_ContextTagExplicit(opakowuje ładunek w skonstruowany znacznik kontekstowy) uzupełniają mikroenkoderPDFlibASN1. Nowe deklaracjeCERT_INFO/CRYPT_ALGORITHM_IDENTIFIER/CRYPT_INTEGER_BLOB/PCERT_CONTEXTwPDFlibCryptoAPIdają ścieżce podpisu dostęp do sparsowanych pól certyfikatu.
v3.56.17 2026-05-23
- Wbudowana ścieżka podpisywania
ETSI.CAdES.detachedtworzy teraz strukturalnie zgodne podpisy PAdES-B-B. Biblioteka sama buduje uwierzytelnione atrybuty CMS -content-type(id-data) isigning-certificate-v2z RFC 5035 / RFC 5816 z hashem SHA-256 certyfikatu podpisującego - i przekazuje je doCryptSignMessageprzezrgAuthAttr. Gdy to pole jest inne niż NULL, Windows CryptoAPI przestaje automatycznie wstrzykiwać atrybutsigning-time, którego PAdES (ETSI EN 319 142-1 v1.2.1 Table 1) zabrania, więc wynikoweSignerInfozawiera wymagane atrybuty i tylko je. - Nowy unit
PDFlibASN1zapewnia wyspecjalizowany mikroenkoder DER (X.690) - prefiks długości, OCTET STRING, SEQUENCE, SET, OBJECT IDENTIFIER - używany do budowania wartości atrybutuSigningCertificateV2. Enkoder przestrzega standardowych zasad łuków OID base-128 i pomija opcjonalne polehashAlgorithm, gdy tylko powtarzałoby domyślne SHA-256, zgodnie z tym, co emitują OpenSSL i BouncyCastle. ApplySignaturekieruje terazETSI.CAdES.detachedprzez ścieżkę surowych bajtów (tę samą, której używaadbe.pkcs7.detached) zamiast podawać wstępnie obliczony skrót. CryptoAPI oblicza teraz uwierzytelniony atrybutmessageDigestna rzeczywistej podpisanej treści, czego oczekują weryfikatory.- SHA-384 i SHA-512 są również respektowane podczas budowania atrybutu signing-certificate-v2: pole
hashAlgorithmjest emitowane z odpowiadającymAlgorithmIdentifier, zamiast polegać na wartości domyślnej. SHA-1 jest w tym kontekście cicho podnoszone do SHA-256, ponieważ PAdES-B-B nie autoryzuje SHA-1 (clause 6.2.1).
v3.56.16 2026-05-23
- Nowe
SetSignProcessDigestAlgorithmwybiera algorytm message-digest podpisu:1= SHA-1 (przestarzały),2= SHA-256 (nowoczesna wartość domyślna),3= SHA-384,4= SHA-512,0= auto (SHA-256 dla każdego SubFilter z wyjątkiem starszej ścieżkiadbe.pkcs7.sha1, która pozostaje przy SHA-1 dla stabilnej bajtowo kompatybilności wstecznej). ETSI EN 319 142-1 v1.2.1 §6.2.1 zabrania MD5 i odsyła do ETSI TS 119 312 dla zalecanych zestawów kryptograficznych, więc podpisujący PAdES powinni wybierać SHA-256 lub mocniejsze. - Dodano helpery hash
SHA256StreamRange,SHA384StreamRangeiSHA512StreamRangeobok istniejącegoSHA1StreamRange; ścieżka podpisu używa ich do obliczenia skrótu PDF ByteRange wybranym algorytmem. OID PKCS#7SignerInfo.digestAlgorithmi rzeczywiste bajty skrótu są teraz gwarantowanie zgodne (poprzedni kod zawsze przekazywał skrót SHA-1 niezależnie od wynegocjowanego algorytmu). TPDFlibPFXFile.SignDataprzyjmuje teraz parametrDigestAlgorithmi wybiera poprawny OID dla każdej pary (SubFilter, algorytm):2.16.840.1.101.3.4.2.1/.2/.3dla SHA-256/384/512 na odłączonych i niestandardowych SubFilters (RFC 5754) oraz odpowiadającą rodzinę OIDsha256WithRSAEncryptiondla starszej ścieżkiadbe.pkcs7.sha1.
v3.56.15 2026-05-23
- Nowe
SetSignProcessDocTimeStampprzełącza proces podpisywania w tryb PAdES Document Time-stamp zgodnie z ETSI EN 319 142-1 v1.2.1 §5.4.3. Wynikowy Signature Dictionary zawiera/Type /DocTimeStampi/SubFilter /ETSI.RFC3161, pomija niedozwolone klucze/M,/Reason,/Location,/ContactInfoi/Nameoraz rezerwuje 8192-bajtowy (lub o rozmiarze podanym przez wywołującego) placeholder hex w/Contentsna zewnętrznie pobrany RFC 3161 TimeStampToken. - Tryb passthrough jest włączany automatycznie po wybraniu trybu DocTimeStamp, ponieważ TimeStampToken pochodzi z zewnętrznego TSA. Wywołania
SetSignProcessInfowykonane po przełączeniu na tryb DocTimeStamp są po cichu ignorowane, aby słownik podpisu pozostał zgodny ze specyfikacją. - Istniejące automatyczne wstrzykiwanie PAdES
/Extensions /ESICdodane w v3.56.8 obejmuje już DocTimeStamp, ponieważ jego SubFilter zaczyna się odETSI., więc PDF ze znacznikiem czasu dokumentu deklaruje wymagane rozszerzenie katalogu bez dodatkowego okablowania.
v3.56.14 2026-05-23
- Nowe API augmentacji PAdES Document Security Store (DSS).
NewPAdESDSSProcessFromFile/NewPAdESDSSProcessFromStream/NewPAdESDSSProcessFromStringotwierają wcześniej podpisany PDF,AddPAdESDSSCertificate/AddPAdESDSSCRL/AddPAdESDSSOCSPprzygotowują zakodowany DER materiał walidacyjny, aEndPAdESDSSProcessToFile/EndPAdESDSSProcessToStream/EndPAdESDSSProcessToStringzapisują aktualizację przyrostową zawierającą słownik/DSS << /Type /DSS /Certs [...] /CRLs [...] /OCSPs [...] >>zgodnie z ETSI EN 319 142-1 v1.2.1 §5.4.2.2. To element bazowy do promowania podpisu PAdES-B-B / B-T do długoterminowej walidacji PAdES-B-LT. - Proces DSS automatycznie podnosi wpis katalogu
/Extensions /ESICdo co najmniejExtensionLevel 1podczas dodawania materiału walidacyjnego, zgodnie z wymaganiem w §5.6, oraz scala nowe certyfikaty, CRL i odpowiedzi OCSP z istniejącymi tablicami/Certs//CRLs//OCSPsprzy powtarzanych wywołaniach, tak aby rewizje narastały zamiast się nadpisywać. GetPAdESDSSProcessResult/ReleasePAdESDSSProcessdomykają cykl życia, odzwierciedlając istniejącą powierzchnię APISignProcess.
v3.56.8 2026-05-23
- Zgodność bazowa PAdES: gdy podpis jest tworzony z PAdES SubFilter (
ETSI.CAdES.detachedlubETSI.RFC3161), katalog dokumentu otrzymuje teraz automatycznie wpis/Extensions /ESIC <</BaseVersion /1.7 /ExtensionLevel 2>>wymagany przez ETSI EN 319 142-1 v1.2.1 §5.6. Wpis jest dodawany przez tę samą aktualizację przyrostową, która przenosi podpis, nigdy nie obniża istniejącego wyższego/ExtensionLeveli podąża za pośrednimi referencjami/Extensionslub/ESIC, gdy źródłowy PDF przechowuje je już jako osobne obiekty. - Znacznik rozszerzenia równoważny Adobe zapisywany przez SetSignProcessCustomSubFilter dla plików PDF tworzonych przez
TPDFlibto teraz/ADBE /BaseVersion /1.7 /ExtensionLevel 8(wcześniejExtensionLevel 5), zgodnie z alternatywną deklaracją, której mogą używać podpisy bazowe PAdES; poziom 5 obejmował tylko formularze ISO 32000-2 / 3D / funkcje RichMedia i faktycznie nie identyfikował rozszerzeń PAdES.
v3.56.13 2026-05-23
- Gdy SetPDFUAMode jest aktywny i dokument jest zapisywany, każdy element struktury L (lista), który nie ma jawnego atrybutu
ListNumbering, otrzymuje teraz automatycznie/O = List /ListNumbering = None. ISO 14289-1 §7.6 wymaga, aby każdy tag L deklarował swój styl numerowania; nowa korektaApplyPDFUAListNumberingwykonywana podczas zapisu dołącza do istniejącej rodzinyApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationship/ApplyPDFUAStripTrapNet. - Autorzy, którym zależy na konkretnym stylu listy, nadal powinni wywołać SetStructElemListNumbering przed EndTag; automatyczna korekta uruchamia się tylko wtedy, gdy w czasie zapisu nie ma atrybutu ListNumbering, więc jawne wartości są zachowywane.
- Komunikat diagnostyczny po stronie zapisu
LIST-NO-NUMBERING:Ninformuje teraz, że automatyczna korekta zamaskuje problem w czasie zapisu, dzięki czemu użytkownicy rozumieją zarówno brakujący atrybut, jak i automatyczne zachowanie naprawcze.
v3.56.12 2026-05-23
- Audyt PDF/UA-1 zyskuje trzy nowe kontrole ISO 14289-1.
10031zgłasza adnotacje Link, których słownik akcji URI zawiera/IsMap = true(zabronione przez §7.18.5, chyba że równoważna funkcjonalność jest zapewniona gdzie indziej w treści; autorzy z uzasadnionym przypadkiem użycia IsMap mogą samodzielnie wyciszyć tę diagnostykę).10032zgłasza elementy strukturyNotebez wpisu/ID— §7.9 wymaga, aby każdy tag Note deklarował unikalny ID.10033zgłasza liczby zduplikowanych par, gdy dwa lub więcej tagów Note ma tę samą wartość/ID. - Wykrywanie kolizji ID Note odbywa się przez zebranie ID w posortowanym TStringList i przejście po sąsiednich parach, więc grupa trzech Notes współdzielących jeden ID liczy się jako dwie zduplikowane pary.
- Sprawdzanie akcji URI przechodzi po tablicy
/Annotskażdej strony', filtruje według/Subtype /Link, a następnie sprawdza/A /S /URIi wartość boolowską/IsMap. Referencje pośrednie są dereferencjonowane na każdym kroku, więc wydzielone słowniki akcji zachowują się tak samo jak osadzone bezpośrednio.
v3.56.11 2026-05-23
- ISO 14289-1 §7.6 wymaga, aby każdy element struktury L (lista) miał jawny atrybut
ListNumbering.10030(po stronie odczytu) iLIST-NO-NUMBERING:N(po stronie zapisu) zgłaszają tagi L, które go pomijają. Walker po stronie odczytu dekoduje oba kształty/A(pojedynczy słownik atrybutów albo tablicę słowników wymieszanych z liczbami rewizji) i szuka klucza/ListNumberingniezależnie od właściciela. Kontrola po stronie zapisu sprawdzaTPDFStructElem.Attributespod kątem tej samej nazwy zarówno w sfinalizowanej liście struktur, jak i w wciąż otwartym stosie tagów. - Poprawne wartości
ListNumberingwedług ISO 32000-1 Table 347 toNone,Disc,Circle,Square,Decimal,UpperRoman,LowerRoman,UpperAlpha,LowerAlpha. Audyt sprawdza tylko obecność klucza, a nie wybraną wartość — każdy tag L potrzebuje jednej z nich.
v3.56.10 2026-05-23
- Audyt PDF/UA-1 zyskuje reguły kodowania TrueType z ISO 14289-1 §7.21.6.
10028zgłasza niesymboliczne fonty TrueType, których/Encoding(lub/BaseEncodingwewnątrz słownika Encoding) nie jest aniMacRomanEncoding, aniWinAnsiEncoding.10029zgłasza symboliczne fonty TrueType, które w ogóle zawierają wpis/Encoding(zabronione przez czwarty akapit §7.21.6). - Rozróżnienie symboliczny vs. niesymboliczny jest ustalane na podstawie bitu 3 FontDescriptor
/Flags(maska4), z ponownym użyciem istniejącego pomocnikaUAFontDescriptorSymbolicz podklasy 4. Pełny pierwszy akapit §7.21.6 (osadzony program TrueType musi zawierać pasujące wpisy cmap) wymaga parsowania programu fontu TrueType i nadal oczekuje; powyższe reguły na poziomie słownika są praktyczną warstwą, którą ten audyt może zweryfikować bez parsera TrueType. - Reguły tablicy Differences w §7.21.6 (nazwy glifów wyłącznie AGL, obecność Microsoft Unicode cmap) pozostają poza zakresem z tego samego powodu — wymagają inspekcji programu fontu.
v3.56.9 2026-05-23
- Audyt PDF/UA-1 zyskuje pełną kontrolę ISO 14289-1 §7.18.4.
10027zgłasza adnotacje Widget, których/StructParentprzechodzi przez/ParentTreedrzewa struktury', ale nie trafia na element struktury z/S = Form. Poprzednia częściowa kontrola v3.56.7 (10026) wychwytywała tylko Widgets, które całkowicie nie mają/StructParent; nowa kontrola domyka regułę, podążając za wskaźnikiem drzewa liczb i weryfikując tag docelowy. - Nowy pomocnik
NumberTreeLookupimplementuje kształt drzewa liczb ISO 32000-1 §7.9.7 (płaski korzeń/Nums, pośrednie/Kidszakresowane przez/Limits). Przyszłe audyty, które muszą rozwiązywać wpisy stron/StructParentslub etykiety/PageLabels, mogą go użyć ponownie. - Weryfikacja tagu Form dla adnotacji Widget używa modelu dwupoziomowego: Widget bez
/StructParentjest zgłaszany jako10026; Widget, którego/StructParentistnieje, ale nie rozwiązuje się do/S = Form, jest zgłaszany jako bardziej szczegółowe10027. Zapobiega to podwójnemu liczeniu tego samego naruszenia pod oboma kodami.
v3.56.7 2026-05-23
- Gdy SetPDFUAMode jest aktywny i dokument jest zapisywany, wszystkie wpisy adnotacji
TrapNetsą teraz automatycznie usuwane z tablicy/Annotskażdej strony'. ISO 14289-1 §7.18.2 zabrania adnotacjiTrapNet; nowa korektaApplyPDFUAStripTrapNetwykonywana podczas zapisu dołącza do istniejącej rodzinyApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationship, dzięki czemu dokumenty w trybie PDF/UA przestają po cichu emitować pozostałościTrapNet. - Audyt PDF/UA-1 zyskuje częściową kontrolę §7.18.4.
10026zgłasza adnotacje Widget bez/StructParent— Widget bez/StructParentnie może zostać osiągnięty z drzewa struktury i dlatego nie może być zagnieżdżony w tagu strukturyForm. Pełna weryfikacja strukturalna (rozwiązanie/StructParentprzezParentTreei potwierdzenie, że nadrzędny/StoForm) pozostaje na kolejne wydanie. - Po stronie zapisu GetPDFUADiagnostics zyskuje odpowiadający problem
WIDGET-NO-STRUCTPARENT:N. Istniejący komunikat TRAPNET-ANNOT informuje teraz również, że SetPDFUAMode automatycznie usuwa je podczas zapisu.
v3.56.6 2026-05-23
- Audyt PDF/UA-1 zyskuje dwie kontrole hierarchii nagłówków ISO 14289-1 §7.4.2.
10024zgłasza sytuację, gdy pierwszy element nagłówka w kolejności dokumentu nie jest H1 (lub H).10025zgłasza liczbę przeskoków poziomu nagłówków w sekwencji malejącej (np. H1, po którym następuje H3 bez H2). Obie kontrole współdzielą pojedyncze przejście pre-order po drzewie struktury, które dekoduje zagnieżdżone kształty/K(pojedynczy StructElem, tablica StructElems / IndRefs / MCRs). - Po stronie zapisu GetPDFUADiagnostics zyskuje odpowiadający problem
FIRST-HEADING-NOT-H1, zachowując parytet z czytnikiem10024. Wcześniej istniejąca kontrola zapisu HEADING-LEVEL-SKIP ma teraz kontrolę towarzyszącą, która wychwytuje także problemy w stylu "pierwszy nagłówek był H2".
v3.56.5 2026-05-23
- Gdy SetPDFUAMode jest aktywny, a dokument zostaje później zaszyfrowany, klucz uprawnień szyfrowania (
/Pw słowniku encrypt) ma teraz automatycznie ustawiany bit 10 (maska$200, "Extract text and graphics in support of accessibility"), nawet jeśli wywołujący nie uwzględniłppCanCopyAccesswTPDFExtraPermissionsprzekazanym do Encrypt. ISO 14289-1 §7.16 wymaga, aby każdy zaszyfrowany zgodny plik pozwalał na ekstrakcję dla dostępności, a ten bit łatwo przeoczyć. Ustawienie tego bitu jest zawsze bezpieczne — przyznaje tylko dodatkowy dostęp technologiom wspomagającym, nie innym ścieżkom ekstrakcji. - Po stronie zapisu GetPDFUADiagnostics zyskuje nowy problem
ENCRYPT-NO-ACCESS, który uruchamia się, gdy PDFUAMode jest włączony, a bit 10/Psłownika encrypt' jest wyczyszczony. Wychwytuje to przypadek brzegowy kolejności wywołań, w którym użytkownik najpierw wywołałEncrypt(), a dopiero potem SetPDFUAMode — diagnostyka każe użytkownikowi ponownie wywołaćEncrypt(), aby słownik encrypt został wyemitowany z poprawionym/P.
v3.56.4 2026-05-23
- Po stronie zapisu GetPDFUADiagnostics zyskuje pięć nowych kontroli ISO 14289-1, aby audyt dokumentu w pamięci wychwytywał te same naruszenia co audyt po stronie odczytu CheckFileCompliance ComplianceTest=2.
SUSPECTS-TRUEoznacza MarkInfo/Suspects=true (§7.1: pliki zgodne z PDF/UA wymagają Suspects=false).ROLEMAP-STANDARD-REMAP:Noznacza wywołania AddRoleMap, które przemapowałyby standardowy tag struktury — §7.1 zabrania przemapowywania standardowych tagów.DC-TITLE-MISSINGoznacza pusty XMP dc:title (oddzielnie od DOCINFO-TITLE-MISSING, który sprawdza /Info /Title).TRAPNET-ANNOT:Noznacza adnotacje TrapNet (§7.18.2 ich zabrania).ANNOT-PAGE-NO-TABS-S:Noznacza strony zawierające adnotacje, których /Tabs słownika strony nie jest /S (§7.18.3 wymaga na tych stronach kolejności tabulacji według drzewa struktury). - Audyty PDF/UA-1 po stronie zapisu i odczytu są teraz w przybliżeniu w parytecie: każdy problem zgłaszany przez audyt po stronie odczytu na zapisanym pliku jest także osiągalny z diagnostyki w pamięci, z uwzględnieniem konwencji formatu każdej funkcji (tekst rozdzielany nowymi liniami vs. lista ciągów z kodami NNNNN).
v3.56.3 2026-05-23
- Audyt PDF/UA-1 zyskuje kontrole fontów §7.21.
10020zgłasza każdy font spoza Standard-14, którego FontDescriptor nie maFontFile/FontFile2/FontFile3(§7.21.4.1: każdy renderowany font musi osadzać swój program).10021zgłasza potomków CIDFontType2 bez wpisu/CIDToGIDMap(§7.21.3.2).10022wskazuje fonty Standard 14 (Helvetica, Times, Courier, Symbol, ZapfDingbats oraz warianty bold / oblique), do których odwołano się bez osadzonego programu — §7.21.4 NOTE 5 jasno mówi, że nie ma zwolnienia z osadzania dla tych fontów.10023zgłasza fonty bez CMap/ToUnicode, które nie pasują do listy zwolnień §7.21.7 (predefiniowane kodowania MacRoman / MacExpert / WinAnsi, Type 0 z kolekcjami znaków Adobe-GB1 / CNS1 / Japan1 / Korea1, niesymboliczne TrueType). - Złożone fonty Type 0 są sprawdzane na obu warstwach:
/ToUnicodew samym słowniku nadrzędnym Type 0 oraz osadzanie //CIDToGIDMapw pierwszym potomku CIDFont. Fonty Type 3 pomijają kontrolę osadzania (ich glify są osadzone jako CharProcs), ale nadal uczestniczą w kontroli/ToUnicode. - Pomocniki PDFlibPDFA do podobnej pracy z fontami celowo nie zostały współdzielone — pół tuzina krótkich procedur (usuwanie prefiksu podzbioru, tabela nazw Standard-14, obecność FontFile, flaga Symbolic) zduplikowano lokalnie jako pomocniki
UA*, aby audyt PDF/A mógł dalej ewoluować bez psucia PDF/UA i odwrotnie.
v3.56.2 2026-05-23
- Audyt PDF/UA-1 zyskuje pięć kolejnych kontroli ISO 14289-1 obejmujących adnotacje, osadzone pliki i zawartość opcjonalną.
10015zgłasza adnotacje Link bez niepustego opisu alternatywnego/Contents(§7.18.5), aby czytniki ekranu mogły ogłaszać cele linków.10016i10017oznaczają słowniki FileSpec osadzonych plików, w których brakuje wymaganych kluczy nazwy pliku/Flub/UF(§7.11).10018oznacza słowniki konfiguracji zawartości opcjonalnej, które pomijają niepusty ciąg tekstowy/Name(§7.10).10019oznacza słowniki konfiguracji zawartości opcjonalnej, które zawierają zabroniony klucz/AS(§7.10). - Przejście po adnotacjach na stronę, które już obsługiwało kontrole TrapNet i
/Tabs /S, teraz w tym samym przebiegu zbiera także dane Link //Contents, utrzymując audyt na poziomie O(N) względem liczby obiektów.
v3.56.1 2026-05-23
- Audyt PDF/UA-1 zyskuje pięć nowych kontroli ISO 14289-1.
10010weryfikuje uprawnienie ekstrakcji dla dostępności (bit 10 klucza szyfrowania/P) w zaszyfrowanych plikach (§7.16).10011wykrywa dynamiczne formularze XFA przez element<dynamicRender>required</dynamicRender>wewnątrz pakietu XFA XDP (§7.15).10012oznacza Form XObjects, które zawierają wpis/Ref— referencyjne XObjects są zabronione (§7.20).10013oznacza adnotacjeTrapNet(§7.18.2).10014przechodzi po każdej stronie i zgłasza każdą stronę zawierającą adnotacje, której słownik strony nie ustawia/Tabs /S(§7.18.3), tak aby kolejność tabulacji podążała za drzewem struktury. - Wszystkie pięć nowych kodów przepływa przez tę samą parę uchwytów CheckFileCompliance + GetStringListItem, którą dodało poprzednie wydanie — nie ma nowej publicznej powierzchni API.
v3.56.0 2026-05-23
- Nowy audyt po stronie odczytu
CheckCompliancePDFUAwaliduje zewnętrzny PDF względem ISO 14289-1 (PDF/UA-1). Uzupełnia istniejącą kontrolę po stronie zapisu GetPDFUADiagnostics, akceptując dowolny wejściowy PDF (własny output, output skanera, treści zewnętrzne) i wypisując naruszenia PDF/UA-1 tak samo, jak CheckFileCompliance już zgłasza problemy PDF/A. - CheckFileCompliance akceptuje teraz
ComplianceTest = 2, aby uruchomić nowy audyt PDF/UA-1. Test PDF/A podComplianceTest = 1pozostaje bez zmian, a lista problemów nadal wraca przez istniejącą parę uchwytów GetStringListCount / GetStringListItem. - Pierwsza wersja obejmuje podstawowe bramki zgodności PDF/UA-1 z §5 (identyfikacja XMP
pdfuaid:part) i §7.1 (strumień katalogu/Metadata, znacznik tagged-PDF, drzewo struktury, preferencja tytułu przeglądarki, język dokumentu, XMPdc:title, wartość/Suspectsoraz zakaz przemapowywania standardowych tagów struktury). Emitowanych jest osiem kodów diagnostycznych — od10001do10009— dzięki czemu zakres liczbowy jest wizualnie oddzielony od kodów PDF/A00xxx. - Głębsze klauzule PDF/UA-1 (zabezpieczenia, adnotacje, XObjects, podzbiory fontów) są śledzone dla kolejnych wydań poprawek na bazie tego samego frameworka audytu.
v3.55.6 2026-05-22
- Każdy świeżo wygenerowany pakiet XMP zawiera teraz właściwość xmpMM:InstanceID w formacie uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Identyfikator jest generowany przez Win32 CoCreateGuid i nadaje każdemu utworzonemu dokumentowi unikalny, niezależny od wersji odcisk zgodnie z zaleceniami ISO 19005-1 §6.7.2 (Cor2) oraz przewodników najlepszych praktyk PDF/A. Kompilacje inne niż Windows (gdzie pakiet XMP pozostaje pusty) pozostają bez zmian.
- Przestrzeń nazw xmpMM (http://ns.adobe.com/xap/1.0/mm/) jest teraz częścią SelectionNamespaces pakietu XMP; nowe pomocniki SetXMPMM i GenerateInstanceID stanowią podstawę emisji InstanceID oraz fundament dla przyszłej obsługi xmpMM:History / xmpMM:DerivedFrom.
- Schemat opisu PDF/A Extension Schema (pdfaExtension / pdfaSchema / pdfaProperty / pdfaType / pdfaField) nie jest dodawany w tym wydaniu. Tworzenie niestandardowego schematu rozszerzeń wymaga wieloetapowej konstrukcji bag / seq / właściwości strukturalnych wykraczającej poza obecny kształt SetDublinCore / SetXMPBasic; prace są śledzone dla przyszłego wydania. Dokumenty, które muszą deklarować niestandardowe właściwości XMP, nadal korzystają ze ścieżki LoadFromString.
v3.55.5 2026-05-22
- Dokumenty PDF/A mają teraz flagi adnotacji /F normalizowane podczas zapisu. ISO 19005-1 §6.5.3 wymaga, aby bit Print miał wartość 1, a bity Hidden / Invisible / NoView miały wartość 0 dla każdej adnotacji; writer stosuje teraz tę maskę podczas zapisu, więc wywołujący nie muszą pamiętać układu bitów. Przypadek /Subtype /Popup jest zwolniony — popupy są dziećmi innych adnotacji i tradycyjnie nie są drukowane.
- Flaga AcroForm /NeedAppearances jest teraz wymuszanie ustawiana na false podczas zapisu, gdy dokument jest w dowolnym trybie PDF/A. ISO 19005-1 §6.9 wymaga, aby flaga była nieobecna albo miała wartość false; wcześniej writer pozostawiał dowolną wartość ustawioną przez wywołującego, co tworzyło dokumenty proszące przeglądarkę o ponowne wygenerowanie appearance przy otwarciu i po cichu naruszało specyfikację, gdy wywołujący ustawił ją na true. Poprawka działa również dla dokumentów, w których flaga była wcześniej nieobecna — writer emituje jawne /NeedAppearances false, aby nie pozostawić walidatorowi żadnej niejednoznaczności.
v3.55.4 2026-05-22
- AddStandardFont odrzuca teraz wywołania w trybie PDF/A. ISO 19005-1 §6.3.4 unieważnia wyjątek z referencji PDF mówiący, że „Standard 14 may be unembedded”: każdy program fontu w zgodnym pliku musi być osadzony, a biblioteka nie dostarcza konturów Standard 14. Fasada zwraca po cichu 0; wywołujący powinni przejść na AddTrueTypeFont lub AddType1Font z rzeczywistym plikiem fontu.
- AddTrueTypeFont teraz po cichu promuje Embed=0 (bez osadzania) do Embed=1 (osadź pełny font), gdy aktywny jest tryb PDF/A. Ścieżka odwołania bez osadzonego fontu tworzyła PDF zależny od mechanizmu zastępowania fontów w przeglądarce przez systemową instalację Arial / Times / Courier, co narusza ISO 19005-1 §6.3.4. Istniejący wywołujący, którzy prosili o osadzanie (Embed=1 lub 2), pozostają bez zmian.
- Kontrola zgodności /Encoding dla niesymbolicznego TrueType (ISO 19005-1 §6.3.7 Cor2 wymaga WinAnsi lub MacRoman jako nazwy kodowania albo BaseEncoding, bez /Differences) nie została dodana w tym wydaniu, ponieważ biblioteka już emituje /WinAnsiEncoding dla niesymbolicznych podzbiorów TrueType, a głębsze egzekwowanie wymagałoby śledzenia rozdziału symbolic-vs-non-symbolic przez ścieżkę podzbioru. CheckCompliancePDFA 00034 / 00035 (dodane w v3.51.0) oznaczają wszelkie niezgodne wyjście podczas walidacji.
v3.55.3 2026-05-22
- Słowniki fontów TrueType-backed CIDFontType2 zawierają teraz jawnie /CIDToGIDMap /Identity. ISO 19005-1 §6.3.3.2 (Cor2) wymaga obecności tego wpisu dla każdego osadzonego Type 2 CIDFont; referencja PDF dopuszcza domyślne niejawne Identity, ale PDF/A wymaga jawnej wartości. Writer wcześniej całkowicie pomijał ten klucz, przez co veraPDF (oraz CheckCompliancePDFA 00033 dodane w v3.51.0) oznaczały plik. Nazwa /Identity odpowiada układowi GID-as-CID, który writer już wcześniej tworzył niejawnie, więc istniejące dokumenty renderują się identycznie.
- FontDescriptor /CharSet (dla podzbiorów Type 1) i /CIDSet (dla podzbiorów CIDFont) pozostają TODO; writer musiałby śledzić, które nazwy glifów / CIDs trafiły do podzbioru, aby poprawnie je wypełnić. CheckCompliancePDFA 00031 i 00032 (również dodane w v3.51.0) oznaczą brak, aby użytkownicy zobaczyli problem podczas walidacji.
v3.55.2 2026-05-22
- AddImageDirectFromString odrzuca teraz filtry niezgodne z PDF/A już w punkcie wejścia. Przekazanie Filter = 'LZWDecode' jest odrzucane dla każdej części PDF/A (ISO 19005-1 §6.1.10 oraz równoważne reguły ISO 19005-2 / -3). Przekazanie Filter = 'JBIG2Decode' lub 'JPXDecode' jest odrzucane dla PDF/A-1 (tryby 1 i 2). PDF/A-2 i PDF/A-3 dopuszczają JPXDecode zgodnie z ISO 19005-2 §6.2.8.3 z ograniczeniami podspecyfikacji (liczba kanałów koloru, jednolitość głębi bitowej, wymagania METH/APPROX), których bramka po stronie writera nie egzekwuje — wywołujący w tych trybach nadal muszą zapewnić zgodność strumienia JPEG 2000. Fasada zwraca po cichu 0, gdy żądany jest zabroniony filtr.
- Dane wejściowe TIFF, PNG, JPEG i JPEG 2000 ładowane przez AddImageFromFile / AddImageFromStream pozostają bez zmian: importer dekompresuje bajty źródłowe i ponownie koduje je z FlateDecode (lub DCTDecode dla ładunków JPEG), więc wejściowe LZW nigdy nie propaguje do łańcucha Filter w wyjściu. Walidator CheckCompliancePDFA dodany w v3.50.0 (00004) i v3.52.0 (00022, 00023) zapewnia drugą linię obrony podczas walidacji dla każdej pośredniej ścieżki, która nadal przepuści zabroniony filtr do wyjścia.
v3.55.1 2026-05-22
- AddLinkToHideField odrzuca teraz wywołania w trybie PDF/A. Poprzednie wydanie pozostawiło komentarz twierdzący, że akcja była zgodna z PDF/A, ale ISO 19005-1 Cor2 dodało /Hide do listy zabronionych akcji (§6.6.1), a ISO 19005-2 / -3 dziedziczą to ograniczenie. Fasada zwraca po cichu 0 przy wywołaniu w trybie PDF/A, tak jak AddLinkToJavaScript i AddLinkToImportData.
- AddSWFAnnotationFromFile odrzuca teraz wywołania w trybie PDF/A. Adnotacje SWF / RichMedia opakowują media Flash, które są zabronione przez ISO 19005-1 §6.5.2 (brak podtypów Movie / Sound) i wzmocnione przez ISO 19005-2 §6.3.1 (brak 3D / Sound / Screen / Movie). Fasada zwraca po cichu 0.
- AddEmbeddedFile i AddLinkToEmbeddedFile odrzucają teraz wywołania w trybach PDF/A-1 i PDF/A-2. ISO 19005-1 §6.1.11 zabrania /EF, a ISO 19005-2 §6.8 dopuszcza tylko osadzone pliki PDF/A; zamiast weryfikować rekurencyjną zgodność PDF/A dołączonego ładunku, writer po prostu odmawia wywołania w tych trybach. PDF/A-3 (SetPDFAMode 5 lub 6) pozostaje dozwolone — zobacz v3.55.0 dla automatycznego wstrzykiwania /AFRelationship.
- SetOpenActionMenu odrzuca teraz wartości MenuItem spoza białej listy {NextPage, PrevPage, FirstPage, LastPage}, gdy dokument jest w trybie PDF/A. ISO 19005-1 §6.6.1 ogranicza named actions do tego zestawu, więc wcześniej API po cichu tworzyło niezgodne słowniki Open-Action Find / Print / FullScreen, które veraPDF odrzucał.
- NewOptionalContentGroup odrzuca teraz wywołania w trybach PDF/A-1 (SetPDFAMode 1 lub 2). ISO 19005-1 §6.1.13 zabrania klucza Catalog /OCProperties. PDF/A-2 (tryby 3/4) i PDF/A-3 (tryby 5/6) dopuszczają optional content z ograniczeniami w odpowiednich §6.9, więc bramka uruchamia się tylko dla PDF/A-1.
v3.55.0 2026-05-22
- Dokumenty PDF/A-3 otrzymują teraz automatycznie wpis /AFRelationship przy każdym osadzonym pliku. Wcześniej plik PDF/A-3 utworzony biblioteką mógł nie przejść walidacji, ponieważ ISO 19005-3 Annex E, Table E.1 wymaga AFRelationship przy każdej specyfikacji pliku osadzonego. Writer wstrzykuje teraz skonfigurowaną wartość domyślną ('Unspecified' domyślnie) do każdego słownika FileSpec, który nie ma tego wpisu podczas zapisu, odzwierciedlając wcześniejsze automatyczne wstrzykiwanie PDF/UA AFRelationship. Automatyczne wstrzykiwanie uruchamiają tylko tryby PDF/A-3 (SetPDFAMode 5 = PDF/A-3b lub 6 = PDF/A-3a); PDF/A-1 i PDF/A-2 nadal całkowicie odrzucają pliki osadzone zgodnie z ISO 19005-1 §6.1.11 i ISO 19005-2 §6.8.
- SetPDFA3DefaultAFRelationship to nowe API, które nadpisuje wartość domyślną zapisywaną przez writera, gdy plik osadzony nie ma wpisu /AFRelationship. Akceptuje wartości ISO 19005-3 Table E.1: 'Source' (plik osadzony jest materiałem źródłowym, z którego powstała zawartość PDF), 'Data' (plik jest danymi strukturalnymi stojącymi za wizualną tabelą lub wykresem), 'Alternative' (alternatywne przedstawienie, takie jak wersja audio), 'Supplement' (uzupełniająca reprezentacja, taka jak forma MathML równania), 'Unspecified' (relacji nie da się scharakteryzować powyższymi wartościami) lub dowolną zarejestrowaną nazwę drugiej klasy. Pusty string resetuje do 'Unspecified'. Nadpisania per-file pozostają dostępne przez SetEmbeddedFileAFRelationship.
- Nowe API są udostępnione w fasadzie Delphi jako TPDFlib.SetPDFA3DefaultAFRelationship oraz przez DLL jako DLSetPDFA3DefaultAFRelationship (PWideChar) i DLSetPDFA3DefaultAFRelationshipA (PAnsiChar).
v3.54.0 2026-05-22
- LoadOutputIntentProfile to nowe API, które zastępuje dołączony profil sRGB OutputIntent zewnętrznym profilem ICC załadowanym z dysku. Jest wymagane przy tworzeniu dokumentów PDF/A w przestrzeniach kolorów DeviceCMYK lub DeviceGray, ponieważ biblioteka dostarcza tylko profil sRGB. Typowe użycie polega na wywołaniu najpierw SetPDFAMode (co inicjalizuje szkielet OutputIntent), a następnie LoadOutputIntentProfile('C:\\path\\to\\FOGRA39.icc', 'DeviceCMYK'), aby podmienić bajty profilu i oznaczyć dokument nową przestrzenią kolorów. Zwraca 1 przy powodzeniu, 0 przy braku pliku lub nieznanej przestrzeni kolorów. Udostępnione w fasadzie Delphi jako TPDFlib.LoadOutputIntentProfile oraz przez DLL jako DLLoadOutputIntentProfile (forma PWideChar) i DLLoadOutputIntentProfileA (forma PAnsiChar). ISO 19005-1 §6.2.2 dopuszcza dowolny zarejestrowany profil ICC w strumieniu DestOutputProfile.
- SetFillColorCMYK, SetTextColorCMYK, SetTextHighlightColorCMYK, SetTextUnderlineColorCMYK, AddSeparationColor, SetFillColorSep, SetLineColorSep, SetTextHighlightColorSep i SetTextColorSep teraz działają w trybie PDF/A, gdy profil OutputIntent dokumentu to DeviceCMYK. Wcześniej te API odrzucały każde wywołanie w trybie PDF/A niezależnie od OutputIntent, co uniemożliwiało tworzenie zgodnych dokumentów CMYK. Bramka ma teraz postać PDFAMode = 0 OR OutputIntentColorSpace = 'DeviceCMYK', zgodnie z regułą ISO 19005-1 §6.2.3.3, że DeviceCMYK jest dozwolone, gdy OutputIntent używa profilu CMYK, oraz ISO 19005-1 §6.2.3.4, które dopuszcza alternatywy Separation, których bazowa przestrzeń kolorów również jest zgodna.
- SetTextShader teraz działa w trybie PDF/A, gdy profil OutputIntent to DeviceRGB albo DeviceCMYK. Same shadery nie są zakazane przez PDF/A; walidator (po stronie odczytu) sprawdza, czy wewnętrzna przestrzeń kolorów shadera pasuje do OutputIntent. Poprzednie zachowanie ścisłego odrzucania blokowało zgodne użycie shaderów.
- Odblokowanie CMYK / Separation / Shader zależy od tagu OutputIntentColorSpace ustawionego przez AddOutputIntent i LoadOutputIntentProfile (wprowadzone w v3.53.0). Wywołanie SetPDFAMode bez LoadOutputIntentProfile zachowuje przestrzeń kolorów jako DeviceRGB (dołączony profil sRGB), więc wywołania CMYK nadal są domyślnie odrzucane — nowe zachowanie jest opcjonalne przez LoadOutputIntentProfile.
v3.53.0 2026-05-22
- Słownik OutputIntent zawiera teraz pełne pola szkieletu PDF/A zalecane przez ISO 19005-1 §6.2.2 i Adobe Acrobat preflight: /OutputCondition (czytelny dla człowieka opis warunku koloru), /Info (dłuższy tekst identyfikacyjny) oraz /RegistryName (URL rejestru, domyślnie http://www.color.org). Wartości domyślne to "sRGB IEC61966-2.1" / "sRGB IEC61966-2.1" / "http://www.color.org" dla starszych miejsc wywołania z jednym argumentem; nowe przeciążenie AddOutputIntent przyjmuje bezpośrednio cztery niestandardowe pola, aby wywołujący mogli wypełnić je dla własnych warunków koloru.
- AddOutputIntent zyskuje nowe przeciążenie z pięcioma argumentami: AddOutputIntent(ColorSpace, OutputConditionIdentifier, OutputCondition, Info, RegistryName). Starsza forma z jednym argumentem działa bez zmian; teraz deleguje do nowego przeciążenia z domyślnymi wartościami sRGB. Argument ColorSpace wybiera również liczbę komponentów /N zapisywaną do słownika osadzonego profilu ICC (3 dla DeviceRGB, 4 dla DeviceCMYK, 1 dla DeviceGray); sam osadzony profil pozostaje dołączonym strumieniem sRGB do czasu dostarczenia nadchodzącego API LoadOutputIntentProfile w v3.54.0.
- TPDFDocument udostępnia OutputIntentColorSpace jako właściwość do odczytu/zapisu śledzącą przestrzeń kolorów ostatniego wywołania AddOutputIntent. Staje się to warunkiem bramki dla ograniczeń po stronie writera dotyczących CMYK / Separation / Shader w v3.54.0, gdzie API kolorów, które dziś odrzucają każde wywołanie w trybie PDF/A, będą odrzucać je tylko wtedy, gdy przestrzeń kolorów nie pasuje do OutputIntent.
v3.52.0 2026-05-22
- CheckCompliancePDFA teraz audytuje adnotacje, stan graficzny, akcje i form XObjects, domykając zakres walidatora PDF/A po stronie odczytu dla rozdziałów ISO 19005-1 6.2-6.6 oraz równoważnych reguł różnicowych PDF/A-2/-3. Walidator zgłasza 14 nowych klas problemów (00050-00067): zabronione podtypy adnotacji (00050; ISO 19005-1 §6.5.2 zabrania FileAttachment / Sound / Movie dla PDF/A-1, a ISO 19005-2 §6.3.1 zabrania 3D / Sound / Screen / Movie dla PDF/A-2 i PDF/A-3), adnotacja /CA inna niż 1.0 (00051; §6.5.3), adnotacja /F brakująca albo z Print=0 / Hidden=1 / Invisible=1 / NoView=1 (00052; §6.5.3, z wyjątkiem /Subtype /Popup), adnotacja /AA (00054; §6.6.2), słownik appearance adnotacji z kluczami innymi niż /N lub niezgodną wartością /N (00055; §6.5.3 Cor2), adnotacja Widget z /A (00056; §6.9), ExtGState /TR (00058; §6.2.8), ExtGState /TR2 inne niż /Default (00059; §6.2.8), oraz tylko w PDF/A-1: ExtGState /SMask inne niż /None (00061; §6.4), /BM inne niż Normal lub Compatible (00062; §6.4), /CA lub /ca inne niż 1.0 (00063; §6.4).
- Audyt action-anywhere (00064, 00065) zastępuje kontrolę wyłącznie OpenAction z v3.50.0 pełnym przebiegiem, który oznacza zabronione wartości akcji /S (Launch, Sound, Movie, ResetForm, ImportData, JavaScript, Hide, SetState, NOP, Trans, GoTo3DView, Rendition, SetOCGState) oraz named actions, których /N jest poza {NextPage, PrevPage, FirstPage, LastPage}, niezależnie od miejsca występowania akcji (annotation /A, widget /A, outline /A, catalog /OpenAction itd.). ISO 19005-1 §6.6.1.
- Audyt XObject (00066, 00067) zgłasza PostScript i Reference XObjects, a także zabronione klucze w Form XObjects (/OPI, /PS, /Subtype2 = /PS) oraz Image XObjects (/Alternates, /OPI, /Interpolate true). ISO 19005-1 §6.2.4 - §6.2.7.
v3.51.0 2026-05-22
- CheckCompliancePDFA teraz audytuje zgodność fontów i przestrzeni kolorów oprócz kontroli strukturalnych dodanych w v3.50.0. Walidator zgłasza dziewięć nowych klas problemów: co najmniej jeden program fontu nie jest osadzony (00030; ISO 19005-1 §6.3.4 wymaga osadzenia każdego programu fontu, w tym substytucji Standard 14), podzbiór Type 1 bez /CharSet w FontDescriptor (00031; §6.3.5), podzbiór CIDFont bez /CIDSet (00032; §6.3.5), CIDFontType2 bez /CIDToGIDMap (00033; §6.3.3.2 Cor2), niesymboliczny TrueType z niezgodnym /Encoding (00034; §6.3.7 Cor2 wymaga bezpośrednio WinAnsi/MacRoman albo jako BaseEncoding, bez /Differences), symboliczny TrueType, który nadal zawiera /Encoding (00035; §6.3.7 Cor2), co najmniej jeden font bez /ToUnicode w dokumentach PDF/A-Na lub PDF/A-Nu (00036; zastosowano czteroklasowe wyłączenie §6.3.8), przestrzeń kolorów ICCBased, która nie osadza swojego strumienia profilu (00037; §6.2.3.2), oraz plik używający jednocześnie DeviceRGB i DeviceCMYK (00038; §6.2.3.3 zabrania mieszania).
- Kontrola /ToUnicode (00036) jest ograniczona do poziomów zgodności A i U, ponieważ tylko te poziomy wymagają mapowania Unicode zgodnie z ISO 19005-1 §6.3.8 i ISO 19005-2 §6.2.11.7. Pliki poziomu B (PDF/A-1b, PDF/A-2b, PDF/A-3b) nie są oznaczane. Czteroklasowe wyłączenie rozpoznaje predefiniowane kodowania (MacRomanEncoding, MacExpertEncoding, WinAnsiEncoding), Standard 14 Type 1 BaseFonts jako przybliżenie dla fontów Adobe Standard Latin / Symbol z nazwami glifów oraz fonty Type 0, których podrzędny CIDFont używa rejestrów Adobe-GB1, Adobe-CNS1, Adobe-Japan1 lub Adobe-Korea1.
- Audyt fontów przechodzi przez każdy słownik Font, klasyfikuje go według Subtype (Type1, MMType1, TrueType, Type3, Type0 z podrzędnym CIDFontType0 lub CIDFontType2), a następnie uruchamia odpowiednie kontrole. Złożone fonty Type 0 delegują kontrole osadzenia i podzbiorów do swojego podrzędnego CIDFont, zachowując /ToUnicode na wrapperze Type 0. Wykrywanie podzbiorów używa standardowej konwencji prefiksu sześciu wielkich liter.
v3.50.0 2026-05-22
- CheckCompliancePDFA zgłasza teraz 15 dodatkowych problemów niezgodności PDF/A, które walidator wcześniej pomijał: brakująca tablica trailer /ID (00013), brakujący strumień Document Catalog /Metadata (00014), /Filter zastosowany do strumienia /Metadata (00015), słowniki strumieni odwołujące się do plików zewnętrznych przez /F, /FFilter lub /FDecodeParms (00016), pliki osadzone deklarowane przez /EF w dowolnym słowniku specyfikacji pliku albo przez wpis Name tree /EmbeddedFiles w dokumentach PDF/A-1 (00017, 00018), /OpenAction wskazujące na zabroniony typ akcji (00019), słowniki /AA additional-action w Document Catalog lub dowolnej Page (00020, 00021), filtry JBIG2Decode lub JPXDecode w dokumentach PDF/A-1 (00022, 00023), filtry Crypt, których /Name nie jest /Identity (00024), /Requirements w Document Catalog (00025), /Perms z kluczami innymi niż /UR3 i /DocMDP (00026) oraz /AcroForm /NeedAppearances ustawione na true (00027). Walidator oznacza teraz zabronione typy akcji Catalog /OpenAction (/Launch, /Sound, /Movie, /ResetForm, /ImportData, /JavaScript, /Hide, /SetState, /NOP, /Trans, /GoTo3DView, /Rendition, /SetOCGState) oraz wartości named-action /N spoza listy dozwolonych {NextPage, PrevPage, FirstPage, LastPage} zgodnie z ISO 19005-1 §6.6.1.
- Parser PDFAID akceptuje sufiks zgodności U (PDF/A-2U, PDF/A-3U) obok istniejących wariantów A i B, więc CheckCompliancePDFA nie zgłasza już fałszywego ostrzeżenia "00005 PDFA Mark NOT Found or invalid" podczas skanowania pliku PDF/A-2U lub PDF/A-3U utworzonego przez inne narzędzie. Poziomy zgodności mapowania Unicode dodane w ISO 19005-2:2011 są teraz rozpoznawane przez walidator.
- Kontrole specyficzne dla filtrów (JBIG2Decode, JPXDecode) i kontrole plików osadzonych (/EF, /EmbeddedFiles) pozostają ograniczone do PDF/A-1, ponieważ ISO 19005-2 §6.2.8.3 i §6.8 wyraźnie łagodzą te ograniczenia dla PDF/A-2 i PDF/A-3. Kontrole struktury dokumentu (/Metadata, /AcroForm /NeedAppearances, /OpenAction, /AA, /Requirements, /Perms) mają zastosowanie do każdej części PDF/A.
v3.49.0 2026-05-21
- AddLinkToImportData tworzy adnotację Link, której akcja jest akcją importu danych PDF (/S /ImportData), wypełniającą pola AcroForm dokumentu z zewnętrznego pliku FDF, gdy użytkownik kliknie link (ISO 32000-1 §12.6.4.8, Table 198). Parametr FileName jest używany jako słownik filespec, z tymi samymi regułami normalizacji ścieżki, których używają AddLinkToFile / AddLinkToFileEx (ukośniki odwrotne konwertowane na ukośniki zwykłe zgodnie z ISO 32000-1 §7.11.2.1). Bit 0 Options przełącza widoczną ramkę, a bity 1–3 wybierają tryb podświetlenia linku (Invert, Outline, Push), zgodnie z istniejącymi konwencjami AddLinkTo*. PDF 1.4 lub nowszy. NIEDOZWOLONE w PDF/A, ponieważ akcja odwołuje się do zasobu zewnętrznego; fasada po cichu zwraca 0 przy wywołaniu w trybie PDF/A. Udostępnione w bibliotece Delphi oraz interfejsie DLL jako DLAddLinkToImportData / DLAddLinkToImportDataA (forma PWideChar i PAnsiChar).
v3.48.0 2026-05-21
- AddLinkToHideField tworzy adnotację Link, której akcja jest akcją ukrywania PDF (/S /Hide), przełączającą widoczność jednego lub więcej pól AcroForm, gdy użytkownik kliknie link (ISO 32000-1 §12.6.4.10, Table 196). FieldNames akceptuje jedną lub więcej w pełni kwalifikowanych nazw pól rozdzielonych przecinkami, średnikami lub znakami końca wiersza; pojedyncza nazwa emituje /T jako string tekstowy, a dwie lub więcej nazw emituje /T jako tablicę, przy czym obie formy są dozwolone przez specyfikację. HideFlag wybiera kierunek widoczności: wartość niezerowa ukrywa wymienione pola (/H true), a zero je pokazuje (/H false). Bit 0 Options przełącza widoczną ramkę, a bity 1–3 wybierają tryb podświetlenia linku (Invert, Outline, Push), zgodnie z AddLinkToWeb / AddLinkToNamedAction. PDF 1.2 lub nowszy. Zgodne z PDF/A, ponieważ nie jest przywoływany żaden zasób zewnętrzny. Udostępnione w bibliotece Delphi oraz interfejsie DLL jako DLAddLinkToHideField / DLAddLinkToHideFieldA (forma PWideChar i PAnsiChar).
v3.47.0 2026-05-21
- AddLinkToNamedAction tworzy adnotację Link, której akcja jest named action PDF (/S /Named), uruchamiającą jedno z czterech standardowych poleceń nawigacji przeglądarki zdefiniowanych w ISO 32000-1 §12.6.4.11, Table 194: NextPage, PrevPage, FirstPage i LastPage. Parametr NamedActionType wybiera polecenie (0=NextPage, 1=PrevPage, 2=FirstPage, 3=LastPage); wartości spoza tego zakresu wracają do NextPage, aby writer zawsze emitował zgodną ze specyfikacją nazwę /N. Bit 0 Options przełącza widoczną ramkę, a bity 1–3 wybierają tryb podświetlenia linku (Invert, Outline, Push), zgodnie z istniejącymi konwencjami AddLinkToWeb / AddLinkToPage. Adnotacja wymaga PDF 1.1 lub nowszego i jest zgodna z PDF/A, ponieważ nie jest przywoływany żaden zasób zewnętrzny. Dostępne w bibliotece Delphi i interfejsach DLL.
v3.46.1 2026-05-21
- AddCaretAnnotation tworzy adnotację caret markup (PDF /Subtype /Caret) w podanym prostokącie, oznaczając pozycję na stronie, w której tekst lub treść zostały wstawione, pominięte albo w inny sposób wymagają uwagi recenzenta. Obsługuje dwa typy symboli (None i Paragraph) przez SymbolType (0 / 1), konfigurowalny kolor, opacity, tytuł, zawartość oraz znaczniki czasu utworzenia/modyfikacji. Zdefiniowane w ISO 32000-1 §12.5.6.11. PDF 1.5 lub nowszy. Dostępne w bibliotece Delphi i interfejsach DLL.
- Ten wpis domyka uzupełnianie adnotacji geometrycznych rozpoczęte w v3.44.0 Square+Circle. PDFlibPas tworzy teraz adnotacje Text, Stamp, FreeText, TextMarkup (Highlight/Underline/Squiggly/StrikeOut), Square, Circle, Line, Polygon, PolyLine, Ink i Caret, oprócz istniejącej obsługi Link, FileAttachment, SVG, U3D i SWF.
v3.46.0 2026-05-21
- AddInkAnnotation tworzy adnotację ink markup (PDF /Subtype /Ink) reprezentującą odręczne kreski lub dowolne znaki rysowane na stronie. Kreski są podawane jako pojedynczy string, w którym wiele kresek jest oddzielanych przez '|' lub nową linię, a w obrębie każdej kreski pary współrzędnych używają tego samego formatu ze spacją/przecinkiem/średnikiem/tabulatorem co AddPolygonAnnotation. Na przykład "100 100 110 105 120 110 | 200 200 210 205" opisuje dwie oddzielne kreski. Obsługuje konfigurowalną szerokość obramowania, kolor tuszu, opacity, tytuł, zawartość i znaczniki czasu. Zdefiniowane w ISO 32000-1 §12.5.6.13. PDF 1.3 lub nowszy. Dostępne w bibliotece Delphi i interfejsach DLL.
- Każda kreska musi zawierać parzystą liczbę wartości (co najmniej cztery), w przeciwnym razie wywołanie zwraca 0 i nie zapisuje adnotacji. /Rect jest obliczany automatycznie z łącznego zakresu wszystkich kresek plus niewielki padding, aby kreski pozostały wewnątrz prostokąta ograniczającego adnotacji.
v3.45.0 2026-05-21
- AddPolygonAnnotation tworzy zamkniętą adnotację polygon markup (PDF /Subtype /Polygon) z wierzchołkami podanymi jako string par współrzędnych rozdzielanych spacjami, przecinkami, średnikami lub tabulatorami (np. "100 100 200 100 200 200 100 200"). Obsługuje konfigurowalną szerokość obramowania, kolor obramowania, opcjonalny kolor wypełnienia wnętrza, opacity, tytuł, zawartość i znaczniki czasu. Zdefiniowane w ISO 32000-1 §12.5.6.9. PDF 1.5 lub nowszy. Dostępne w bibliotece Delphi i interfejsach DLL.
- AddPolyLineAnnotation tworzy otwartą adnotację polyline markup (PDF /Subtype /PolyLine) z tym samym formatem stringa wierzchołków i konfigurowalnymi stylami zakończeń linii na każdym końcu (None, Square, Circle, Diamond, OpenArrow, ClosedArrow, Butt, ROpenArrow, RClosedArrow, Slash). Zdefiniowane w ISO 32000-1 §12.5.6.9. PDF 1.5 lub nowszy. Dostępne w bibliotece Delphi i interfejsach DLL.
- Obie adnotacje wymagają co najmniej dwóch punktów wierzchołków (czterech liczb) oraz parzystej łącznej liczby liczb; wywołanie zwraca 0, jeśli string wierzchołków nie da się sparsować do poprawnej listy par. /Rect jest obliczany z zakresu wierzchołków plus padding proporcjonalny do szerokości obramowania, aby dekoracje końców pozostały widoczne.
- Obie adnotacje podnoszą wersję dokumentu do PDF 1.5, gdy są emitowane przy niższej blokadzie minimalnej wersji.
v3.44.1 2026-05-21
- AddLineAnnotation tworzy adnotację line markup (PDF /Subtype /Line) między dwoma punktami końcowymi, z konfigurowalną szerokością obramowania, kolorem linii, opcjonalnym kolorem wypełnienia wnętrza, stylami zakończeń linii dla obu końców (None, Square, Circle, Diamond, OpenArrow, ClosedArrow, Butt, ROpenArrow, RClosedArrow, Slash), opacity, tytułem, zawartością oraz znacznikami czasu utworzenia/modyfikacji. Zdefiniowane w ISO 32000-1 §12.5.6.7. PDF 1.3 lub nowszy. Dostępne w bibliotece Delphi i interfejsach DLL.
- Adnotacja /Rect jest obliczana z dwóch punktów końcowych plus padding proporcjonalny do szerokości obramowania, aby dekoracje końców pozostały wewnątrz prostokąta ograniczającego adnotacji.
v3.44.0 2026-05-21
- AddSquareAnnotation tworzy adnotację znacznika prostokątnego (PDF /Subtype /Square) w podanym prostokącie, z konfigurowalną szerokością obramowania, kolorem obramowania, opcjonalnym kolorem wypełnienia wnętrza, kryciem, tytułem, zawartością oraz znacznikami czasu utworzenia/modyfikacji. Zdefiniowano w ISO 32000-1 §12.5.6.8. PDF 1.3 lub nowszy. Dostępne w bibliotece Delphi oraz interfejsach DLL.
- AddCircleAnnotation tworzy adnotację znacznika eliptycznego (PDF /Subtype /Circle) wpisaną w podany prostokąt, z takim samym konfigurowalnym obramowaniem, wypełnieniem, kryciem, tytułem, zawartością i znacznikami czasu jak AddSquareAnnotation. Zdefiniowano w ISO 32000-1 §12.5.6.8. PDF 1.3 lub nowszy. Dostępne w bibliotece Delphi oraz interfejsach DLL.
- Obie nowe adnotacje automatycznie podnoszą wersję dokumentu do PDF 1.3, gdy są emitowane przy blokadzie niższej wersji minimalnej, i emitują standardowy zestaw pól adnotacji znacznikowej (/Type /Subtype /Rect /C /IC /BS /Border /CA /F /M /CreationDate /NM /T /Contents /Subj /P), dzięki czemu istniejące przepływy recenzji w Acrobat, Foxit i Edge mogą je edytować po utworzeniu.
v3.43.0 2026-05-20
- SetStructElemSpaceBefore i SetStructElemSpaceAfter ustawiają atrybuty /SpaceBefore i /SpaceAfter (właściciel Layout) dla aktualnie otwartego elementu struktury, wyrażając odstęp przed i po elementach blokowych w punktach. Zdefiniowano w ISO 32000-1 §14.8.5.4.2 Table 340. Dostępne w bibliotece Delphi, ActiveX (Dispids 73008051/73008052) oraz interfejsach DLL.
- SetStructElemStartIndent i SetStructElemEndIndent ustawiają atrybuty /StartIndent i /EndIndent (właściciel Layout), wyrażając wcięcie od krawędzi początkowej i końcowej prostokąta treści, zgodnych z trybem pisania, w punktach. Zdefiniowano w ISO 32000-1 §14.8.5.4.2 Table 340. Dostępne w bibliotece Delphi, ActiveX (Dispids 73008053/73008054) oraz interfejsach DLL.
- SetStructElemColor ustawia atrybut /Color (właściciel Layout) jako trójkę RGB (każda składowa 0.0-1.0), opisując kolor pierwszego planu elementu dla silników ponownego przepływu i dalszych narzędzi sprawdzających kontrast kolorów. Zdefiniowano w ISO 32000-1 §14.8.5.4.2 Table 340. Dostępne w bibliotece Delphi, ActiveX (Dispid 73008055) oraz interfejsach DLL.
- Naprawiono błąd serializacji w BuildStructElemDictRef: jednowyrazowe numeryczne wartości atrybutów (takie jak SpaceBefore, SpaceAfter, StartIndent, EndIndent) były zapisywane jako nazwy PDF zamiast liczb PDF. Poprawka dotyczy zarówno gałęzi atrybutów z jednym właścicielem, jak i z wieloma właścicielami.
v3.42.0 2026-05-20
- CheckCompliancePDFA teraz poprawnie weryfikuje wszystkie sześć trybów PDF/A (1a, 1b, 2a, 2b, 3a, 3b). Sprawdzenie PDFAID (kod 00005) akceptuje dowolny z sześciu poprawnych znaczników XMP zamiast tylko '1B'. Sprawdzenie górnego limitu wersji (00002) stosuje 1.4 dla PDF/A-1 oraz 1.7 dla PDF/A-2 i PDF/A-3.
- Sprawdzenie OCProperties (kod 00003) jest teraz warunkowe: dotyczy tylko dokumentów PDF/A-1, w których zawartość opcjonalna (warstwy) jest zabroniona. PDF/A-2 i PDF/A-3 dopuszczają warstwy i nie są już oznaczane.
- Dodano trzy nowe sprawdzenia zgodności: kod 00006 oznacza dokumenty zaszyfrowane (szyfrowanie jest zabronione we wszystkich wersjach PDF/A); kod 00007 oznacza dokumenty bez wpisu OutputIntents w katalogu (wymaganego przez wszystkie wersje PDF/A); kody 00011 i 00012 oznaczają dokumenty bez MarkInfo lub StructTreeRoot, gdy poziom zgodności to -a (dostępność).
v3.41.0 2026-05-20
- Tryb PDF/A egzekwuje teraz zabronione operacje na poziomie API. Gdy aktywny jest tryb PDF/A (dowolny z trybów 1-6), wywołanie SetEncryption, AddSeparationColor, SetFillColorCMYK, SetTextColorCMYK lub dowolnego innego API CMYK/Separation/Shader zwraca 0 i nie ma efektu, zgodnie z wymaganiem PDF/A's dotyczącym pojedynczego wyjściowego profilu sRGB.
- Przezroczystość jest zabroniona w PDF/A-1 (tryby 1 i 2): SetTransparency, SetBlendMode i SetPageTransparencyGroup zwracają 0 i nie wykonują operacji, gdy aktywny tryb to 1 lub 2. PDF/A-2 i PDF/A-3 (tryby 3-6) dopuszczają ograniczoną przezroczystość i nie są ograniczone.
- Akcje JavaScript są zabronione we wszystkich trybach PDF/A (1-6): SetOpenActionJavaScript, PageJavaScriptAction, DocJavaScriptAction, AddGlobalJavaScript i AddLinkToJavaScript zwracają 0 i nie wykonują operacji, gdy aktywny jest dowolny tryb PDF/A. ISO 19005-1 §6.6.1 jawnie zakazuje JavaScript w dokumentach PDF/A.
- API załączników plików (EmbedFile, AddFileAttachment) są blokowane w trybach PDF/A-1 i PDF/A-2 (1-4). Pozostają funkcjonalne w PDF/A-3 (tryby 5 i 6), który jawnie dopuszcza dowolne osadzone pliki.
v3.40.0 2026-05-20
- SetPDFAMode obsługuje teraz poziomy zgodności PDF/A-2 i PDF/A-3. Przekaż NewMode=3 dla PDF/A-2b, 4 dla PDF/A-2a, 5 dla PDF/A-3b lub 6 dla PDF/A-3a. PDF/A-2 docelowo używa PDF 1.7 i dopuszcza warstwy, formularze interaktywne, obrazy JPEG2000 oraz ograniczoną przezroczystość. PDF/A-3 rozszerza PDF/A-2, zezwalając na dowolne osadzone pliki (dowolny typ MIME). Wszystkie warianty -a automatycznie zapisują /MarkInfo oraz znaczniki struktury tagged-PDF wymagane przez poziom zgodności dostępności.
- Naprawiono: SetPDFAMode(1) (PDF/A-1a) wcześniej nie wykonywał operacji z powodu wewnętrznego błędu routingu wprowadzonego w v3.20.0. Teraz poprawnie zapisuje /MarkInfo i /OutputIntents oraz ustawia XMP pdfaid:part=1/conformance=A.
- GetInformation(201) zwraca '1' do '6', zgodnie z aktywnym trybem PDF/A i nową numeracją trybów.
v3.39.0 2026-05-20
- SetStructElemWritingMode ustawia atrybut /WritingMode (właściciel Layout) dla aktualnie otwartego elementu struktury. Poprawne wartości to LrTb (od lewej do prawej, domyślne dla alfabetów łacińskich), RlTb (od prawej do lewej, dla arabskiego i hebrajskiego) oraz TbRl (od góry do dołu, od prawej do lewej, dla tradycyjnego pionowego tekstu CJK). Zdefiniowano w ISO 32000-1 §14.8.5.4.2 Table 340. Dostępne w bibliotece Delphi, ActiveX (Dispid 73008049) oraz interfejsach DLL.
- SetStructElemListNumbering ustawia atrybut /ListNumbering (właściciel List) dla aktualnie otwartego elementu struktury. Obsługiwane wartości obejmują None, Disc, Circle, Square (znaczniki nieuporządkowane) oraz Decimal, UpperRoman, LowerRoman, UpperAlpha, LowerAlpha (numerowanie uporządkowane). Atrybut jest ustawiany na elemencie L (lista) i umożliwia technologiom wspomagającym prawidłowe ogłaszanie typu listy. Zdefiniowano w ISO 32000-1 §14.8.5.3.2 Table 336. Dostępne w bibliotece Delphi, ActiveX (Dispid 73008050) oraz interfejsach DLL.
v3.38.0 2026-05-20
- SetStructElemColSpan ustawia atrybut /ColSpan (właściciel Table) dla aktualnie otwartego elementu struktury, wskazując, ile kolumn obejmuje komórka. Zdefiniowano w ISO 32000-1 §14.8.5.7.2 Table 337. Dostępne w bibliotece Delphi, ActiveX (Dispid 73008047) oraz interfejsach DLL.
- SetStructElemRowSpan ustawia atrybut /RowSpan (właściciel Table) dla aktualnie otwartego elementu struktury, wskazując, ile wierszy obejmuje komórka. Zdefiniowano w ISO 32000-1 §14.8.5.7.2 Table 337. Dostępne w bibliotece Delphi, ActiveX (Dispid 73008048) oraz interfejsach DLL.
- Obie funkcje są wygodnymi opakowaniami równoważnymi wywołaniu AddTagAttribute z Owner='Table' i odpowiednią nazwą atrybutu. Uzupełniają SetStructElemScope dla w pełni opisanych komórek tabel w złożonych tabelach lub tabelach z nagłówkami obejmującymi wiele zakresów.
v3.37.2 2026-05-20
- GetPDFUADiagnostics zgłasza teraz FORM-NO-TOOLTIP:N, gdy N interaktywnych pól formularza (adnotacje Widget) nie ma wpisu TU (podpowiedź / nazwa dostępna). ISO 14289-1 §7.18.4 wymaga, aby wszystkie interaktywne pola formularzy zawierały wpis TU, tak aby technologia wspomagająca mogła ogłosić użytkownikowi cel pola, gdy pole otrzyma fokus. /TU jest nazwą dostępną odczytywaną na głos przez czytniki ekranu; różni się od /T, czyli częściowej nazwy pola używanej do dostępu programistycznego i przesyłania formularza.
v3.37.1 2026-05-20
- GetPDFUADiagnostics zgłasza teraz LIST-STRUCT:N, gdy N elementów struktury LI lub LBody pojawia się poza wymaganym elementem nadrzędnym. ISO 32000-1 §14.8.4.4 wymaga, aby LI było bezpośrednim dzieckiem L (lista), a LBody bezpośrednim dzieckiem LI (element listy). Niepoprawne zagnieżdżenie list uniemożliwia technologiom wspomagającym prawidłowe przechodzenie po treści listy i jej ogłaszanie oraz może powodować błędy walidacji struktury dokumentu w walidatorach PDF/UA-1.
v3.37.0 2026-05-20
- BeginTagEx2 to nowe API, które otwiera element struktury i ustawia wszystkie główne właściwości elementu w jednym wywołaniu. Oprócz parametrów TagType, AltText, ActualText i Lang z BeginTagEx, BeginTagEx2 przyjmuje Title (/T, dla panelu nawigacji Tags), ElemID (/ID, unikalny identyfikator elementu) oraz Expansion (/E, pełny tekst skrótu lub akronimu). Przekazanie pustego ciągu dla dowolnego z tych trzech dodatkowych parametrów jest równoważne pominięciu odpowiedniego settera. BeginTagEx2 ogranicza kod szablonowy dla dobrze opisanych elementów — zamiast wywoływać BeginTagEx, a następnie osobno SetStructElemTitle, SetStructElemID i SetStructElemExpansion, wszystkie siedem właściwości można ustawić w jednym wywołaniu. Funkcja jest dostępna w bibliotece Delphi, ActiveX (Dispid 73008046) oraz interfejsach DLL.
v3.36.1 2026-05-20
- GetPDFUADiagnostics zgłasza teraz TABLE-TH-NO-SCOPE:N, gdy N elementów struktury TH (komórka nagłówka tabeli) nie ma atrybutu Scope. ISO 32000-1 §14.8.4.3.4 Table 337 definiuje Scope (Row, Column lub Both) jako atrybut opisujący, do których komórek danych odnosi się komórka nagłówka. Bez niego czytniki ekranu i inne technologie wspomagające nie mogą niezawodnie powiązać komórek nagłówka z komórkami danych w złożonych tabelach lub tabelach z wieloma nagłówkami, czego wymaga ISO 14289-1 §7.5. Wywołaj SetStructElemAttr('Table','Scope', 'Column') (lub 'Row' / 'Both') bezpośrednio po oznaczeniu każdego elementu TH.
v3.36.0 2026-05-20
- SetStructElemExpansion to nowe API, które ustawia wpis /E (tekst rozwinięcia) dla aktualnie otwartego elementu struktury (ISO 32000-1 §14.9.5). Tekst rozwinięcia jest pełną zapisaną formą skrótu lub akronimu zawartego w elemencie — np. "World Wide Web" dla Span, którego tekst to "WWW". Czytniki ekranu odczytują rozwinięcie zamiast próbować wymawiać skrócone znaki, co jest krytyczne dla dostępności treści technicznych i naukowych. PDF/UA-1 (ISO 14289-1 §7.2) wymaga, aby język naturalny był jednoznacznie możliwy do określenia; /E jest standardowym mechanizmem dla skrótów i akronimów. Funkcja jest dostępna w bibliotece Delphi, ActiveX oraz interfejsach DLL.
v3.35.1 2026-05-20
- GetPDFUADiagnostics zgłasza teraz DOCINFO-TITLE-MISSING, gdy wpis /Title w słowniku informacji dokumentu jest nieobecny lub pusty. PDF/UA-1 (ISO 14289-1) wymaga tytułu dokumentu, aby czytniki ekranu mogły go ogłosić po otwarciu dokumentu. Istniejące sprawdzenie DISPLAYDOCTITLE-FALSE potwierdza, że tytuł jest pokazywany na pasku tytułu przeglądarki; DOCINFO-TITLE-MISSING jest uzupełniające — potwierdza, że sama wartość tytułu jest ustawiona. Wywołaj SetDocumentInfo('Title', ...), aby podać wartość.
v3.35.0 2026-05-20
- SetStructElemTitle to nowe API, które ustawia wpis /T (tytuł) dla aktualnie otwartego elementu struktury (ISO 32000-1 §14.7.2 Table 324). Tytuł jest czytelną dla człowieka etykietą identyfikującą konkretną instancję elementu — na przykład "Chapter 1", "Summary Table" lub "Figure 3: Quarterly Sales" — i jest wyświetlany w panelu nawigacji Tags przeglądarek PDF oraz używany przez narzędzia naprawy dostępności. /T różni się od /Alt (tekst alternatywny dla użytkowników z ograniczeniami renderowania) i /ActualText (korekta tekstu na poziomie glifów); jest najbardziej przydatny na nietekstowych elementach kontenerowych, takich jak Table, Figure, Form, Sect i Div. Przekaż pusty ciąg, aby wyczyścić wcześniej ustawioną wartość. Funkcja jest dostępna w bibliotece Delphi, ActiveX oraz interfejsach DLL.
v3.34.0 2026-05-20
- SetStructElemAltText to nowe API, które ustawia wpis /Alt dla aktualnie otwartego elementu struktury (ISO 32000-1 §14.9.3). Jest równoważne przekazaniu AltText do BeginTag, ale pozwala ustawić lub zaktualizować opis tekstu alternatywnego po otwarciu elementu — przydatne, gdy opis jest obliczany oddzielnie od typu elementu. PDF/UA-1 (ISO 14289-1 §7.5) wymaga tekstu Alt dla elementów Figure i Formula; GetPDFUADiagnostics już zgłasza FIGURE-NO-ALT:N dla brakujących wartości. Funkcja jest dostępna w bibliotece Delphi, ActiveX oraz interfejsach DLL.
v3.33.1 2026-05-20
- GetPDFUADiagnostics zawiera teraz sprawdzenie ROLEMAP-UNMAPPED:N, które wykrywa niestandardowe nazwy typów elementów struktury użyte w dokumencie bez wpisu w słowniku /RoleMap. ISO 14289-1 §7.1 i ISO 32000-1 §14.7.3 wymagają, aby każdy niestandardowy typ struktury był mapowany na standardowy typ PDF (taki jak P, Span lub Figure), tak aby technologia wspomagająca mogła określić, jak obsłużyć element. Gdy zostanie znalezionych N niezmapowanych typów, opis problemu zawiera listę nazw typów, aby wywołujący wiedzieli, które wpisy AddRoleMap są potrzebne. Wszystkie 49 standardowych typów struktury zdefiniowanych w ISO 32000-1 Table 333 (PDF 1.7) jest rozpoznawanych i wykluczanych z raportu.
v3.33.0 2026-05-20
- SetStructElemLang to nowe API, które ustawia wpis /Lang dla aktualnie otwartego elementu struktury (ISO 32000-1 §14.9.2). Znacznik języka zastępuje język na poziomie dokumentu zadeklarowany przez SetDocumentLanguage lub SetPDFUAMode dla elementu i wszystkich jego potomków, umożliwiając dokumentom wielojęzycznym oznaczanie każdego zakresu właściwym znacznikiem języka BCP 47 (np. 'en-US', 'fr', 'zh-Hant-TW'). Czytniki ekranu używają /Lang na poziomie elementu, aby wybrać odpowiedni silnik lub głos zamiany tekstu na mowę podczas głośnego czytania dokumentu. Funkcja jest dostępna w bibliotece Delphi, ActiveX oraz interfejsach DLL.
v3.32.0 2026-05-20
- SetStructElemActualText to nowe API, które ustawia wpis /ActualText dla aktualnie otwartego elementu struktury (ISO 32000-1 §14.9.4). Użyj go, aby określić dokładny tekst Unicode reprezentowany przez sekwencję glifów, gdy ekstrakcja ze strumienia treści dawałaby niepoprawne wyniki — najczęstsze przypadki to glify ligatur OpenType (U+FB00 ff, U+FB01 fi, U+FB02 fl) oraz skróty z nieoczywistymi rozwinięciami. ActualText uzupełnia, a nie zastępuje renderowaną treść; nadpisuje to, co technologie wspomagające i ekstraktory tekstu odczytują dla tego elementu, bez tłumienia renderowania wizualnego. Funkcja jest dostępna w bibliotece Delphi, ActiveX oraz interfejsach DLL.
v3.31.1 2026-05-20
- GetPDFUADiagnostics sprawdza teraz elementy struktury Formula oprócz elementów Figure przy zgłaszaniu brakującego tekstu Alt (FIGURE-NO-ALT:N). ISO 32000-1 §14.9.3 wymaga opisów alternatywnych zarówno dla figur graficznych, jak i formuł matematycznych; wcześniej skanowane były tylko elementy Figure.
- GetPDFUADiagnostics zgłasza teraz PDF-VERSION-LOW, gdy wersja PDF dokumentu jest niższa niż 1.7. PDF/UA-1 (ISO 14289-1) jest zdefiniowany względem PDF 1.7 (ISO 32000-1:2008); dokumenty w PDF 1.5 lub 1.6 nie spełniałyby wymagań specyfikacji bazowej. Wywołaj SetPDFUAMode, aby automatycznie podnieść wersję do 1.7.
v3.31.0 2026-05-19
- Identyfikatory elementów struktury i powiązanie nagłówków tabel są teraz obsługiwane. SetStructElemID przypisuje unikalny identyfikator ciągu znaków (/ID) do aktualnie otwartego elementu struktury; identyfikatory są zbierane w drzewie nazw /IDTree w korzeniu drzewa struktury podczas zapisywania dokumentu, umożliwiając narzędziom dostępności i odwołaniom krzyżowym lokalizowanie elementów według ID (ISO 32000-1 §14.7.4). SetStructElemHeaders wiąże bieżącą komórkę tabeli (TD lub TH) z jedną lub większą liczbą komórek nagłówka za pomocą rozdzielonej przecinkami listy wcześniej przypisanych identyfikatorów, zapisując tablicę /Headers w słowniku właściciela atrybutów Table (ISO 32000-1 §14.8.5.7.2). Razem te dwie funkcje obsługują złożone znaczniki tabel dla PDF/UA-1 (ISO 14289-1 §7.10) i WCAG 2.x SC 1.3.1. Obie funkcje są dostępne w bibliotece Delphi, ActiveX oraz interfejsach DLL. AddTagAttribute teraz również poprawnie obsługuje atrybut /Headers z wartościami rozdzielanymi przecinkami zapisywanymi jako tablice ciągów tekstowych PDF.
v3.30.1 2026-05-19
- GetPDFUADiagnostics zawiera teraz sprawdzenie HEADING-LEVEL-SKIP:N, które wykrywa przeskoki poziomów nagłówków w kolejności dokumentu (np. H1 bezpośrednio po którym następuje H3 bez H2 pomiędzy). Sprawdzenie wykonuje przejście pre-order całego drzewa elementów struktury i zlicza każde wystąpienie, w którym następny poziom nagłówka przekracza poprzedni o więcej niż jeden. Ogólne elementy H są traktowane jako H1. Powrót do nagłówka wyższego poziomu (H3 → H1) nie jest liczony jako przeskok. WCAG 2.x Success Criterion 1.3.1 i ISO 14289-1 §7.1 wymagają, aby nagłówki były zagnieżdżane bez luk.
v3.30.0 2026-05-19
- Atrybuty elementów struktury są teraz obsługiwane dla dokumentów tagged PDF i PDF/UA. Trzy nowe funkcje API umożliwiają dołączanie atrybutów do elementu struktury aktualnie budowanego na stosie znaczników: AddTagAttribute (ogólnego przeznaczenia, dowolny owner/name/value), SetStructElemScope (wygodne opakowanie ustawiające atrybut /Scope pod właścicielem Table, dla komórek nagłówka TH — ISO 32000-1 §14.8.5.7.2) oraz SetStructElemBBox (wygodne opakowanie ustawiające atrybut /BBox pod właścicielem Layout, dla figur i innych wizualnie pozycjonowanych elementów — ISO 32000-1 §14.8.5.4). Podczas zapisywania dokumentu atrybuty są zapisywane jako słowniki atrybutów /A w każdym elemencie struktury; wiele atrybutów od tego samego właściciela jest grupowanych w jeden słownik, a atrybuty od różnych właścicieli są zapisywane jako tablica słowników. Wszystkie trzy funkcje są dostępne w bibliotece Delphi, ActiveX oraz interfejsach DLL.
v3.29.1 2026-05-19
- GetPDFUADiagnostics zawiera teraz dwa dodatkowe sprawdzenia: czy jakiekolwiek elementy struktury Figure w dokumencie nie mają wartości tekstu Alt (zgłaszane jako FIGURE-NO-ALT:N, zgodnie z ISO 14289-1 §7.5 i ISO 32000-1 §14.9.3) oraz czy jakiekolwiek elementy struktury nadal są otwarte, ponieważ EndTag nie zostało wywołane (zgłaszane jako STRUCT-UNCLOSED:N). Sprawdzenie figur wykonuje pełne rekurencyjne przejście drzewa elementów struktury, obejmując elementy na wszystkich poziomach zagnieżdżenia.
v3.29.0 2026-05-19
- GetPDFUADiagnostics to nowe API diagnostyczne, które sprawdza dokument pod kątem potencjalnych problemów zgodności z PDF/UA-1 (ISO 14289-1) i zwraca rozdzieloną znakami nowego wiersza listę ustaleń. Wykonywanych jest sześć sprawdzeń: czy ustawiono MarkInfo/Marked (tagged PDF), czy katalog dokumentu ma wpis /Lang, czy ViewerPreferences/DisplayDocTitle ma wartość true, czy metadane XMP zawierają identyfikator pdfuaid:part, liczba niewyłączonych adnotacji bez wpisu Contents oraz liczba osadzonych plików bez wpisu AFRelationship. Każde ustalenie jest identyfikowane krótkim kodem (np. LANG-MISSING, ANNOT-NO-CONTENTS:3), po którym następuje czytelny dla człowieka opis. Zwraca pusty ciąg, gdy nie znaleziono problemów. Dostępne w bibliotece Delphi, ActiveX oraz interfejsach DLL.
v3.28.5 2026-05-19
- Ulepszenie dostępności adnotacji PDF/UA-1: gdy adnotacja FileAttachment nie ma wpisu Contents ani pola /T, nazwa pliku z osadzonej specyfikacji pliku adnotacji (/FS /UF lub /F) jest teraz używana jako zastępczy opis dostępny. Uzupełnia to łańcuch zastępczy Contents adnotacji: /T → Link URI → Stamp name → FileAttachment filename. Czytniki ekranu otrzymują nazwę załączonego pliku zamiast ciszy, spełniając ISO 14289-1 §7.18.1 dla najczęstszych typów adnotacji.
v3.28.4 2026-05-19
- Ulepszenie dostępności adnotacji PDF/UA-1: gdy adnotacja Stamp nie ma wpisu Contents (lub ma pusty) ani pola /T, nazwa typu stempla z wpisu /Name adnotacji jest teraz używana jako zastępczy opis dostępny (np. "Approved", "Draft", "Confidential", "Final"). Rozszerza to łańcuch zastępczy Contents adnotacji wprowadzony w v3.28.3, aby obejmował adnotacje stempla, które są powszechne w przepływach pracy obejmujących dokumenty recenzowane lub zatwierdzane i często nie mają jawnej wartości Contents.
v3.28.3 2026-05-19
- Ulepszenie dostępności adnotacji PDF/UA-1: gdy adnotacja Link nie ma wpisu Contents (lub ma pusty) ani pola /T, URI z akcji URI adnotacji jest teraz używany jako zastępczy opis dostępny. Dotyczy to tylko podczas przetwarzania SetPDFUAMode i tylko adnotacji Link, które zawierają akcję /URI. Czytniki ekranu otrzymują adres URL jako etykietę ostatniej szansy, spełniając ISO 14289-1 §7.18.1 w typowym przypadku, gdy autorzy tworzą hiperłącza bez podania czytelnego dla człowieka opisu.
v3.28.2 2026-05-19
- SetEmbeddedFileAFRelationship to nowe API do jawnego ustawiania wartości AFRelationship w słowniku specyfikacji pliku osadzonego pliku. Wymagane przez ISO 14289-1 (PDF/UA-1) §7.11, pozwala wywołującym określić semantyczną relację osadzonego pliku z treścią dokumentu przez wybór jednej z pięciu poprawnych wartości: Source, Data, Alternative, Supplement lub Unspecified. Gdy SetPDFUAMode jest aktywny, każdemu osadzonemu plikowi bez klucza AFRelationship automatycznie przypisywane jest Unspecified; użyj tej funkcji, aby nadpisać tę wartość domyślną przed zapisaniem. Dostępne w bibliotece Delphi, ActiveX oraz interfejsach DLL.
v3.28.1 2026-05-19
- Gdy SetPDFUAMode jest wywoływane dla dokumentu, którego metadane XMP zawierają ogólny domyślny tytuł biblioteki zamiast tytułu specyficznego dla dokumentu, tytuł jest teraz automatycznie zastępowany wartością z wpisu /Info Title dokumentu (jeśli jest obecny). Zapewnia to, że pakiet XMP pdfuaid:part-1 odzwierciedla rzeczywisty tytuł dokumentu zamiast symbolu zastępczego, spełniając oczekiwania weryfikatorów PDF/UA-1.
- Parser XMP (LoadFromString) odczytuje teraz wartość dc:title z istniejących metadanych XMP podczas ładowania dokumentu, dzięki czemu ponowny zapis PDF, który już ma dc:title, poprawnie zachowuje ten tytuł zamiast przywracać domyślny symbol zastępczy.
v3.28.0 2026-05-19
- BeginArtifactEx(ArtifactType, ArtifactSubtype) to nowe API tagged-PDF, które rozszerza BeginArtifact, aby wyrazić zarówno /Type artefaktu, jak i Pagination /Subtype w jednym wywołaniu. Gdy oba parametry są niepuste, zapisywany operator to /Artifact << /Type /T /Subtype /S >> BMC, co umożliwia w pełni określone artefakty Pagination, takie jak nagłówki i stopki, zgodnie z ISO 32000-1 §14.8.2.2.1. Jeśli tylko jeden parametr jest niepusty, używana jest odpowiednia forma z jednym kluczem. Eksportowane są także punkty wejścia DLL DLBeginArtifactEx i DLBeginArtifactExA.
v3.27.2 2026-05-19
- BeginArtifact poprawnie rozróżnia teraz typy artefaktów od podtypów paginacji. Gdy argumentem jest Pagination, Layout lub Page (typy artefaktów zgodnie z ISO 32000-1 §14.8.2.2.1 Table 330), operator oznaczonej treści zapisuje /Type zamiast /Subtype. Inne wartości, takie jak Header, Footer i Watermark, nadal są zapisywane jako /Subtype. Poprawia to wcześniejsze nieprawidłowe wyjście, które zapisywało /Subtype /Pagination, gdy wywołujący zamierzał oznaczyć artefakt paginacji.
v3.27.1 2026-05-19
- Gdy tryb PDF/UA jest aktywny, a dokument zawiera pliki osadzone, każdy słownik specyfikacji pliku bez wpisu AFRelationship otrzymuje go teraz automatycznie podczas zapisu. Zapisywana wartość to /Unspecified, co spełnia wymóg ISO 14289-1 §7.11, aby każdy plik osadzony miał klucz AFRelationship. Dotyczy to zarówno plików dodanych przez EmbedFile, jak i plików osadzonych już obecnych w załadowanym dokumencie.
v3.27.0 2026-05-19
- AddRoleMap(CustomType, StandardType) to nowe API tagged-PDF, które rejestruje mapowanie z niestandardowej nazwy typu elementu struktury na standardowy typ struktury PDF. Podczas zapisu mapowania są zapisywane w słowniku RoleMap w korzeniu drzewa struktury, spełniając wymóg ISO 14289-1 §7.1 dla dokumentów używających nazw znaczników specyficznych dla aplikacji. Można zarejestrować wiele mapowań; zduplikowane klucze są nadpisywane przez ostatnie wywołanie. Eksportowane są także punkty wejścia DLL DLAddRoleMap i DLAddRoleMapA.
v3.26.0 2026-05-19
- BeginTagEx(TagType, AltText, ActualText, Lang) to nowe API tagged-PDF, które rozszerza BeginTag o jawny atrybut języka naturalnego. Gdy Lang jest niepusty, jest zapisywany w atrybucie /Lang elementu struktury's, umożliwiając adnotację języka dla poszczególnych elementów wymaganą przez ISO 14289-1 §7.2 dla dokumentów wielojęzycznych. Przekaż pusty ciąg Lang, aby zachowywać się identycznie jak BeginTag. Eksportowane są także punkty wejścia DLL DLBeginTagEx i DLBeginTagExA.
v3.25.1 2026-05-19
- Niepodzbiorowane czcionki TrueType ładowane z domyślną stroną kodową Windows (WinAnsiEncoding) otrzymują teraz strumień ToUnicode CMap, umożliwiając niezawodne wyodrębnianie tekstu Unicode oraz kopiowanie/wklejanie dla tych czcionek. Wcześniej strumień ToUnicode był zapisywany tylko wtedy, gdy obecne było jawne nadpisanie strony kodowej lub tablica Differences; powszechna ścieżka domyślnego kodowania go nie miała.
- Ta sama poprawka dotyczy czcionek TrueType ładowanych z jawną niedomyślną stroną kodową, ale bez tablicy Differences, oraz czcionek ładowanych za pomocą formatu packaged-font.
v3.25.0 2026-05-19
- Gdy tryb PDF/UA jest aktywny, niezwolnione adnotacje (wszystkie typy z wyjątkiem Widget, PrinterMark i TrapNet), które nie mają niepustego wpisu Contents, otrzymują go teraz automatycznie podczas zapisu. Wartość /T (tytuł / autor) adnotacji's jest używana jako wartość zastępcza, spełniając ISO 14289-1 §7.18.1 dla adnotacji, które mają tytuł, ale nie mają jawnego dostępnego opisu.
v3.24.0 2026-05-19
- Gdy tryb PDF/UA jest aktywny, interaktywne pola formularza, które nie mają wpisu TU (podpowiedź / opis alternatywny), otrzymują go teraz automatycznie podczas zapisu. Częściowa nazwa pola (wpis /T) pola's jest używana jako wartość zastępcza, zapewniając, że czytniki ekranu mogą zidentyfikować każde pole. Przyciski Push button są poprawnie wyłączone z tego wymogu zgodnie z ISO 14289-1 §7.18.4.
v3.23.1 2026-05-19
- GetInformation(200) zwraca '1', gdy tryb PDF/UA-1 jest aktywny w wybranym dokumencie, umożliwiając wywołującym sprawdzanie stanu trybu zgodności w czasie wykonywania.
- GetInformation(201) zwraca '1' dla PDF/A-1a, '2' dla PDF/A-1b albo pusty ciąg, gdy tryb PDF/A jest wyłączony.
- GetInformation(311) i GetInformation(312) poprawnie zwracają teraz ciąg wymagań wersji oraz nazwę funkcji z najnowszego konfliktu blokady wersji (wcześniej zapowiedziane we wpisie v3.20.3, ale jeszcze niezaimplementowane).
- GetInformation(313) zwraca ciąg wersji PDF, do której aktualnie zablokowany jest cel zapisu, albo pusty ciąg dla dokumentów z wersjonowaniem swobodnym.
v3.23.0 2026-05-19
- SetMarkInfo(Marked) jest teraz publicznym API, pozwalającym ustawić flagę MarkInfo.Marked niezależnie od pełnej konfiguracji PDF/UA-1 wykonywanej przez SetPDFUAMode. Gdy Marked ma wartość 1, MarkInfo.Suspects jest także ustawiane na false, zgodnie z wymogiem ISO 14289-1 §7.18.6.
- Gdy tryb PDF/UA jest aktywny, wszystkie strony automatycznie otrzymują wpis /Tabs /S podczas zapisu, spełniając wymaganie kolejności tabulacji opartej na strukturze z ISO 14289-1 §7.18.4.
- Dodano dokumentację referencyjną HTML dla SetPDFUAMode, SetDocumentLanguage, SetMarkInfo, BeginTag, EndTag, BeginArtifact i EndArtifact, z pełnymi tabelami składni i przykładami użycia.
v3.22.0 2026-05-19
- BeginTag(TagType, AltText, ActualText) otwiera element struktury tagged-PDF w bieżącym strumieniu treści, zapisując operator BDC z automatycznie przypisanym MCID i rejestrując element w drzewie struktury dokumentu. TagType to dowolny standardowy typ struktury PDF (P, H1, Figure, Table itd.). AltText i ActualText są opcjonalnymi ciągami dostępności zakodowanymi jako ciągi tekstowe PDF (UTF-16BE).
- EndTag zamyka ostatnio otwarty element struktury, zapisując pasujący operator EMC do strumienia treści.
- BeginArtifact(SubType) oznacza region treści jako artefakt PDF (artefakt paginacji, tło itd.), zapisując operator BMC. SubType jest opcjonalny; gdy jest podany, jest zapisywany jako /Artifact << /Subtype /SubType >>.
- EndArtifact zamyka region artefaktu operatorem EMC.
- Podczas zapisu, gdy zarejestrowano jakiekolwiek elementy struktury znacznikowanej, biblioteka automatycznie buduje kompletny StructTreeRoot, przypisuje klucze StructParents do dotkniętych stron i zapisuje drzewo numerów ParentTree, spełniając wymagania ISO 32000-1 §14.7 dla tagged PDF.
- Standardowe czcionki Type 1 (rodziny Helvetica, Times, Courier, Symbol) oraz osadzone czcionki Type 1 z kodowaniem WinAnsi otrzymują teraz strumień ToUnicode CMap, umożliwiając niezawodne wyodrębnianie tekstu Unicode oraz kopiowanie/wklejanie dla tych typów czcionek.
v3.21.0 2026-05-19
- SetPDFUAMode(Language) aktywuje tryb zgodności PDF/UA-1 (ISO 14289-1): automatycznie podnosi dokument do PDF 1.7, zapisuje MarkInfo.Marked i MarkInfo.Suspects, włącza DisplayDocTitle w ViewerPreferences, ustawia Catalog.Lang, gdy Language jest niepusty, oraz zapisuje wpis przestrzeni nazw XMP pdfuaid:part = 1 wymagany przez ISO 14289-1 Section 6.7.11.
- SetDocumentLanguage(Language) zapisuje wpis Catalog /Lang bezpośrednio, pozwalając zadeklarować język dokumentu niezależnie od trybu PDF/UA.
- MarkInfo.Suspects jest teraz ustawiane na false zawsze, gdy MarkInfo.Marked jest ustawione na true, spełniając wymaganie struktury tagged-PDF z ISO 14289-1 (Section 7.18.6).
- Encrypt wymusza teraz flagę uprawnienia CanCopyAccess (kopiowanie treści dla dostępności), gdy dokument jest w trybie PDF/UA, zgodnie z wymogiem ISO 14289-1 Section 7.17.
- Pola formularza Choice (lista rozwijana) nie niosą już bezsensownej zakodowanej na stałe wartości podpowiedzi; TU pozostaje nieustawione, aby wywołujący mógł przypisać znaczącą etykietę przez API właściwości pola formularza.
v3.20.3 2026-05-19
- Encrypt i AddSWFAnnotationFromFile zwracają teraz natychmiast 0 z LastErrorCode 602, gdy wersja zapisu jest zablokowana poniżej minimum wymaganego przez wybraną siłę szyfrowania lub typ adnotacji, zamiast po cichu kontynuować i kończyć niepowodzeniem dopiero podczas zapisu.
- GetInformation(311) i GetInformation(312) odzwierciedlają teraz konfliktowe wymaganie wersji w czasie zapisu, gdy zablokowana wersja blokuje funkcje poziomu rozszerzeń, takie jak AES-256 lub adnotacje RichMedia.
v3.20.2 2026-05-19
- AddU3DAnnotationFromFile automatycznie podnosi teraz wersję dokumentu do PDF 1.6, gdy adnotacja 3D jest dodawana do dokumentu o niższej wersji, zgodnie z zachowaniem automatycznego podnoszenia wersji wszystkich innych punktów wejścia API PDF 1.6+.
v3.20.1 2026-05-17
- Cele zapisu PDF 1.2 są teraz egzekwowane jako ścisłe kontrakty PDF 1.2. Zapisywanie obiektów PDF 1.3+, takich jak dane page TrimBox, pod celem PDF 1.2 kończy się niepowodzeniem przed zapisaniem wyjścia, zamiast emitować plik o mieszanej wersji.
- Zgodność z poziomem rozszerzeń Adobe PDF 1.7 jest teraz częścią kontroli preflight zapisu. AESV3, AES-256, RichMedia, Projection, słowniki geoprzestrzenne i podfiltry podpisów ETSI są sprawdzane względem wymaganego ExtensionLevel.
- Szyfrowanie AES-256, adnotacje RichMedia, słowniki geoprzestrzenne i podfiltry podpisów ETSI deklarują teraz odpowiadający wpis Adobe Extensions, gdy PDFlib automatycznie podnosi dokument do treści rozszerzeń PDF 1.7.
- Zapisy Append używają teraz tej samej bramki zgodności wersji co pełne zapisy.
- Dołączone opcjonalne biblioteki DLL środowiska uruchomieniowego PDFium zostały odświeżone dla Win32 i Win64. GDI+ pozostaje domyślnym rendererem; PDFium pozostaje opcjonalny przez SetPDFiumFileName i SelectRenderer(3).
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszły po 207/207 testów każdy, a C++Builder Win64x GoogleTest przeszedł 61 testów z pominiętymi 2 istniejącymi testami zależnymi od przykładów.
v3.20.0 2026-05-17
- Osiem kolejnych punktów wejścia writer PDFlib przechodzi teraz przez Phase 3 EnsureMinVersion, dzięki czemu wersja dokumentu automatycznie podnosi się do minimum wymaganego przez emitowaną funkcję: SetDocumentMetadata (PDF 1.4 - strumień /Metadata XMP) SetPDFAMode(1 or 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)
- W połączeniu z zestawem v3.15.0 (SetTransparency, SetPageUserUnit, Encrypt, SetPageLayout) i zestawem v3.17.0 (osiem wpisów JavaScript / embedded-file / XFA / SWF), PDFlib automatycznie podnosi teraz FVersion w dwudziestu jeden punktach wejścia writer.
- NewOptionalContentGroup wcześniej podnosiło FVersion bezpośrednio; teraz przechodzi przez EnsureMinVersion, dzięki czemu LockSaveVersion jest respektowane, a podniesienie jest rejestrowane w AutoBumpedFeatures.
v3.19.0 2026-05-17
- Zgodność wersji PDF podczas zapisu i ładowania rozpoznaje teraz także cztery wcześniej odroczone funkcje: Btn /Ff bit 15 NoToggleToOff (tylko przyciski radiowe) -> PDF 1.4 DeviceN /Subtype /NChannel (udoskonalenie przestrzeni kolorów) -> PDF 1.6 FontFile3 /Subtype /OpenType (typ programu czcionki) -> PDF 1.6 Sig /SubFilter ETSI.CAdES.detached or ETSI.RFC3161 -> PDF 1.7
- Reguła NChannel dopasowuje formę tablicy przestrzeni kolorów DeviceN [/DeviceN names alternateSpace tintTransform attributes], gdy słownik attributes pod indeksem 4 zawiera /Subtype /NChannel.
- Reguła FontFile3 OpenType uruchamia się tylko wtedy, gdy strumień jest osiągany przez klucz nadrzędny o nazwie 'FontFile3', więc niepowiązane strumienie, które przypadkowo zawierają /Subtype /OpenType, nie są oznaczane.
- Tabela PDFFeatureRules zawiera teraz 103 reguły (99 + 4 nowe).
v3.18.6 2026-05-17
- Zgodność wersji PDF podczas zapisu i ładowania rozpoznaje teraz /AA (akcje dodatkowe) ze świadomością typu kontenera: Catalog /AA (wyzwalacze na poziomie dokumentu) -> PDF 1.4 Annot /AA (wyzwalacze adnotacji) -> PDF 1.4 Page /AA (wyzwalacze strony) -> PDF 1.5
- Formularzowe /AA (PDF 1.2) pozostaje objęte istniejącym kontraktem zapisu PDF 1.3; żadna reguła nie jest potrzebna.
- Tabela PDFFeatureRules zawiera teraz 99 reguł (96 + 3 nowe).
v3.18.5 2026-05-17
- Zgodność wersji PDF podczas zapisu i ładowania teraz poprawnie klasyfikuje Page /Tabs jako funkcję PDF 1.5; wcześniej była błędnie klasyfikowana jako PDF 1.4. Dokument zmian specyfikacji PDF 1.4 (Adobe TN #5409) nie wymienia /Tabs, a PDF 1.5 Table 8.10 wprowadza "Tabs (Optional; PDF 1.5)".
- Nowa reguła: AcroForm /NeedAppearances jest rozpoznawane jako funkcja PDF 1.5 zgodnie z PDF 1.5 Table 218.
- Tabela PDFFeatureRules zawiera teraz 96 reguł (95 + 1 nowa).
v3.18.4 2026-05-13
- PDFlibZLib teraz zawsze używa dołączonego statycznego backendu obiektowego zlib-ng w zwykłych kompilacjach biblioteki, usuwając pozostałą ścieżkę awaryjną System.ZLib.
- Pokrycie regresyjne zlib-ng obejmuje teraz ładunki o rozmiarach granicznych, dane linii skanowania podobne do PNG, zapisane strumienie wieloblokowe oraz znane strumienie zlib w runnerach testów Delphi i C++Builder.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszły po 194/194 każdy, a C++Builder Win64x GoogleTest przeszedł 58 testów z 2 istniejącymi testami zależnymi od próbek pominiętymi.
v3.18.3 2026-05-12
- Dema Delphi i C++Builder generujące wyjście PDF lub tekstowe teraz automatycznie otwierają wygenerowany dokument po pomyślnym zapisie.
- Pakiet instalatora teraz trzyma artefakty kompilacji poza folderami demo i sprawia, że próbki C++Builder oraz moduły DLL i ActiveX/OCX są komponentami opcjonalnymi; odpowiadające im pliki są instalowane tylko po wybraniu komponentu.
v3.18.2 2026-05-12
- Dema Delphi i C++Builder EditFormField teraz czyszczą /NeedAppearances przed aktualizacją wartości pól, dzięki czemu każde edytowane pole tekstowe otrzymuje odświeżony normalny strumień wyglądu w zapisanym PDF.
- Dzięki temu zapisany strumień /AP pozostaje zsynchronizowany z przechowywaną wartością /V i unika różnic zależnych od przeglądarki, w których ustawienie fokusu na polu ujawnia tekst brakujący w statycznym wyglądzie pola.
v3.18.1 2026-05-10
- Zgodność wersji PDF podczas zapisu i ładowania teraz rozpoznaje także flagi formularzowego pola /Ff na poziomie bitów oraz bit AcroForm /SigFlags AppendOnly: /Ff bit 21 (FileSelect, mask 1048576) -> PDF 1.4 /Ff bit 22 (MultiSelect, mask 2097152) -> PDF 1.4 /Ff bit 23 (DoNotSpellCheck, mask 4194304) -> PDF 1.4 /Ff bit 24 (DoNotScroll, mask 8388608) -> PDF 1.4 /Ff bit 25 (Comb, mask 16777216) -> PDF 1.5 /Ff bit 26 (RichText / RadiosInUnison, 33554432) -> PDF 1.5 /Ff bit 27 (CommitOnSelChange, mask 67108864) -> PDF 1.5 /SigFlags bit 2 (AppendOnly, mask 2) -> PDF 1.5
- Dziedziczenie /Parent nie jest śledzone: tylko słowniki, które jawnie zawierają /Ff lub /SigFlags, uruchamiają reguły.
- Tabela PDFFeatureRules zawiera teraz 95 reguł (87 + 8 nowych na poziomie bitów).
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszły po 191/191 każdy, a C++Builder Win64x GoogleTest przeszedł 57/57.
v3.18.0 2026-05-10
- Zgodność wersji PDF podczas zapisu i ładowania teraz rozpoznaje także dziewięć kolejnych funkcji na poziomie podkluczy i bitów: flagi adnotacji na poziomie bitów (/F mask): Locked (128) -> PDF 1.4 ToggleNoView (256) -> PDF 1.5 LockedContents (512) -> PDF 1.7 wyróżniające podklucze katalogu i strony: /BoxColorInfo (page) -> PDF 1.4 /Permissions, /Legal, /PresSteps -> PDF 1.5 /VP (page geospatial viewport) -> PDF 1.6 /Collection (catalog portable collection) -> PDF 1.7
- Tabela PDFFeatureRules zawiera teraz 87 reguł (78 na poziomie rozdziałów + 9 na poziomie podkluczy / bitów).
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszły po 189/189 każdy, a C++Builder Win64x GoogleTest przeszedł 57/57.
v3.17.0 2026-05-10
- Osiem kolejnych punktów wejścia writera PDFlib teraz przechodzi przez Phase 3 EnsureMinVersion, dzięki czemu wersja dokumentu automatycznie podnosi się do minimum wymaganego przez emitowaną funkcję: AddLinkToJavaScript, SetOpenActionJavaScript, AddGlobalJavaScript, FormFieldJavaScriptAction (PDF 1.3 - JavaScript actions) AddEmbeddedFile, AddFileAttachment (PDF 1.3 - file attachments) SetXFAFromString (PDF 1.5 - XFA forms) AddSWFAnnotationFromFile (PDF 1.7 - RichMedia annotation)
- W połączeniu z zestawem v3.15.0 (SetTransparency, SetPageUserUnit, Encrypt, SetPageLayout) PDFlib obejmuje teraz trzynaście wysokowersyjnych punktów wejścia writera od początku do końca.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszły po 187/187 każdy, a C++Builder Win64x GoogleTest przeszedł 57/57.
v3.16.3 2026-05-10
- Nowe API PDFlib: LockSaveVersion(Version) przypina dokument do Version i powstrzymuje Phase 3 writer-side EnsureMinVersion przed automatycznym podniesieniem powyżej niej. UnlockSaveVersion czyści blokadę.
- Brama podczas zapisu pozostaje bez zmian: funkcje emitowane przez writera powyżej zablokowanej wersji nadal generują LastErrorCode 602 podczas zapisu, zamiast po cichu podnosić nagłówek.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszły po 184/184 każdy, a C++Builder Win64x GoogleTest przeszedł 57/57.
v3.16.2 2026-05-10
- Załadowane pliki PDF udostępniają teraz widok tylko funkcji wnoszących wkład do wykrywania funkcji podczas ładowania przez GetInformation(103) ("ContributorFeatures"). Lista zawiera tylko funkcje, których minimalna wymagana wersja jest ściśle większa niż HeaderVersion (key 100), więc bezpośrednio odpowiada na pytanie "why is the effective version higher than the file header?".
- GetInformation(101) ("DetectedFeatures") pozostaje bez zmian i nadal wymienia każdą dopasowaną funkcję niezależnie od wkładu.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszły po 181/181 każdy, a C++Builder Win64x GoogleTest przeszedł 57/57.
v3.16.1 2026-05-10
- Rozszerzono pokrycie testów wykrywania po stronie loadera o sześć dodatkowych syntetycznych fixture: przezroczystość ExtGState na stronie (bez podniesienia wersji), Catalog /MarkInfo (PDF 1.3 -> PDF 1.4), /OCProperties + zawartość OCG (PDF 1.4 -> PDF 1.5), /Type /3DStream (PDF 1.5 -> PDF 1.6), fixture łączący wiele funkcji oraz sprawdzenie stabilności snapshotu.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszły po 179/179 każdy, a C++Builder Win64x GoogleTest przeszedł 57/57.
v3.16.0 2026-05-10
- Załadowane dokumenty PDF przechodzą teraz przez przebieg wykrywania wersji sterowany zawartością: każdy obiekt pośredni jest przechodzony przez tabelę funkcji do minimalnej wersji używaną przez bramę zapisu, a FVersion jest podnoszona powyżej literalnej wartości nagłówka %PDF-X.Y, gdy zawartość faktycznie wymaga wyższej wersji. Na przykład wpis strony /UserUnit podnosi wersję efektywną do PDF 1.6, nawet gdy nagłówek pliku wskazuje PDF 1.4.
- Nowe klucze GetInformation: 100 zwraca HeaderVersion (literalne %PDF-X.Y), 101 zwraca DetectedFeatures (funkcje dopasowane podczas ładowania, rozdzielane CRLF), 102 zwraca AutoBumpedFeatures (funkcje rozdzielane CRLF, które wyzwoliły writer-side EnsureMinVersion).
- Brama podczas zapisu pozostaje bez zmian: dokumenty, których wersja efektywna została podniesiona przy ładowaniu, a następnie jawnie obniżona za pomocą SetInformation(0, ...), nadal generują LastErrorCode 602 podczas zapisu.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszły po 173/173 każdy, a C++Builder Win64x GoogleTest przeszedł 57/57.
v3.15.0 2026-05-10
- Punkty wejścia writera, które tworzą funkcje wymagające określonej minimalnej wersji PDF, teraz automatycznie podnoszą wersję PDF dokumentu. Wywołanie SetTransparency na dokumencie oznaczonym jako PDF 1.3 teraz awansuje nagłówek do PDF 1.4 zamiast kończyć zapis niepowodzeniem z LastErrorCode 602.
- To samo automatyczne podniesienie podłączono do SetPageUserUnit (>=1.6), Encrypt z Strength 1/2/3/4 (>=1.4/1.6/1.7/1.7 odpowiednio) oraz dwustronicznych wariantów SetPageLayout (>=1.5).
- Zmiana zachowania względem 3.14.x: aplikacje, które wcześniej polegały na bramie v3.12.6 "save target rejects writer-emitted features", teraz kończą się powodzeniem w podniesionej wersji. Załadowane pliki PDF, które już zawierają funkcje wyższej wersji, nadal przechodzą przez istniejącą bramę zapisu, więc załadowanie tagowanego PDF i wybranie PDF 1.3 nadal kończy się niepowodzeniem z LastErrorCode 602.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszły po 170/170 każdy, a C++Builder Win64x GoogleTest przeszedł 57/57.
v3.14.3 2026-05-10
- Zgodność wersji PDF podczas zapisu teraz rozpoznaje także pozostałe typy słowników 3D PDF 1.6 (/Type /3DStream /3DRef /3DBackground /3DRenderMode /3DLightingScheme /3DCrossSection /3DNode) oraz podtypy adnotacji PDF 1.7 Redact, RichMedia i Projection, wraz z towarzyszącymi słownikami /Type /Requirement i /ReqHandler.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszły po 168/168 każdy, a C++Builder Win64x GoogleTest przeszedł 57/57.
v3.14.2 2026-05-10
- Zgodność wersji PDF podczas zapisu teraz rozpoznaje także funkcje PDF 1.5: formularze /XFA, /AlternatePresentations, drzewo nazw /Renditions, słowniki multimedialne /Type /Rendition /MediaCriteria /MediaPermissions /MediaPlayers oraz podtyp adnotacji Screen.
- Zapis jako PDF 1.4 teraz odrzuca dokumenty zawierające te funkcje z LastErrorCode 602.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszły po 166/166 każdy, a C++Builder Win64x GoogleTest przeszedł 57/57.
v3.14.1 2026-05-10
- Zgodność wersji PDF podczas zapisu teraz rozpoznaje także funkcje PDF 1.4: tagowany-PDF /StructTreeRoot /MarkInfo i słowniki StructElem, wpisy dokumentu /Lang i strony /Tabs, słowniki /OutputIntents i /OutputIntent, podpis uprawnień użycia /UR3 oraz podtypy adnotacji PDF 1.4 Polygon, PolyLine, Caret, Ink, Popup i Watermark.
- Zapis jako PDF 1.3 teraz odrzuca dokumenty zawierające te funkcje z LastErrorCode 602.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszly po 165/165 testow kazdy, a C++Builder Win64x GoogleTest przeszedl 57/57.
v3.14.0 2026-05-10
- Zgodnosc wersji PDF podczas zapisu rozpoznaje teraz takze funkcje PDF 1.3, takie jak gladkie cieniowanie, obiekty funkcji, przestrzenie kolorow ICCBased i DeviceN, wpisy stron /TrimBox /BleedBox /ArtBox, /ToUnicode CMaps, zalaczniki plikow oraz adnotacje /Sound i /Movie, slowniki /Type /Filespec i /Type /EmbeddedFile, klucze /Group /EF /Alternates /Mask oraz akcje JavaScript.
- Wywolania PDF 1.2 sa teraz zapisywane zgodnie z kontraktem PDF 1.3: literalny naglowek %PDF-1.2 jest zachowywany, ale bramka akceptuje funkcje PDF 1.3. Funkcje PDF 1.4 i pozniejsze nadal sa odrzucane z LastErrorCode 602.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszly po 162/162 testy kazdy, a C++Builder Win64x GoogleTest przeszedl 57/57.
v3.13.0 2026-05-10
- Przebudowano bramke zgodnosci wersji PDF, ktora odrzuca funkcje z pozniejszych wersji podczas zapisu, przenoszac ja do dedykowanego modulu, aby zestaw regul mogl rosnac bez czestych zmian w rdzeniu dokumentu.
- Brak zmiany zachowania widocznej dla uzytkownika wzgledem v3.12.7: te same funkcje spoza wersji sa nadal odrzucane z LastErrorCode 602.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszly po 155/155 testow kazdy, a C++Builder Win64x GoogleTest przeszedl 57/57.
v3.12.7 2026-05-09
- Rozszerzono automatyczne pokrycie testami dla przeplywu pracy renderowania z bezposrednim dostepem PdfToImage w zestawach Delphi DUnitX i C++Builder GoogleTest.
- Graficzny runner testow Delphi VCL rejestruje teraz zestawy Syntax i XRef, odpowiadajac pokryciu runnera konsolowego.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszly po 147/147 testow kazdy, a C++Builder Win64x GoogleTest przeszedl 57/57.
v3.12.6 2026-05-09
- Zapisywanie jako PDF 1.3, 1.4, 1.5, 1.6 lub 1.7 wymusza teraz wybrana wersje jako kontrakt wyjscia pelnego zapisu.
- Pelne zapisy usuwaja nadpisania /Version w katalogu, usuwaja nieobslugiwane wpisy rozszerzen katalogu i metadanych dla nizszych celow oraz pomijaja strumienie metadanych XMP z PDF 1.4 podczas zapisu jako PDF 1.3.
- SaveToFile, SaveToString i SaveToStream koncza sie teraz niepowodzeniem z LastErrorCode 602, gdy wybrana docelowa wersja PDF jest nizsza niz funkcje nadal obecne w dokumencie, takie jak przezroczystosc, zawartosc opcjonalna, JPX, UserUnit, 3D lub funkcje AES crypt-filter.
v3.12.5 2026-05-09
- Ulepszono parsowanie lancuchow literalnych PDF 1.7, aby nieznane sekwencje ucieczki ignorowaly odwrotny ukosnik zgodnie ze standardem.
- Osemkowe sekwencje ucieczki w lancuchach literalnych zuzywaja teraz tylko cyfry osemkowe i zachowuja nastepujaca po nich cyfre nieosemkowa jako zwykle dane lancucha.
- Dodano pokrycie regresyjne dla nieznanych sekwencji ucieczki w lancuchach literalnych oraz mieszanych sekwencji ucieczki osemkowych/nieosemkowych.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszly po 141/141 testow kazdy.
v3.12.4 2026-05-09
- Ulepszono parsowanie leksykalne PDF 1.7, dzieki czemu obiekty nazw zatrzymuja sie teraz poprawnie na ograniczniku prawego nawiasu klamrowego.
- Naprawiono ladowanie SmartAccess dla wpisow obiektow skompresowanych w strumieniu xref, ktorych numer strumienia obiektow jest wiekszy niz dlugosc PDF w bajtach.
- Dodano pokrycie regresyjne dla ogranicznikow nazw w postaci prawego nawiasu klamrowego oraz rzadkich wpisow obiektow skompresowanych w strumieniu xref.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszly po 139/139 testow kazdy.
v3.12.3 2026-05-08
- Ulepszono zgodnosc zaszyfrowanych dokumentow PDF 1.7 dla plikow standardowego mechanizmu zabezpieczen, ktore uzywaja StrF, StmF, EFF, Identity, None lub nazwanych filtrow szyfrowania w stylu StdCF.
- Strumienie metadanych respektuja teraz EncryptMetadata=false podczas przeplywow odszyfrowywania, szyfrowania i kopiowania/zapisu, zamiast byc przetwarzane jak zwykle strumienie.
- Strumienie osadzonych plikow zawieraja teraz /Type /EmbeddedFile i uzywaja sciezki decyzyjnej filtra szyfrowania osadzonych plikow, gdy zaszyfrowane dokumenty sa ladowane lub zapisywane.
- Zewnetrzne strumienie osadzonych plikow promuja teraz FDecodeParms do DecodeParms, gdy FFilter jest promowany do Filter, zachowujac parametry dekodowania strumienia.
- Nowe zaszyfrowane pliki PDF AES zapisuja teraz wartosci Length filtrów szyfrowania jako dlugosci w bitach, zgodnie z kontraktem slownika filtra szyfrowania PDF 1.7.
- Wartosci Prev/XRefStm strumienia XRef oraz duze przesuniecia numeryczne zachowuja teraz 64-bitowa precyzje w sciezkach parsera i SmartAccess.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszly po 137/137 testow kazdy.
v3.12.2 2026-05-08
- Ulepszono zgodnosc dekodowania strumieni PDF 1.7. Ogolne dekodowanie strumieni respektuje teraz /DP jako alias DecodeParms, rozwiazuje posrednie wpisy tablic parametrow dekodowania i akceptuje standardowe skroty filtrow /AHx i /LZW.
- Wyjscie PDF dla duzych plikow zapisuje teraz przesuniecia xref, startxref, linearyzacji i ByteRange podpisu cyfrowego przez sciezki formatowania 64-bitowego, zamiast zawezac te wartosci przez 32-bitowe pomocniki calkowitoliczbowe.
- Zaladowane dokumenty traktuja teraz wpis /Version katalogu jako efektywna wersje PDF, gdy jest nowszy niz wersja w naglowku pliku.
- Przepisane trailery xref-stream nie zachowuja juz kluczy DecodeParms przeznaczonych tylko dla strumieni, gdy PDFlibPas zapisuje je jako klasyczne slowniki trailera.
- Walidacja: zestawy Delphi Win32 i Win64 DUnitX przeszly po 134/134 testy kazdy.
v3.12.1 2026-05-06
- Wygenerowane pliki PDF otwieraja sie teraz z pierwsza strona dopasowana do dostepnej wysokosci okna przegladarki's, dzieki czemu cala pierwsza strona jest widoczna od gory do dolu przy najwiekszym powiekszeniu mieszczacym sie w oknie. Skonfiguruj niestandardowe OpenAction (SetOpenActionDestination, SetOpenActionMenu, SetOpenActionJavaScript) w dokumencie, aby zastapic to domyslne ustawienie.
v3.12.0 2026-05-06
- Statyczne backendy Windows zawieraja teraz obiekty libjpeg-turbo NASM SIMD dla Win32 i Win64 oraz obiekty dyspozycji zlib-ng x86 SIMD dla zestawu Win64x zlib-ng.
- Przerobiono skrypty przebudowy zlib-ng, aby kompilacje Win64x bcc64x i diagnostyczne kompilacje MSVC kompilowaly ogolne pliki zrodlowe oraz pliki SSE2, SSSE3, SSE4.1/SSE4.2, PCLMULQDQ i AVX2 z flagami funkcji dla poszczegolnych plikow, zamiast polegac na jednym globalnym przelaczniku kompilatora.
- Dodano 32-bajtowo wyrownane atrapy CRT malloc/calloc/realloc/free dla statycznych bibliotek C i naprawiono TPDFJPEGImage.Compress, aby zwalnial bufory jpeg_mem_dest przez te sama sciezke C free, ktora je przydzielila.
- Rozszerzono publiczne notatki walidacyjne, aby wskazac scisle automatyczne pokrycie stojace za tym wydaniem: kompilacje biblioteki, rundy kompresji, wyjscie HelloWorld /FlateDecode, renderowanie JPEG, przeplywy pracy obrazow, czcionki, formularze, zabezpieczenia, podpisywanie, drukowanie oraz przeplywy pracy wywiedzione z dem C++Builder.
v3.11.0 2026-05-05
- Przelaczono kompresje i dekompresje Windows Flate na zlib-ng w trybie zgodnym z zlib. Win32, Delphi Win64 i C++Builder Win64x lacza teraz dopasowane ABI zestawy statycznych obiektow zlib-ng z Lib\thirdparty\Win32, Lib\thirdparty\Win64 i Lib\thirdparty\Win64x.
- Sciezka Win64 nie przechodzi juz przez jednostke Delphi's System.ZLib, wiec kompresja/dekompresja strumieni PDF moze korzystac z backendu zlib-ng tak samo jak kompilacja 32-bitowa.
- Dodano maly obiekt mostka zlib-ng dla kompilacji Win64, aby kod Pascal zachowal stabilne punkty wejscia zgodne z zlib, podczas gdy Delphi i C++Builder uzywaja wlasnych zestawow obiektow zgodnych z linkerem.
- Zaktualizowano wszystkie projekty demo C++Builder, aby definiowaly PDFLIB_CPPBUILDER, zgodnie z runnerem GoogleTest i aby zapobiec linkowaniu przez dema Win64x obiektow zlib-ng Delphi Win64.
v3.10.3 2026-05-01
- Rozszerzono zestaw C++Builder GoogleTest tak, aby obejmowal kazde demo w Demo\C++Builder. Uklad fazy 1 z 7 zestawami urosl do 15 zestawow / 52 przypadkow GoogleTest, wszystkie przechodza na Win64x. Nowo objete dema: AddFormattedTitle, AddTextImage, AddTrueTypeSubsettedFont, AddWebLink, CanvasText, CaptureToNewSize, CopyPageRanges, CreateWithImage, CreateWithImageToStream, DoInTheStream, DrawWrappedText, EditFormField, EmbeddedFonts, ExtractAnnotAttach, ExtractEmbeddedFonts, ExtractImage, ImageToPdf, ImportEMF, MultiFunction (przelacznik renderera), PageOperations, PdfDecrypt, PdfPermission, PrintPDF, TextMeasure, TextPaging.
v3.10.2 2026-05-01
- Dodano runner C++Builder GoogleTest w Tests\C++Builder, ktory testuje Lib\PDFlibrary.pas przez te same naglowki HPP wygenerowane przez {$JPHNE}, ktorych uzywaja dema C++Builder. Pierwsza faza odzwierciedla siedem podstawowych scenariuszy Delphi (HelloWorld, DrawShapes, CreateTable, PdfEncrypt, ExtractText, PdfSigning, renderowanie PdfToImage) jako 17 przypadkow GoogleTest, wszystkie przechodza na Win64x.
- Rozszerzono zestaw Delphi DUnitX o Tests.Print obejmujacy dema PrintPDF i ShowPrinterBins (enumeracja domyslnej drukarki, konfiguracja drukarki niestandardowej, opcje drukowania, zadanie drukowania z przekierowaniem do pliku) oraz test przelacznika renderera w Tests.Render sprawdzajacy wybor silnika GDI+ / PDFium / Cairo w demie MultiFunction's na tym samym zrodlowym PDF.
v3.10.1 2026-05-01
- Dodano 57 nazwanych rozmiarów stron do SetPageSize, dzięki czemu te same kanoniczne nazwy rozmiarów stron działają również tutaj: SIZE8X11, QUADA0, DOUBA0, B0PLUS, ENVB4/B5/C6/DL/MONARCH, ENV9/10/11, ANSIA/B/C/D/E, ARCHA/B/C/D/E1/E, SHIROKU, G1K, USBC/EUBC/ASBC, ID1/ID2/ID3, ONEINCH/TWOINCH/L2INCH/USVISA, P2R..P24R / S8R / P4D photo prints, plus the Chinese / Taiwanese octavo and sextodecimo sheet formats LARGE/STANDARD/CROWN/ROC 8K and the matching 16K halves.
v3.10.0 2026-04-30
- Dodano natywne wersje C++Builder dla każdego przykładu Delphi w Demo. Dema tworzenia PDF, manipulowania stronami, czcionek, obrazów, zabezpieczeń, podpisywania, renderowania i drukowania można teraz budować i uruchamiać z C++Builder bez żadnej nakładki po stronie Delphi.
- Każde nowe demo znajduje się w Demo\C++Builder\<Name>\ jako projekt konsolowy, który bezpośrednio używa Lib\PDFlibrary.pas i zawiera pliki wejściowe potrzebne do uruchomienia.
- Dodano krótki angielski plik Readme.txt do każdego folderu demo Delphi, opisujący, co pokazuje demo, na którym API się koncentruje i jak je uruchomić; przegląd HTML w Demo\Delphi\index.html zawiera linki do wszystkich dem pogrupowanych tematycznie.
- Odzwierciedlono ten sam Readme.txt dla każdego demo C++Builder, z sekcją Run przeredagowaną dla przepływu pracy konsoli (argumenty argv zamiast Open/SaveDialogs); odpowiadający Demo\C++Builder\index.html wymienia każde demo C++Builder w tych samych grupach tematycznych.
- Naprawiono wyciek pamięci w demie ImportEMF (instancja TPDFlib była tworzona, ale nigdy nie zwalniana).
v3.9.14 2026-04-30
- Naprawiono demo kopiowania zakresu stron, tak aby faktycznie kopiowało strony, zamiast zawsze zgłaszać niepowodzenie.
- Uporządkowano dema zawijania tekstu i paginacji HTML, tak aby każde skupiało się na własnym API i uruchamiało się z jednego przycisku.
- Zmieniono nazwy dwóch projektów demo (EmbeddedFonts i PdfPermission), aby skompilowane pliki wykonywalne odpowiadały nazwom folderów zamiast starszym nazwom prototypowym.
v3.9.13 2026-04-30
- Naprawiono błąd pozycji strumienia w wewnętrznym czytniku bufora: odczyty dwubajtowych słów przesuwały kursor odczytu o cztery bajty zamiast o dwa. W buforach dłuższych niż dwa bajty kolejne odczyty trafiały pod niewłaściwy offset i po cichu zwracały nieprawidłowe dane. Efekt był najbardziej widoczny podczas parsowania binarnych struktur danych przeplatających odczyty bajtów i słów.
- Wprowadzono zautomatyzowany zestaw testów DUnitX (uruchamiacze konsolowe i VCL GUI) obejmujący jednostki narzędziowe — bufor, AES, ZLib, Unicode i haszowanie skrótów — oraz przepływy pracy na poziomie biblioteki, w tym tworzenie dokumentów, zapis do pliku i zapis do strumienia, rundy ładowania i zapisu oraz szyfrowanie AES-128/AES-256.
v3.9.12 2026-04-30
- Renderowanie obrazów GDI+ domyślnie używa teraz gładkiej, wysokiej jakości interpolacji bikubicznej przy skalowaniu obrazów rastrowych do rozdzielczości ekranu lub eksportu. Wcześniej domyślne było najbliższe sąsiedztwo, co powodowało widoczne schodkowe artefakty na małych obrazach (logo, miniatury) powiększanych do podglądu ekranowego lub eksportu high-DPI. Wywołujący, którzy wolą ostrzejszy tryb najbliższego sąsiedztwa, mogą przywrócić stare zachowanie przez SetGDIPlusOptions.
v3.9.11 2026-04-30
- Naprawiono renderowanie Cairo obrazów PDF używających przezroczystości klucza koloru (tablica zakresu kolorów /Mask w słowniku obrazu). Wcześniej, gdy strona zawierała obraz z taką formą przezroczystości, renderer Cairo całkowicie pomijał obraz zamiast komponować go na tle strony. Poprawka wyprowadza kanał alfa dla każdego piksela z zadeklarowanych zakresów klucza koloru i renderuje wynik jako obraz przezroczysty, dając wynik wizualnie zgodny z rendererem GDI+.
v3.9.10 2026-04-30
- Naprawiono regresję renderowania Cairo, w której cała zawartość strony następująca po sekwencji przyciętego obrazu była błędnie ograniczana do prostokąta przycinania obrazu's. Strony PDF, które zapisują stan graficzny, stosują ścieżkę przycinania, malują obraz, a następnie przywracają stan — powszechna technika układu dla obrazów w ramkach lub z obramowaniem — renderowały cały późniejszy tekst, kształty i grafikę tylko wewnątrz przyciętego regionu. Zapisywanie i przywracanie stanu Cairo jest teraz poprawnie mapowane na operatory PDF q/Q, więc region przycinania jest odrzucany po narysowaniu obrazu.
v3.9.9 2026-04-29
- Dodano silnik renderowania PDF oparty na Cairo jako trzecią opcję renderowania obok GDI+ i PDFium. Wywołaj SelectRenderer(2) przed renderowaniem, aby go aktywować; silnik wymaga cairo.dll z dołączonego folderu DLL\Cairo. Renderowanie Cairo obsługuje te same tryby wyjścia co GDI+: eksport do pliku i strumienia bitmapy (BMP, JPEG, PNG, GIF, TIFF, G4 TIFF), renderowanie do kontekstu urządzenia oraz bezpośrednie wyjście na drukarkę.
- Demo MultiFunction View/Print udostępnia teraz trójstanowy selektor renderera, dzięki czemu użytkownicy mogą porównywać wyniki GDI+, PDFium i Cairo obok siebie na tym samym dokumencie bez żadnych zmian w kodzie.
v3.9.8 2026-04-29
- Wyciszono dwie fałszywe diagnostyki kompilatora w nakładce Win32 C-runtime, które pojawiały się w RAD Studio 13.1 i nowszych. Ostrzeżenie o wycofaniu (W1000) było zgłaszane, ponieważ osłona możliwości wersji kompilatora nie była propagowana do kompilatorów nowszych niż Delphi 2009, przez co kompilowały one względem wycofanego API menedżera pamięci. Wskazówka o nieużywanej zmiennej (H2164) była zgłaszana dla wewnętrznej zmiennej zgodności potrzebnej tylko dla kompilacji Delphi 7; jest ona teraz ograniczona do bloku warunkowego tej wersji's. Oba problemy dotyczyły wyłącznie diagnostyki i nie miały wpływu na działanie w czasie wykonywania.
v3.9.7 2026-04-29
- Dodano opcjonalne renderowanie stron oparte na PDFium w Windows, w tym renderowanie strumienia BMP, renderowanie do kontekstu urządzenia, renderowanie w pamięci i wyjście na drukarkę.
- Zaktualizowano demo Delphi MultiFunction View/Print o selektor renderera, dzięki któremu użytkownicy mogą przełączać się między istniejącym rendererem GDI+ i PDFium.
v3.9.6 2026-04-29
- Dodano oddzielne skrypty Inno Setup dla pełnego pakietu PDFlibPas i pakietu próbnego, z wyłączeniami ukierunkowanymi na wydanie dla metadanych kontroli źródeł, wyników budowania, pamięci podręcznych IDE, lokalnych plików agentów oraz dołączonych drzew źródeł firm trzecich, które nie są częścią wysyłanego pakietu.
- Instalator próbny buduje i pakuje teraz próbne biblioteki binarne dla RAD Studio 11.3, 12.3 i 13.1 oraz próbne dema Delphi, zanim zostanie wygenerowany plik wykonywalny instalatora.
v3.9.5 2026-04-29
- Naprawiono kompilacje biblioteki Win32 pod RAD Studio 9.0 / Delphi XE2. Skrypt budowania przekazywał flagę katalogu wyjściowego DCU, która istnieje dopiero od Delphi 2010; kompilator XE2's interpretował tę flagę inaczej, tworząc zniekształconą ścieżkę wyjściową i błąd krytyczny, zanim przetworzono jakikolwiek plik źródłowy. Skrypt teraz automatycznie wybiera odpowiednią flagę na podstawie docelowej wersji kompilatora.
- Poprawiono powiązaną osłonę wersji kompilatora w źródle biblioteki, która wywoływała kwalifikowaną nazwą funkcję środowiska wykonawczego wprowadzoną w XE4 pod warunkiem XE2+. Kompilacje docelowe dla XE2 i XE3 rozwiązują teraz właściwy import zgodności.
v3.9.4 2026-04-29
- Naprawiono konfigurację drukarki dla drukarek sieciowych i współdzielonych przez serwer, stosując podajnik papieru, nośnik, dupleks, jakość i inne ustawienia druku przez uchwyt DEVMODE drukarki zamiast uchwytu kontekstu urządzenia drukarki.
v3.9.3 2026-04-29
- Odświeżono dołączony backend AES do źródeł AES Briana Gladmana's z 2018 roku zarówno na Win32, jak i Win64. Powtarzalne skrypty budowania pozwalają teraz w dowolnym momencie odbudować statyczne obiekty AES ze źródeł. W trakcie procesu wykryto i naprawiono defekt ABI w wiązaniach Pascal: funkcjom szyfrowania i deszyfrowania AES-CBC brakowało deklaracji konwencji wywołań C, więc kompilacje Win32 po cichu przekazywały argumenty w niewłaściwej kolejności rejestrów, potencjalnie tworząc nieprawidłowe zaszyfrowane wyjście. Kompilacje Win64 nie były dotknięte, ponieważ platforma wymusza jednolitą konwencję wywołań.
- Wzmocniono skrypty odbudowy firm trzecich, aby skrypty zlib, JPEG i CRT-stub oparte na MSVC można było uruchamiać zarówno z katalogu głównego repozytorium, jak i z katalogu thirdparty; wcześniej wymagały ustawienia katalogu roboczego na folder thirdparty.
v3.9.2 2026-04-29
- Zaktualizowano backend JPEG 2000 ze starszego OpenJPEG 1.5 do OpenJPEG 2.5.4 zarówno na Win32, jak i Win64. Obie platformy używają teraz statycznego linkowania obiektów, więc kodowanie i dekodowanie JPEG 2000 działa bez dodatkowej biblioteki DLL w czasie wykonywania. Nowoczesny kodek wnosi aktualną obsługę nagłówków JP2/J2K, API strumieniowe sterowane callbackami oraz skumulowane poprawki błędów i bezpieczeństwa z projektu upstream. Publiczne API TJpeg2000Bitmap pozostaje bez zmian.
v3.9.1 2026-04-29
- Naprawiono renderowanie stron JPEG i eksport obrazów po aktualizacji libjpeg-turbo, przywracając konwersję PdfToImage JPG oraz wyjście TPDFJPEGImage.SaveToStream na Win32 i Win64.
- Poprawiono wiązania ABI Win32 libjpeg-turbo, tak aby callbacki, wyrównanie struktur, pola boolean i miejsca docelowe JPEG oparte na pamięci odpowiadały libjpeg-turbo 3.1.90.
- Naprawiono dekompresję strumienia Win32 FlateDecode z dołączonym backendem zlib 1.3.2, przywracając ładowanie strumieni xref PDF dla plików takich jak przykładowy dokument PdfToImage.
v3.9.0 2026-04-29
- Zaktualizowano dołączony backend JPEG 2000 ze starszego OpenJPEG 1.5 do OpenJPEG 2.5.4. Ładowanie i zapisywanie JPEG 2000 używa teraz nowoczesnego kodeka, API strumieniowego sterowanego callbackami i aktualnej obsługi nagłówków JP2/J2K, zachowując publiczne API TJpeg2000Bitmap.
- Wyjście JPEG 2000 automatycznie wybiera teraz prawidłową liczbę rozdzielczości OpenJPEG dla małych obrazów, a statyczny backend Win32 nie zależy już od brakujących eksportów pomocniczych MSVCRT.
v3.8.1 2026-04-29
- Wyeliminowano wszystkie 16 kosmetycznych ostrzeżeń linkera W1028 "Bad global symbol definition" na Win32 i Win64. Zmiany nazw na poziomie źródeł usuwają nadmiarowe duplikaty po stronie Pascal (jpeg_std_error i stuby alokatora jmemnobs są teraz rozwiązywane wyłącznie z warstwy obj); trzy pozostałe symbole obj bcc32 / vc64 (jpeg_natural_order, jpeg_aritab, jpeg_nbits_table), które muszą pozostać rozwiązywane przez linker względem danych po stronie Pascal, mają teraz usunięte nazwy symboli COFF przez przebieg postprocessingu ObjConv podczas thirdparty\build-jpeg-vc64.bat. Brak zmiany publicznego API; czyste wyjście linkera dla kompilacji Delphi Win32 i Win64.
v3.8.0 2026-04-29
- Kodek JPEG Win64 zaktualizowano z libjpeg w stylu IJG do libjpeg-turbo 3.1.90, kończąc migrację JPEG rozpoczętą w v3.7.0 (Win32). Ścieżki Win32 i Win64 współdzielą teraz ten sam nowoczesny kodek JPEG, z tymi samymi wewnętrznymi pętlami zoptymalizowanymi pod SIMD i ponad 30 skumulowanymi poprawkami CVE / fuzz z upstream. Publiczne API PDFlibPas pozostaje bez zmian.
v3.7.0 2026-04-28
- Kodek JPEG Win32 zaktualizowano z IJG libjpeg-6b do libjpeg-turbo 3.1.90. Znacznie szybsze kodowanie/dekodowanie JPEG dzięki wewnętrznym pętlom zoptymalizowanym pod SIMD oraz ponad 30 poprawkom CVE / fuzz zgromadzonym w upstream libjpeg-turbo. Publiczne API PDFlibPas (klasa TPDFJPEGImage, funkcje DumpJPEG) pozostaje bez zmian; istniejące ścieżki kodu PDF/JPEG działają szybciej bez wymagania zmian w źródłach.
v3.6.0 2026-04-28
- Win32 zlib zaktualizowano z 1.2.x do 1.3.2. Obejmuje standardowe ponad 25 poprawek CVE / fuzz zgromadzonych upstream od 1.2.8 oraz nowe punkty wejścia inflateBack9 / inflateTree9 używane przez strumienie z 64-bitowym oknem. Publiczne API PDFlibPas (DeflateStr / InflateStr / InflateStrParms) pozostaje bez zmian.
- Ścieżka Win64 zlib pozostaje bez zmian w tym wydaniu - nadal używa jednostki System.ZLib dołączonej do Delphi.
- Aktywowano nakładkę CRT PDFlibCLibs.pas linkowaną w czasie linkowania dla Win64 (wprowadzoną w v3.5.0) dla ścieżki Win32 zlib, dostarczając symbole memcpy / memset / malloc / free, do których odwołują się nowe pliki obj zlib 1.3.2.
v3.5.0 2026-04-28
- Dodano do repozytorium świeżą infrastrukturę budowania dla dołączonych bibliotek C obrazów / kompresji: zlib 1.3.2, libjpeg-turbo 3.1.90, libtiff 4.7.1. Skrypty budowania dla Embarcadero bcc32 (Win32) i MSVC cl.exe (Win64) znajdują się w Lib/thirdparty/ obok drzew źródeł, dzięki czemu każdy z RAD Studio + VS2022 może odbudować statyczne pliki obj z czystego źródła.
- Dodano infrastrukturę budowania dla OpenJPEG 2.5.4. Samo drzewo źródeł OpenJPEG jest pobierane niezależnie przez użytkownika (git clone uclouvain/openjpeg do Lib/thirdparty/OpenJPEG/), dzięki czemu można je aktualizować bez dotykania konfiguracji budowania PDFlibPas's.
- Dodano Lib/PDFlibCLibs.pas, shim CRT czasu linkowania Win64 używany przez backend Win64. Wypełnia on lukę między plikami obj C skompilowanymi przez MSVC a linkerami Win64 Delphi (dcc64 / Win64x ld.lld / BCB ilink64), które nie dołączają automatycznie msvcrt.dll.
v3.4.0 2026-04-28
- Wzmocniono generowanie klucza szyfrowania, wektora inicjalizacji AES i bloku uprawnień Perms przed przewidywalnymi źródłami liczb losowych. Zaszyfrowane pliki PDF utworzone na systemach uruchomionych w podobnym czasie zegarowym nie są już trywialnie korelowalne; dokumenty AES-256 zachowują teraz pełną siłę klucza.
- Wzmocniono parsowanie słownika obrazów przed zniekształconymi lub wrogimi plikami PDF deklarującymi nierozsądne wartości Width, Height, BitsPerComponent lub liczby komponentów DeviceN. Wartości spoza zakresu są ograniczane przed jakąkolwiek arytmetyką bufora pikseli, zapobiegając awariom podczas otwierania takich plików.
- Wzmocniono przechodzenie po odsyłaczach krzyżowych i drzewie stron przed dokumentami, których łańcuchy /Prev xref lub linki stron /Parent tworzą cykl albo są nadmiernie głębokie. Czytnik odrzuca teraz zniekształcone struktury czysto, zamiast rekurencyjnie działać aż do wyczerpania stosu.
v3.3.1 2026-04-27
- Uproszczono skrypty budowania Windows dla poszczególnych komponentów. Foldery DLL/, OCX/ i Dylib/ nie zawierają już oddzielnych wariantów build12-* / build13-*: każda platforma ma teraz pojedynczy skrypt build-Win32 / build-Win64, który przypina się do najnowszego RAD Studio i akceptuje opcjonalny argument "debug".
- Dodano komentarze z uzasadnieniem bezpośrednio przy poprawkach renderowania w PDFlibRenderer.pas, które były już obecne w początkowej bazie Git. Komentarze dokumentują, dlaczego SetPen skaluje szerokości kreski według aktywnej transformacji płótna oraz dlaczego operatory d0/d1 CharProc czcionki Type 3 muszą zużywać swoje operandy. Zachowanie w czasie wykonywania nie uległo zmianie.
v3.3.0 2026-04-26
- Naprawiono renderowanie kresek po transformacji w PDFlibRenderer.pas. SetPen stosuje teraz skalę bieżącej transformacji płótna do szerokości linii PDF przed wywołaniem Picasso, zapobiegając zbyt dużym lub zbyt małym kreskom na ścieżkach, których współrzędne zostały już przekształcone. Naprawia to kontury glifów Type 3, które mogły być renderowane jako grube, nieregularne bloki.
- Naprawiono obsługę d0/d1 CharProc czcionki Type 3 w parserze strumienia zawartości. d0 zużywa teraz swoje dwa operandy szerokości, a d1 zużywa swoje sześć operandów szerokości/ramki ograniczającej, zanim zostaną wykonane późniejsze polecenia rysowania, zapobiegając uszkadzaniu geometrii glifu lub ścieżki przez nieaktualne operandy.