Registro modifiche
Cronologia delle versioni
« Torna all’indice della documentazione
Cronologia delle versioni della libreria PDFlibPas. Le voci sono elencate dalla più recente alla più vecchia; ciascuna versione segue il versioning semantico in base alla politica di rilascio del progetto.
Lingue: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
- Corretto il percorso di decifratura AES-256 basato su buffer introdotto in v3.56.41, così i chiamanti possono assegnare il risultato della decifratura allo stesso
AnsiStringche ha fornito il buffer del testo cifrato senza violazioni di accesso. - Il flusso dell'API normale
LoadFromFile,Encrypt,SaveToFile, ricaricamento,DecrypteSaveToFileora si completa di nuovo su PDF grandi già caricati, mantenendo l'ottimizzazione di decifratura AES-CBC con copia ridotta. - Aggiunta copertura di regressione AES per i casi in cui buffer di input e destinazione del risultato coincidono durante il ripristino degli stream cifrati in fase di salvataggio, inclusi payload grandi da 504 KB che prima esponevano il problema.
v3.56.41 2026-05-27
- Aggiunto
TPDFlib.DACopyFileper workflow Direct Access che richiedono il conteggio delle pagine e una copia invariata del file senza costruire il grafo completo degli oggetti normali. - Ottimizzata la decodifica AES-256 aggiungendo percorsi AES-CBC basati su buffer e usandoli durante la decodifica di stringhe e stream caricati, riducendo copie aggiuntive del testo cifrato nei grandi stream cifrati.
- La demo Delphi
HugeFileBenchmarkora include una rigadirect-copye i filtri--opse--skipper esecuzioni mirate su file di grandi dimensioni.
v3.56.40 2026-05-26
- Le demo
HelloWorldDelphi e C++Builder ora creano un PDF iniziale piu ricco con informazioni del documento, output con un font standard selezionato, blocco titolo stilizzato, semplice disegno vettoriale e indicazioni sui passi successivi, mantenendo lo stesso flusso di compilazione ed esecuzione. - Tutte le note delle demo Delphi e C++Builder sono state sostituite con pagine
Readme.htmladatte al browser, incluse le note ausiliarie per password, file con restrizioni e risultati di firma; gli indici delle demo ora indirizzano gli utenti alle note HTML.
v3.56.39 2026-05-26
- I percorsi di salvataggio della API file diretta ora costruiscono le tabelle di ricerca dei riferimenti incrociati in modo lineare, rendendo
DASaveAsFilee i percorsi di salvataggio diretto correlati molto più veloci sui PDF con moltissimi oggetti o alberi di pagine densi. - Il writer ottimizzato conserva la stessa semantica della catena degli oggetti liberi ed evita scansioni ripetute dei numeri di oggetto durante la generazione completa di xref, migliorando i grandi flussi di salvataggio diretto senza modificare la API pubblica o il contratto di output.
v3.56.38 2026-05-26
- Corretta l'uscita di crittografia dell'API normale in modo che
Encryptcrei o conservi il trailer/IDprima di scrivere i dati di sicurezza AES-256, mantenendo i PDF crittografati rilevabili al ricaricamento tramiteEncryptionStatus. - Il flusso dell'API normale
LoadFromFile,Encrypt,SaveToFile, ricaricamento,DecrypteSaveToFileora preserva lo stato crittografato prima delDecryptesplicito, allineandosi al comportamento dell'API di accesso diretto ai file per i grandi PDF legacy.
v3.56.37 2026-05-26
- Aggiunto
TPDFlib.ComparePreflightReports, un comparatore riga per riga per report di preflight in testo semplice che ignora le righe temporali volatiliGenerated:e restituisce una stringa vuota quando il contenuto stabile del report corrisponde. - La demo Delphi
PreflightReportora supporta--compare <file>in modalita file singolo, scrive un report UTF-8.diff.txte restituisce il codice di uscita 2 quando il report di testo generato differisce dalla baseline.
v3.56.36 2026-05-26
- La demo Delphi
PreflightReportora supporta esecuzioni batch su directory con--input-dir,--output-dire--recursive, scrivendo un report per ogni PDF come<basename>.preflight.<ext>. - La modalita batch scrive un file UTF-8
preflight-summary.csvche registra ogni PDF sorgente, lo stato pass/fail, il numero di problemi e il percorso del report generato, mantenendo il contratto dei codici di uscita esistente per l'automazione.
v3.56.35 2026-05-26
ReportFormat = 3aggiunge l'output CSV aTPDFlib.CreatePreflightReportExeTPDFlib.SavePreflightReportEx, producendo righe UTF-8 per i metadati del report, ogni controllo di conformita selezionato, i singoli codici e messaggi dei problemi e il riepilogo finale.- La demo Delphi
PreflightReportora supporta--format csve--csv, cosi le esecuzioni preflight da riga di comando possono alimentare fogli di calcolo o semplici parser CI senza post-elaborare JSON o estrarre testo.
v3.56.34 2026-05-26
- Aggiunte le API sensibili al formato
TPDFlib.CreatePreflightReportExeTPDFlib.SavePreflightReportExper generare report preflight PDF/A e PDF/UA-1 come testo semplice, JSON o HTML autonomo, mantenendo le API esistenti solo testuali. - La demo Delphi
PreflightReportora supporta--format text|json|htmle le scorciatoie--jsone--html, così lo stesso flusso da riga di comando può produrre report leggibili o artefatti CI leggibili da macchina.
v3.56.33 2026-05-26
- Aggiunti
TPDFlib.CreatePreflightReporteTPDFlib.SavePreflightReportper consentire alle applicazioni di generare report di testo riutilizzabili dai controlli integrati di conformità PDF/A e PDF/UA-1 senza enumerare manualmente gli handle delle liste di stringhe. - La demo Delphi
PreflightReportora chiama direttamente le API di report della libreria, mantenendo l'esempio focalizzato sul flusso da riga di comando, sui controlli selezionati, sulla modalità primo problema e sui codici di uscita adatti all'automazione.
v3.56.32 2026-05-26
- Aggiunto un nuovo esempio console Delphi
PreflightReportche esegue controlli PDF/A e PDF/UA-1 conCheckFileCompliance, enumera gli elenchi di problemi conGetStringListCounteGetStringListIteme scrive un report di preflight in testo semplice. - L'esempio supporta le opzioni
--input,--output,--pdfa,--pdfua,--bothe--first-issue, oltre a codici di uscita adatti all'automazione per esito positivo, problemi trovati ed errore di runtime.
v3.56.31 2026-05-25
GetCustomKeys(2)ora nasconde in modo coerente le voci del sistema Catalog gestite dalla libreria, inclusi/OutputIntents,/Extensions,/Requirements,/Collectione/NeedsRendering.- Gli intenti di output PDF/A creati da
SetPDFAModenon vengono più visualizzati come chiavi personalizzate nel catalogo, mantenendo la separazione tra l'enumerazione dei metadati dell'applicazione e le strutture di conformità PDF.
v3.56.25 2026-05-23
- Il modulo di scrittura GetPDFUADiagnostics risolve il problema corrispondente
MULTIPLE-H-CHILDREN:N, raggiungendo la parità con il modulo di lettura10044a partire dalla versione v3.56.24. ISO 14289-1 §7.4.4 impedisce che un nodo dell'albero dei tag abbia più di un figlio diretto H; il controllo sul lato della scrittura viene eseguito ogni volta che l'albero FStructElems in memoria contiene una violazione di questo tipo. - Un nuovo helper nidificato CountMultipleHChildren percorre l'albero in profondità, contando i figli H a ogni livello. Il controllo viene eseguito insieme alle percorse esistenti LIST-STRUCT / LIST-NO-NUMBERING e condivide lo stesso schema di attraversamento FStructElems.
v3.56.24 2026-05-23
- Il controllo PDF/UA-1 aggiunge un controllo di unicità dei tag H ISO 14289-1 §7.4.4.
10044segnala qualsiasi nodo della struttura che abbia più di un figlio diretto H —, in quanto la specifica lo vieta nei documenti con struttura fortemente definita, e la stessa restrizione si applica a qualsiasi nodo dell'albero dei tag, indipendentemente dalla modalità di struttura complessiva. L'altra sezione § 7.4.4 SHALL (un documento deve essere o fortemente o debolmente strutturato, non entrambi) richiede euristiche a livello di documento ed è intenzionalmente esclusa da questo controllo. - Un nuovo algoritmo di attraversamento dell'albero della struttura (UAVisitStructNodeForHUniqueness / ScanStructTreeForHUniqueness) conta i figli H diretti per nodo e ricorsivamente in profondità. Riutilizza lo stesso decoder a forma di K degli algoritmi esistenti per intestazioni / elenchi / note.
v3.56.23 2026-05-23
- L'audit PDF/UA-1 ora include due controlli sui programmi di font ISO 14289-1 §7.21.6 che i controlli a livello di dizionario di v3.56.10 dovevano rimandare fino alla disponibilità di un parser TrueType.
10034segnala programmi TrueType non simbolici i cui cmap incorporati contengono solo l'entry simbolica (platformID=3, encodingID=0) — §. Il primo paragrafo della versione 7.21.6 richiede almeno una sottotabella cmap non simbolica affinché il programma possa renderizzare i codepoint dichiarati dal suo /Encoding..10035segnala array TrueType non simbolici i cui nomi di glifi non sono membri dell'Adobe Glyph List (.notdefescluso) — §. Il terzo paragrafo della versione 7.21.6 richiede che ogni entry di Differenze sia presente in AGL. - Il nuovo
Lib/PDFlibPDFUAFontInspect.pasimplementa un walker tollerante per la directory della tabella e un parser per la directory delle sottotabelle cmap. La tabella Adobe Glyph List con 4281 nomi, aggiunta come scaffolding nell'ultimo commit dell'infrastruttura, è ora integrata tramite il controllo delle Differenze. I programmi che non vengono analizzati come SFNT (programma di font PFB / PFA, OpenType collezione, spazzatura arbitraria) vengono ignorati silenziosamente; i falsi negativi sono preferiti ai falsi positivi a livello di audit.
v3.56.22 2026-05-23
- L'audit PDF/UA-1 ora include controlli sui dati dei clip multimediali ISO 14289-1 §7.18.6.
10042segnala dizionari di dati dei clip multimediali (identificati da/S /MCD, opzionalmente/Type /MediaClip) che mancano dell'entry obbligatoria/CTcontent-type.10043segnala gli stessi dizionari che mancano dell'array obbligatorio/Alt. ISO 32000-1 La tabella 274 elenca entrambe le chiavi come opzionali, ma ISO 14289-1 §7.18.6 le promuove a obbligatorie in modo che i lettori di schermo possano annunciare una descrizione significativa per i contenuti multimediali incorporati. - Questa è la Fase 6 del piano di audit approfondito PDF/UA (
.superpowers/plans/2026-05-23-pdfua-deep-audit-plan.md). Funziona senza alcuna dipendenza dal parser del programma di font o dello stream di contenuto, quindi è la prima sottoclasse successiva alla serie v3.56.0..v3.56.13.
v3.56.21 2026-05-23
- Nuovo
SetSignProcessCommitmentTypeemette l'attributo firmato CAdEScommitment-type-indication(OID 1.2.840.113549.1.9.16.2.16, ETSI EN 319 122-1 v1.2.1 §5.2.3) all'interno del percorso PAdES-B-B SignerInfo. Accetta codici interi da 1 a 6 che corrispondono ai noti schemi di impegno ETSI OIDsid-cti-ets-proofOfOrigintramiteid-cti-ets-proofOfCreation; passare 0 per cancellare. I codici fuori intervallo vengono rifiutati. - Nuovo
SetSignProcessSignaturePolicyemette l'attributo firmato CAdESsignature-policy-identifier(OID 1.2.840.113549.1.9.16.2.15, §5.2.9). Richiede la policy in formato decimale con punti, l'hash del documento di policy come stringa esadecimale maiuscola e un codice di algoritmo di digest (1=SHA-1, 2=SHA-256, 3=SHA-384, 4=SHA-512, 0=auto/SHA-256). L'attributo trasporta ilSignaturePolicyIdSEQUENCE consigPolicyId+sigPolicyHash(OtherHashAlgAndValueSEQUENCE). - Entrambi gli attributi hanno effetto solo quando SubFilter è
ETSI.CAdES.detached(il percorso PAdES-B-B); estendono l'arrayrgAuthAttresistente insieme acontent-typeesigning-certificate-v2. La riga d) della PAdES Tabella 1 vieta di combinarecommitment-type-indicationcon la voce del dizionario delle firme PDF/Reason; il chiamante è responsabile di non impostare entrambi.
v3.56.20 2026-05-23
- Il nuovo
AddPAdESDSSVRIaggiunge una voce di sottodizionario VRI all'oggetto DSS che viene assemblato, completando la struttura ETSI EN 319 142-1 v1.2.1 della sezione 5.4.2.3 Informazioni relative alla validazione. La voce è identificata dalla chiave SHA-1 in maiuscolo esadecimale dei byte della firma '; i suoi sotto-arrayCert/CRL/OCSPvengono popolati facendo riferimento ai corrispondenti stream padre ⟦P0011⟧ tramite indici basati su zero forniti come elenchi separati da virgole (ad esempio,"0,2,5"). - Il
TSmartPDFDocument.AddPAdESDSSWithVRIsottostante tiene traccia dei numeri di oggetto stream emessi per ogni certificato / CRL / OCSP e li utilizza per scrivere i sotto-array VRI come riferimenti indiretti agli stessi stream a cui i sotto-array padre DSS puntano già, soddisfacendo il requisito della specifica secondo cui le voci VRI condividono lo spazio di archiviazione con il dizionario padre DSS. Il punto di ingresso originaleAddPAdESDSScontinua a funzionare inalterato per le applicazioni che non necessitano di VRI. - Ogni sottodizionario VRI per firma contiene il marcatore opzionale
/Type /VRI, in modo che gli strumenti che analizzano il catalogo per tagTypepossano riconoscere la struttura senza dover risolvere nuovamente il percorso padre.
v3.56.19 2026-05-23
- Nuovo flusso di lavoro PAdES-B-T per collegare una firma RFC 3161 / RFC 5816 con timestamp (id-aa-signatureTimeStampToken, OID 1.2.840.113549.1.9.16.2.14) a una firma PAdES-B-B esistente.
NewPAdESSignatureTimeStampProcessFromFile/FromStream/FromStringapre una firma PDF,SetPAdESSignatureTimeStampFieldnomina il campo,GetPAdESSignatureValueHashHexrestituisce l'hash SHA-256 (o 384 / 512) delsignatureValuedel firmatario per l'invio a un TSA,GetPAdESSignatureCMSBytesespone il payload CMS esistente,SetPAdESSignatureCMSBytesaccetta i byte aumentati CMS che il chiamante assembla tramite la sua libreria CMS di scelta, eEndPAdESSignatureTimeStampProcessToFile/ToStream/ToStringinserisce la nuova CMS nel segnaposto/Contentsoriginale. BuildPAdESSignatureTimeStampAttributeè un helper senza stato che avvolge un TimeStampToken emesso da TSA nell'attributo CMS cheSignerInfo.unsignedAttrssi aspetta, quindi i chiamanti che già hanno una libreria CMS a portata di mano possono saltare la parte di plumbing OID + SET.- La nuova
SetSignProcessReserveContentsBytesallarga il segnaposto/Contentsal momento della firma iniziale in modo che l'CMS aumentato successivamente entri senza superare la riserva originale. Gli attributi TimeStampTokens tipicamente emessi da13aggiungono da 2 a 6 KB al SignerInfo; passare 1024-8192 per lasciare spazio. Se non c'è abbastanza riserva, la chiamata di aumento restituisce13(overflow dell'output). - La libreria non include un client TSA HTTP; il chiamante recupera l'TimeStampToken (tipicamente 30-50 righe di richiesta TSP + HTTP POST contro, ad esempio, FreeTSA o DigiCert). In linea di principio,
CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTRsu Windows CryptoAPI potrebbe automatizzare l'iniezione CMS nella libreria, ma restituisceCRYPT_E_INVALID_INDEX(0x80091008) sulla forma SignedData separata PAdES emessa, quindi viene utilizzato il percorso di byte fornito dal chiamante CMS.
v3.56.18 2026-05-23
- L'attributo PAdES
signing-certificate-v2ora include il campo opzionaleIssuerSerialdefinito da RFC 5035 (ESSCertIDv2). Il Distinguished Name dell'emittente del certificato di firma è avvolto in unGeneralName [4] EXPLICIT directoryNameCHOICE all'interno diGeneralNames, seguito dal numero di serie del certificato come un ASN.1 INTEGER. I byte del numero di serie arrivano in ordine little-endian da Windows CryptoAPI (CRYPT_INTEGER_BLOB) e vengono invertiti in big-endian con l'aggiunta del byte di riempimento intero positivo quando il bit più significativo è impostato, come OpenSSL e BouncyCastle emettono lo stesso campo. - I verificatori che controllano il nome dell'emittente + la coppia del numero di serie rispetto al loro set di candidati di costruzione del percorso (in particolare EU DSS in modalità stretta) ora trovano entrambi gli identificatori nell'attributo signing-cert-v2; l'output precedente v3.56.17 forniva solo il riferimento
certHash. - I nuovi helper ASN.1
DER_IntegerFromLittleEndian(gestisce l'ordine dei byte Win32CRYPT_INTEGER_BLOB) eDER_ContextTagExplicit(avvolge un payload in un tag contestuale costruito) completano il micro-encoderPDFlibASN1. Le nuove dichiarazioniCERT_INFO/CRYPT_ALGORITHM_IDENTIFIER/CRYPT_INTEGER_BLOB/PCERT_CONTEXTinPDFlibCryptoAPIforniscono al percorso di firma l'accesso ai campi del certificato analizzati.
v3.56.17 2026-05-23
- Il percorso di firma integrato
ETSI.CAdES.detachedora produce firme PAdES-B-B strutturalmente conformi. La libreria costruisce essa stessa gli attributi autenticati CMS —content-type(id-data) esigning-certificate-v2da RFC 5035 / RFC 5816 con un hash SHA-256 del certificato di firma — e li consegna aCryptSignMessagetramitergAuthAttr. Non appena quel campo è non-NULL, la Windows CryptoAPI smette di iniettare automaticamente l'attributosigning-timeche PAdES (ETSI EN 319 142-1 v1.2.1 Table 1) vieta, così ilSignerInforisultante porta gli attributi richiesti e soltanto quelli. - La nuova unità
PDFlibASN1fornisce un micro-encoder DER (X.690) mirato — prefisso di lunghezza, OCTET STRING, SEQUENCE, SET, OBJECT IDENTIFIER — usato per costruire il valore dell'attributoSigningCertificateV2. L'encoder segue le regole standard per gli archi OID base-128 e omette il campo opzionalehashAlgorithmquando si limiterebbe a ripetere il valore di default SHA-256, in linea con quanto emettono OpenSSL e BouncyCastle. ApplySignatureora instradaETSI.CAdES.detachedattraverso il percorso raw-byte (lo stesso usato daadbe.pkcs7.detached) invece di alimentare un digest precalcolato. La CryptoAPI calcola ora l'attributo autenticatomessageDigestsul contenuto effettivamente firmato, che è ciò che si aspettano i verificatori.- SHA-384 e SHA-512 sono onorati anche nella costruzione dell'attributo signing-certificate-v2: il campo
hashAlgorithmviene emesso con l'AlgorithmIdentifiercorrispondente invece di affidarsi al valore di default. SHA-1 viene silenziosamente promosso a SHA-256 in questo contesto perché PAdES-B-B non autorizza SHA-1 (clause 6.2.1).
v3.56.16 2026-05-23
- Il nuovo
SetSignProcessDigestAlgorithmseleziona l'algoritmo di message-digest per la firma:1= SHA-1 (deprecated),2= SHA-256 (default moderno),3= SHA-384,4= SHA-512,0= auto (SHA-256 per ogni SubFilter tranne il percorso legacyadbe.pkcs7.sha1, che resta su SHA-1 per la compatibilità binaria stabile). ETSI EN 319 142-1 v1.2.1 §6.2.1 vieta MD5 e rinvia a ETSI TS 119 312 per le suite crittografiche raccomandate, perciò i firmatari PAdES dovrebbero scegliere SHA-256 o più forte. - Aggiunti gli helper di hash
SHA256StreamRange,SHA384StreamRangeeSHA512StreamRangeaccanto al già presenteSHA1StreamRange; il percorso di firma li utilizza per fare il digest del ByteRange del PDF con l'algoritmo selezionato. L'OIDSignerInfo.digestAlgorithmdi PKCS#7 e i byte di hash effettivamente scritti ora sono garantiti coerenti (il codice precedente passava sempre il digest SHA-1 indipendentemente dall'algoritmo negoziato). TPDFlibPFXFile.SignDataora accetta un parametroDigestAlgorithme sceglie l'OID corretto per ciascuna coppia (SubFilter, algoritmo):2.16.840.1.101.3.4.2.1/.2/.3per SHA-256/384/512 sui SubFilter detached e custom (RFC 5754), e gli OID della famigliasha256WithRSAEncryptioncorrispondenti per il percorso legacyadbe.pkcs7.sha1.
v3.56.15 2026-05-23
- Il nuovo
SetSignProcessDocTimeStampcommuta un processo di firma in modalità PAdES Document Time-stamp secondo ETSI EN 319 142-1 v1.2.1 §5.4.3. Il dizionario di firma risultante porta/Type /DocTimeStampe/SubFilter /ETSI.RFC3161, omette le chiavi non consentite/M,/Reason,/Location,/ContactInfoe/Name, e riserva un segnaposto esadecimale di 8192 byte (o di dimensione specificata dal chiamante) in/Contentsper un TimeStampToken RFC 3161 recuperato esternamente. - Il passthrough viene abilitato automaticamente quando viene selezionata la modalità DocTimeStamp, poiché il TimeStampToken proviene da una TSA esterna. Le chiamate a
SetSignProcessInfoeffettuate dopo il passaggio alla modalità DocTimeStamp vengono ignorate silenziosamente per mantenere il dizionario di firma conforme alla specifica. - L'iniezione automatica di
/Extensions /ESICPAdES esistente aggiunta in v3.56.8 copre già DocTimeStamp perché il suo SubFilter inizia conETSI., quindi un PDF Document Time-stamp dichiara l'estensione di catalogo richiesta senza ulteriore configurazione.
v3.56.14 2026-05-23
- Nuova API di aumento del Document Security Store (DSS) PAdES.
NewPAdESDSSProcessFromFile/NewPAdESDSSProcessFromStream/NewPAdESDSSProcessFromStringaprono un PDF già firmato,AddPAdESDSSCertificate/AddPAdESDSSCRL/AddPAdESDSSOCSPmettono in coda materiale di convalida codificato in DER, eEndPAdESDSSProcessToFile/EndPAdESDSSProcessToStream/EndPAdESDSSProcessToStringscrivono un aggiornamento incrementale contenente un dizionario/DSS << /Type /DSS /Certs [...] /CRLs [...] /OCSPs [...] >>come specificato da ETSI EN 319 142-1 v1.2.1 §5.4.2.2. Questo è il mattone per promuovere una firma PAdES-B-B / B-T a convalida a lungo termine PAdES-B-LT. - Il processo DSS aumenta automaticamente la voce
/Extensions /ESICdel catalogo ad almenoExtensionLevel 1quando aggiunge materiale di convalida, soddisfacendo il requisito di §5.6, e unisce i nuovi certificati, CRL e risposte OCSP negli array esistenti/Certs//CRLs//OCSPsnelle invocazioni ripetute, in modo che le revisioni si accumulino invece di sovrascriversi. GetPAdESDSSProcessResult/ReleasePAdESDSSProcesscompletano il ciclo di vita, rispecchiando la superficie APISignProcessesistente.
v3.56.8 2026-05-23
- Conformità baseline PAdES: quando una firma viene creata con un SubFilter PAdES (
ETSI.CAdES.detachedoETSI.RFC3161), il catalogo del documento riceve ora automaticamente la voce/Extensions /ESIC <</BaseVersion /1.7 /ExtensionLevel 2>>richiesta da ETSI EN 319 142-1 v1.2.1 §5.6. La voce viene aggiunta tramite lo stesso aggiornamento incrementale che porta la firma, non riduce mai un/ExtensionLevelsuperiore esistente e segue i riferimenti indiretti/Extensionso/ESICquando il PDF di origine li memorizza già come oggetti separati. - Il marcatore di estensione equivalente Adobe scritto da SetSignProcessCustomSubFilter per i PDF creati tramite
TPDFlibè ora/ADBE /BaseVersion /1.7 /ExtensionLevel 8(eraExtensionLevel 5), corrispondente alla dichiarazione alternativa che le firme baseline PAdES sono autorizzate a utilizzare; il livello 5 copriva solo moduli ISO 32000-2 / 3D / funzionalità RichMedia e non identificava in realtà le estensioni PAdES.
v3.56.13 2026-05-23
- Quando SetPDFUAMode è attivo e il documento viene salvato, qualsiasi elemento di struttura L (list) che manca di un attributo
ListNumberingesplicito riceve ora automaticamente/O = List /ListNumbering = None. ISO 14289-1 §7.6 richiede che ogni tag L dichiari il proprio stile di numerazione; la nuova correzione al momento del salvataggioApplyPDFUAListNumberingsi unisce alla famiglia esistenteApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationship/ApplyPDFUAStripTrapNet. - Gli autori che si preoccupano di uno stile di elenco specifico dovrebbero comunque chiamare SetStructElemListNumbering prima di EndTag; la correzione automatica si attiva solo quando nessun attributo ListNumbering è presente al momento del salvataggio, quindi i valori espliciti vengono preservati.
- Il messaggio diagnostico lato writer
LIST-NO-NUMBERING:Nora segnala che la correzione automatica maschererà il problema al momento del salvataggio, in modo che gli utenti comprendano sia l'attributo mancante sia il comportamento di riparazione automatica.
v3.56.12 2026-05-23
- L'audit PDF/UA-1 guadagna tre nuovi controlli ISO 14289-1.
10031segnala le annotazioni Link il cui dizionario di azione URI porta/IsMap = true(vietato da §7.18.5 a meno che funzionalità equivalente sia fornita altrove nel contenuto; gli autori con un caso d'uso IsMap legittimo possono sopprimere la diagnostica da soli).10032segnala gli elementi di strutturaNoteprivi della voce/ID— §7.9 richiede che ogni tag Note dichiari un ID univoco.10033segnala il conteggio di coppie duplicate quando due o più tag Note condividono lo stesso valore/ID. - Il rilevamento delle collisioni di ID Note viene effettuato raccogliendo gli ID in una TStringList ordinata e percorrendo le coppie adiacenti, quindi un gruppo di tre Note che condividono un ID conta come due coppie duplicate.
- Il controllo dell'azione URI percorre l'array
/Annotsdi ogni pagina, filtra per/Subtype /Link, quindi ispeziona/A /S /URIe il booleano/IsMap. I riferimenti indiretti vengono dereferenziati ad ogni passo in modo che i dizionari di azione separati si comportino come quelli inline.
v3.56.11 2026-05-23
- ISO 14289-1 §7.6 richiede che ogni elemento di struttura L (list) porti un attributo
ListNumberingesplicito.10030(lato reader) eLIST-NO-NUMBERING:N(lato writer) segnalano i tag L che lo omettono. Il walker lato reader decodifica entrambe le forme di/A(dizionario di attributo singolo, o array di dizionari mescolati con interi di revisione) e cerca la chiave/ListNumberingindipendentemente dall'owner. Il controllo lato writer ispezionaTPDFStructElem.Attributesper lo stesso nome sia nell'elenco di strutture finalizzato sia nello stack di tag ancora aperti. - I valori validi di
ListNumberingsecondo ISO 32000-1 Tabella 347 sonoNone,Disc,Circle,Square,Decimal,UpperRoman,LowerRoman,UpperAlpha,LowerAlpha. L'audit controlla solo la presenza della chiave, non quale valore viene scelto — ogni tag L necessita di uno di questi.
v3.56.10 2026-05-23
- L'audit PDF/UA-1 guadagna le regole di codifica TrueType di ISO 14289-1 §7.21.6.
10028segnala i font TrueType non simbolici il cui/Encoding(o il/BaseEncodingall'interno di un dizionario Encoding) non è néMacRomanEncodingnéWinAnsiEncoding.10029segnala i font TrueType simbolici che portano del tutto una voce/Encoding(vietato dal quarto paragrafo di §7.21.6). - Simbolico vs non simbolico viene deciso dal bit 3 (maschera
4) dei/Flagsdel FontDescriptor, riutilizzando l'helperUAFontDescriptorSymbolicesistente dalla sub-classe 4. Il primo paragrafo completo di §7.21.6 (il programma TrueType incorporato deve contenere voci cmap corrispondenti) richiede l'analisi del programma del font TrueType ed è ancora in attesa; le regole a livello di dizionario sopra costituiscono lo strato pratico che questo audit può verificare senza un parser TrueType. - Le regole dell'array Differences in §7.21.6 (nomi di glifo solo AGL, presenza di cmap Microsoft Unicode) restano fuori scopo per la stessa ragione — richiedono ispezione del programma del font.
v3.56.9 2026-05-23
- L'audit PDF/UA-1 guadagna un controllo ISO 14289-1 §7.18.4 completo.
10027segnala le annotazioni Widget il cui/StructParentsi risolve attraverso il/ParentTreedell'albero di struttura ma non atterra su un elemento di struttura con/S = Form. Il precedente controllo parziale di v3.56.7 (10026) catturava solo i Widget che mancano del tutto di/StructParent; il nuovo controllo completa la regola seguendo il puntatore dell'albero di numeri e verificando il tag di destinazione. - Un nuovo helper
NumberTreeLookupimplementa la forma dell'albero di numeri di ISO 32000-1 §7.9.7 (root piatta/Nums,/Kidsintermedi con range tramite/Limits). Gli audit futuri che devono risolvere le voci/StructParentsdella pagina o le etichette/PageLabelspossono riutilizzarlo. - La verifica del tag Form dell'annotazione Widget utilizza un modello a due livelli: un Widget senza
/StructParentviene segnalato come10026; un Widget il cui/StructParentesiste ma non si risolve in/S = Formviene segnalato come il più specifico10027. Ciò evita il doppio conteggio della stessa violazione sotto entrambi i codici.
v3.56.7 2026-05-23
- Quando SetPDFUAMode è attivo e il documento viene salvato, le eventuali voci di annotazione
TrapNetvengono ora rimosse automaticamente dall'array/Annotsdi ogni pagina. ISO 14289-1 §7.18.2 vieta le annotazioniTrapNet; la nuova correzione al momento del salvataggioApplyPDFUAStripTrapNetsi unisce alla famiglia esistenteApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationshipin modo che i documenti in modalità PDF/UA smettano di emettere silenziosamente residuiTrapNet. - L'audit PDF/UA-1 guadagna un controllo parziale di §7.18.4.
10026segnala le annotazioni Widget che mancano di/StructParent— un Widget senza/StructParentnon può essere raggiunto dall'albero di struttura e quindi non può essere nidificato in un tag di strutturaForm. La verifica strutturale completa (risoluzione di/StructParentattraverso ilParentTreee conferma che il/Sgenitore siaForm) è lasciata per una release successiva. - Il lato writer GetPDFUADiagnostics guadagna il problema corrispondente
WIDGET-NO-STRUCTPARENT:N. Il messaggio TRAPNET-ANNOT esistente ora segnala anche che SetPDFUAMode li elimina automaticamente al momento del salvataggio.
v3.56.6 2026-05-23
- L'audit PDF/UA-1 guadagna due controlli di gerarchia delle intestazioni di ISO 14289-1 §7.4.2.
10024segnala quando il primo elemento di intestazione nell'ordine del documento non è H1 (o H).10025segnala il numero di salti di livello di intestazione in una sequenza discendente (ad es. H1 seguito da H3 senza H2). Entrambi i controlli condividono un unico attraversamento pre-ordine dell'albero di struttura che decodifica le forme annidate di/K(StructElem singolo, array di StructElem / IndRef / MCR). - Il lato writer GetPDFUADiagnostics guadagna il problema corrispondente
FIRST-HEADING-NOT-H1, in parità con il reader10024. Il controllo writer HEADING-LEVEL-SKIP già esistente ha ora un compagno che cattura anche problemi del tipo "la prima intestazione era H2".
v3.56.5 2026-05-23
- Quando SetPDFUAMode è attivo e il documento viene successivamente cifrato, la chiave di permessi di cifratura (
/Pnel dizionario di cifratura) ha ora automaticamente il bit 10 (maschera$200, "Extract text and graphics in support of accessibility") impostato, anche quando il chiamante non ha inclusoppCanCopyAccessnelTPDFExtraPermissionspassato a Encrypt. ISO 14289-1 §7.16 richiede che ogni file conforme cifrato consenta l'estrazione per l'accessibilità, e il bit è altrimenti facile da dimenticare. Il bit è sempre sicuro da impostare — concede solo accesso aggiuntivo alla tecnologia assistiva, non ad altri percorsi di estrazione. - Il lato writer GetPDFUADiagnostics guadagna un nuovo problema
ENCRYPT-NO-ACCESSche si attiva quando PDFUAMode è attivo e il bit 10 del/Pdel dizionario di cifratura è azzerato. Ciò cattura il caso limite dell'ordine di chiamata in cui l'utente ha chiamatoEncrypt()prima e SetPDFUAMode solo dopo — la diagnostica dice all'utente di chiamareEncrypt()di nuovo in modo che il dizionario di cifratura venga riemesso con il/Pcorretto.
v3.56.4 2026-05-23
- Il lato writer GetPDFUADiagnostics guadagna cinque nuovi controlli ISO 14289-1 in modo che l'audit del documento in memoria catturi le stesse violazioni dell'audit lato reader CheckFileCompliance ComplianceTest=2.
SUSPECTS-TRUEsegnala MarkInfo/Suspects=true (§7.1: i file conformi PDF/UA richiedono Suspects=false).ROLEMAP-STANDARD-REMAP:Nsegnala le chiamate AddRoleMap che rimapperebbero un tag di struttura standard — §7.1 vieta la rimappatura di tag standard.DC-TITLE-MISSINGsegnala un dc:title XMP vuoto (separato da DOCINFO-TITLE-MISSING, che controlla /Info /Title).TRAPNET-ANNOT:Nsegnala le annotazioni TrapNet (§7.18.2 le vieta).ANNOT-PAGE-NO-TABS-S:Nsegnala le pagine che portano annotazioni il cui dizionario di pagina /Tabs non è /S (§7.18.3 richiede l'ordine di tabulazione dell'albero di struttura su quelle pagine). - Gli audit PDF/UA-1 lato writer e lato reader sono ora pressoché in parità: ogni problema che l'audit lato reader solleva su un file salvato è raggiungibile anche dalla diagnostica in memoria, salvo le convenzioni di formato di ciascuna funzione (testo separato da newline vs elenco di stringhe con codice NNNNN).
v3.56.3 2026-05-23
- L'audit PDF/UA-1 guadagna i controlli sui font di §7.21.
10020segnala qualsiasi font non-Standard-14 il cui FontDescriptor manca diFontFile/FontFile2/FontFile3(§7.21.4.1: ogni font reso deve incorporare il proprio programma).10021segnala i discendenti CIDFontType2 senza una voce/CIDToGIDMap(§7.21.3.2).10022evidenzia i font Standard 14 (Helvetica, Times, Courier, Symbol, ZapfDingbats e varianti bold / oblique) referenziati senza un programma incorporato — §7.21.4 NOTE 5 chiarisce che non c'è alcuna esenzione dall'incorporamento per questi font.10023segnala i font che mancano di una CMap/ToUnicodee non corrispondono all'elenco di esenzioni di §7.21.7 (codifiche predefinite MacRoman / MacExpert / WinAnsi, Type 0 con raccolte di caratteri Adobe-GB1 / CNS1 / Japan1 / Korea1, TrueType non simbolico). - I font compositi Type 0 vengono ispezionati a entrambi i livelli:
/ToUnicodesul dizionario padre Type 0 stesso, e incorporamento //CIDToGIDMapsul primo CIDFont discendente. I font Type 3 saltano il controllo di incorporamento (i loro glifi sono CharProc inline) ma partecipano comunque al controllo/ToUnicode. - Gli helper di PDFlibPDFA per un lavoro simile sui font non sono stati intenzionalmente condivisi — una mezza dozzina di brevi routine (rimozione del prefisso di subset, tabella nomi Standard-14, presenza di FontFile, flag Symbolic) sono duplicate localmente come helper
UA*, in modo che l'audit PDF/A possa continuare a evolversi senza rompere PDF/UA, e viceversa.
v3.56.2 2026-05-23
- L'audit PDF/UA-1 guadagna altri cinque controlli ISO 14289-1 che coprono annotazioni, file incorporati e contenuto opzionale.
10015segnala le annotazioni Link che mancano di una descrizione alternativa/Contentsnon vuota (§7.18.5) in modo che gli screen reader possano annunciare i target dei collegamenti.10016e10017segnalano i dizionari FileSpec di file incorporati che mancano delle chiavi nome file/Fo/UFrichieste (§7.11).10018segnala i dizionari di configurazione di contenuto opzionale che omettono una stringa di testo/Namenon vuota (§7.10).10019segnala i dizionari di configurazione di contenuto opzionale che contengono la chiave vietata/AS(§7.10). - L'attraversamento delle annotazioni per pagina che già alimentava i controlli TrapNet e
/Tabs /Sora raccoglie anche i dati Link //Contentsnello stesso passaggio, mantenendo l'audit O(N) sul conteggio degli oggetti.
v3.56.1 2026-05-23
- L'audit PDF/UA-1 guadagna cinque nuovi controlli ISO 14289-1.
10010verifica il permesso di estrazione per l'accessibilità (bit 10 della chiave di cifratura/P) sui file cifrati (§7.16).10011rileva i moduli XFA dinamici tramite l'elemento<dynamicRender>required</dynamicRender>all'interno del pacchetto XFA XDP (§7.15).10012segnala i Form XObject che portano una voce/Ref— gli XObject di riferimento sono vietati (§7.20).10013segnala le annotazioniTrapNet(§7.18.2).10014percorre ogni pagina e segnala qualsiasi pagina che porta annotazioni il cui dizionario di pagina non imposta/Tabs /S(§7.18.3) in modo che l'ordine di tabulazione segua l'albero di struttura. - Tutti e cinque i nuovi codici fluiscono attraverso la stessa coppia di handle CheckFileCompliance + GetStringListItem aggiunta dalla release precedente — non c'è nuova superficie API pubblica.
v3.56.0 2026-05-23
- Il nuovo audit lato reader
CheckCompliancePDFUAconvalida un PDF esterno rispetto a ISO 14289-1 (PDF/UA-1). Completa il controllo lato writer esistente GetPDFUADiagnostics accettando qualsiasi PDF di input (output proprio, output di scanner, contenuto di terze parti) ed elencando le violazioni PDF/UA-1 nello stesso modo in cui CheckFileCompliance riporta già i problemi PDF/A. - CheckFileCompliance ora accetta
ComplianceTest = 2per eseguire il nuovo audit PDF/UA-1. Il test PDF/A sottoComplianceTest = 1è invariato, e l'elenco dei problemi continua a fluire attraverso la coppia di handle esistente GetStringListCount / GetStringListItem. - Il primo taglio copre i gate fondamentali di conformità PDF/UA-1 di §5 (identificazione XMP
pdfuaid:part) e §7.1 (flusso/Metadatadel Catalog, marcatore tagged-PDF, albero di struttura, preferenza titolo del viewer, lingua del documento,dc:titleXMP, valore/Suspectse divieto di rimappare tag di struttura standard). Vengono emessi otto codici diagnostici — da10001a10009— mantenendo l'intervallo numerico visivamente separato dai codici00xxxdi PDF/A. - Clausole PDF/UA-1 più profonde (sicurezza, annotazioni, XObject, sottoinsiemizzazione di font) sono tracciate per release patch successive sopra lo stesso framework di audit.
v3.55.6 2026-05-22
- Ogni pacchetto XMP appena generato porta ora una proprietà xmpMM:InstanceID nel formato uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. L'identificatore viene generato tramite Win32 CoCreateGuid e dà a ogni documento prodotto un fingerprint univoco e indipendente dalla versione come raccomandato da ISO 19005-1 §6.7.2 (Cor2) e dalle guide alle best practice PDF/A. Le build non Windows (dove il pacchetto XMP rimane vuoto) non sono interessate.
- Il namespace xmpMM (http://ns.adobe.com/xap/1.0/mm/) fa ora parte dei SelectionNamespaces del pacchetto XMP; nuovi helper SetXMPMM e GenerateInstanceID sostengono l'emissione di InstanceID e forniscono la base per il futuro supporto di xmpMM:History / xmpMM:DerivedFrom.
- Lo schema di descrizione dello schema di estensione PDF/A (pdfaExtension / pdfaSchema / pdfaProperty / pdfaType / pdfaField) non è aggiunto in questa release. Creare uno schema di estensione personalizzato richiede una costruzione bag / seq / proprietà strutturata multi-passo oltre l'attuale forma SetDublinCore / SetXMPBasic; il lavoro è tracciato per una release futura. I documenti che hanno bisogno di dichiarare proprietà XMP personalizzate continuano a ricadere sul percorso LoadFromString.
v3.55.5 2026-05-22
- I documenti PDF/A hanno ora i flag /F delle annotazioni normalizzati al momento del salvataggio. ISO 19005-1 §6.5.3 richiede che il bit Print sia 1 e i bit Hidden / Invisible / NoView siano 0 su ogni annotazione; il writer ora applica quella maschera al momento del salvataggio in modo che i chiamanti non debbano ricordare il layout dei bit. Il caso /Subtype /Popup è esente — i popup sono figli di altre annotazioni e tradizionalmente non vengono stampati.
- Il flag AcroForm /NeedAppearances viene ora forzato a false al momento del salvataggio quando il documento è in qualsiasi modalità PDF/A. ISO 19005-1 §6.9 richiede che il flag sia assente o false; in precedenza il writer lasciava qualsiasi valore il chiamante avesse impostato, producendo documenti che chiedevano al viewer di rigenerare le appearance al momento dell'apertura e violando silenziosamente la specifica quando il chiamante lo aveva impostato su true. La correzione si applica anche ai documenti che in precedenza avevano il flag assente — il writer emette un
/NeedAppearances falseesplicito per non lasciare ambiguità al validatore.
v3.55.4 2026-05-22
- AddStandardFont rifiuta ora le chiamate in modalità PDF/A. ISO 19005-1 §6.3.4 revoca l'esenzione del riferimento PDF "Standard 14 può essere non incorporato": ogni programma di font in un file conforme deve essere incorporato, e la libreria non include gli outline Standard 14. La facciata restituisce 0 silenziosamente; i chiamanti dovrebbero passare a AddTrueTypeFont o AddType1Font con un file di font reale.
- AddTrueTypeFont promuove ora silenziosamente Embed=0 (nessun incorporamento) a Embed=1 (incorpora font completo) quando la modalità PDF/A è attiva. Il percorso di riferimento non incorporato produceva PDF che dipendevano dal fallback dei font del viewer a un'installazione di sistema Arial / Times / Courier, cosa che viola ISO 19005-1 §6.3.4. I chiamanti esistenti che hanno chiesto l'incorporamento (Embed=1 o 2) non sono interessati.
- Il controllo di conformità /Encoding TrueType non simbolico (ISO 19005-1 §6.3.7 Cor2 richiede WinAnsi o MacRoman come nome di codifica o BaseEncoding, senza /Differences) non viene aggiunto in questa release perché la libreria emette già /WinAnsiEncoding per i subset TrueType non simbolici, e l'applicazione più profonda richiederebbe il tracciamento del dispatch simbolico-vs-non simbolico attraverso il percorso del subset. CheckCompliancePDFA 00034 / 00035 (aggiunti in v3.51.0) segnalano qualsiasi output non conforme al momento della convalida.
v3.55.3 2026-05-22
- I dizionari di font CIDFontType2 supportati da TrueType portano ora /CIDToGIDMap /Identity in modo esplicito. ISO 19005-1 §6.3.3.2 (Cor2) richiede che la voce sia presente per ogni CIDFont Type 2 incorporato; il riferimento PDF consente il default Identity implicito, ma PDF/A esige un valore esplicito. Il writer in precedenza ometteva del tutto la chiave, causando la segnalazione del file da parte di veraPDF (e di CheckCompliancePDFA 00033 aggiunto in v3.51.0). Il nome /Identity corrisponde al layout GID-come-CID che il writer stava già producendo implicitamente, quindi i documenti esistenti vengono renderizzati in modo identico.
- /CharSet del FontDescriptor (per i subset Type 1) e /CIDSet (per i subset CIDFont) restano TODO; il writer dovrebbe tracciare quali nomi di glifo / CID sono finiti nel subset per popolarli con precisione. CheckCompliancePDFA 00031 e 00032 (anche aggiunti in v3.51.0) segnaleranno l'assenza in modo che gli utenti vedano il problema al momento della convalida.
v3.55.2 2026-05-22
- AddImageDirectFromString rifiuta ora i filtri incompatibili con PDF/A al punto di ingresso. Passare Filter = 'LZWDecode' viene rifiutato per ogni parte di PDF/A (ISO 19005-1 §6.1.10 più le regole equivalenti di ISO 19005-2 / -3). Passare Filter = 'JBIG2Decode' o 'JPXDecode' viene rifiutato per PDF/A-1 (modalità 1 e 2). PDF/A-2 e PDF/A-3 ammettono JPXDecode sotto ISO 19005-2 §6.2.8.3 con vincoli di sotto-specifica (conteggio dei canali di colore, uniformità di profondità bit, requisiti METH/APPROX) che il gate lato writer non applica — i chiamanti in quelle modalità devono comunque assicurarsi che il flusso JPEG 2000 sia conforme. La facciata restituisce 0 silenziosamente quando viene richiesto un filtro vietato.
- Gli input TIFF, PNG, JPEG e JPEG 2000 caricati tramite AddImageFromFile / AddImageFromStream non sono interessati: l'importer decomprime i byte sorgente e ricodifica con FlateDecode (o DCTDecode per i payload JPEG), quindi l'input LZW non si propaga mai alla catena Filter di output. Il validatore CheckCompliancePDFA aggiunto in v3.50.0 (00004) e v3.52.0 (00022, 00023) fornisce una seconda linea di difesa al momento della convalida per qualsiasi percorso indiretto che faccia ancora passare un filtro vietato nell'output.
v3.55.1 2026-05-22
- AddLinkToHideField rifiuta ora le chiamate in modalità PDF/A. La release precedente lasciava un commento che affermava che l'azione era compatibile con PDF/A, ma ISO 19005-1 Cor2 ha aggiunto /Hide all'elenco delle azioni vietate (§6.6.1), e ISO 19005-2 / -3 ereditano la restrizione. La facciata restituisce 0 silenziosamente quando chiamata in modalità PDF/A, corrispondente a AddLinkToJavaScript e AddLinkToImportData.
- AddSWFAnnotationFromFile rifiuta ora le chiamate in modalità PDF/A. Le annotazioni SWF / RichMedia avvolgono media Flash vietati da ISO 19005-1 §6.5.2 (nessun sotto-tipo Movie / Sound) e rafforzati da ISO 19005-2 §6.3.1 (nessun 3D / Sound / Screen / Movie). La facciata restituisce 0 silenziosamente.
- AddEmbeddedFile e AddLinkToEmbeddedFile rifiutano ora le chiamate in modalità PDF/A-1 e PDF/A-2. ISO 19005-1 §6.1.11 vieta /EF, e ISO 19005-2 §6.8 ammette solo file PDF/A incorporati; piuttosto che verificare la PDF/A-ità ricorsiva del payload allegato, il writer rifiuta semplicemente la chiamata in queste modalità. PDF/A-3 (SetPDFAMode 5 o 6) rimane consentito — vedere v3.55.0 per l'iniezione automatica /AFRelationship.
- SetOpenActionMenu rifiuta ora i valori MenuItem fuori dalla whitelist {NextPage, PrevPage, FirstPage, LastPage} quando il documento è in modalità PDF/A. ISO 19005-1 §6.6.1 limita le azioni nominate a quel set, quindi in precedenza l'API produceva silenziosamente dizionari Open-Action Find / Print / FullScreen non conformi che veraPDF avrebbe rifiutato.
- NewOptionalContentGroup rifiuta ora le chiamate in modalità PDF/A-1 (SetPDFAMode 1 o 2). ISO 19005-1 §6.1.13 vieta la chiave /OCProperties del Catalog. PDF/A-2 (modalità 3/4) e PDF/A-3 (modalità 5/6) ammettono il contenuto opzionale con i vincoli nelle rispettive §6.9, quindi il gate si attiva solo per PDF/A-1.
v3.55.0 2026-05-22
- I documenti PDF/A-3 ricevono ora automaticamente una voce /AFRelationship su ogni file incorporato. In precedenza un file PDF/A-3 creato con la libreria poteva fallire la convalida perché ISO 19005-3 Allegato E, Tabella E.1 richiede AFRelationship su ogni specifica di file incorporato. Il writer ora inietta il valore predefinito configurato ('Unspecified' di fabbrica) su qualsiasi dizionario FileSpec che manca della voce al momento del salvataggio, rispecchiando l'iniezione automatica AFRelationship PDF/UA introdotta in precedenza. Solo le modalità PDF/A-3 (SetPDFAMode 5 = PDF/A-3b o 6 = PDF/A-3a) attivano l'iniezione automatica; PDF/A-1 e PDF/A-2 continuano a rifiutare del tutto i file incorporati secondo ISO 19005-1 §6.1.11 e ISO 19005-2 §6.8.
- SetPDFA3DefaultAFRelationship è una nuova API che sovrascrive il valore predefinito scritto dal writer quando un file incorporato manca di una voce /AFRelationship. Accetta i valori di ISO 19005-3 Tabella E.1 'Source' (il file incorporato è il materiale sorgente che ha prodotto il contenuto PDF), 'Data' (il file è il dato strutturato che sostiene una tabella o un grafico visuale), 'Alternative' (una resa alternativa come una versione audio), 'Supplement' (una rappresentazione supplementare come una forma MathML di un'equazione), 'Unspecified' (la relazione non può essere caratterizzata dai precedenti) o qualsiasi nome di seconda classe registrato. Una stringa vuota reimposta a 'Unspecified'. Le sovrascritture per file restano disponibili tramite SetEmbeddedFileAFRelationship.
- Le nuove API sono esposte sulla facciata Delphi come TPDFlib.SetPDFA3DefaultAFRelationship e tramite la DLL come DLSetPDFA3DefaultAFRelationship (PWideChar) e DLSetPDFA3DefaultAFRelationshipA (PAnsiChar).
v3.54.0 2026-05-22
- LoadOutputIntentProfile è una nuova API che sostituisce il profilo OutputIntent sRGB in bundle con un profilo ICC esterno caricato da disco. Necessaria quando si producono documenti PDF/A in spazi colore DeviceCMYK o DeviceGray, poiché la libreria fornisce solo un profilo sRGB. L'uso tipico è chiamare prima SetPDFAMode (che inizializza lo scheletro OutputIntent), poi LoadOutputIntentProfile('C:\\path\\to\\FOGRA39.icc', 'DeviceCMYK') per scambiare i byte del profilo e taggare il documento con il nuovo spazio colore. Restituisce 1 in caso di successo, 0 in caso di file-non-trovato o spazio colore sconosciuto. Esposta sulla facciata Delphi come TPDFlib.LoadOutputIntentProfile e tramite la DLL come DLLoadOutputIntentProfile (forma PWideChar) e DLLoadOutputIntentProfileA (forma PAnsiChar). ISO 19005-1 §6.2.2 consente qualsiasi profilo ICC registrato nel flusso DestOutputProfile.
- SetFillColorCMYK, SetTextColorCMYK, SetTextHighlightColorCMYK, SetTextUnderlineColorCMYK, AddSeparationColor, SetFillColorSep, SetLineColorSep, SetTextHighlightColorSep e SetTextColorSep ora hanno successo in modalità PDF/A quando il profilo OutputIntent del documento è DeviceCMYK. In precedenza queste API rifiutavano ogni chiamata in modalità PDF/A indipendentemente dall'OutputIntent, cosa che impediva la produzione di documenti CMYK conformi. Il gate è ora PDFAMode = 0 OR OutputIntentColorSpace = 'DeviceCMYK', corrispondente alla regola di ISO 19005-1 §6.2.3.3 secondo cui DeviceCMYK è permesso quando l'OutputIntent usa un profilo CMYK, e a ISO 19005-1 §6.2.3.4 che consente le alternative Separation il cui spazio colore di base è anch'esso conforme.
- SetTextShader ora ha successo in modalità PDF/A quando il profilo OutputIntent è DeviceRGB o DeviceCMYK. Gli shader in sé non sono vietati da PDF/A; il validatore (lato lettore) verifica che lo spazio colore interno dello shader corrisponda all'OutputIntent. Il precedente comportamento di rifiuto stretto negava l'uso conforme degli shader.
- Lo sblocco CMYK / Separation / Shader dipende dal tag OutputIntentColorSpace impostato da AddOutputIntent e LoadOutputIntentProfile (introdotti in v3.53.0). Chiamare SetPDFAMode senza LoadOutputIntentProfile mantiene lo spazio colore come DeviceRGB (il profilo sRGB in bundle), quindi le chiamate CMYK continuano a rifiutare di default — il nuovo comportamento è opt-in tramite LoadOutputIntentProfile.
v3.53.0 2026-05-22
- Il dizionario OutputIntent porta ora i campi completi dello scheletro PDF/A raccomandati da ISO 19005-1 §6.2.2 e dal preflight di Adobe Acrobat: /OutputCondition (descrizione leggibile dall'uomo della condizione di colore), /Info (testo di identificazione in forma lunga) e /RegistryName (URL del registro, predefinito a http://www.color.org). I valori predefiniti sono "sRGB IEC61966-2.1" / "sRGB IEC61966-2.1" / "http://www.color.org" per i siti di chiamata legacy a un solo argomento; il nuovo overload di AddOutputIntent prende direttamente i quattro campi personalizzati in modo che i chiamanti possano popolarli per le proprie condizioni di colore.
- AddOutputIntent guadagna un nuovo overload a cinque argomenti: AddOutputIntent(ColorSpace, OutputConditionIdentifier, OutputCondition, Info, RegistryName). La forma legacy a un argomento continua a funzionare invariata; ora delega al nuovo overload con i predefiniti sRGB. L'argomento ColorSpace seleziona anche il conteggio dei componenti /N scritto nel dizionario di profilo ICC incorporato (3 per DeviceRGB, 4 per DeviceCMYK, 1 per DeviceGray); il profilo incorporato stesso rimane il flusso sRGB in bundle finché non arriva la prossima API LoadOutputIntentProfile in v3.54.0.
- TPDFDocument espone OutputIntentColorSpace come proprietà di lettura/scrittura che traccia lo spazio colore dell'ultima chiamata AddOutputIntent. Ciò diventa la condizione di gate per le restrizioni lato writer CMYK / Separation / Shader in v3.54.0, dove le API colore che oggi rifiutano ogni chiamata in modalità PDF/A rifiuteranno solo quando lo spazio colore non corrisponde all'OutputIntent.
v3.52.0 2026-05-22
- CheckCompliancePDFA ora controlla annotazioni, graphics-state, azioni e form XObject, completando la copertura del validatore PDF/A lato lettore dei capitoli 6.2-6.6 di ISO 19005-1 e delle regole differenziali equivalenti di PDF/A-2/-3. Il validatore segnala 14 nuove classi di problemi (00050-00067): sottotipi di annotazione vietati (00050; ISO 19005-1 §6.5.2 vieta FileAttachment / Sound / Movie per PDF/A-1, e ISO 19005-2 §6.3.1 vieta 3D / Sound / Screen / Movie per PDF/A-2 e PDF/A-3), /CA di annotazione diverso da 1.0 (00051; §6.5.3), /F di annotazione mancante o con Print=0 / Hidden=1 / Invisible=1 / NoView=1 (00052; §6.5.3, con /Subtype /Popup esente), /AA di annotazione (00054; §6.6.2), dizionario appearance di annotazione con chiavi diverse da /N o valore /N non conforme (00055; §6.5.3 Cor2), annotazione Widget con /A (00056; §6.9), ExtGState /TR (00058; §6.2.8), ExtGState /TR2 diverso da /Default (00059; §6.2.8), e solo in PDF/A-1: ExtGState /SMask diverso da /None (00061; §6.4), /BM diverso da Normal o Compatible (00062; §6.4), /CA o /ca diversi da 1.0 (00063; §6.4).
- L'audit di azioni-ovunque (00064, 00065) sostituisce il controllo solo-OpenAction di v3.50.0 con uno sweep completo che segnala i valori /S di azione vietati (Launch, Sound, Movie, ResetForm, ImportData, JavaScript, Hide, SetState, NOP, Trans, GoTo3DView, Rendition, SetOCGState) e le azioni nominate il cui /N è fuori da {NextPage, PrevPage, FirstPage, LastPage} indipendentemente da dove vive l'azione (annotazione /A, widget /A, outline /A, /OpenAction del catalogo, ecc.). ISO 19005-1 §6.6.1.
- L'audit di XObject (00066, 00067) segnala PostScript e Reference XObject, più chiavi vietate sui Form XObject (/OPI, /PS, /Subtype2 = /PS) e Image XObject (/Alternates, /OPI, /Interpolate true). ISO 19005-1 §6.2.4 - §6.2.7.
v3.51.0 2026-05-22
- CheckCompliancePDFA ora controlla la conformità dei font e dello spazio colore oltre ai controlli strutturali aggiunti in v3.50.0. Il validatore segnala nove nuove classi di problemi: almeno un programma di font non incorporato (00030; ISO 19005-1 §6.3.4 richiede che ogni programma di font, incluse le sostituzioni Standard 14, sia incorporato), subset Type 1 senza /CharSet nel proprio FontDescriptor (00031; §6.3.5), subset CIDFont senza /CIDSet (00032; §6.3.5), CIDFontType2 senza /CIDToGIDMap (00033; §6.3.3.2 Cor2), TrueType non simbolico con un /Encoding non conforme (00034; §6.3.7 Cor2 richiede WinAnsi/MacRoman direttamente o come BaseEncoding, senza /Differences), TrueType simbolico che porta ancora /Encoding (00035; §6.3.7 Cor2), almeno un font senza /ToUnicode nei documenti PDF/A-Na o PDF/A-Nu (00036; §6.3.8 esenzione a quattro classi applicata), spazio colore ICCBased che non incorpora il proprio flusso di profilo (00037; §6.2.3.2) e un file che usa sia DeviceRGB sia DeviceCMYK (00038; §6.2.3.3 vieta la mescolanza).
- Il controllo /ToUnicode (00036) è limitato ai livelli di conformità A e U perché solo questi livelli richiedono la mappatura Unicode secondo ISO 19005-1 §6.3.8 e ISO 19005-2 §6.2.11.7. I file di livello B (PDF/A-1b, PDF/A-2b, PDF/A-3b) non vengono segnalati. L'esenzione a quattro classi riconosce le codifiche predefinite (MacRomanEncoding, MacExpertEncoding, WinAnsiEncoding), Standard 14 Type 1 BaseFonts come proxy per font con nomi di glifo Adobe Standard Latin / Symbol, e font Type 0 il cui CIDFont discendente usa registri Adobe-GB1, Adobe-CNS1, Adobe-Japan1 o Adobe-Korea1.
- L'audit dei font percorre ogni dizionario Font, lo classifica per Subtype (Type1, MMType1, TrueType, Type3, Type0 con il proprio CIDFontType0 o CIDFontType2 discendente), poi smista i controlli rilevanti. I font compositi Type 0 delegano i controlli di incorporamento e di subset al proprio CIDFont discendente mantenendo /ToUnicode sull'involucro Type 0. Il rilevamento del subset usa la convenzione standard del prefisso a sei lettere maiuscole.
v3.50.0 2026-05-22
- CheckCompliancePDFA segnala ora 15 ulteriori problemi di non conformità PDF/A che il validatore precedentemente mancava: array /ID del trailer mancante (00013), flusso /Metadata del Document Catalog mancante (00014), /Filter applicato al flusso /Metadata (00015), dizionari di flusso che fanno riferimento a file esterni tramite /F, /FFilter o /FDecodeParms (00016), file incorporati dichiarati tramite /EF in qualsiasi dizionario di specifica di file o tramite la voce /EmbeddedFiles dell'albero Name nei documenti PDF/A-1 (00017, 00018), /OpenAction che punta a un tipo di azione vietato (00019), dizionari di azioni aggiuntive /AA nel Document Catalog o in qualsiasi Page (00020, 00021), filtri JBIG2Decode o JPXDecode nei documenti PDF/A-1 (00022, 00023), filtri Crypt il cui /Name non è /Identity (00024), /Requirements nel Document Catalog (00025), /Perms con chiavi diverse da /UR3 e /DocMDP (00026), e /AcroForm /NeedAppearances impostato su true (00027). Il validatore segnala ora i tipi di azione /OpenAction del Catalog vietati (/Launch, /Sound, /Movie, /ResetForm, /ImportData, /JavaScript, /Hide, /SetState, /NOP, /Trans, /GoTo3DView, /Rendition, /SetOCGState) e i valori /N di azione nominata fuori dalla allowlist {NextPage, PrevPage, FirstPage, LastPage} secondo ISO 19005-1 §6.6.1.
- Il parser PDFAID accetta il suffisso di conformità U (PDF/A-2U, PDF/A-3U) accanto alle varianti A e B esistenti, quindi CheckCompliancePDFA non solleva più un avviso spurio "00005 PDFA Mark NOT Found or invalid" durante la scansione di un file PDF/A-2U o PDF/A-3U prodotto da un altro strumento. I livelli di conformità di mappatura Unicode aggiunti in ISO 19005-2:2011 sono ora riconosciuti dal validatore.
- I controlli specifici per filtro (JBIG2Decode, JPXDecode) e i controlli di file incorporati (/EF, /EmbeddedFiles) restano limitati a PDF/A-1 perché ISO 19005-2 §6.2.8.3 e §6.8 rilassano esplicitamente quelle restrizioni per PDF/A-2 e PDF/A-3. I controlli di struttura del documento (/Metadata, /AcroForm /NeedAppearances, /OpenAction, /AA, /Requirements, /Perms) si applicano a ogni parte di PDF/A.
v3.49.0 2026-05-21
- AddLinkToImportData crea un'annotazione Link la cui azione è un'azione PDF di import-data (/S /ImportData) che popola i campi AcroForm del documento da un file FDF esterno quando l'utente fa clic sul collegamento (ISO 32000-1 §12.6.4.8, Tabella 198). Il parametro FileName viene referenziato come dizionario filespec, con le stesse regole di normalizzazione del percorso utilizzate da AddLinkToFile / AddLinkToFileEx (i backslash vengono convertiti in slash secondo ISO 32000-1 §7.11.2.1). Il bit 0 di Options attiva il bordo visibile e i bit 1–3 selezionano la modalità di evidenziazione del collegamento (Invert, Outline, Push), conformemente alle convenzioni AddLinkTo* esistenti. PDF 1.4 o successivo. NON consentito in PDF/A perché l'azione fa riferimento a una risorsa esterna; la facciata restituisce silenziosamente 0 quando viene chiamata in modalità PDF/A. Esposta nella libreria Delphi e nell'interfaccia DLL come DLAddLinkToImportData / DLAddLinkToImportDataA (forma PWideChar e PAnsiChar).
v3.48.0 2026-05-21
- AddLinkToHideField crea un'annotazione Link la cui azione è un'azione PDF di hide (/S /Hide) che attiva/disattiva la visibilità di uno o più campi AcroForm quando l'utente fa clic sul collegamento (ISO 32000-1 §12.6.4.10, Tabella 196). FieldNames accetta uno o più nomi di campo completamente qualificati separati da virgole, punti e virgola o interruzioni di riga; un singolo nome viene emesso come stringa di testo in /T e due o più nomi vengono emessi come array, entrambe le forme sono ammesse dalla specifica. HideFlag seleziona la direzione di visibilità: un valore diverso da zero nasconde i campi elencati (/H true) e zero li mostra (/H false). Il bit 0 di Options attiva il bordo visibile e i bit 1–3 selezionano la modalità di evidenziazione del collegamento (Invert, Outline, Push), conformemente a AddLinkToWeb / AddLinkToNamedAction. PDF 1.2 o successivo. Compatibile con PDF/A perché nessuna risorsa esterna viene referenziata. Esposta nella libreria Delphi e nell'interfaccia DLL come DLAddLinkToHideField / DLAddLinkToHideFieldA (forma PWideChar e PAnsiChar).
v3.47.0 2026-05-21
- AddLinkToNamedAction crea un'annotazione Link la cui azione è un'azione PDF named (/S /Named) che attiva uno dei quattro comandi di navigazione del viewer standardizzati definiti in ISO 32000-1 §12.6.4.11, Tabella 194: NextPage, PrevPage, FirstPage e LastPage. Il parametro NamedActionType seleziona il comando (0=NextPage, 1=PrevPage, 2=FirstPage, 3=LastPage); i valori fuori da questo intervallo ricadono su NextPage in modo che il writer emetta sempre un nome /N conforme alla specifica. Il bit 0 di Options attiva il bordo visibile e i bit 1–3 selezionano la modalità di evidenziazione del collegamento (Invert, Outline, Push), conformemente alle convenzioni AddLinkToWeb / AddLinkToPage esistenti. L'annotazione richiede PDF 1.1 o successivo ed è compatibile con PDF/A perché nessuna risorsa esterna viene referenziata. Disponibile nella libreria Delphi e nelle interfacce DLL.
v3.46.1 2026-05-21
- AddCaretAnnotation crea un'annotazione di markup caret (PDF /Subtype /Caret) nel rettangolo specificato, contrassegnando una posizione sulla pagina in cui è stato inserito, omesso del testo o del contenuto, o che richiede comunque attenzione da parte del revisore. Supporta due tipi di simbolo (None e Paragraph) tramite SymbolType (0 / 1), colore, opacità, titolo, contenuto e timestamp di creazione/modifica configurabili. Definita in ISO 32000-1 §12.5.6.11. PDF 1.5 o successivo. Disponibile nella libreria Delphi e nelle interfacce DLL.
- Questa voce completa il backfill delle annotazioni geometriche iniziato con v3.44.0 Square+Circle. PDFlibPas ora crea annotazioni Text, Stamp, FreeText, TextMarkup (Highlight/Underline/Squiggly/StrikeOut), Square, Circle, Line, Polygon, PolyLine, Ink e Caret, oltre al supporto esistente per Link, FileAttachment, SVG, U3D e SWF.
v3.46.0 2026-05-21
- AddInkAnnotation crea un'annotazione di markup ink (PDF /Subtype /Ink) che rappresenta tratti scritti a mano o segni a forma libera disegnati sulla pagina. I tratti vengono forniti come una singola stringa in cui più tratti sono separati da '|' o newline, e all'interno di ciascun tratto le coppie di coordinate seguono lo stesso formato spazio/virgola/punto e virgola/tab utilizzato da AddPolygonAnnotation. Ad esempio "100 100 110 105 120 110 | 200 200 210 205" descrive due tratti separati. Supporta larghezza del bordo, colore dell'inchiostro, opacità, titolo, contenuto e timestamp configurabili. Definita in ISO 32000-1 §12.5.6.13. PDF 1.3 o successivo. Disponibile nella libreria Delphi e nelle interfacce DLL.
- Ogni tratto deve contenere un numero pari di valori (almeno quattro), altrimenti la chiamata restituisce 0 e non viene scritta alcuna annotazione. Il /Rect viene calcolato automaticamente dall'estensione combinata di tutti i tratti più un piccolo padding in modo che i tratti restino all'interno del riquadro di delimitazione dell'annotazione.
v3.45.0 2026-05-21
- AddPolygonAnnotation crea un'annotazione di markup poligono chiuso (PDF /Subtype /Polygon) con vertici forniti come una stringa di coppie di coordinate separate da spazi, virgole, punti e virgola o tabulazioni (ad es. "100 100 200 100 200 200 100 200"). Supporta larghezza del bordo, colore del bordo, colore di riempimento interno opzionale, opacità, titolo, contenuto e timestamp configurabili. Definita in ISO 32000-1 §12.5.6.9. PDF 1.5 o successivo. Disponibile nella libreria Delphi e nelle interfacce DLL.
- AddPolyLineAnnotation crea un'annotazione di markup polilinea aperta (PDF /Subtype /PolyLine) con lo stesso formato di stringa di vertici e stili di terminazione configurabili a ciascuna estremità (None, Square, Circle, Diamond, OpenArrow, ClosedArrow, Butt, ROpenArrow, RClosedArrow, Slash). Definita in ISO 32000-1 §12.5.6.9. PDF 1.5 o successivo. Disponibile nella libreria Delphi e nelle interfacce DLL.
- Entrambe le annotazioni richiedono almeno due punti vertice (quattro numeri) e un conteggio totale pari di numeri; la chiamata restituisce 0 se la stringa dei vertici non riesce a essere analizzata in un elenco di coppie valido. Il /Rect viene calcolato dall'estensione dei vertici più un padding proporzionale alla larghezza del bordo, in modo che le decorazioni terminali rimangano visibili.
- Entrambe le annotazioni elevano la versione del documento a PDF 1.5 quando vengono emesse sotto un blocco di versione minima inferiore.
v3.44.1 2026-05-21
- AddLineAnnotation crea un'annotazione di markup linea (PDF /Subtype /Line) tra due punti finali, con larghezza del bordo, colore della linea, colore di riempimento interno opzionale, stili di terminazione per entrambe le estremità (None, Square, Circle, Diamond, OpenArrow, ClosedArrow, Butt, ROpenArrow, RClosedArrow, Slash), opacità, titolo, contenuto e timestamp di creazione/modifica configurabili. Definita in ISO 32000-1 §12.5.6.7. PDF 1.3 o successivo. Disponibile nella libreria Delphi e nelle interfacce DLL.
- Il /Rect dell'annotazione viene calcolato dai due punti finali più un padding proporzionale alla larghezza del bordo, in modo che le decorazioni terminali rimangano all'interno del riquadro di delimitazione dell'annotazione.
v3.44.0 2026-05-21
- AddSquareAnnotation crea un'annotazione di markup rettangolo (PDF /Subtype /Square) nel rettangolo specificato, con larghezza del bordo, colore del bordo, colore di riempimento interno opzionale, opacità, titolo, contenuto e timestamp di creazione/modifica configurabili. Definita in ISO 32000-1 §12.5.6.8. PDF 1.3 o successivo. Disponibile nella libreria Delphi e nelle interfacce DLL.
- AddCircleAnnotation crea un'annotazione di markup ellisse (PDF /Subtype /Circle) inscritta nel rettangolo specificato, con gli stessi bordo, riempimento, opacità, titolo, contenuto e timestamp configurabili di AddSquareAnnotation. Definita in ISO 32000-1 §12.5.6.8. PDF 1.3 o successivo. Disponibile nella libreria Delphi e nelle interfacce DLL.
- Entrambe le nuove annotazioni elevano automaticamente la versione del documento a PDF 1.3 quando vengono emesse sotto un blocco di versione minima inferiore ed emettono un insieme di campi di annotazione di markup standard (/Type /Subtype /Rect /C /IC /BS /Border /CA /F /M /CreationDate /NM /T /Contents /Subj /P), in modo che i flussi di lavoro di revisione esistenti in Acrobat, Foxit ed Edge possano modificarle dopo la creazione.
v3.43.0 2026-05-20
- SetStructElemSpaceBefore e SetStructElemSpaceAfter impostano gli attributi /SpaceBefore e /SpaceAfter (owner Layout) sull'elemento di struttura attualmente aperto, esprimendo la spaziatura prima e dopo gli elementi a livello di blocco in punti. Definite in ISO 32000-1 §14.8.5.4.2 Tabella 340. Disponibili nella libreria Delphi, ActiveX (Dispid 73008051/73008052) e nelle interfacce DLL.
- SetStructElemStartIndent e SetStructElemEndIndent impostano gli attributi /StartIndent e /EndIndent (owner Layout), esprimendo il rientro dai bordi iniziale e finale, consapevoli della modalità di scrittura, del rettangolo del contenuto in punti. Definite in ISO 32000-1 §14.8.5.4.2 Tabella 340. Disponibili nella libreria Delphi, ActiveX (Dispid 73008053/73008054) e nelle interfacce DLL.
- SetStructElemColor imposta l'attributo /Color (owner Layout) come tripletta RGB (ciascun componente 0.0-1.0), descrivendo il colore in primo piano dell'elemento per i motori di re-flow e i controllori di contrasto dei colori a valle. Definita in ISO 32000-1 §14.8.5.4.2 Tabella 340. Disponibile nella libreria Delphi, ActiveX (Dispid 73008055) e nelle interfacce DLL.
- Corretto un bug di serializzazione in BuildStructElemDictRef: i valori di attributo numerici a singolo token (come SpaceBefore, SpaceAfter, StartIndent, EndIndent) venivano scritti come nomi PDF invece che come numeri PDF. La correzione si applica sia ai rami di attributi a singolo owner che a quelli multi-owner.
v3.42.0 2026-05-20
- CheckCompliancePDFA ora convalida correttamente tutti e sei i modi PDF/A (1a, 1b, 2a, 2b, 3a, 3b). Il controllo PDFAID (codice 00005) accetta uno qualsiasi dei sei marcatori XMP validi invece del solo '1B'. Il controllo del limite di versione (00002) applica 1.4 per PDF/A-1 e 1.7 per PDF/A-2 e PDF/A-3.
- Il controllo OCProperties (codice 00003) ora è condizionale: si applica solo ai documenti PDF/A-1, dove il contenuto opzionale (livelli) è vietato. PDF/A-2 e PDF/A-3 permettono i livelli e non vengono più segnalati.
- Aggiunti tre nuovi controlli di conformità: il codice 00006 segnala i documenti cifrati (la cifratura è vietata in tutte le versioni PDF/A); il codice 00007 segnala i documenti che non hanno una voce OutputIntents nel catalogo (richiesta da tutte le versioni PDF/A); i codici 00011 e 00012 segnalano i documenti privi di MarkInfo o StructTreeRoot quando il livello di conformità è -a (accessibilità).
v3.41.0 2026-05-20
- La modalità PDF/A ora impone le operazioni vietate a livello di API. Quando una modalità PDF/A è attiva (una qualsiasi delle modalità 1-6), chiamare SetEncryption, AddSeparationColor, SetFillColorCMYK, SetTextColorCMYK o qualsiasi altra API CMYK/Separation/Shader restituisce 0 e non ha effetto, coerentemente con il requisito di PDF/A di un singolo output intent sRGB.
- La trasparenza è vietata in PDF/A-1 (modalità 1 e 2): SetTransparency, SetBlendMode e SetPageTransparencyGroup restituiscono 0 e sono no-op quando la modalità attiva è 1 o 2. PDF/A-2 e PDF/A-3 (modalità 3-6) permettono una trasparenza limitata e non sono ristretti.
- Le azioni JavaScript sono vietate in tutte le modalità PDF/A (1-6): SetOpenActionJavaScript, PageJavaScriptAction, DocJavaScriptAction, AddGlobalJavaScript e AddLinkToJavaScript restituiscono tutti 0 e sono no-op quando una qualsiasi modalità PDF/A è attiva. ISO 19005-1 §6.6.1 vieta esplicitamente JavaScript dai documenti PDF/A.
- Le API di allegato file (EmbedFile, AddFileAttachment) sono bloccate nelle modalità PDF/A-1 e PDF/A-2 (1-4). Rimangono funzionali in PDF/A-3 (modalità 5 e 6), che permette esplicitamente file incorporati arbitrari.
v3.40.0 2026-05-20
- SetPDFAMode ora supporta i livelli di conformità PDF/A-2 e PDF/A-3. Passare NewMode=3 per PDF/A-2b, 4 per PDF/A-2a, 5 per PDF/A-3b o 6 per PDF/A-3a. PDF/A-2 punta a PDF 1.7 e permette livelli, moduli interattivi, immagini JPEG2000 e trasparenza limitata. PDF/A-3 estende PDF/A-2 permettendo file incorporati arbitrari (qualsiasi tipo MIME). Tutte le varianti -a scrivono automaticamente /MarkInfo e i marcatori di struttura del PDF taggato richiesti dal livello di conformità di accessibilità.
- Corretto: SetPDFAMode(1) (PDF/A-1a) era precedentemente un no-op a causa di un bug di routing interno introdotto in v3.20.0. Ora scrive correttamente /MarkInfo e /OutputIntents e imposta XMP pdfaid:part=1/conformance=A.
- GetInformation(201) restituisce da '1' a '6' corrispondente alla modalità PDF/A attiva, coerentemente con la nuova numerazione delle modalità.
v3.39.0 2026-05-20
- SetStructElemWritingMode imposta l'attributo /WritingMode (owner Layout) sull'elemento di struttura attualmente aperto. I valori validi sono LrTb (da sinistra a destra, predefinito per gli script latini), RlTb (da destra a sinistra, per arabo ed ebraico) e TbRl (dall'alto in basso da destra a sinistra, per il testo verticale CJK tradizionale). Definita in ISO 32000-1 §14.8.5.4.2 Tabella 340. Disponibile nella libreria Delphi, ActiveX (Dispid 73008049) e nelle interfacce DLL.
- SetStructElemListNumbering imposta l'attributo /ListNumbering (owner List) sull'elemento di struttura attualmente aperto. I valori supportati includono None, Disc, Circle, Square (marcatori non ordinati) e Decimal, UpperRoman, LowerRoman, UpperAlpha, LowerAlpha (numerazione ordinata). L'attributo viene impostato sull'elemento L (list) e consente alla tecnologia assistiva di annunciare correttamente il tipo di elenco. Definita in ISO 32000-1 §14.8.5.3.2 Tabella 336. Disponibile nella libreria Delphi, ActiveX (Dispid 73008050) e nelle interfacce DLL.
v3.38.0 2026-05-20
- SetStructElemColSpan imposta l'attributo /ColSpan (owner Table) sull'elemento di struttura attualmente aperto, indicando su quante colonne si estende la cella. Definita in ISO 32000-1 §14.8.5.7.2 Tabella 337. Disponibile nella libreria Delphi, ActiveX (Dispid 73008047) e nelle interfacce DLL.
- SetStructElemRowSpan imposta l'attributo /RowSpan (owner Table) sull'elemento di struttura attualmente aperto, indicando su quante righe si estende la cella. Definita in ISO 32000-1 §14.8.5.7.2 Tabella 337. Disponibile nella libreria Delphi, ActiveX (Dispid 73008048) e nelle interfacce DLL.
- Entrambe le funzioni sono wrapper di convenienza equivalenti a chiamare AddTagAttribute con Owner='Table' e il rispettivo nome di attributo. Completano SetStructElemScope per celle di tabella completamente descritte in tabelle complesse o con intestazioni che si estendono su più celle.
v3.37.2 2026-05-20
- GetPDFUADiagnostics ora segnala FORM-NO-TOOLTIP:N quando N campi modulo interattivi (annotazioni Widget) non hanno una voce TU (tooltip / nome accessibile). ISO 14289-1 §7.18.4 richiede che tutti i campi modulo interattivi abbiano una voce TU in modo che la tecnologia assistiva possa annunciare lo scopo del campo all'utente quando il campo riceve il focus. /TU è il nome accessibile pronunciato dagli screen reader; è distinto da /T, che è il nome parziale del campo utilizzato per l'accesso programmatico e l'invio del modulo.
v3.37.1 2026-05-20
- GetPDFUADiagnostics ora segnala LIST-STRUCT:N quando N elementi di struttura LI o LBody appaiono al di fuori del loro elemento genitore richiesto. ISO 32000-1 §14.8.4.4 richiede che LI sia figlio diretto di L (list) e LBody sia figlio diretto di LI (list item). Una nidificazione errata degli elenchi impedisce alla tecnologia assistiva di attraversare e annunciare correttamente il contenuto dell'elenco e può causare errori di convalida della struttura del documento nei validatori PDF/UA-1.
v3.37.0 2026-05-20
- BeginTagEx2 è una nuova API che apre un elemento di struttura e imposta tutte le proprietà principali dell'elemento in una singola chiamata. Oltre ai parametri TagType, AltText, ActualText e Lang di BeginTagEx, BeginTagEx2 accetta Title (/T, per il pannello di navigazione Tags), ElemID (/ID, identificatore univoco dell'elemento) ed Expansion (/E, testo completo di un'abbreviazione o acronimo). Passare una stringa vuota per uno qualsiasi di questi tre parametri aggiuntivi equivale a omettere il setter corrispondente. BeginTagEx2 riduce il boilerplate per elementi ben descritti — invece di chiamare BeginTagEx seguito da SetStructElemTitle, SetStructElemID e SetStructElemExpansion separatamente, tutte e sette le proprietà possono essere impostate in una sola chiamata. La funzione è disponibile nella libreria Delphi, ActiveX (Dispid 73008046) e nelle interfacce DLL.
v3.36.1 2026-05-20
- GetPDFUADiagnostics ora segnala TABLE-TH-NO-SCOPE:N quando N elementi di struttura TH (celle di intestazione di tabella) non hanno un attributo Scope. ISO 32000-1 §14.8.4.3.4 Tabella 337 definisce Scope (Row, Column o Both) come l'attributo che descrive a quali celle dati si applica una cella di intestazione. Senza di esso, gli screen reader e le altre tecnologie assistive non possono associare in modo affidabile le celle di intestazione alle celle dati in tabelle complesse o con intestazioni multiple, cosa richiesta da ISO 14289-1 §7.5. Chiamare SetStructElemAttr('Table','Scope', 'Column') (o 'Row' / 'Both') immediatamente dopo aver taggato ciascun elemento TH.
v3.36.0 2026-05-20
- SetStructElemExpansion è una nuova API che imposta la voce /E (testo di espansione) sull'elemento di struttura attualmente aperto (ISO 32000-1 §14.9.5). Il testo di espansione è la forma scritta per intero di un'abbreviazione o acronimo contenuto nell'elemento — ad es. "World Wide Web" per uno Span il cui testo è "WWW". Gli screen reader pronunciano l'espansione invece di tentare di pronunciare i caratteri abbreviati, cosa critica per l'accessibilità del contenuto tecnico e scientifico. PDF/UA-1 (ISO 14289-1 §7.2) richiede che la lingua naturale sia determinabile in modo non ambiguo; /E è il meccanismo standard per abbreviazioni e acronimi. La funzione è disponibile nella libreria Delphi, ActiveX e nelle interfacce DLL.
v3.35.1 2026-05-20
- GetPDFUADiagnostics ora segnala DOCINFO-TITLE-MISSING quando la voce /Title del dizionario delle informazioni del documento è assente o vuota. PDF/UA-1 (ISO 14289-1) richiede un titolo del documento in modo che gli screen reader possano annunciarlo quando il documento viene aperto. Il controllo esistente DISPLAYDOCTITLE-FALSE conferma che il titolo viene mostrato nella barra del titolo del viewer; DOCINFO-TITLE-MISSING è complementare — conferma che il valore del titolo stesso è impostato. Chiamare SetDocumentInfo('Title', ...) per fornire il valore.
v3.35.0 2026-05-20
- SetStructElemTitle è una nuova API che imposta la voce /T (titolo) sull'elemento di struttura attualmente aperto (ISO 32000-1 §14.7.2 Tabella 324). Il titolo è un'etichetta leggibile dall'uomo che identifica l'istanza specifica dell'elemento — ad esempio "Chapter 1", "Summary Table" o "Figure 3: Quarterly Sales" — e viene mostrato nel pannello di navigazione Tags dei viewer PDF e utilizzato dagli strumenti di rimedio dell'accessibilità. /T è distinto da /Alt (testo alternativo per utenti con disabilità di rendering) e /ActualText (correzione del testo a livello di glifo); è più utile su elementi contenitore non testuali come Table, Figure, Form, Sect e Div. Passare una stringa vuota per cancellare un valore precedentemente impostato. La funzione è disponibile nella libreria Delphi, ActiveX e nelle interfacce DLL.
v3.34.0 2026-05-20
- SetStructElemAltText è una nuova API che imposta la voce /Alt sull'elemento di struttura attualmente aperto (ISO 32000-1 §14.9.3). È equivalente al passare AltText a BeginTag ma consente di impostare o aggiornare la descrizione del testo alternativo dopo che l'elemento è stato aperto — utile quando la descrizione viene calcolata separatamente dal tipo di elemento. PDF/UA-1 (ISO 14289-1 §7.5) richiede il testo Alt sugli elementi Figure e Formula; GetPDFUADiagnostics segnala già FIGURE-NO-ALT:N per i valori mancanti. La funzione è disponibile nella libreria Delphi, ActiveX e nelle interfacce DLL.
v3.33.1 2026-05-20
- GetPDFUADiagnostics ora include un controllo ROLEMAP-UNMAPPED:N che rileva i nomi di tipo di elemento di struttura personalizzati utilizzati nel documento che non hanno una voce nel dizionario /RoleMap. ISO 14289-1 §7.1 e ISO 32000-1 §14.7.3 richiedono che ogni tipo di struttura non standard sia mappato a un tipo PDF standard (come P, Span o Figure) in modo che la tecnologia assistiva possa determinare come gestire l'elemento. Quando vengono trovati N tipi non mappati la descrizione del problema include l'elenco dei nomi di tipo in modo che i chiamanti sappiano quali voci AddRoleMap sono necessarie. Tutti i 49 tipi di struttura standard definiti in ISO 32000-1 Tabella 333 (PDF 1.7) sono riconosciuti ed esclusi dal rapporto.
v3.33.0 2026-05-20
- SetStructElemLang è una nuova API che imposta la voce /Lang sull'elemento di struttura attualmente aperto (ISO 32000-1 §14.9.2). Il tag di lingua sovrascrive la lingua a livello di documento dichiarata da SetDocumentLanguage o SetPDFUAMode per l'elemento e tutti i suoi discendenti, consentendo ai documenti multilingue di contrassegnare ciascuna porzione con il proprio tag di lingua BCP 47 corretto (ad es. 'en-US', 'fr', 'zh-Hant-TW'). Gli screen reader utilizzano il /Lang a livello di elemento per selezionare il motore di sintesi vocale o la voce appropriata quando leggono il documento ad alta voce. La funzione è disponibile nella libreria Delphi, ActiveX e nelle interfacce DLL.
v3.32.0 2026-05-20
- SetStructElemActualText è una nuova API che imposta la voce /ActualText sull'elemento di struttura attualmente aperto (ISO 32000-1 §14.9.4). Utilizzarla per specificare il testo Unicode esatto che una sequenza di glifi rappresenta quando l'estrazione del flusso di contenuto darebbe risultati errati — i casi più comuni sono i glifi delle legature OpenType (U+FB00 ff, U+FB01 fi, U+FB02 fl) e le abbreviazioni con espansioni non ovvie. ActualText integra, anziché sostituire, il contenuto renderizzato; sovrascrive ciò che la tecnologia assistiva e gli estrattori di testo leggono per quell'elemento senza sopprimere il rendering visivo. La funzione è disponibile nella libreria Delphi, ActiveX e nelle interfacce DLL.
v3.31.1 2026-05-20
- GetPDFUADiagnostics ora controlla anche gli elementi di struttura Formula oltre agli elementi Figure quando segnala testo Alt mancante (FIGURE-NO-ALT:N). ISO 32000-1 §14.9.3 richiede descrizioni alternative sia per le figure grafiche sia per le formule matematiche; in precedenza venivano scansionati solo gli elementi Figure.
- GetPDFUADiagnostics ora segnala PDF-VERSION-LOW quando la versione PDF del documento è inferiore a 1.7. PDF/UA-1 (ISO 14289-1) è definito rispetto a PDF 1.7 (ISO 32000-1:2008); i documenti a PDF 1.5 o 1.6 non soddisferebbero i requisiti di base della specifica. Chiamare SetPDFUAMode per elevare automaticamente la versione a 1.7.
v3.31.0 2026-05-19
- Ora sono supportati gli ID degli elementi di struttura e l'associazione delle intestazioni di tabella. SetStructElemID assegna un identificatore stringa univoco (/ID) all'elemento di struttura attualmente aperto; gli ID vengono raccolti in un name tree /IDTree sulla radice dell'albero di struttura quando il documento viene salvato, consentendo agli strumenti di accessibilità e ai riferimenti incrociati di localizzare gli elementi tramite ID (ISO 32000-1 §14.7.4). SetStructElemHeaders associa la cella di tabella corrente (TD o TH) a una o più celle di intestazione tramite un elenco separato da virgole di ID precedentemente assegnati, scrivendo l'array /Headers nel dizionario dell'owner di attributo Table (ISO 32000-1 §14.8.5.7.2). Insieme queste due funzioni supportano il markup di tabella complesso per PDF/UA-1 (ISO 14289-1 §7.10) e WCAG 2.x SC 1.3.1. Entrambe le funzioni sono disponibili nella libreria Delphi, ActiveX e nelle interfacce DLL. AddTagAttribute ora gestisce correttamente anche l'attributo /Headers con valori delimitati da virgole scritti come array di stringhe di testo PDF.
v3.30.1 2026-05-19
- GetPDFUADiagnostics ora include un controllo HEADING-LEVEL-SKIP:N che rileva i salti di livello di intestazione nell'ordine del documento (ad es. un H1 immediatamente seguito da un H3 senza un H2 in mezzo). Il controllo esegue una traversata in pre-order dell'intero albero degli elementi di struttura e conta ogni occorrenza in cui il livello di intestazione successivo supera il precedente di più di uno. Gli elementi H generici sono trattati come H1. Tornare a un'intestazione di livello superiore (H3 → H1) non viene conteggiato come salto. Il criterio di successo 1.3.1 di WCAG 2.x e ISO 14289-1 §7.1 richiedono che le intestazioni siano nidificate senza lacune.
v3.30.0 2026-05-19
- Ora sono supportati gli attributi degli elementi di struttura per i documenti PDF taggati e PDF/UA. Tre nuove funzioni API consentono di allegare attributi all'elemento di struttura attualmente in costruzione sullo stack di tag: AddTagAttribute (generale, qualsiasi owner/nome/valore), SetStructElemScope (wrapper di convenienza che imposta l'attributo /Scope sotto l'owner Table, per le celle di intestazione TH — ISO 32000-1 §14.8.5.7.2) e SetStructElemBBox (wrapper di convenienza che imposta l'attributo /BBox sotto l'owner Layout, per figure e altri elementi visivamente posizionati — ISO 32000-1 §14.8.5.4). Quando il documento viene salvato, gli attributi vengono scritti come dizionari di attributi /A in ciascun elemento di struttura; più attributi dello stesso owner vengono raggruppati in un dizionario, e gli attributi di owner diversi vengono scritti come array di dizionari. Tutte e tre le funzioni sono disponibili nella libreria Delphi, ActiveX e nelle interfacce DLL.
v3.29.1 2026-05-19
- GetPDFUADiagnostics ora include due controlli aggiuntivi: se qualche elemento di struttura Figure nel documento è privo di un valore di testo Alt (segnalato come FIGURE-NO-ALT:N, secondo ISO 14289-1 §7.5 e ISO 32000-1 §14.9.3) e se ci sono elementi di struttura ancora aperti perché EndTag non è stato chiamato (segnalato come STRUCT-UNCLOSED:N). Il controllo delle figure esegue una visita ricorsiva completa dell'albero degli elementi di struttura, coprendo gli elementi a tutte le profondità di nidificazione.
v3.29.0 2026-05-19
- GetPDFUADiagnostics è una nuova API diagnostica che controlla un documento per potenziali problemi di conformità PDF/UA-1 (ISO 14289-1) e restituisce un elenco di risultati separati da newline. Vengono eseguiti sei controlli: se MarkInfo/Marked è impostato (PDF taggato), se il catalogo del documento ha una voce /Lang, se ViewerPreferences/DisplayDocTitle è true, se i metadati XMP contengono un identificatore pdfuaid:part, il numero di annotazioni non esenti senza una voce Contents e il numero di file incorporati senza una voce AFRelationship. Ogni risultato è identificato da un codice breve (ad es. LANG-MISSING, ANNOT-NO-CONTENTS:3) seguito da una descrizione leggibile dall'uomo. Restituisce una stringa vuota quando non vengono trovati problemi. Disponibile nella libreria Delphi, ActiveX e nelle interfacce DLL.
v3.28.5 2026-05-19
- Miglioramento dell'accessibilità delle annotazioni PDF/UA-1: quando un'annotazione FileAttachment non ha una voce Contents e nessun campo /T, viene ora utilizzato come descrizione accessibile di fallback il nome di file dalla specifica del file incorporato dell'annotazione (/FS /UF o /F). Questo completa la catena di fallback per Contents delle annotazioni: /T → URI del Link → nome dello Stamp → nome file di FileAttachment. Gli screen reader ricevono il nome del file allegato invece del silenzio, soddisfacendo ISO 14289-1 §7.18.1 per i tipi di annotazione più comuni.
v3.28.4 2026-05-19
- Miglioramento dell'accessibilità delle annotazioni PDF/UA-1: quando un'annotazione Stamp non ha una voce Contents (o ne ha una vuota) e nessun campo /T, viene ora utilizzato come descrizione accessibile di fallback il nome del tipo di stamp dalla voce /Name dell'annotazione (ad es. "Approved", "Draft", "Confidential", "Final"). Questo estende la catena di fallback Contents delle annotazioni introdotta in v3.28.3 per coprire le annotazioni stamp, che sono comuni nei flussi di lavoro che coinvolgono documenti revisionati o approvati e spesso mancano di un valore Contents esplicito.
v3.28.3 2026-05-19
- Miglioramento dell'accessibilità delle annotazioni PDF/UA-1: quando un'annotazione Link non ha una voce Contents (o ne ha una vuota) e nessun campo /T, viene ora utilizzato come descrizione accessibile di fallback l'URI dall'azione URI dell'annotazione. Questo si applica solo durante l'elaborazione di SetPDFUAMode e solo alle annotazioni Link che portano un'azione /URI. Gli screen reader ricevono l'URL come etichetta di ultima istanza, soddisfacendo ISO 14289-1 §7.18.1 nel caso comune in cui gli autori creano collegamenti ipertestuali senza fornire una descrizione leggibile dall'uomo.
v3.28.2 2026-05-19
- SetEmbeddedFileAFRelationship è una nuova API per impostare esplicitamente il valore AFRelationship sul dizionario della specifica del file di un file incorporato. Richiesta da ISO 14289-1 (PDF/UA-1) §7.11, consente ai chiamanti di specificare la relazione semantica di un file incorporato con il contenuto del documento scegliendo tra i cinque valori validi: Source, Data, Alternative, Supplement o Unspecified. Quando SetPDFUAMode è attivo, a qualsiasi file incorporato senza una chiave AFRelationship viene assegnato automaticamente Unspecified; utilizzare questa funzione per sovrascrivere quel valore predefinito prima del salvataggio. Disponibile nella libreria Delphi, ActiveX e nelle interfacce DLL.
v3.28.1 2026-05-19
- Quando SetPDFUAMode viene chiamato su un documento i cui metadati XMP portano il titolo predefinito generico della libreria piuttosto che uno specifico del documento, il titolo viene ora sostituito automaticamente con il valore della voce Title /Info del documento (se presente). Ciò garantisce che il pacchetto XMP pdfuaid:part-1 rifletta il titolo effettivo del documento piuttosto che un segnaposto, soddisfacendo le aspettative dei verificatori PDF/UA-1.
- Il parser XMP (LoadFromString) ora legge il valore dc:title dai metadati XMP esistenti quando un documento viene caricato, in modo che il round-trip di un PDF che ha già dc:title preservi correttamente quel titolo invece di tornare al segnaposto predefinito.
v3.28.0 2026-05-19
- BeginArtifactEx(ArtifactType, ArtifactSubtype) è una nuova API per PDF taggato che estende BeginArtifact per esprimere sia il /Type dell'artifact che il /Subtype Pagination in una singola chiamata. Quando entrambi i parametri non sono vuoti, l'operatore scritto è /Artifact << /Type /T /Subtype /S >> BMC, abilitando artifact Pagination completamente specificati come intestazioni e piè di pagina secondo ISO 32000-1 §14.8.2.2.1. Se solo un parametro non è vuoto, viene utilizzata la corrispondente forma a chiave singola. Vengono esportati anche i punti di ingresso DLL DLBeginArtifactEx e DLBeginArtifactExA.
v3.27.2 2026-05-19
- BeginArtifact ora distingue correttamente i tipi di artifact dai sottotipi di pagination. Quando l'argomento è Pagination, Layout o Page (tipi di artifact secondo ISO 32000-1 §14.8.2.2.1 Tabella 330), l'operatore di contenuto marcato scrive /Type invece di /Subtype. Altri valori come Header, Footer e Watermark continuano a essere scritti come /Subtype. Questo corregge l'output precedentemente errato che scriveva /Subtype /Pagination quando il chiamante intendeva contrassegnare un artifact di pagination.
v3.27.1 2026-05-19
- Quando la modalità PDF/UA è attiva e il documento contiene file incorporati, ogni dizionario di specifica del file che manca di una voce AFRelationship la riceve ora automaticamente al momento del salvataggio. Il valore scritto è /Unspecified, soddisfacendo il requisito ISO 14289-1 §7.11 che ogni file incorporato porti una chiave AFRelationship. Ciò si applica sia ai file aggiunti tramite EmbedFile sia ai file incorporati già presenti in un documento caricato.
v3.27.0 2026-05-19
- AddRoleMap(CustomType, StandardType) è una nuova API per PDF taggato che registra una mappatura da un nome di tipo di elemento di struttura personalizzato (non standard) a un tipo di struttura PDF standard. Quando viene salvato, le mappature vengono scritte nel dizionario RoleMap nella radice dell'albero di struttura, soddisfacendo il requisito ISO 14289-1 §7.1 per i documenti che utilizzano nomi di tag specifici dell'applicazione. Possono essere registrate più mappature; le chiavi duplicate vengono sovrascritte dall'ultima chiamata. Vengono esportati anche i punti di ingresso DLL DLAddRoleMap e DLAddRoleMapA.
v3.26.0 2026-05-19
- BeginTagEx(TagType, AltText, ActualText, Lang) è una nuova API per PDF taggato che estende BeginTag con un attributo esplicito di lingua naturale. Quando Lang non è vuoto viene scritto nell'attributo /Lang dell'elemento di struttura, abilitando l'annotazione di lingua per elemento richiesta da ISO 14289-1 §7.2 per i documenti multilingue. Passare una stringa Lang vuota si comporta in modo identico a BeginTag. Vengono esportati anche i punti di ingresso DLL DLBeginTagEx e DLBeginTagExA.
v3.25.1 2026-05-19
- I font TrueType non sottoinsiemizzati caricati con la code page predefinita di Windows (WinAnsiEncoding) ora ricevono un flusso CMap ToUnicode, abilitando l'estrazione affidabile di testo Unicode e il copia/incolla per questi font. In precedenza un flusso ToUnicode veniva scritto solo quando era presente un override esplicito della code page o un array Differences; il percorso comune della codifica predefinita ne era privo.
- La stessa correzione si applica ai font TrueType caricati con una code page non predefinita esplicita ma senza array Differences, e ai font caricati tramite il formato di font impacchettato.
v3.25.0 2026-05-19
- Quando la modalità PDF/UA è attiva, le annotazioni non esenti (tutti i tipi tranne Widget, PrinterMark e TrapNet) prive di una voce Contents non vuota la ricevono ora automaticamente al momento del salvataggio. Viene utilizzato come fallback il valore /T (titolo / autore) dell'annotazione, soddisfacendo ISO 14289-1 §7.18.1 per le annotazioni che portano un titolo ma nessuna descrizione accessibile esplicita.
v3.24.0 2026-05-19
- Quando la modalità PDF/UA è attiva, i campi modulo interattivi privi di una voce TU (tooltip / descrizione alternativa) la ricevono ora automaticamente al momento del salvataggio. Viene utilizzato come valore di fallback il nome parziale del campo (voce /T), garantendo che gli screen reader possano identificare ogni campo. I pulsanti push sono correttamente esclusi da questo requisito secondo ISO 14289-1 §7.18.4.
v3.23.1 2026-05-19
- GetInformation(200) restituisce '1' quando la modalità PDF/UA-1 è attiva sul documento selezionato, consentendo ai chiamanti di interrogare lo stato della modalità di conformità in fase di esecuzione.
- GetInformation(201) restituisce '1' per PDF/A-1a, '2' per PDF/A-1b, o una stringa vuota quando la modalità PDF/A è disattivata.
- GetInformation(311) e GetInformation(312) ora restituiscono correttamente la stringa di requisito di versione e il nome della funzionalità dal conflitto di blocco di versione più recente (precedentemente pubblicizzato nella voce v3.20.3 ma non ancora implementato).
- GetInformation(313) restituisce la stringa di versione PDF a cui il target di salvataggio è attualmente bloccato, o una stringa vuota per documenti con versione libera.
v3.23.0 2026-05-19
- SetMarkInfo(Marked) è ora un'API pubblica, consentendo di impostare il flag MarkInfo.Marked indipendentemente dalla configurazione completa PDF/UA-1 eseguita da SetPDFUAMode. Quando Marked è 1, MarkInfo.Suspects viene anch'esso impostato su false come richiesto da ISO 14289-1 §7.18.6.
- Quando la modalità PDF/UA è attiva, tutte le pagine ricevono automaticamente una voce /Tabs /S al momento del salvataggio, soddisfacendo il requisito di ordine delle tab basato sulla struttura di ISO 14289-1 §7.18.4.
- Aggiunta documentazione di riferimento HTML per SetPDFUAMode, SetDocumentLanguage, SetMarkInfo, BeginTag, EndTag, BeginArtifact ed EndArtifact, con tabelle di sintassi complete ed esempi di utilizzo.
v3.22.0 2026-05-19
- BeginTag(TagType, AltText, ActualText) apre un elemento di struttura di PDF taggato nel flusso di contenuto corrente, scrivendo un operatore BDC con un MCID assegnato automaticamente e registrando l'elemento nell'albero di struttura del documento. TagType è uno qualsiasi dei tipi di struttura PDF standard (P, H1, Figure, Table, ecc.). AltText e ActualText sono stringhe di accessibilità opzionali codificate come stringhe di testo PDF (UTF-16BE).
- EndTag chiude l'elemento di struttura aperto più di recente, scrivendo l'operatore EMC corrispondente nel flusso di contenuto.
- BeginArtifact(SubType) contrassegna una regione di contenuto come artifact PDF (artefatto di pagination, sfondo, ecc.), scrivendo un operatore BMC. SubType è opzionale; quando viene fornito viene scritto come /Artifact << /Subtype /SubType >>.
- EndArtifact chiude la regione di artifact con un operatore EMC.
- Al momento del salvataggio, quando sono stati registrati elementi di struttura taggati, la libreria costruisce automaticamente lo StructTreeRoot completo, assegna le chiavi StructParents alle pagine interessate e scrive il number tree ParentTree, soddisfacendo i requisiti ISO 32000-1 §14.7 per il PDF taggato.
- I font Type 1 standard (Helvetica, Times, famiglia Courier, Symbol) e i font Type 1 incorporati con codifica WinAnsi ora ricevono un flusso CMap ToUnicode, abilitando l'estrazione affidabile di testo Unicode e il copia/incolla per questi tipi di font.
v3.21.0 2026-05-19
- SetPDFUAMode(Language) attiva la modalità di conformità PDF/UA-1 (ISO 14289-1): eleva automaticamente il documento a PDF 1.7, scrive MarkInfo.Marked e MarkInfo.Suspects, abilita DisplayDocTitle in ViewerPreferences, imposta Catalog.Lang quando Language non è vuoto e scrive la voce dello spazio dei nomi XMP pdfuaid:part = 1 richiesta da ISO 14289-1 Sezione 6.7.11.
- SetDocumentLanguage(Language) scrive direttamente la voce Catalog /Lang, consentendo di dichiarare la lingua del documento indipendentemente dalla modalità PDF/UA.
- MarkInfo.Suspects viene ora impostato su false ogni volta che MarkInfo.Marked è impostato su true, soddisfacendo il requisito di struttura PDF taggato di ISO 14289-1 (Sezione 7.18.6).
- Encrypt ora forza il flag di permesso CanCopyAccess (copia di contenuto per l'accessibilità) quando il documento è in modalità PDF/UA, come richiesto da ISO 14289-1 Sezione 7.17.
- I campi modulo Choice (a discesa) non portano più un valore di tooltip hardcoded senza significato; TU rimane non impostato in modo che il chiamante possa assegnare un'etichetta significativa tramite l'API delle proprietà del campo modulo.
v3.20.3 2026-05-19
- Encrypt e AddSWFAnnotationFromFile ora restituiscono 0 immediatamente con LastErrorCode 602 quando la versione di salvataggio è bloccata al di sotto del minimo richiesto dalla forza di crittografia o dal tipo di annotazione selezionati, invece di procedere silenziosamente e fallire solo al momento del salvataggio.
- GetInformation(311) e GetInformation(312) ora riflettono il requisito di versione in conflitto al momento della scrittura quando una versione bloccata blocca le funzionalità a livello di estensione come AES-256 o le annotazioni RichMedia.
v3.20.2 2026-05-19
- AddU3DAnnotationFromFile ora eleva automaticamente la versione del documento a PDF 1.6 quando un'annotazione 3D viene aggiunta a un documento di versione inferiore, coerentemente con il comportamento di auto-bump della versione di tutti gli altri punti di ingresso API PDF 1.6+.
v3.20.1 2026-05-17
- I target di salvataggio PDF 1.2 sono ora applicati come contratti PDF 1.2 rigorosi. Il salvataggio di oggetti PDF 1.3+ come i dati della Page TrimBox sotto un target PDF 1.2 fallisce prima della scrittura dell'output invece di emettere un file con versioni miste.
- La conformità a livello di estensione PDF 1.7 Adobe è ora parte del preflight di salvataggio. AESV3, AES-256, RichMedia, Projection, i dizionari geospaziali e i subfilter di firma ETSI vengono verificati rispetto all'ExtensionLevel richiesto.
- La crittografia AES-256, le annotazioni RichMedia, i dizionari geospaziali e i subfilter di firma ETSI ora dichiarano la corrispondente voce Adobe Extensions quando PDFlib eleva automaticamente un documento a contenuto di estensione PDF 1.7.
- I salvataggi Append ora utilizzano lo stesso gate di conformità di versione dei salvataggi completi.
- Le DLL runtime PDFium opzionali in bundle sono state aggiornate per Win32 e Win64. GDI+ rimane il renderer predefinito; PDFium rimane opt-in tramite SetPDFiumFileName e SelectRenderer(3).
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 207/207 ciascuna, e C++Builder Win64x GoogleTest ha superato 61 test con 2 test esistenti dipendenti dai sample saltati.
v3.20.0 2026-05-17
- Otto ulteriori punti di ingresso del writer PDFlib ora passano tramite Phase 3 EnsureMinVersion in modo che la versione del documento venga elevata automaticamente al minimo richiesto dalla funzionalità emessa: SetDocumentMetadata (PDF 1.4 - flusso /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)
- Combinato con l'insieme v3.15.0 (SetTransparency, SetPageUserUnit, Encrypt, SetPageLayout) e l'insieme v3.17.0 (otto voci JavaScript / file incorporato / XFA / SWF), PDFlib ora auto-bump di FVersion attraverso ventuno punti di ingresso del writer.
- NewOptionalContentGroup precedentemente bumpava FVersion direttamente; ora passa tramite EnsureMinVersion in modo che LockSaveVersion sia rispettato e il bump sia registrato in AutoBumpedFeatures.
v3.19.0 2026-05-17
- La conformità di versione PDF in fase di salvataggio e caricamento ora riconosce anche quattro funzionalità precedentemente posticipate: Btn /Ff bit 15 NoToggleToOff (solo radio button) -> PDF 1.4 DeviceN /Subtype /NChannel (raffinamento spazio colore) -> PDF 1.6 FontFile3 /Subtype /OpenType (tipo programma font) -> PDF 1.6 Sig /SubFilter ETSI.CAdES.detached o ETSI.RFC3161 -> PDF 1.7
- La regola NChannel corrisponde alla forma di array di spazio colore DeviceN [/DeviceN names alternateSpace tintTransform attributes] quando il dizionario attributes all'indice 4 porta /Subtype /NChannel.
- La regola FontFile3 OpenType si attiva solo quando il flusso viene raggiunto tramite una chiave genitore denominata 'FontFile3', in modo che i flussi non correlati che portano per caso /Subtype /OpenType non vengano segnalati.
- La tabella PDFFeatureRules ora contiene 103 regole (99 + 4 nuove).
v3.18.6 2026-05-17
- La conformità di versione PDF in fase di salvataggio e caricamento ora riconosce /AA (additional actions) con consapevolezza del tipo di contenitore: Catalog /AA (trigger a livello di documento) -> PDF 1.4 Annot /AA (trigger di annotazione) -> PDF 1.4 Page /AA (trigger di pagina) -> PDF 1.5
- Il /AA dei campi modulo (PDF 1.2) rimane coperto dal contratto di salvataggio PDF 1.3 esistente; nessuna regola necessaria.
- La tabella PDFFeatureRules ora contiene 99 regole (96 + 3 nuove).
v3.18.5 2026-05-17
- La conformità di versione PDF in fase di salvataggio e caricamento ora classifica correttamente Page /Tabs come funzionalità PDF 1.5; in precedenza era classificata erroneamente come PDF 1.4. Il documento di modifiche alla specifica PDF 1.4 (Adobe TN #5409) non elenca /Tabs, e la PDF 1.5 Tabella 8.10 introduce "Tabs (Optional; PDF 1.5)".
- Nuova regola: AcroForm /NeedAppearances viene riconosciuto come funzionalità PDF 1.5 secondo PDF 1.5 Tabella 218.
- La tabella PDFFeatureRules ora contiene 96 regole (95 + 1 nuova).
v3.18.4 2026-05-13
- PDFlibZLib ora utilizza sempre il backend di oggetti zlib-ng statico in bundle nelle build normali della libreria, rimuovendo il percorso di fallback System.ZLib rimanente.
- La copertura di regressione zlib-ng ora include payload di dimensioni limite, dati di scanline simili a PNG, flussi multi-blocco memorizzati e flussi zlib noti tra i test runner Delphi e C++Builder.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 194/194 ciascuna, e C++Builder Win64x GoogleTest ha superato 58 test con 2 test esistenti dipendenti dai sample saltati.
v3.18.3 2026-05-12
- Le demo Delphi e C++Builder che generano output PDF o di testo ora aprono automaticamente il documento generato dopo un salvataggio riuscito.
- L'imballaggio del programma di installazione ora mantiene gli artefatti di build fuori dalle cartelle delle demo e rende i sample C++Builder più i moduli DLL e ActiveX/OCX componenti opt-in; i loro file corrispondenti vengono installati solo quando il componente è selezionato.
v3.18.2 2026-05-12
- Le demo Delphi e C++Builder EditFormField ora cancellano /NeedAppearances prima di aggiornare i valori dei campi, in modo che ogni campo di testo modificato riceva un flusso di apparenza normale aggiornato nel PDF salvato.
- Ciò mantiene il flusso /AP salvato sincronizzato con il valore /V memorizzato ed evita differenze dipendenti dal viewer in cui mettendo a fuoco il campo si rivela testo mancante dall'apparenza statica del campo.
v3.18.1 2026-05-10
- La conformità di versione PDF in fase di salvataggio e caricamento ora riconosce anche i flag /Ff dei campi modulo a livello di bit e il bit AcroForm /SigFlags AppendOnly: /Ff bit 21 (FileSelect, maschera 1048576) -> PDF 1.4 /Ff bit 22 (MultiSelect, maschera 2097152) -> PDF 1.4 /Ff bit 23 (DoNotSpellCheck, maschera 4194304) -> PDF 1.4 /Ff bit 24 (DoNotScroll, maschera 8388608) -> PDF 1.4 /Ff bit 25 (Comb, maschera 16777216) -> PDF 1.5 /Ff bit 26 (RichText / RadiosInUnison, 33554432) -> PDF 1.5 /Ff bit 27 (CommitOnSelChange, maschera 67108864) -> PDF 1.5 /SigFlags bit 2 (AppendOnly, maschera 2) -> PDF 1.5
- L'ereditarietà /Parent non viene seguita: solo i dizionari che portano esplicitamente /Ff o /SigFlags attivano le regole.
- La tabella PDFFeatureRules ora contiene 95 regole (87 + 8 nuove a livello di bit).
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 191/191 ciascuna, e C++Builder Win64x GoogleTest ha superato 57/57.
v3.18.0 2026-05-10
- La conformità di versione PDF in fase di salvataggio e caricamento ora riconosce anche nove ulteriori funzionalità sub-chiave e a livello di bit: flag di annotazione a livello di bit (maschera /F): Locked (128) -> PDF 1.4 ToggleNoView (256) -> PDF 1.5 LockedContents (512) -> PDF 1.7 sub-chiavi distintive di catalogo e pagina: /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
- La tabella PDFFeatureRules ora contiene 87 regole (78 a livello di capitolo + 9 sub-chiave / a livello di bit).
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 189/189 ciascuna, e C++Builder Win64x GoogleTest ha superato 57/57.
v3.17.0 2026-05-10
- Otto ulteriori punti di ingresso del writer PDFlib ora passano tramite Phase 3 EnsureMinVersion in modo che la versione del documento venga elevata automaticamente al minimo richiesto dalla funzionalità emessa: AddLinkToJavaScript, SetOpenActionJavaScript, AddGlobalJavaScript, FormFieldJavaScriptAction (PDF 1.3 - azioni JavaScript) AddEmbeddedFile, AddFileAttachment (PDF 1.3 - allegati file) SetXFAFromString (PDF 1.5 - moduli XFA) AddSWFAnnotationFromFile (PDF 1.7 - annotazione RichMedia)
- Combinato con l'insieme v3.15.0 (SetTransparency, SetPageUserUnit, Encrypt, SetPageLayout) PDFlib ora copre tredici punti di ingresso del writer ad alta versione end-to-end.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 187/187 ciascuna, e C++Builder Win64x GoogleTest ha superato 57/57.
v3.16.3 2026-05-10
- Nuova API PDFlib: LockSaveVersion(Version) blocca il documento alla Version e impedisce alla Phase 3 EnsureMinVersion lato writer di auto-elevarlo al di sopra. UnlockSaveVersion cancella il blocco.
- Il gate di salvataggio è invariato: le funzionalità emesse dal writer al di sopra della versione bloccata producono ancora LastErrorCode 602 al momento del salvataggio, invece di elevare silenziosamente l'header.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 184/184 ciascuna, e C++Builder Win64x GoogleTest ha superato 57/57.
v3.16.2 2026-05-10
- I PDF caricati ora espongono una vista solo-contributore della rilevazione di funzionalità in fase di caricamento tramite GetInformation(103) ("ContributorFeatures"). L'elenco contiene solo le funzionalità la cui versione minima richiesta è strettamente maggiore di HeaderVersion (chiave 100), quindi risponde direttamente alla domanda "perché la versione effettiva è superiore all'header del file?".
- GetInformation(101) ("DetectedFeatures") è invariato e continua a elencare ogni funzionalità corrispondente indipendentemente dal contributo.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 181/181 ciascuna, e C++Builder Win64x GoogleTest ha superato 57/57.
v3.16.1 2026-05-10
- Estesa la copertura dei test di rilevazione lato loader con sei fixture sintetici aggiuntivi: ExtGState di trasparenza in-page (nessun bump di versione), Catalog /MarkInfo (PDF 1.3 -> PDF 1.4), /OCProperties + contenuto OCG (PDF 1.4 -> PDF 1.5), /Type /3DStream (PDF 1.5 -> PDF 1.6), una fixture di combinazione multi-funzionalità e un controllo di stabilità snapshot.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 179/179 ciascuna, e C++Builder Win64x GoogleTest ha superato 57/57.
v3.16.0 2026-05-10
- I documenti PDF caricati ora passano attraverso una fase di rilevazione di versione guidata dal contenuto: ogni oggetto indiretto viene esaminato attraverso la tabella funzionalità-versione-minima utilizzata dal gate di salvataggio, e FVersion viene elevato al di sopra del valore letterale dell'header %PDF-X.Y quando il contenuto richiede effettivamente una versione superiore. Ad esempio una voce /UserUnit di pagina eleva la versione effettiva a PDF 1.6 anche quando l'header del file dice PDF 1.4.
- Nuove chiavi GetInformation: 100 restituisce HeaderVersion (letterale %PDF-X.Y), 101 restituisce DetectedFeatures (funzionalità corrispondenti in fase di caricamento delimitate da CRLF), 102 restituisce AutoBumpedFeatures (funzionalità che hanno attivato EnsureMinVersion lato writer delimitate da CRLF).
- Il gate di salvataggio non è influenzato: i documenti la cui versione effettiva è stata elevata al caricamento, poi esplicitamente downgradata con SetInformation(0, ...), producono ancora LastErrorCode 602 al momento del salvataggio.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 173/173 ciascuna, e C++Builder Win64x GoogleTest ha superato 57/57.
v3.15.0 2026-05-10
- I punti di ingresso del writer che producono funzionalità che richiedono una particolare versione PDF minima ora elevano automaticamente la versione PDF del documento. Chiamare SetTransparency su un documento contrassegnato come PDF 1.3 ora promuove l'header a PDF 1.4 invece di fallire il salvataggio con LastErrorCode 602.
- Cablato lo stesso auto-bump in SetPageUserUnit (>=1.6), Encrypt con Strength 1/2/3/4 (rispettivamente >=1.4/1.6/1.7/1.7), e le varianti a due pagine di SetPageLayout (>=1.5).
- Modifica di comportamento rispetto a 3.14.x: le applicazioni che precedentemente si affidavano al gate v3.12.6 "il target di salvataggio rifiuta le funzionalità emesse dal writer" ora hanno successo alla versione elevata. I PDF caricati che già contengono funzionalità di versione superiore passano comunque attraverso il gate di salvataggio esistente, quindi caricare un PDF taggato e selezionare PDF 1.3 fallisce ancora con LastErrorCode 602.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 170/170 ciascuna, e C++Builder Win64x GoogleTest ha superato 57/57.
v3.14.3 2026-05-10
- La conformità di versione PDF in fase di salvataggio ora riconosce anche i restanti tipi di dizionario 3D PDF 1.6 (/Type /3DStream /3DRef /3DBackground /3DRenderMode /3DLightingScheme /3DCrossSection /3DNode) e i sottotipi di annotazione PDF 1.7 Redact, RichMedia e Projection oltre ai dizionari companion /Type /Requirement e /ReqHandler.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 168/168 ciascuna, e C++Builder Win64x GoogleTest ha superato 57/57.
v3.14.2 2026-05-10
- La conformità di versione PDF in fase di salvataggio ora riconosce anche le funzionalità PDF 1.5: moduli /XFA, /AlternatePresentations, name tree /Renditions, i dizionari multimediali /Type /Rendition /MediaCriteria /MediaPermissions /MediaPlayers, e il sottotipo di annotazione Screen.
- Salvare come PDF 1.4 ora rifiuta i documenti che portano queste funzionalità con LastErrorCode 602.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 166/166 ciascuna, e C++Builder Win64x GoogleTest ha superato 57/57.
v3.14.1 2026-05-10
- La conformità di versione PDF in fase di salvataggio ora riconosce anche le funzionalità PDF 1.4: dizionari di PDF taggato /StructTreeRoot /MarkInfo e StructElem, le voci /Lang del documento e /Tabs di pagina, i dizionari /OutputIntents e /OutputIntent, la firma dei diritti di utilizzo /UR3, e i sottotipi di annotazione PDF 1.4 Polygon, PolyLine, Caret, Ink, Popup e Watermark.
- Salvare come PDF 1.3 ora rifiuta i documenti che portano queste funzionalità con LastErrorCode 602.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 165/165 ciascuna, e C++Builder Win64x GoogleTest ha superato 57/57.
v3.14.0 2026-05-10
- La conformità di versione PDF in fase di salvataggio ora riconosce anche le funzionalità PDF 1.3 come smooth shading, oggetti funzione, spazi colore ICCBased e DeviceN, voci di pagina /TrimBox /BleedBox /ArtBox, CMap /ToUnicode, allegati file e annotazioni /Sound e /Movie, dizionari /Type /Filespec e /Type /EmbeddedFile, le chiavi /Group /EF /Alternates /Mask, e azioni JavaScript.
- I chiamanti PDF 1.2 ora salvano sotto il contratto PDF 1.3: l'header letterale %PDF-1.2 viene preservato, ma il gate accetta le funzionalità PDF 1.3. Le funzionalità PDF 1.4 e successive sono ancora rifiutate con LastErrorCode 602.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 162/162 ciascuna, e C++Builder Win64x GoogleTest ha superato 57/57.
v3.13.0 2026-05-10
- Refactoring del gate di conformità di versione PDF che rifiuta le funzionalità di versione successiva al momento del salvataggio in un modulo dedicato in modo che l'insieme di regole possa crescere senza fluttuare il core del documento.
- Nessuna modifica di comportamento visibile all'utente rispetto a v3.12.7: le stesse funzionalità fuori versione sono ancora rifiutate con LastErrorCode 602.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 155/155 ciascuna, e C++Builder Win64x GoogleTest ha superato 57/57.
v3.12.7 2026-05-09
- Estesa la copertura dei test automatizzati per il flusso di lavoro di rendering ad accesso diretto PdfToImage sia nelle suite Delphi DUnitX che C++Builder GoogleTest.
- Il test runner Delphi VCL GUI ora registra le fixture Syntax e XRef, allineandosi alla copertura del runner di console.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 147/147 ciascuna, e C++Builder Win64x GoogleTest ha superato 57/57.
v3.12.6 2026-05-09
- Salvare come PDF 1.3, 1.4, 1.5, 1.6 o 1.7 ora impone la versione selezionata come contratto di output di salvataggio completo.
- I salvataggi completi rimuovono gli override /Version del catalogo, rimuovono le voci di estensione e di metadati del catalogo non supportate per i target inferiori e sopprimono i flussi di metadati XMP PDF 1.4 quando si salva come PDF 1.3.
- SaveToFile, SaveToString e SaveToStream ora falliscono con LastErrorCode 602 quando la versione PDF target selezionata è inferiore alle funzionalità ancora presenti nel documento, come trasparenza, contenuto opzionale, JPX, UserUnit, 3D, o funzionalità di crypt-filter AES.
v3.12.5 2026-05-09
- Migliorato il parsing delle stringhe letterali PDF 1.7 in modo che le sequenze di escape sconosciute ignorino il backslash come richiesto dallo standard.
- Gli escape ottali delle stringhe letterali ora consumano solo cifre ottali e preservano una cifra non ottale successiva come dati stringa regolari.
- Aggiunta copertura di regressione per escape di stringhe letterali sconosciuti e sequenze di escape ottali/non ottali miste.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 141/141 ciascuna.
v3.12.4 2026-05-09
- Migliorato il parsing lessicale PDF 1.7 in modo che gli oggetti nome ora si fermino correttamente al delimitatore di parentesi graffa destra.
- Corretto il caricamento SmartAccess delle voci di oggetto compresso dello stream xref il cui numero di stream di oggetti è maggiore della lunghezza in byte del PDF.
- Aggiunta copertura di regressione per i delimitatori di nome di parentesi graffa destra e le voci sparse di oggetto compresso dello stream xref.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 139/139 ciascuna.
v3.12.3 2026-05-08
- Migliorata la compatibilità dei documenti cifrati PDF 1.7 per i file con security handler standard che utilizzano StrF, StmF, EFF, Identity, None, o crypt filter denominati in stile StdCF.
- I flussi di metadati ora rispettano EncryptMetadata=false durante i flussi di lavoro di decifratura, cifratura e copia/salvataggio invece di essere elaborati come flussi ordinari.
- I flussi di file incorporati ora portano /Type /EmbeddedFile e utilizzano il percorso di decisione del crypt-filter per file incorporati quando i documenti cifrati vengono caricati o salvati.
- I flussi di file incorporati esterni ora promuovono FDecodeParms a DecodeParms quando FFilter viene promosso a Filter, preservando i parametri di decodifica del flusso.
- I nuovi PDF cifrati con AES ora scrivono i valori Length del crypt-filter come lunghezze di bit, allineandosi al contratto del dizionario del crypt filter PDF 1.7.
- I valori Prev/XRefStm dello stream XRef e gli offset numerici grandi ora mantengono la precisione a 64 bit attraverso i percorsi del parser e SmartAccess.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 137/137 ciascuna.
v3.12.2 2026-05-08
- Migliorata la compatibilità di decodifica dei flussi PDF 1.7. La decodifica generica del flusso ora rispetta /DP come alias di DecodeParms, risolve le voci dell'array di parametri di decodifica indiretti e accetta le abbreviazioni dei filtri standard /AHx e /LZW.
- L'output PDF per file di grandi dimensioni ora scrive gli offset xref, startxref, di linearizzazione e ByteRange della firma digitale attraverso percorsi di formattazione a 64 bit invece di restringere quei valori attraverso helper interi a 32 bit.
- I documenti caricati ora trattano una voce /Version del catalogo come versione PDF effettiva quando è più recente della versione dell'header del file.
- I trailer dello stream xref riscritti non conservano più le chiavi DecodeParms solo per stream quando PDFlibPas li salva come dizionari trailer classici.
- Validazione: le suite Delphi Win32 e Win64 DUnitX hanno superato 134/134 ciascuna.
v3.12.1 2026-05-06
- I PDF generati ora si aprono con la prima pagina dimensionata all'altezza disponibile della finestra del viewer, in modo che l'intera prima pagina sia visibile dall'alto in basso al massimo zoom che si adatta alla finestra. Configurare un OpenAction personalizzato (SetOpenActionDestination, SetOpenActionMenu, SetOpenActionJavaScript) sul documento per sovrascrivere questa impostazione predefinita.
v3.12.0 2026-05-06
- I backend statici Windows ora includono oggetti SIMD NASM libjpeg-turbo per Win32 e Win64, più oggetti di dispatch SIMD x86 zlib-ng per l'insieme zlib-ng Win64x.
- Rielaborati gli script di rebuild zlib-ng in modo che le build Win64x bcc64x e le build diagnostiche MSVC compilino i file sorgente generici, SSE2, SSSE3, SSE4.1/SSE4.2, PCLMULQDQ e AVX2 con flag di funzionalità per file invece di affidarsi a un unico switch globale del compilatore.
- Aggiunti stub CRT malloc/calloc/realloc/free allineati a 32 byte per le librerie C statiche e corretto TPDFJPEGImage.Compress per rilasciare i buffer jpeg_mem_dest attraverso lo stesso percorso C free che li ha allocati.
- Espanse le note di validazione pubbliche per evidenziare la rigorosa copertura automatizzata dietro questa release: build della libreria, round trip di compressione, output /FlateDecode di HelloWorld, rendering JPEG, flussi di lavoro di immagini, font, moduli, sicurezza, firma, stampa e flussi di lavoro derivati dalle demo C++Builder.
v3.11.0 2026-05-05
- Commutata la compressione e decompressione Flate di Windows a zlib-ng in modalità compatibile con zlib. Win32, Delphi Win64 e C++Builder Win64x ora collegano insiemi di oggetti statici zlib-ng con ABI corrispondente da Lib\thirdparty\Win32, Lib\thirdparty\Win64 e Lib\thirdparty\Win64x.
- Il percorso Win64 non passa più tramite l'unità System.ZLib di Delphi, quindi la compressione/decompressione dei flussi PDF può beneficiare del backend zlib-ng proprio come la build a 32 bit.
- Aggiunto un piccolo oggetto bridge zlib-ng per le build Win64 in modo che il codice Pascal mantenga punti di ingresso stabili compatibili con zlib mentre Delphi e C++Builder consumano i propri insiemi di oggetti compatibili con il linker.
- Aggiornati tutti i progetti demo C++Builder per definire PDFLIB_CPPBUILDER, allineandosi al runner GoogleTest e prevenendo che le demo Win64x colleghino gli oggetti zlib-ng Delphi Win64.
v3.10.3 2026-05-01
- Estesa la suite GoogleTest C++Builder per coprire ogni demo sotto Demo\C++Builder. Il layout phase-1 a 7 fixture è cresciuto a 15 fixture / 52 casi GoogleTest, tutti superati su Win64x. Demo appena coperte: AddFormattedTitle, AddTextImage, AddTrueTypeSubsettedFont, AddWebLink, CanvasText, CaptureToNewSize, CopyPageRanges, CreateWithImage, CreateWithImageToStream, DoInTheStream, DrawWrappedText, EditFormField, EmbeddedFonts, ExtractAnnotAttach, ExtractEmbeddedFonts, ExtractImage, ImageToPdf, ImportEMF, MultiFunction (cambio renderer), PageOperations, PdfDecrypt, PdfPermission, PrintPDF, TextMeasure, TextPaging.
v3.10.2 2026-05-01
- Aggiunto un runner GoogleTest C++Builder sotto Tests\C++Builder che esercita Lib\PDFlibrary.pas attraverso le stesse intestazioni HPP emesse da {$JPHNE} utilizzate dalle demo C++Builder. La prima fase rispecchia sette scenari Delphi core (HelloWorld, DrawShapes, CreateTable, PdfEncrypt, ExtractText, PdfSigning, rendering PdfToImage) come 17 casi GoogleTest, tutti superati su Win64x.
- Estesa la suite Delphi DUnitX con Tests.Print che copre le demo PrintPDF e ShowPrinterBins (enumerazione stampante predefinita, configurazione stampante personalizzata, opzioni di stampa, lavoro di stampa con redirect su file) e un test di cambio renderer in Tests.Render che esercita la selezione del motore GDI+ / PDFium / Cairo della demo MultiFunction sullo stesso PDF di origine.
v3.10.1 2026-05-01
- Aggiunte 57 dimensioni di pagina denominate a SetPageSize, in modo che gli stessi nomi canonici dei formati pagina funzionino anche qui: 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
- Aggiunte versioni native C++Builder per ogni sample Delphi sotto Demo. Le demo di creazione PDF, manipolazione di pagine, font, immagini, sicurezza, firma, rendering e stampa possono ora essere compilate ed eseguite da C++Builder senza alcun wrapper lato Delphi.
- Ogni nuova demo si trova in Demo\C++Builder\<Name>\ come progetto console che consuma direttamente Lib\PDFlibrary.pas e fornisce i file di input necessari per l'esecuzione.
- Aggiunto un breve Readme.txt inglese a ogni cartella demo Delphi che descrive cosa mostra la demo, l'API su cui si concentra e come eseguirla; una panoramica HTML in Demo\Delphi\index.html collega tutte loro raggruppate per argomento.
- Rispecchiato lo stesso Readme.txt per ogni demo C++Builder con una sezione Run riscritta per il flusso di lavoro della console (argomenti argv invece di Open/SaveDialogs); un corrispondente Demo\C++Builder\index.html elenca ogni demo C++Builder con gli stessi gruppi di argomenti.
- Corretta una memory leak nella demo ImportEMF (l'istanza TPDFlib veniva creata ma mai liberata).
v3.9.14 2026-04-30
- Corretta la demo di copia di intervalli di pagine in modo che effettivamente copi le pagine invece di segnalare sempre un errore.
- Riordinate le demo di testo con a capo e di paginazione HTML in modo che ciascuna si concentri sulla propria API e venga eseguita da un singolo pulsante.
- Rinominati due progetti demo (EmbeddedFonts e PdfPermission) in modo che gli eseguibili compilati corrispondano ai nomi delle cartelle invece dei nomi prototipo più vecchi.
v3.9.13 2026-04-30
- Corretto un bug di posizione del flusso nel lettore di buffer interno: le letture di word a due byte avanzavano il cursore di lettura di quattro byte invece di due. Nei buffer più lunghi di due byte, le letture successive atterravano all'offset sbagliato e restituivano silenziosamente dati errati. L'effetto era più visibile durante l'analisi di strutture dati binarie che intercalano letture di byte e word.
- Introdotta una suite di test DUnitX automatizzata (runner di console e VCL GUI) che copre le unità utilitarie — buffer, AES, ZLib, Unicode e digest hashing — e i flussi di lavoro a livello di libreria inclusa creazione di documenti, salvataggio su file e su stream, round trip di caricamento e cifratura AES-128/AES-256.
v3.9.12 2026-04-30
- Il rendering di immagini GDI+ ora utilizza per impostazione predefinita un'interpolazione bicubica fluida e di alta qualità quando si scalano immagini raster a risoluzione di schermo o di esportazione. In precedenza l'impostazione predefinita era nearest-neighbour, che produceva artefatti visibili a gradini su piccole immagini (loghi, miniature) ingrandite per anteprima su schermo o esportazione ad alto DPI. I chiamanti che preferiscono la modalità nearest-neighbour più nitida possono ripristinare il vecchio comportamento tramite SetGDIPlusOptions.
v3.9.11 2026-04-30
- Corretto il rendering Cairo di immagini PDF che utilizzano la trasparenza color-key (un array di intervalli di colori /Mask nel dizionario dell'immagine). In precedenza, quando una pagina conteneva un'immagine con questa forma di trasparenza, il renderer Cairo ometteva interamente l'immagine invece di comporla con lo sfondo della pagina. La correzione deriva un canale alpha per pixel dagli intervalli di color-key dichiarati e rende il risultato come immagine trasparente, producendo un output visivamente coerente con il renderer GDI+.
v3.9.10 2026-04-30
- Corretta una regressione del rendering Cairo in cui tutto il contenuto della pagina successivo a una sequenza di immagini clippate veniva erroneamente confinato al rettangolo di clipping dell'immagine. Le pagine PDF che salvano lo stato grafico, applicano un percorso di clip, dipingono un'immagine, poi ripristinano lo stato — una tecnica di layout comune per immagini incorniciate o bordate — renderizzavano tutto il testo, le forme e i grafici successivi solo all'interno della regione clippata. Il salvataggio e ripristino dello stato Cairo ora mappano correttamente agli operatori PDF q/Q, in modo che la regione di clipping venga scartata dopo il disegno dell'immagine.
v3.9.9 2026-04-29
- Aggiunto un motore di rendering PDF basato su Cairo come terza opzione di rendering accanto a GDI+ e PDFium. Chiamare SelectRenderer(2) prima del rendering per attivarlo; il motore richiede cairo.dll dalla cartella DLL\Cairo in bundle. Il rendering Cairo supporta le stesse modalità di output di GDI+: esportazione di file bitmap e stream (BMP, JPEG, PNG, GIF, TIFF, G4 TIFF), rendering su contesto di dispositivo e output diretto alla stampante.
- La demo MultiFunction View/Print ora espone un selettore di renderer a tre vie in modo che gli utenti possano confrontare l'output GDI+, PDFium e Cairo fianco a fianco sullo stesso documento senza alcuna modifica del codice.
v3.9.8 2026-04-29
- Soppresse due diagnostiche del compilatore spurie nel C-runtime shim Win32 che apparivano in RAD Studio 13.1 e successivi. Un avviso di deprecazione (W1000) veniva sollevato perché un guard di capacità di versione del compilatore non veniva propagato ai compilatori più recenti di Delphi 2009, facendoli compilare contro un'API del gestore di memoria deprecata. Un hint di variabile non utilizzata (H2164) veniva sollevato per una variabile di compatibilità interna necessaria solo per le build Delphi 7; ora è limitata al blocco condizionale di quella versione. Entrambi i problemi erano solo diagnostici senza impatto a runtime.
v3.9.7 2026-04-29
- Aggiunto il rendering di pagine opzionale basato su PDFium su Windows, incluso il rendering stream BMP, il rendering su contesto di dispositivo, il rendering in memoria e l'output alla stampante.
- Aggiornata la demo Delphi MultiFunction View/Print con un selettore di renderer in modo che gli utenti possano commutare tra il renderer GDI+ esistente e PDFium.
v3.9.6 2026-04-29
- Aggiunti script Inno Setup separati per il pacchetto PDFlibPas completo e il pacchetto trial, con esclusioni focalizzate sulla release per metadati di controllo del codice sorgente, output di build, cache IDE, file di agent locali e alberi di sorgenti di terze parti in bundle che non fanno parte del pacchetto consegnato.
- Il programma di installazione trial ora compila e impacchetta librerie binarie trial per RAD Studio 11.3, 12.3 e 13.1, più le demo Delphi trial, prima che venga generato l'eseguibile di setup.
v3.9.5 2026-04-29
- Corrette le build della libreria Win32 sotto RAD Studio 9.0 / Delphi XE2. Lo script di build passava un flag di directory di output DCU che esiste solo da Delphi 2010 in poi; il compilatore di XE2 interpretava il flag diversamente, producendo un percorso di output confuso e un errore fatale prima che qualsiasi file sorgente venisse elaborato. Lo script ora seleziona automaticamente il flag appropriato in base alla versione del compilatore target.
- Corretto un guard di versione del compilatore correlato nel codice sorgente della libreria che chiamava una funzione runtime con nome qualificato introdotta in XE4 sotto una condizione XE2+. Le build che hanno come target XE2 e XE3 ora risolvono correttamente l'import di compatibilità corretto.
v3.9.4 2026-04-29
- Corretta la configurazione della stampante per stampanti di rete e condivise da server applicando le impostazioni di vassoio carta, supporto, fronte/retro, qualità e altre impostazioni di stampa tramite l'handle DEVMODE della stampante invece dell'handle del contesto di dispositivo della stampante.
v3.9.3 2026-04-29
- Aggiornato il backend AES in bundle alle sorgenti AES 2018 di Brian Gladman sia su Win32 che Win64. Gli script di build riproducibili ora consentono di ricostruire gli oggetti AES statici dalla sorgente in qualsiasi momento. Un difetto ABI nelle binding Pascal è stato scoperto e corretto nel processo: alle funzioni di cifratura e decifratura AES-CBC mancava la dichiarazione di convenzione di chiamata C, quindi le build Win32 passavano silenziosamente gli argomenti nell'ordine sbagliato dei registri, producendo potenzialmente output cifrato errato. Le build Win64 non erano interessate perché la piattaforma impone una convenzione di chiamata uniforme.
- Rafforzati gli script di rebuild di terze parti in modo che gli script zlib, JPEG e CRT-stub basati su MSVC possano essere lanciati dalla radice del repository oltre che dalla directory thirdparty; in precedenza richiedevano che la directory di lavoro fosse impostata sulla cartella thirdparty.
v3.9.2 2026-04-29
- Aggiornato il backend JPEG 2000 dal vecchio OpenJPEG 1.5 a OpenJPEG 2.5.4 sia su Win32 che Win64. Entrambe le piattaforme ora utilizzano il linking statico degli oggetti, quindi la codifica e decodifica JPEG 2000 funzionano senza una DLL runtime aggiuntiva. Il codec moderno porta la gestione corrente dell'header JP2/J2K, un'API di stream guidata da callback e bug fix e fix di sicurezza accumulati dal progetto upstream. L'API pubblica TJpeg2000Bitmap è invariata.
v3.9.1 2026-04-29
- Corretto il rendering di pagine JPEG e l'esportazione di immagini dopo l'aggiornamento di libjpeg-turbo, ripristinando la conversione JPG di PdfToImage e l'output TPDFJPEGImage.SaveToStream su Win32 e Win64.
- Corrette le binding ABI Win32 di libjpeg-turbo in modo che callback, allineamento di struttura, campi booleani e destinazioni JPEG basate su memoria corrispondano a libjpeg-turbo 3.1.90.
- Corretta la decompressione del flusso FlateDecode Win32 con il backend zlib 1.3.2 in bundle, ripristinando il caricamento del flusso xref PDF per file come il documento di esempio PdfToImage.
v3.9.0 2026-04-29
- Aggiornato il backend JPEG 2000 in bundle dal vecchio OpenJPEG 1.5 a OpenJPEG 2.5.4. Il caricamento e salvataggio JPEG 2000 ora utilizzano il codec moderno, l'API di stream guidata da callback e la gestione corrente dell'header JP2/J2K preservando l'API pubblica TJpeg2000Bitmap.
- L'output JPEG 2000 ora seleziona automaticamente un conteggio di risoluzione OpenJPEG valido per immagini piccole, e il backend statico Win32 non dipende più da export helper MSVCRT mancanti.
v3.8.1 2026-04-29
- Eliminati tutti i 16 avvisi cosmetici del linker W1028 "Bad global symbol definition" su Win32 e Win64. Le rinominazioni a livello di sorgente rimuovono i duplicati lato Pascal ridondanti (jpeg_std_error e gli stub di allocatore jmemnobs ora si risolvono esclusivamente dal layer obj); i tre simboli obj bcc32 / vc64 rimanenti (jpeg_natural_order, jpeg_aritab, jpeg_nbits_table) che devono rimanere risolti dal linker contro i dati lato Pascal vengono ora spogliati dei loro nomi di simbolo COFF tramite una fase di post-elaborazione ObjConv durante thirdparty\build-jpeg-vc64.bat. Nessuna modifica all'API pubblica; output del linker pulito sia per le build Delphi Win32 che Win64.
v3.8.0 2026-04-29
- Codec JPEG Win64 aggiornato da libjpeg in stile IJG a libjpeg-turbo 3.1.90, completando la migrazione JPEG iniziata in v3.7.0 (Win32). Entrambi i percorsi Win32 e Win64 condividono ora lo stesso codec JPEG moderno, con gli stessi cicli interni ottimizzati SIMD e oltre 30 fix CVE / fuzz accumulati dall'upstream. API pubblica PDFlibPas invariata.
v3.7.0 2026-04-28
- Codec JPEG Win32 aggiornato da IJG libjpeg-6b a libjpeg-turbo 3.1.90. Codifica/decodifica JPEG significativamente più veloce grazie a cicli interni ottimizzati SIMD, più gli oltre 30 fix CVE / fuzz accumulati nell'upstream libjpeg-turbo. L'API pubblica PDFlibPas (classe TPDFJPEGImage, funzioni DumpJPEG) è invariata; i percorsi di codice PDF/JPEG esistenti funzionano più velocemente senza modifiche al codice sorgente richieste.
v3.6.0 2026-04-28
- Win32 zlib aggiornato da 1.2.x a 1.3.2. Include i 25+ fix CVE / fuzz standard accumulati upstream dal 1.2.8, più i nuovi punti di ingresso inflateBack9 / inflateTree9 utilizzati dai flussi a finestra a 64 bit. L'API pubblica PDFlibPas (DeflateStr / InflateStr / InflateStrParms) è invariata.
- Il percorso zlib Win64 è invariato in questa release - continua a utilizzare l'unità System.ZLib in bundle con Delphi.
- Attivato lo shim CRT al link-time Win64 PDFlibCLibs.pas (introdotto in v3.5.0) per il percorso zlib Win32, fornendo i simboli memcpy / memset / malloc / free che i nuovi file obj zlib 1.3.2 referenziano.
v3.5.0 2026-04-28
- Aggiunta infrastruttura di build fresca per le librerie C di immagini / compressione in bundle: zlib 1.3.2, libjpeg-turbo 3.1.90, libtiff 4.7.1. Gli script di build sia per Embarcadero bcc32 (Win32) che MSVC cl.exe (Win64) si trovano in Lib/thirdparty/ insieme agli alberi sorgente, in modo che chiunque abbia RAD Studio + VS2022 possa ricostruire i file obj statici da sorgenti pulite.
- Aggiunta infrastruttura di build per OpenJPEG 2.5.4. L'albero sorgente OpenJPEG stesso viene recuperato indipendentemente dall'utente (git clone uclouvain/openjpeg in Lib/thirdparty/OpenJPEG/) in modo che possa essere aggiornato senza toccare la configurazione di build di PDFlibPas.
- Aggiunto Lib/PDFlibCLibs.pas, uno shim CRT a tempo di link Win64 usato dal backend Win64. Colma il divario tra i file obj C compilati con MSVC e i linker Win64 di Delphi (dcc64 / Win64x ld.lld / BCB ilink64), che non includono automaticamente msvcrt.dll.
v3.4.0 2026-04-28
- Rafforzata la generazione della chiave di cifratura, del vettore di inizializzazione AES e del blocco di permessi Perms contro fonti di numeri casuali prevedibili. I PDF cifrati prodotti su sistemi avviati in tempi di wall-clock vicini non sono più banalmente correlabili; i documenti AES-256 ora mantengono la loro piena forza chiave.
- Rafforzato il parsing del dizionario delle immagini contro PDF malformati o ostili che dichiarano conteggi Width, Height, BitsPerComponent o componenti DeviceN irragionevoli. I valori fuori intervallo vengono limitati prima di qualsiasi aritmetica sui buffer di pixel, prevenendo crash all'apertura di tali file.
- Rafforzata la traversata cross-reference e dell'albero delle pagine contro documenti le cui catene xref /Prev o link di pagina /Parent formano un ciclo o sono eccessivamente profonde. Il lettore ora rifiuta le strutture malformate in modo pulito invece di ricorrere finché non esaurisce lo stack.
v3.3.1 2026-04-27
- Razionalizzati gli script di build Windows per componente. Le cartelle DLL/, OCX/ e Dylib/ non portano più varianti separate build12-* / build13-*: ciascuna piattaforma ora ha un singolo script build-Win32 / build-Win64 che si fissa al più recente RAD Studio e accetta un argomento opzionale "debug".
- Aggiunti commenti inline di motivazione attorno alle correzioni di rendering PDFlibRenderer.pas che erano già presenti nella baseline Git iniziale. I commenti documentano perché SetPen scala le larghezze di tratto tramite la trasformazione canvas attiva e perché gli operatori d0/d1 di CharProc dei font Type 3 devono consumare i loro operandi. Nessuna modifica del comportamento a runtime.
v3.3.0 2026-04-26
- Corretto il rendering dei tratti trasformati in PDFlibRenderer.pas. SetPen ora applica la scala della trasformazione canvas corrente alle larghezze di linea PDF prima di chiamare Picasso, prevenendo tratti sovradimensionati o sottodimensionati su percorsi le cui coordinate sono già state trasformate. Ciò corregge i contorni dei glifi Type 3 che potrebbero renderizzare come blocchi spessi e irregolari.
- Corretta la gestione di CharProc d0/d1 dei font Type 3 nel parser del flusso di contenuto. d0 ora consuma i suoi due operandi di larghezza, e d1 consuma i suoi sei operandi di larghezza/bounding box prima dell'esecuzione dei comandi di disegno successivi, prevenendo che operandi obsoleti corrompano la geometria dei glifi o dei percorsi.