Note di rilascio PDFiumPas
Cronologia delle versioni per funzioni visibili all'utente, correzioni, miglioramenti del visualizzatore, generazione documenti, output PDF/A, rendering e aggiornamenti della documentazione di PDFiumPas
Ultima versione
- Versione più recente: 2.21.3; Data di rilascio:
Version 2.27.0
Modificato (Changed)
- Le demo Delphi, C++Builder e Lazarus
PDFViewereMultiPageViewerora eseguono una ricerca circolare nei documenti, accettanoEntereF3per il risultato successivo, reimpostano il contesto quando cambiano le opzioni e riservanoEscalla cancellazione di una ricerca o stampa attiva - La stampa del visualizzatore segue ora la rotazione corrente e seleziona di conseguenza l'output verticale o orizzontale, riflettendo la rotazione della barra degli strumenti nelle pagine stampate
- Tutte e tre le demo
ViewerInteractionLabsupportano ora le scorciatoieCtrl+A,Ctrl+C,Enter,F3eEscsenza intercettare i comandi nativi di selezione e copia dei controlli di modifica
Corretto (Fixed)
- La cancellazione della stampa del visualizzatore in C++Builder e Lazarus interrompe ora il lavoro della stampante invece di inviare le pagine renderizzate prima della cancellazione, e Lazarus esce esplicitamente da ogni ciclo annidato di copie, pagine e fascicolazione
- Il pulsante Annulla di
MultiPageViewerDelphi è ora collegato al relativo gestore, mentre i campi di ricercaMultiPageViewerC++Builder/Lazarus mantengono la modifica nativa con i tasti freccia, Home ed End
Version 2.26.0
Modificato (Changed)
TPdf.GetObjectBitmap,TPdf.GetBitmap,TPdf.GetThumbnaile i corrispondenti metodiTPdfViewacquisiscono ora il lock di rendering attorno alla chiamataFPDFImageObj_GetBitmap/FPDFPage_GetThumbnailAsBitmap, comeRenderPage/RenderTile. Queste chiamate lato rendering PDFium prima venivano eseguite senza lock e potevano competere conUnloadPage/ReloadPageconcorrenti sullo stesso documentoTPdf.RenderPageThumbnailora rispetta la voce/Rotate: per pagine/Rotate 90o270il fitting viene ricalcolato sulle dimensioni ruotate, così le proporzioni della miniatura corrispondono al visualizzatore invece di usare le dimensioni intrinseche non ruotate restituite daFPDF_GetPageSizeByIndex
Corretto (Fixed)
TPdfView.GetCharacterRectangleignorava il valore restituito daFPDFText_GetCharBoxe passava unTPdfRectanglenon inizializzato aPageToDevicequando PDFium segnalava un errore. Il rettangolo è ora inizializzato a zero e unGetCharBoxfallito restituisceRect(0,0,0,0)- La lunghezza del buffer per percorso URI e percorso file di
GetLinkAnnotationsera errata di uno: la seconda chiamataFPDFAction_GetURIPath/GetFilePathpassavasize, che include il NUL finale, a un buffer allocato comesize-1. Ora passasize-1e non può scrivere oltre l'allocazione nelle build PDFium che non applicano un limite interno
Version 2.25.0
Modificato (Changed)
TPdf.AddText,SetText,AddPatheInsertFormObjectFromXObjectinvalidano ora la pagina di testo e le annotazioni link memorizzate nella cache prima di rigenerare il contenuto, comeSetTextPositionseRemoveObject. Prima una chiamataGetText/GetWebLinks/FindFirstdopo una modifica restituiva dati obsoleti catturati prima della modifica e il handleFPDF_TEXTPAGEconservato veniva usato dopo la rigenerazione con comportamento indefinitoTPdfView.RenderPage(HDC, ...)acquisisce ora il lock di rendering e maschera le eccezioni FPU/SSE attorno aFPDF_RenderPage, come ogni altro punto di ingresso di rendering. Il precedente overload diretto su DC poteva competere conUnloadPage/ReloadPageconcorrenti e lasciava non mascherate le eccezioni FPU sui compilatori precedenti a D12- La demo Delphi
PrintPDFora chiamaPrinter.Abortin caso di cancellazione invece di permettere al bloccofinallydi raggiungerePrinter.EndDoc, che inviava le pagine renderizzate prima della cancellazione. La demo Lazarus lo gestiva già correttamente
Corretto (Fixed)
TPdf.GetCharacter,TPdf.GetCharcodee i corrispondenti metodiTPdfViewtroncavano a 16 bit bassi tramiteWideChar()i punti di codice oltre il piano BMP (emoji, CJK Extension B) restituiti daFPDFText_GetUnicode, producendo un surrogato isolato. Ora i caratteri sopra U+FFFF restituiscono U+FFFD (carattere di sostituzione); usareGetTextper il codice UTF-16 completoGetWebLinkschiamavaSetLength(Rectangles, FPDFLink_CountRects(...))senza proteggere il ritorno-1, causandoEOutOfMemorysu pagine malformate. Un conteggio negativo viene ora limitato a zeroTPdf.Destroyora cancella dalla memoria la stringaPassword(tramiteUniqueString+FillChar) prima di rilasciare il buffer con conteggio dei riferimenti, così la password non resta leggibile nell'heap dopo la distruzione del componente
Version 2.24.0
Aggiunto (Added)
TPdf.DeletePage,GetAttachment,GetAttachmentName,GetAttachmentType,SetAttachmenteDeleteAttachmentora convalidano l'indice di pagina o allegato e generanoEPdfErrorper un valore fuori intervallo, in linea con gli accessor delle annotazioni esistenti. Prima un indice fuori intervallo veniva passato direttamente a PDFium e produceva un no-op silenzioso o comportamento indefinito
Corretto (Fixed)
- Perdite di handle degli oggetti di pagina in caso di errore in
TPdf.AddText,AddBitmapeAddJpegImage: seFPDFText_SetText,FPDFImageObj_SetBitmap,FPDFImageObj_SetMatrixoFPDFImageObj_LoadJpegFileInlinegenerava un'eccezione dopo la creazione dell'oggetto ma prima cheFPDFPage_InsertObjectlo consegnasse alla pagina, l'handle nativoFPDF_PAGEOBJECTperdeva memoria. Ora ogni percorso distrugge l'oggetto prima di rilanciare l'eccezione TPdf.UnloadPageeliminava un handleFPathin corso (impostato daCreatePathma non ancora consumato daAddPath) assegnandoglinilsenza chiamareFPDFPageObj_Destroy. Ora l'handle viene distrutto e un percorso abbandonato o interrotto da un cambio pagina non perde più memoriaTPdf.InsertFormObjectFromXObjectometteva la chiamataUpdatePage(FPDFPage_GenerateContent) eseguita da ogni inserimento affine, perciò un Form XObject inserito in questo modo spariva al successivo reload o salvataggio.UpdatePageviene ora chiamato dopo l'inserimento
Version 2.23.0
Corretto (Fixed)
- La convalida del contenuto opzionale
/BaseStateaccetta ora/OFFoltre a/ON(ISO 32000-1 Table 8.70 consente entrambi). Il controllo precedente rifiutava configurazioni conformi/OCProperties /D /BaseState /OFFcon un errore di contenuto opzionale malformato - La convalida del contenuto opzionale
/Intentaccetta ora/Designe array di nomi come[/View /Design], non solo il letterale/View. ISO 32000-1 Table 8.70 definisce/Intentcome nome o array di nomi scelti tra/Viewe/Design; il precedente controllo a valore singolo rifiutava troppo output standard - Il rilevamento del dizionario Measure geospaziale per la soglia PDF 1.7
/Extensions /ADBEExtensionLevel 3 non richiede più/Type /Measure, indicato come opzionale da ISO 32000-1 Table 254. I produttori GeoPDF che omettono/Type(PDFBox, QGIS, FME) aggiravano prima la soglia producendo silenziosamente output PDF 1.7 non conforme; il rilevatore ora corrisponde al solo/Subtype /GEO
Version 2.22.0
Modificato (Changed)
- I calcoli dello zoom di adattamento di
TPdfView(GetPageZoom,GetPageWidthZoom,GetPageHeightZoom) usano oraClientWidth/ClientHeightinvece diWidth/Heightdella finestra, cosìpfmFitPage/pfmFitWidth/pfmFitHeightdimensionano la pagina sul viewport visibile anziché sulla cornice esterna con barre di scorrimento e bordi, eliminando la barra ridondante che appariva quando la pagina adattata era leggermente più grande dell'area client AddSignatureTimestampToCmsora genera unaExceptionesplicita che identifica il campo CMS SignerInfo non leggibile (version / sid / digestAlgorithm / signedAttrs / signatureAlgorithm) invece di eseguire silenziosamenteExite lasciare proseguire una parte del parsing come se fosse un CMS firmato completo; è corretto anche il bloccobegin/endmancante nel ramo opzionalesignedAttrs [0]che lasciavaR.Positioninvariato
Corretto (Fixed)
- Perdita dell'handle della chiave privata CNG in
ResolveWinSigner: quandoCryptAcquireCertificatePrivateKeyriusciva ma l'estrazione successiva di issuer/seriale oTWinCmsSigner.Creategenerava un'eccezione,NCryptKeyHandlenon veniva liberato perché la proprietà passava al signer solo dopo un costruttore riuscito. La configurazione dopo l'acquisizione è ora protetta e l'handle viene rilasciato tramiteNCryptFreeObjectal primo errore EcDsaP1363ToDerrifiuta ora una metàrostutta a zero invece di emettereINTEGER 0; le firme ECDSA conr = 0os = 0non sono valide (RFC 4754 §6 / FIPS 186-4 §6 richiedono1 ≤ r, s ≤ n-1) e altrimenti potrebbero essere accettate come autentiche da un verificatore permissivo
Version 2.21.3
Corretto (Fixed)
- I salvataggi espliciti in PDF 1.3 ora rifiutano gli alberi dei nomi
/EmbeddedFilesdel documento, che richiedono PDF 1.4 o versione successiva, senza rifiutare gli stream di file incorporati referenziati tramite specifiche di file più vecchie
Version 2.21.2
Corretto (Fixed)
- Versione più recente: 2.21.4; Data di rilascio:
Version 2.21.1
Corretto (Fixed)
- La validazione dei riferimenti ibridi ora applica le voci supplementari
/XRefStmprima dei segnaposto xref classici della stessa revisione, in modo che le annotazioni compresse e altri oggetti condizionati dalla versione non vengano più ignorati quando la tabella di compatibilità li segna come liberi
Version 2.21.0
Modificato (Changed)
- Tutti gli esempi di visualizzatore Delphi, C++Builder e Lazarus possono aprire un PDF passato come primo argomento della riga di comando, e gli esempi
MultiPageViewerdi C++Builder e Lazarus forniscono scorciatoie esplicite per seleziona tutto e copia
Corretto (Fixed)
- Versione più recente: 2.21.12; Data di rilascio:
Version 2.20.0
Modificato (Changed)
- Tutti gli esempi di visualizzatore Delphi, C++Builder e Lazarus forniscono ora scorciatoie coerenti per apertura, ricerca, salvataggio, stampa, zoom e navigazione delle pagine, mentre ogni variante di
ViewerInteractionLabsupporta anche salti di pagina, zoom manuale validato tra 10–600%, log di interazione persistenti e verifiche di andata e ritorno delle coordinate di clic
Version 2.19.1
Corretto (Fixed)
- La validazione esplicita della versione PDF segue ora la catena di revisione classica, ibrida o xref-stream attiva, incluse le voci di oggetti compressi, in modo che gli oggetti superati, liberati e non referenziati non causino più falsi errori di versione della funzionalità
Version 2.19.0
Modificato (Changed)
- Gli esempi di allegati, estrazione immagini, estrazione testo, conversione pagine e suddivisione di C++Builder e Lazarus ora utilizzano cartelle di output dedicate o file finalizzati in modo sicuro, nomi stabili con zero padding, aggiornamenti di avanzamento reattivi e riepiloghi di completamento con conteggi di errori per elemento
Corretto (Fixed)
- Il
CJKTextLabdi C++Builder ora misura il testo tramite le funzioni di modifica PDFium esportate, eMergePDFevita un sovraccarico di messaggi VCL ambiguo, ripristinando build pulite di RAD Studio 37
Version 2.18.3
Corretto (Fixed)
- Il Document Time-stamp PAdES B-LTA è ora registrato come campo firma individuabile — un Widget invisibile raggiungibile tramite
/Annotsdella prima pagina e/Fieldsdell'AcroForm (ETSI EN 319 142-1 §5.4.3) — invece di un oggetto orfano irraggiungibile che i validatori che enumerano i campi firma non riuscivano a trovare; le annotazioni e i campi esistenti vengono preservati
Version 2.18.2
Corretto (Fixed)
- La firma PAdES e la scrittura classica di riferimenti incrociati ora generano un errore chiaro quando un offset di byte supera la larghezza del campo fisso a 10 cifre (~9,3 GB) invece di lasciare silenziosamente il segnaposto
/ByteRangenon scritto (producendo una firma non valida) o di sforare la riga xref a 20 byte (ISO 32000-1 §7.5.4); l'output dello stream di riferimenti incrociati usa campi binari a 8 byte e non è interessato
Version 2.18.1
Corretto (Fixed)
- La firma PAdES ora risolve i riferimenti indiretti a
/Annots,/AcroForme/Fieldsdella prima pagina tramite l'intestazione dell'oggetto intero (ISO 32000-1 §7.5.3) e il numero di generazione effettivo del riferimento; una ricerca su sottostringa nuda corrispondeva in precedenza a un numero di oggetto all'interno di uno più lungo (risolvendo5 0 Rin15 0 obj) e una generazione fissa ignorava gli oggetti congen>0, corrompendo gli array del campo firma o rifiutando documenti validi - Quando il catalogo, la prima pagina,
/Annots,/AcroFormo/Fieldssi trovano all'interno di uno stream di oggetti, la firma ora ritenta su una copia espansa prima di fallire invece di rifiutare il documento immediatamente
Version 2.18.0
Aggiunto (Added)
ReadPdfVersionInforiporta la versione dell'intestazione, la versione core effettiva, l'override del catalogo e il livello di estensione sviluppatore Adobe da uno stream PDF
Modificato (Changed)
- I salvataggi espliciti in PDF 1.3-1.7 ora validano le strutture del catalogo, delle risorse di pagina, XFA, di redazione e delle estensioni sviluppatore nel contesto dell'oggetto proprietario; l'output con versione esplicita crittografato e la normalizzazione incrementale di PDF 1.3 vengono rifiutati per preservare l'integrità del documento
- I salvataggi su percorso file ora scrivono su un file temporaneo adiacente e sostituiscono la destinazione solo dopo che tutti i controlli di compressione, normalizzazione e versione hanno avuto successo
Corretto (Fixed)
- L'output PDF 1.3 ora include la risorsa
/ProcSetcompleta richiesta e rimuove le chiavi di trasparenza PDF 1.4 quando ripetono solo i valori iniziali dello stato grafico PDF 1.3 - I file di riferimenti ibridi, stream xref e stream di oggetti non vengono più riscritti dal compressore xref classico, impedendo che le voci di oggetti compressi vengano eliminate
- I nomi che assomigliano a chiavi di funzionalità di trasparenza o catalogo all'interno di stringhe, commenti o mappe di risorse non correlate non causano più falsi errori di versione target
Version 2.17.0
Aggiunto (Added)
- Le firme PAdES sono ora registrate come annotazioni Widget invisibili nell'array
/Annotsdella prima pagina e nell'array/Fieldsdell'AcroForm, preservando le annotazioni e i campi modulo esistenti
Modificato (Changed)
- Gli aggiornamenti incrementali di PDF/A, PDF/X, PDF/E, PDF/R, PDF/UA, PDF/VT e PAdES ora preservano la rappresentazione dei riferimenti incrociati sorgente: i documenti con stream xref ricevono un aggiornamento dello stream xref come richiesto da ISO 32000-1 §7.5.8.1, mentre i documenti classici continuano a ricevere una tabella xref
- Gli offset dei riferimenti incrociati,
startxref,/Prev, i valori ByteRange PAdES e l'elaborazione degli intervalli SHA-256 ora usano posizioni a 64 bit con hashing a blocchi, abilitando file di dimensioni superiori a 2 GB nelle build a 64 bit - I pacchetti XMP scrivibili generati riservano ora 2048 byte di padding prima dell'istruzione di chiusura del pacchetto
Version 2.16.10
Corretto (Fixed)
- L'espansione dello stream di oggetti non resuscita più copie obsolete di oggetti che un aggiornamento incrementale ha migrato fuori dallo stream di oggetti in una definizione semplice (ISO 32000-1 §7.5.7); i controlli di conformità e l'iniezione di marcatori in precedenza risolvevano il catalogo o il dizionario di metadati obsoleto su tali file
Version 2.16.9
Corretto (Fixed)
- Su Free Pascal, le stringhe di testo il cui input non è UTF-8 valido vengono allargate byte per byte come Latin-1 e scritte come stringhe esadecimali UTF-16BE; i byte alti grezzi in precedenza fuoriuscivano in una stringa letterale, che non è una codifica di stringa di testo PDF 1.7 legale
- La decodifica dello stream ora riconosce i dati deflate grezzi senza il wrapper zlib RFC 1950 (un difetto comune di scrittori difettosi) e li decomprime in modalità raw, in modo che le scansioni di conformità non diventino più silenziosamente cieche su tali stream
Version 2.16.8
Corretto (Fixed)
- Gli aggiornamenti incrementali scritti dal percorso di post-elaborazione del salvataggio ora aggiornano il secondo elemento
/IDdel trailer in modifica come richiesto da ISO 32000-1 §14.4; entrambi gli elementi venivano in precedenza copiati verbatim, in modo che gli strumenti di caching e sincronizzazione vedessero un identificatore invariato dopo ogni aggiornamento
Version 2.16.7
Corretto (Fixed)
- L'azzeramento del corpo dello stream usato dalle scansioni di conformità ora richiede che la parola chiave
streamsia seguita da un fine riga (ISO 32000-1 §7.3.8.1); la parola all'interno di una stringa letterale come(downstream)in precedenza azzerava tutta la struttura successiva fino al prossimoendstream, nascondendo le violazioni reali ai controlli a livello di byte - Le scansioni delle funzionalità vietate di PDF/X e PDF/E azzerano inoltre le stringhe letterali e i commenti (§7.2.2), in modo che un valore come
/Title (see /JavaScript docs)o un token commentato non produca più un falso rilevamento diJavaScript,AcroFormoLZWDecode
Version 2.16.6
Corretto (Fixed)
- Le voci DPM di PDF/VT vengono ora validate al momento della scrittura come documentato: i nomi di chiave che violano la regola NMTOKEN di ISO 16612-2 §6.6 o la regola del prefisso del registrante dell'Allegato E, e i nomi duplicati, vengono rifiutati invece di essere scritti nel dizionario DPart — un nome contenente uno spazio in precedenza si divideva in una coppia chiave/valore fasulli e corrompeva il dizionario
Version 2.16.5
Corretto (Fixed)
- La rimozione di una voce del dizionario il cui valore è una stringa esadecimale (come
/Check <...>) ora rimuove l'intera voce; gli iniettori in precedenza lasciavano un valore esadecimale orfano, producendo un dizionario sintatticamente non valido - La rimozione di una voce il cui riferimento indiretto usa a capo tra i token (ISO 32000-1 §7.3.10 consente qualsiasi spazio bianco) non lascia più il numero di generazione e la parola chiave
R
Version 2.16.4
Corretto (Fixed)
- La scansione del numero massimo di oggetti non richiede più che le intestazioni degli oggetti inizino una riga (ISO 32000-1 §7.5.3 consente qualsiasi spazio bianco o delimitatore prima di esse), in modo che gli iniettori non possano più allocare un numero di oggetto che collide con un'intestazione
N G objinline e corrompere silenziosamente il file; i numeri di oggetto sono limitati dal tetto dell'Allegato C - Gli stream il cui
/Lengthè un riferimento indiretto ora risolvono l'oggetto intero referenziato e ne usano il valore quando coincide con ilendstreamdi chiusura; in precedenza tali stream erano delimitati da una ricerca per pattern, che troncava i corpi contenenti legalmente la sequenza di byteendstream— tipico per allegati PDF incorporati
Version 2.16.3
Corretto (Fixed)
- I passaggi di compressione dello stream trasmettono invariati i documenti con stream di riferimenti incrociati (file PDF 1.5+ senza la parola chiave
trailerclassica); il percorso di ricostruzione in precedenza interpretava erroneamentestartxrefcome posizione della tabella e sintetizzava un trailer ipotetico, che poteva produrre un file non apribile - Il compressore salta gli stream di metadati XMP in modo che un documento PDF/A mantenga il suo stream di metadati obbligatoriamente non filtrato (ISO 19005-1 §6.7.2), e lascia invariati gli stream di file esterni (
/Fcon/FFilter) - La tabella dei riferimenti incrociati ricostruita esegue la scansione di una copia del documento senza stream, in modo che il contenuto binario degli stream non possa più simulare intestazioni di oggetti o gonfiare la tabella; il
/Sizedel trailer ricostruito riflette ora la tabella effettiva e i numeri di oggetto sono limitati al tetto dell'Allegato C - L'individuazione della tabella dei riferimenti incrociati originale accetta terminazioni di riga solo CR (ISO 32000-1 §7.5.1) e non può più corrispondere alle lettere
xrefall'interno distartxref; la scansione delle parole chiave degli stream ha guadagnato la stessa protezione dalla codaendstreamusata altrove e ora avanza oltre i corpi di stream saltati
Version 2.16.2
Corretto (Fixed)
- L'analisi dei numeri interi nei lettori PDF a livello di byte ora accetta il segno esplicito
+consentito da ISO 32000-1 §7.3.3 e rifiuta le sequenze di cifre che andrebbero in overflow, in modo che documenti ostili o corrotti non possano più avvolgere lunghezze e offset analizzati in valori fuorvianti
Version 2.16.1
Corretto (Fixed)
- L'iniettore PDF/UA scrive il valore
/Langdel catalogo come stringa di testo PDF corretta; in precedenza eseguiva il valore attraverso l'escape XML, in modo che un tag di lingua contenente&o parentesi producesse una voce corrotta, e l'input non ASCII veniva scritto come UTF-8 grezzo - La voce Info
/ISO_PDFEVersiondi PDF/E usa il codificatore di stringhe di testo condiviso, mantenendo i valori non ASCII legali in PDF 1.7 - L'escape XML per i pacchetti XMP elimina i caratteri di controllo non legali in XML 1.0, in modo che i metadati copiati da un documento sorgente danneggiato non possano più rendere l'intero stream di metadati non ben formato
- La conversione da data PDF a XMP valida che i campi data siano numerici e aggiunge un campo minuti mancante, prevenendo date ISO 8601 malformate negli XMP generati; sulle piattaforme non Windows il timestamp di fallback include ora l'orario del giorno invece della sola data
Version 2.16.0
Aggiunto (Added)
- La decodifica degli stream ora ricostruisce i predittori
/DecodeParms(predittori PNG 10-15 e predittore TIFF 2, ISO 32000-1 §7.4.4.4) dopo FlateDecode, rispettando/Colors,/BitsPerComponente/Columns; gli stream di oggetti compressi con un predittore — una scelta comune dei writer PDF 1.5+ — in precedenza mostravano byte differenziati, quindi gli oggetti che contengono erano silenziosamente invisibili alle scansioni di conformità e all'iniezione di marcatori
Corretto (Fixed)
- Il rilevamento di FlateDecode ora analizza il valore
/Filtercome nome o array invece di una corrispondenza su sottostringa, in modo che le catene di filtri a cascata e le occorrenze della parola all'interno di valori non correlati non inneschino più un gonfiaggio fasullo; le catene non supportate tornano ai byte grezzi come prima
Version 2.15.1
Corretto (Fixed)
- Lo scanner del dizionario ora salta le stringhe letterali, le stringhe esadecimali e i commenti bilanciando
<</>>(ISO 32000-1 §7.2.2), in modo che i dizionari contenenti valori come(A >> B)o una stringa esadecimale adiacente al delimitatore di chiusura non vengano più troncati durante l'analisi del trailer, del catalogo e della scansione di conformità - L'estrazione di stringhe letterali ora decodifica l'intero set di escape della Tabella 3 §7.3.4.2 —
\n \r \t \b \f, ottale\ddd, continuazioni di riga e normalizzazione EOL senza escape — invece di copiare verbatim la lettera di escape, ripristinando confronti corretti di/Producer,/GTS_PDFXVersione/ISO_PDFEVersionper i writer che usano escape ottali - Le stringhe letterali scritte dagli iniettori di marcatori ora eseguono l'escape di CR, LF e altri caratteri di controllo in modo che i valori sopravvivano byte per byte alla normalizzazione del fine riga lato lettore
Version 2.15.0
Corretto (Fixed)
- Gli aggiornamenti incrementali scritti dagli iniettori di marcatori PDF/A, PDF/X, PDF/E, PDF/R, PDF/UA e PDF/VT e dai percorsi di firma PAdES e DSS ora preservano l'identificatore di file permanente del documento sorgente: il primo elemento
/IDdel trailer viene trasportato verbatim come richiesto da ISO 32000-1 §14.4 e solo il secondo elemento (in modifica) viene aggiornato; in precedenza entrambi gli elementi venivano rigenerati, in modo che i riferimenti esterni e i flussi di lavoro di validazione a lungo termine vedessero un'identità del documento diversa dopo ogni salvataggio - Le firme PAdES, l'iniezione DSS e i Document Time-stamp B-LTA ora trasportano in avanti il riferimento
/Infodel trailer sorgente (ISO 32000-1 §7.5.6), in modo che le proprietà del documento non scompaiano più dai pannelli del lettore dopo la firma; il trailer del Document Time-stamp guadagna anche l'array/ID - Il fallback
/Infodel trailer per i documenti con stream di riferimenti incrociati ora individua correttamente il dizionario dello stream XRef e preserva il numero di generazione del riferimento; in precedenza non corrispondeva mai su file PDF 1.5+ conformi, eliminando silenziosamente/Info
Version 2.14.4
Corretto (Fixed)
- La data
/Mdel dizionario firma scritta daTPdf.SignPadeseSignPadesBytesora include il prefisso obbligatorioD:e il marcatore offset UTCZrichiesti da ISO 32000-1 §7.9.4; i validatori rigorosi in precedenza rifiutavano l'ora di firma come stringa di data malformata
Version 2.14.3
Corretto (Fixed)
- Le ricerche di chiavi del dizionario nel lettore PDF condiviso ora corrispondono a token nome interi (ISO 32000-1 §7.3.5); in precedenza uno stream il cui dizionario elencava
/Length1prima di/Length(tipico per gli stream FontFile) veniva troncato al numero di byte errato, rendendo cieche silenziosamente le scansioni di conformità PDF/A, PDF/UA e altre che leggevano stream di font, CMap o metadati - Le ricerche del trailer
/Encrypt,/Root,/Sizee/Infonon corrispondono più a chiavi più lunghe che condividono lo stesso prefisso (come/EncryptMetadata) - L'espansione dello stream di oggetti non si fida più di un valore
/Ncorrotto o ostile: i valori non interi ora restituiscono 0 invece di un numero non inizializzato, e un limite superiore derivato da/Firstpreviene allocazioni eccessive durante la scansione di documenti malformati
Version 2.14.2
Corretto (Fixed)
- Gli iniettori di marcatori PDF/X, PDF/VT, PDF/UA, PDF/E e PDF/R ora copiano i documenti sorgente crittografati invariati invece di aggiungere sezioni di aggiornamento in chiaro; il comportamento precedente produceva file il cui ultimo trailer perdeva la voce
/Encrypt(ISO 32000-1 §7.5.6), in modo che i lettori conformi interpretassero erroneamente il corpo crittografato come testo in chiaro TPdf.SignPades,SignPadesByteseInjectPadesDssMarkersora generanoEPadesCryptoquando il documento sorgente è crittografato, invece di emettere silenziosamente un file corrotto o non verificabile; rimuovere la crittografia prima di firmare o incorporare il materiale DSS
Version 2.14.1
Corretto (Fixed)
TPdf.SignPadeseSignPadesBytesora compilano a posteriori tutti e quattro i campi/ByteRangedel dizionario firma; in precedenza gli ultimi tre campi rimanevano ai loro segnaposto zero, in modo che le firme prodotte dichiarassero un intervallo di byte vuoto e fallissero la verifica nei validatori conformi- I dizionari del Document Time-stamp PAdES B-LTA ricevono la stessa correzione di compilazione a posteriori di
/ByteRange ValidatePadesComplianceora accetta il layout di firma standard dove il gap dell'intervallo di byte contiene il valore esadecimale/Contents, e verifica che il secondo segmento dell'intervallo termini esattamente alla fine del file; in precedenza solo gli intervalli senza gap superavano il controllo di copertura
Version 2.14.0
Aggiunto (Added)
TPdf.ExportXFDFserializza ogni valore di campo modulo e annotazione su tutte le pagine in un documento XFDF (ISO 19444-1), emettendo<fields>per i valori gerarchici dei moduli e<annots>per tutti i sottotipi di annotazione supportati (text, highlight, underline, strikeout, squiggly, line, circle, square, caret, polygon, polyline, stamp, ink, freetext, fileattachment, sound, link, redact)TPdf.ImportXFDFlegge un documento XFDF nel PDF caricato, ricreando le annotazioni sulle pagine corrispondenti e applicando i valori dei campi alle loro annotazioni widget- Il record
TPdfAnnotationha guadagnato i campiName(NM),Subject,ModificationDate(M),CreationDate,Icon,Opacity(CA), endpoint di linea, vertici di poligono/polilinea e gesture della lista di inchiostro, in modo che i round-trip XFDF preservino i metadati completi dell'annotazione - Il nuovo esempio
XfdfLabnei set demo di Delphi, C++Builder e Lazarus mostra il round-trip di esportazione/importazione
Version 2.13.6
Corretto (Fixed)
ValidatePdfAora tratta gli stream/Metadatadel catalogo senza/Type /Metadatao/Subtype /XMLcome metadati XMP mancanti tramitepvaiMissingXmpMetadata- I report di verifica preliminare PDF/A ora classificano
pvaiMissingXmpMetadatacome Metadati e raccomandano uno stream/Metadatadel catalogo con/Type /Metadata,/Subtype /XML, XMP non filtrato e marcatoripdfaid
Version 2.13.5
Corretto (Fixed)
ValidatePdfAora segnala le annotazioni Widget senza dizionario di aspetto e le annotazioni PDF/A-2 / PDF/A-3 che richiedono ma mancano di/APtramitepvaiAnnotationApDictViolation- I report di verifica preliminare PDF/A ora categorizzano
pvaiAnnotationApDictViolationcome contenuto che l'iniezione di marcatori non può riparare
Version 2.13.4
Corretto (Fixed)
ValidatePdfAora segnala le immagini inline PDF/A-2 e PDF/A-3 il cui valore/Io/InterpolateètruetramitepvaiImageDictionaryViolation, corrispondendo alla copertura del dizionario XObject Image esistente- I report di verifica preliminare PDF/A ora categorizzano
pvaiImageDictionaryViolationcome contenuto che l'iniezione di marcatori non può riparare
Version 2.13.3
Corretto (Fixed)
ValidatePdfAora segnala le immagini inline PDF/A-1 che usano filtri/LZWDecodeo abbreviati/LZWall'interno dei flussi di contenuto tramitepvaiInlineImageLzwForbidden, corrispondendo alla copertura delle immagini inline PDF/A-2 e PDF/A-3 esistente- Lo scanner dei filtri delle immagini inline ora avanza oltre i nomi di risorse iniziali come
/GS1, evitando blocchi durante la scansione di flussi di contenuto PDF/A-1 più ampi
Version 2.13.2
Aggiunto (Added)
TPdf.SetFocusedFormFieldTextscrive testo nel buffer di modifica del campo modulo attualmente focalizzato tramiteFORM_ReplaceSelection, simmetricamente aFocusedFormFieldText. Per i campi testo/combo AcroForm il valore viene confermato in/Valla perdita del fuoco e persiste; per i campi testo XFA la scrittura avviene solo nel buffer in memoria (PDFium non espone API pubbliche per riconciliare i valori XFA nel pacchetto dataset, quindi non persiste tra i salvataggi)- La piattaforma host JavaScript è ora collegata ogni volta che il motore V8 è disponibile, indipendentemente dal fatto che il documento sia XFA — in modo che JavaScript AcroForm incorporato (script a livello di documento, calcoli dei campi,
app.alert) possa eseguire. In precedenzam_pJsPlatformera collegato solo per i documenti XFA, lasciando silenziosamente disabilitato JS di AcroForm
Modificato (Changed)
- Il collegamento della piattaforma JavaScript è ora indipendente dalla decisione XFA in
InitializeFormFill— la tabellam_pJsPlatformviene costruita ogni volta cheV8FeaturesAvailableè vero, applicata dopo il cablaggio della versione/callback XFA invece di essere annidata al suo interno
Version 2.13.1
Aggiunto (Added)
- Nuovi eventi host espongono informazioni che i callback di compilazione moduli della v2.13.0 in precedenza ingoiavano:
OnXfaUriAction,OnXfaPageCountChanged,OnXfaFocusChange,OnXfaEmail,OnXfaHttpRequest,OnXfaOpenFile,OnJavaScriptBeep,OnJavaScriptPrint,OnJavaScriptMail,OnJavaScriptSubmitForm. Ogni evento assume per impostazione predefinita il comportamento no-op esistente quando non assegnato, quindi i host esistenti non sono interessati - La proprietà di sola lettura
TPdf.XfaFormPacketsrestituisce un'istantanea una-tantum di tutti i pacchetti XFA (TXfaPacketList), soddisfacendo i tipiTXfaPacket/TXfaPacketListprecedentemente dichiarati ma inutilizzati - I codici di errore PDFium specifici per XFA
FPDF_ERR_XFALOAD/FPDF_ERR_XFALAYOUTsono ora collegati ed esposti tramiteLastPdfError, sostituendo il generico "Unknown error" per i fallimenti di caricamento/layout XFA
Modificato (Changed)
FFI_DoURIActionWithKeyboardModifierora consultaOnXfaUriActionprima di eseguire tramite shell un URI da un campo XFA, dando all'host un veto (sicurezza: un campo XFA malevolo in precedenza poteva avviare URL arbitrari incondizionatamente). I gestori non assegnati preservano il comportamento predefinitoShellExecuteWDecodeFormFieldTypeora instrada i tipi di campo XFA tramiteIsXfaFormFieldpiuttosto che un caso esplicito a 8 rami, mantenendo l'enum allineato conFPDF_FORMFIELD_XFA_*per offset ordinale
Corretto (Fixed)
ValidatePdfAora segnala le dichiarazioni PDF/A-1 che usano stream di riferimenti incrociati PDF 1.5 o stream di oggetti con il nuovopvaiPdfA1Pdf15Structure, continuando a consentire gli stream di oggetti per PDF/A-2 e PDF/A-3
Version 2.13.0
Aggiunto (Added)
- Supporto runtime XFA (XML Forms Architecture) completo:
TPdf.InitializeFormFillora collega tutti i 14 callbackFPDF_FORMFILLINFOversione 2 e allega unIPDF_JsPlatformin modo che unapdfium.dllabilitata per XFA possa renderizzare e scriptare moduli XFA dinamici - Nuovo unit
Lib\FPdfXfa.pasche dichiara le costanti XFA e i tipiTXfaPacket/TXfaSaveFormat - Lettore di pacchetti statici XFA su
TPdf:GetXfaPacketCount/GetXfaPacketName/GetXfaPacketContent/GetXfaPacketByNamepiùGetXfaTemplate/GetXfaDatasets/GetXfaConfigestraggono i pacchetti XFAtemplate,datasetseconfigcome XML grezzo senza bisogno di un runtime abilitato per XFA — utile per l'audit di conformità e la migrazione dei dati - Sonde di capacità: globale
XfaFeaturesAvailable, e per-documentoTPdf.XfaRuntimeAvailableeTPdf.XfaStaticReadable TPdfFormFieldTypeesteso con i tipi di campo XFA, conDecodeFormFieldTypeche mappa i nuovi valoriFPDF_FORMFIELD_XFA_*- Eventi JavaScript host su
TPdf:OnJavaScriptAlert,OnJavaScriptResponse,OnXfaGotoUrleOnXfaRuntimeMissing - Nuovo esempio Delphi
XfaLabche mostra il rilevamento XFA, l'estrazione di pacchetti, le sonde di capacità e il percorso di fallback runtime-missing
Modificato (Changed)
TPdf.LoadDocumentora pre-scansiona l'input alla ricerca di marcatori XFA e seleziona automaticamentepdfium.v8.dllimpostandoEnableV8Engine := Trueprima che la libreria singleton venga caricata per la prima voltaTPdf.GetPageCountora riflette il conteggio delle pagine riportato dal motore XFA tramiteFFI_PageEventdopo la reimpaginazione dinamica- Quando un documento XFA viene aperto ma il runtime non è disponibile,
InitializeFormFillora fissaversion=1exfa_disabled=1invece di richiedere la versione 2 con callback non assegnati
Version 2.12.2
Corretto (Fixed)
ValidatePdfAComplianceora segnala i namespace XMP personalizzati usati senzapdfaExtension:schemas, accettando comunque i metadatipdfaidstandard senza dichiarazioni di estensione- La validazione dei file incorporati PDF/A-3 ora richiede sia le voci
/Fche/UFdi livello superiore sui dizionari filespec e ignora le chiavi stream/EFnidificate quando verifica quei nomi
Version 2.12.1
Corretto (Fixed)
ValidatePdfAComplianceora decodifica i token di nome PDF con escape prima di confrontare JavaScript, LZWDecode, Type1 e i relativi nomi proibiti, in modo che i nomi offuscati ma semanticamente identici vengano segnalati correttamente- I controlli delle immagini inline PDF/A ora rifiutano i valori
/Filtere/Fche usano/LZWDecode, abbreviato/LZW, o/Crypt, inclusi i moduli array e nome con escape - La validazione PDF/A ora segnala gli stream di metadati con filtri stream proibiti, i profili ICC OutputIntent il cui conteggio dei componenti
/Nè mancante o incoerente, e le specifiche di file incorporati PDF/A-3 con/AFRelationshipmancante o non valido
Version 2.12.0
Aggiunto (Added)
- Le richieste HTTP TSA ora impostano timeout espliciti di 30 s per ogni fase (risoluzione/connessione/invio/ricezione) tramite
WinHttpSetTimeouts, in modo che un'autorità di timestamp lenta o irraggiungibile non possa bloccare indefinitamente il thread di firma - Derivazione nonce per richiesta per le richieste di timestamp PAdES B-T / B-LTA quando il chiamante omette
TPadesSignOptions.Nonce: un fold SHA-256 di contatore monotono + orologio di parete +GetTickCount64+ id processo sostituisce il precedente fallback fisso$100000000, in modo che due richieste emesse nello stesso millisecondo non riutilizzino più lo stesso nonce anti-replay PdfInflateora limita l'output decompresso a 256 MiB per impedire a uno stream compresso con zlib di esaurire la memoria su input ostili o corrotti (una “zlib bomb”); il limite è generoso per qualsiasi stream PDF reale
Modificato (Changed)
- Il blending dell'overlay di
TPdfViewnon usa piùGetPixel/SetPixelVper pixel; il rettangolo viene ora blendato tramite unTBitmapoff-screen a 32 bpp eScanLinein un singolo passaggio, eliminando migliaia di attraversamenti del kernel GDI per dipintura e rendendo le selezioni grandi reattive FPdfAsn1.TDerReader.ReadIntegerora rifiuta i campi INTEGER più lunghi di 8 byte, restituendo 0 invece di calcolare un valore errato tramite comportamento di shift indefinito sull'input ASN.1 CMS/PAdESParseTimeStampRespnon riecheggia più il nonce della richiesta comeTPadesTimestamp.Nonce; il campo rimane a 0 per segnalare “non verificato”
Corretto (Fixed)
PointsToPixelsrestituiva l'input invariato per qualsiasi DPI: il divisore eraPointsPerInch(la costante 72) invece del letterale 72, riducendo la formula aResult := Points. Qualsiasi chiamante esterno che esegue il dimensionamento punti→pixel del dispositivo tramite questo helper ora ottiene il correttoPoints × PixelsPerInch / 72PdfMaxObjNumsottostimava sui documenti che usano stream di oggetti (ObjStm PDF 1.5+): gli oggetti compressi all'interno di un/ObjStmnon hanno marcatoriN 0 obj, quindi la scansione a byte grezzo li mancava. La scansione ora espande prima gli stream di oggettiInjectPdfAMarkersnon forgia più una dichiarazione di conformità PDF/A su un documento crittografato: PDF/A (ISO 19005-1 §7.1) vieta la crittografia. QuandoHasEncryptè impostato, la sorgente viene ora passata invariataPdfReadStreamBytesora rifiuta un/Lengthmaggiore dell'intero file prima di allocare il buffer risultato, chiudendo un percorso di allocazione precoce su lunghezze indirette corrotte o ostili
Version 2.11.0
Aggiunto (Added)
- Il record PDFium
FPDF_FILEHANDLERora dichiara i suoi sei callback (Release,GetSize,ReadBlock,WriteBlock,Flush,Truncate) come campi reali invece di commenti, corrispondendo al layout dell'intestazione C - Il caricamento e lo scaricamento della libreria PDFium (
LoadLibrary/UnloadLibrary) sono ora serializzati da una sezione critica globale del processo, in modo che due thread workerTPdfFuture<T>non possano entrambi osservarePDFiumLibrary=0e fare il doppio bind - Una sezione
initialization/finalizationora chiamaUnloadLibraryallo scaricamento dell'unit, assicurando cheFPDF_DestroyLibraryvenga eseguito (join del thread worker, eliminazione dell'isolato V8, teardown di font/cache) invece di affidarsi al sistema operativo per recuperare la DLL
Modificato (Changed)
TPdf.SetActiveora assorbe qualsiasi eccezione durante il caricamento (in precedenza soloEPdfError), in modo che un errore di stream o una violazione di accesso durante la configurazione del modulo/pagina lasciActive=Falseinvece di un componente parzialmente caricato con stato indeterminato- Codifica caratteri coerente per gli argomenti delle chiavi di metadati PDFium:
TPdf.GetMetaTextora usa la stessa suddivisione FPCAnsiString/ DelphiUTF8EncodediGetViewerPreferencee i percorsi di caricamento - Deduplicati gli helper
BytesToAnsi,AnsiToBytes,WriteByteseWriteStr:FPdfCompressora li importa daFPdfPdfCommon
Corretto (Fixed)
- Perdita di risorse in
TPdf.LoadDocumenteTPdf.CreateDocument: seInitializeFormFilloReloadPagegenerava un'eccezione dopo cheFPDF_LoadDocument/FPDF_CreateNewDocumentera riuscito, l'handle nativoFPDF_DOCUMENTveniva perso. Ogni percorso ora avvolge la configurazione post-caricamento intry/excepte chiude il documento in caso di fallimento - Diagnostica di caricamento DLL PDFium più amichevole:
CheckLoadLibraryrilevaERROR_BAD_EXE_FORMAT(193) e segnala un'incompatibilità di architettura 32/64 bit che indica la buildDLLs/Win32oDLLs/Win64corrispondente
Version 2.10.1
Risolto (Fixed)
- Standardizzazione del sid del SignerInfo PAdES: l'identificatore del firmatario ora usa la forma
issuerAndSerialNumberdi RFC 5652 §5.3 (issuer Name + serialNumber, entrambi estratti letteralmente dal DER del certificato del firmatario), in sostituzione della precedente forma non standardsubjectKeyIdentifier+ placeholder SHA-256 del certificato intero che Adobe Acrobat e gli altri validatori conformi rifiutavano. Un nuovo analizzatore DER del TbsCertificate (ExtractIssuerAndSerial) legge la SEQUENCE issuer e l'INTEGER serial come byte TLV grezzi — i numeri di serie superano comunemente il rangeInt64, quindi il TLV grezzo è obbligatorio. La formasubjectKeyIdentifierresta solo come fallback quando l'analisi del DER del certificato fallisce
Modificato (Changed)
TCmsSignerId.SerialNumber: Int64è stato sostituito daSerialDer: TBytes(il TLV serialNumber grezzo). Il costruttore CMS incorpora il TLV tagliato letteralmente inIssuerAndSerialNumber, evitando un overflow diInt64sui seriali CA a 20 byte (limite superiore di RFC 5280 §4.1.2.2)
Version 2.10.0
Aggiunto (Added)
- Validazione a lungo termine PAdES B-LT: quando
TPadesSignOptions.Level >= plB_LT,SignPadesBytesaggiunge un aggiornamento incrementale che porta un dizionario/DSScon il certificato del firmatario e la catena intermedia completa (la radice autofirmata è esclusa secondo RFC 5652 §10.2.3), più il marcatore/Extensions /ESICdi livello 1 (EN 319 142-1 §5.4.2) - Marca temporale di archiviazione PAdES B-LTA: quando
Level >= plB_LTAeTsaUrlè impostato, viene aggiunto un dizionario di firma Document Time-stamp (/SubFilter /ETSI.RFC3161) il cui/ByteRangecopre l'intero file; il marcatore ESIC è promosso a livello 2. Questo completa i quattro livelli baseline PAdES (B-B, B-T, B-LT, B-LTA) - Raccolta della catena di certificati:
ResolveWinSignerora chiamaCertGetCertificateChaine popolaTPadesResolvedSigner.ChainCertDercon i certificati CA intermedi, così che/DSS /Certsdel B-LT porti ogni certificato necessario per convalidare la firma senza ricerche esterne.CertFreeCertificateContextè ora vincolato, chiudendo la perdita di un contesto per firma segnalata nella v2.8.0 - Flusso di lavoro di integrazione PDF/A:
TPdf.SignPadesWithPdfAconverte prima il documento in PDF/A (il livello più alto che la libreria emette oggi) poi applica la firma PAdES richiesta — il pattern del contenitore di archiviazione a lungo termine raccomandato da EN 319 142-1 Allegato A.7
Version 2.9.0
Aggiunto (Added)
- Marca temporale attendibile PAdES B-T:
TPadesSignOptionsguadagna i campiLevel,TsaUrleNonce. QuandoLevel >= plB_TeTsaUrlè impostato,SignPadesBytesestrae il valore della firma dal CMS costruito, richiede una marca temporale RFC 3161 su di esso e incorpora il TimeStampToken restituito come attributo non firmatosignature-time-stampdel SignerInfo — il passo B-T a tempo attendibile (EN 319 142-1 §6.3 requisito o) FPdfTsa: client RFC 3161 multipiattaforma —BuildTimeStampReq(versione 1, messageImprint SHA-256 sul valore della firma, nonce, certReq=true),ParseTimeStampResp(accetta PKIStatus 0/1, rifiuta 2+, estrae il TimeStampToken ContentInfo letteralmente) eRequestTimestamp(flusso unico di costruzione+POST+analisi).PadesTsaAvailableabilita la funzionalità su piattaforme senza backend HTTPFPdfTsaWin: backend WinHttp di Windows, vincolato dinamicamente da winhttp.dll (zero nuove dipendenze in fase di compilazione; HTTPS negoziato dall'archivio certificati di Windows). Rispecchia il pattern di binding dinamico diFPdfCryptoWinFPdfCms:ExtractSignatureValuepercorre un CMS costruito per recuperare gli ottetti di firma grezzi (l'input di hash della TSA), eAddSignatureTimestampToCmsricostruisce il ContentInfo con un nuovounsignedAttrs [1](0xA1) che porta l'attributo di marca temporale. Il validatore di fase 1 riconosce il risultato come firma B-T
Version 2.8.0
Aggiunto (Added)
- Stack di firma PAdES B-B: quattro nuovi blocchi costitutivi in Pascal puro/multipiattaforma (
FPdfSha256,FPdfAsn1,FPdfCms,FPdfCrypto) più un backend CNG di Windows (FPdfCryptoWin) permettono aTPdf.SignPades/SignPadesToStreamdi produrre una firma PAdES B-B end-to-end. Il certificato del firmatario viene risolto tramite impronta SHA-1 dall'archivio “MY” dell'utente corrente; RSA-PSS (consigliato), RSA PKCS#1 v1.5 ed ECDSA sono tutti supportati tramiteNCryptSignHash FPdfSha256: SHA-256 FIPS 180-4 autonomo (Init/Update/Final + assistenti one-shot). FPC 3.2.2 non fornisce alcuna unit SHA-2, quindi la libreria ne possiede una per mantenere ogni percorso di codice CMS su un unico tipoTSHA256Digestsenza diramazioni RTLFPdfAsn1: encoder DER (TDerWriter) e reader (TDerReader) che coprono SEQUENCE/SET/OID/INTEGER/OCTET STRING/UTCTime/GeneralizedTime/tag context-specific, con la codifica a lunghezza definita e la gestione dei tag IMPLICIT che CMS richiedeFPdfCms: costruttore CAdES SignedData (BuildSignedData) che emette gli attributi firmati content-type, message-digest e signing-certificate-v2 che la baseline PAdES impone, con signing-time e commitment-type-indication opzionali. Il digest di signedAttrs è calcolato sulla forma con tag SET (0x31) e riemesso con il tag IMPLICIT [0] (0xA0) secondo RFC 5652 §5.4FPdfCrypto+FPdfCryptoWin: astrazione del backend crittografico conPadesCryptoAvailable/ResolvePadesSigner, e l'implementazione Windows che vincola crypt32.dll / ncrypt.dll dinamicamente (nessuna nuova dipendenza di DLL in fase di compilazione). Le firme ECDSA sono ricodificate dalla forma IEEE P1363 r¦s di Windows nella forma DERECDSA-Sig-Valueche CMS richiedeSignPadesBytes: iniezione di firma a livello di byte — riserva uno slot hex/Contentsa larghezza fissa, calcola il/ByteRangecoprente, digerisce il documento, costruisce e incorpora il CMS e aggiunge l'aggiornamento incrementale. Il validatore (v2.7.0) riconosce l'output come firma PAdES B-B
Version 2.7.0
Aggiunto (Added)
- Validatore strutturale PAdES (ETSI EN 319 142-1 V1.2.1): la nuova unit
FPdfPadese il metodoTPdf.ValidatePadesispezionano i dizionari di valore di firma raggiungibili da/ByteRange, percorrono ilSignedDataCMS dentro/Contentsabbastanza a fondo da confermare la forma detached CAdES, e rilevano i quattro livelli baseline (B-B, B-T, B-LT, B-LTA) oltre ai dizionari Document Time-stamp (/SubFilter /ETSI.RFC3161) - Set di problemi a livello di clausola PAdES: 26 enumerati
ppei*coprono l'accettabilità del/SubFilter(adbe.pkcs7.sha1eadbe.x509.rsa_sha1segnalati come vietati), la copertura del file da parte di/ByteRange, il divieto di/Cert, la forma delSignedDataCMS (firmatario singolo, eContent detached, range di versione), gli attributi firmati richiesti (content-type,message-digest,signing-certificate/v2), i digest vietati (MD5, SHA-1), l'esclusione reciproca di/Reasonvscommitment-type-indication(requisito d), il requisito B-T di tempo attendibile, il/DSS+/Certs+ marcatore ESIC livello 1 del B-LT, e il Document Time-stamp + marcatore ESIC livello 2 del B-LTA - Iniettore DSS:
TPdf.SaveAsPadesDss/SaveAsPadesDssToStreamaggiungono a una copia del documento un aggiornamento incrementale che porta un dizionario/DSS(con array di stream/Certs,/OCSPs,/CRLs) e il marcatore/Extensions /ESIC(livello 1 o 2), preservando i byte originali — il passo di incorporamento del materiale di validazione B-LT/B-LTA (clausola 5.4.2) - Fase multipiattaforma, senza dipendenze: il validatore e l'iniettore sono in Pascal puro e funzionano su ogni IDE supportato (Delphi, Lazarus, FPC, C++Builder); non è richiesto alcun backend crittografico per questo rilascio, e non è introdotta alcuna nuova dipendenza DLL
Version 2.6.0
Modificato (Changed)
- Deduplicazione inter-standard: altre sette funzioni helper duplicate (PdfEnclosingObjNum, PdfDictRefNum, PdfExpandObjectStreams, PdfTextStr, ExtractLiteralString, ExtractXmpAttr) sono state rimosse dalle singole unit di standard e consolidate in
FPdfPdfCommon, riducendo di circa 300 righe l'onere di manutenzione da copia-incolla - Qualità di PreflightReport: i problemi di content-class di PDF/X e PDF/E che prima ricadevano nella categoria generica del “marcatore mancante” ora portano categorie Content/Metadata/Security accurate e raccomandazioni specifiche per clausola (~15 enumerati tra i due standard)
- Copertura dei test PDF/E e PDF/R: altri sei enumerati con copertura zero hanno ottenuto test positivi (
pveiLzwForbidden,pveiJavaScriptForbidden,pveiFormFieldsForbidden,pveiEmbeddedFilesForbidden,pvriBadHeader,pvriProhibitedInfoEntry) - Correzione di build Lazarus:
Tests.PdfVT(una unit DUnitX esclusiva di Delphi aggiunta in v2.5.x) è ora esclusa dal progetto Lazarus per ripristinare la compilazione
Version 2.5.3
Aggiunto (Added)
- Completezza dell'OutputIntent (PDF/X-4 §6.2.4):
pvviOutputIntentSchemesegnala un OutputIntent il cui/Snon è/GTS_PDFX;pvviOutputIntentMissingIdentifiersegnala un/OutputConditionIdentifiermancante - Esenzione Reference XObject per PDF/VT-2 (§6.2.2):
pvviReferenceXObjectForbiddennon si attiva più per un filePDF/VT-2, che può usare legalmente Reference XObject su una base X-5g/5pg - Validazione dei caratteri della boundary MIME (RFC 2046 §5.1.1):
vtmviBoundaryInvalidCharsegnala una boundary i cui caratteri cadono fuori dal set bchars o la cui lunghezza supera 70
Risolto (Fixed)
InjectPdfVTMarkersora scrive Info/CreationDatee/ModDatedalle opzioni di salvataggio, così che il file prodotto superiValidatePdfVTCompliancesenza un falsopvviInfoModDateMismatch(l'iniettore prima riscriveva le date XMP ma lasciava obsolete le date del dizionario Info)
Version 2.5.2
Aggiunto (Added)
- Consistenza dell'Info
/ModDate(§6.3 NOTE 2, base PDF/X-4):pvviInfoModDateMismatchsegnala un/ModDatedel dizionario Info che, dopo la normalizzazione da data PDF a data XMP, non è uguale axmp:ModifyDate - Conformità dei chunk inline PDF/VT-2s (Allegato A.2): il validatore MIME ora esegue
ValidatePdfVTCompliancesu ogni parteapplication/pdfinline e segnala un corpo non-PDF/VT tramitevtmviInlinePdfNotPdfVT
Version 2.5.1
Aggiunto (Added)
- Validazione del chunking DParts (ISO 16612-2 §6.5 Tabella 4):
pvviDPartsBadChunkingsegnala un array/DPartsi cui sotto-array non finali non hanno esattamente 8192 voci o il cui ultimo sotto-array cade fuori da 1..8192 - Consistenza del RecordLevel tra stream (Allegato A.2): il validatore MIME PDF/VT-2s ora estrae il
/RecordLeveldi ogni PDF inline e segnala disaccordi tramitevtmviRecordLevelMismatch, completando il controllo NodeNameList esistente - Indicazioni di oggetti grafici ricorrenti (§6.7):
pvviGtsScopeInvalidValuesegnala un/GTS_Scopeal di fuori di {SingleUse, Record, File, Stream, Global, Unknown};pvviGtsScopeRecordWithoutRecordLevelsegnala/Recordsenza un/RecordLevel;pvviGtsXidNotUuidsegnala un/GTS_XIDche non è una URI uuid: RFC 4122;pvviGtsEnvMissingsegnala un/GTS_Envmancante quando/GTS_Scopeè Stream o Global (§6.7.4) - Rilevamento di riferimenti in avanti MIME (Allegato A.2):
vtmviForwardReferencesegnala un PDF inline che cita un nome file (tramite/EF /F) non introdotto da una parte di allegato precedente nello stream
Risolto (Fixed)
ExtractNodeNameListFromPdfeExtractRecordLevelFromPdfinFPdfPdfvtMimehanno risolto un errore off-by-one ricorrente in cui l'offset in base 1 restituito daAnsiFindKeyveniva trattato come offset di byte assoluto nel PDF espanso
Version 2.5.0
Aggiunto (Added)
- Metadati Document Part (DPM) di PDF/VT (ISO 16612-2 §6.6):
TPdfVTSaveOptionsha guadagnatoDpmEntrieseDpmTargetcosì che un writer possa allegare un dizionario/DPMal nodo DPart sintetizzato, con validazione dei nomi di chiave rispetto alla regola di prefisso di seconda classe dell'Allegato E e alle regole NMTOKEN / unicità / formaGTS_Manageddel §6.6 sul lato validatore - Scambio tramite streaming PDF/VT-2s (Allegato A): la nuova unit
FPdfPdfvtMimefornisceBuildPdfVT2sStreameValidatePdfVT2sStreamper la busta MIMEmultipart/mixedche trasporta chunk PDF/VT inline più profili ICC in allegato, con la regola di ordinamento dell'intestazioneX-PDFVT-Stream-version: 1e il controllo di consistenzaNodeNameListtra stream TPdf.ValidatePdfVTora esegue un conteggio autorevole delle azioni JavaScript tramiteFPDFDoc_GetJavaScriptActionCount, completando la scansione del nome/JavaScripta livello di byte
Risolto (Fixed)
- Correttezza del
Trappeddi PDF/VT sulla base PDF/X-4: il valore enumptvUnknownè rimosso (PDF/X-4 vieta/Unknown),ptvUnspecifiedè normalizzato a/Falsein scrittura (un/Trappedmancante è anch'esso vietato), e un nuovo problemapvviTrappedInvalidsegnala un valore assente oUnknown ValidatePdfVTComplianceora espande gli stream di oggetti (PdfExpandObjectStreams) prima della scansione, così che un dizionario catalog, OutputIntent o Metadata memorizzato dentro un ObjStm compresso (PDF 1.5+, tipico dei produttori PDF/X-4) sia raggiungibile dalle ricerche a livello di byte
Modificato (Changed)
- PDF/VT-1 ora ereda le prohibizioni di contenuto PDF/X-4 complete:
pvviAcroFormForbidden(/AcroFormo/XFA),pvviAdditionalActionsForbidden(catalog/AA),pvviMissingTrimBoxepvviReferenceXObjectForbidden(Reference XObject, solo X-5g/5pg) - Deduplicazione inter-standard:
BuildDictObj,IccComponentCount, il profilo ICC sRGB incorporato (GetSrgbIccProfile),PdfTextStr,PdfEnclosingObjNum,PdfDictRefNumePdfExpandObjectStreamssono stati promossi da copie locali triplicate inFPdfPdfa/FPdfPdfx/FPdfPdfvta una sola sede canonica inFPdfPdfCommon; il letterale ICC di 3144 byte ora esiste esattamente una sola volta nella base di codice
Version 2.4.0
Risolto (Fixed)
InjectPdfUaMarkersnon perde più il riferimento/Infodel trailer su base cross-reference-stream: la funzione localeSourceTrailerInfoRef(che mancava del fallback per xref-stream) è stata sostituita da quella condivisaPdfSourceTrailerInfoRef(promossa dalla copia PDF/A che includeva il fallback a partire da v2.0.0)- La funzione condivisa
PdfReadStreamBytesora gestisce i riferimenti indiretti/Length N G R(portati dalla copia locale PDF/A), pertanto i validatori PDF/VT, PDF/R e PDF/E non leggono più in modo errato né saltano i flussi di metadati XMP prodotti da strumenti che utilizzano una Length indiretta (Acrobat, Ghostscript)
Modificato (Changed)
- Deduplicazione inter-standard: le copie locali di
PdfReadTrailerinFPdfPdfaeFPdfPdfx, le copie locali diSourceTrailerInfoRefinFPdfPdfaeFPdfPdfua, e la copia locale diPdfReadStreamBytesinFPdfPdfasono state tutte rimosse — le versioni condivise diFPdfPdfCommonsi applicano ora ovunque; ciò elimina circa 330 righe di codice duplicato e azzera l'onere di manutenzione per tenere sincronizzate le copie - Risoluzione del debito di test per PDF/X: sette enum di content-class che in precedenza avevano copertura zero hanno ottenuto test positivi (
pvxiLzwForbidden,pvxiJavaScriptForbidden,pvxiFormFieldsForbidden,pvxiAdditionalActions,pvxiEmbeddedFilesForbidden,pvxiMissingTrimBox,pvxiTrappedNotSet)
Version 2.3.0
Modificato (Changed)
- La risoluzione del debito di test per PDF/A continua: altri tre enum con copertura zero hanno ottenuto test positivi;
pvaiForbiddenRenderingIntent(§6.2.9) segnala un nom rendering-intent non standard in un content stream;pvaiJpeg2000Violation(§6.2.2) segnala un'immagine JPXDecode con/NumComponentsal di fuori di {1,3,4} nel Part 2;pvaiInlineImageLzwForbidden(§6.1.10) segnala un'immagine inline che utilizza il filtro LZW nel Part 2
Version 2.2.0
Modificato (Changed)
- Test di regressione per cross-reference-stream: l'esistente
Validate_XrefStreamTrailer_DetectsConformanceora verifica anche che il riferimento catalog/Metadatasia risolto e che l'XMPpdfaid:partsia letto su una base di xref-stream (non solo/Root+/ID); un nuovo testInjectPdfA_XrefStreamBase_RoundTripsprotegge il percorso xref-stream dell'iniettore aggiunto nella v2.0.0; due test cross-standard (PdfE_XrefStreamBase_NotRejectedAsUnparsable,PdfR_XrefStreamBase_NotRejectedAsUnparsable) verificano che i validatori PDF/E e PDF/R non rifiutino più i PDF con xref-stream come non analizzabili - Chiusura del debito di test per PDF/A:
Validate_MinimalPdf_FlagsRequiredMarkersasserisce che un PDF minimo nudo attivapvaiMissingPdfAIdentifier,pvaiMissingOutputIntent,pvaiMissingIccProfile,pvaiMissingXmpMetadataepvaiMissingXmpDates— colmando il divario di simmetria con i validatori PDF/E e PDF/X che avevano già test equivalenti; altri due enum a copertura zero hanno ottenuto test positivi:pvaiUnembeddedFontepvaiSubsetMissingCidSet
Version 2.1.0
Corretto (Fixed)
- PDF/E è stato inavvertitamente escluso dalla correzione del cross-reference-stream della v2.0.0: sia
InjectPdfEMarkerscheValidatePdfECompliancechiamavano ancoraPdfReadTrailersenzaAcceptXrefStream, pertanto l'iniettore PDF/E falliva silenziosamente sull'output PDF 1.5+ (impostazione predefinita diSaveAsCopydi pdfium); entrambi i punti di chiamata ora passanoTrue - Il fallback cross-reference-stream condiviso di
PdfReadTrailerora include la guardia/Type /XRefche le copie locali di PDF/A e PDF/X avevano già, in modo che un offsetstartxrefcorrotto che punta a un dizionario non correlato fallisca in modo pulito invece di essere analizzato erroneamente come trailer - Il risolutore di riferimenti indiretti
/LanginValidatePdfUaCompliance(v2.0.0) era irraggiungibile:PdfFindObjDicttrova solo dizionari<<, ma un oggetto stringa/Langè(...)o<...>senza dizionario; sostituito con una scansione diretta del corpo dell'oggetto che individua il token stringa
Modificato (Changed)
- Sette duplicati helper inutilizzati (PdfStructureBytes, PdfHasName, PdfCountName, BuildStreamObj) che erano copie identiche a livello di byte delle versioni condivise di
FPdfPdfCommonsono stati rimossi daFPdfPdfaeFPdfPdfua— le versioni condivise si applicano ora ovunque tramiteuses
Version 2.0.0
Corretto (Fixed)
- Fallimento silenzioso cross-standard: l'helper condiviso
PdfReadTrailer(utilizzato dagli iniettori di marcatori e validatori per PDF/UA, PDF/X, PDF/VT e PDF/R) ora accetta un parametroAcceptXrefStreame ripiega sul dizionario degli oggetti cross-reference-stream quando non è presente la parola chiavetrailer(PDF 1.5+); in precedenza, l'outputSaveAsCopydi pdfium (che utilizza un cross-reference stream) causava il fallimento silenzioso di ogni iniettore di marcatori — i byte di origine venivano copiati senza modifiche e la chiamata restituiva comunque successo; il validatore PDF/R-1.0 (la cui base PDF 2.0 è sempre un cross-reference stream) era di fatto inattivo; l'implementazione matura del validatore PDF/A è stata trasferita nell'helper condiviso in modo che ogni standard ne tragga vantaggio - La scansione del dizionario trailer in
InjectPdfUaMarkerseInjectPdfAMarkersora utilizzaPdfDictEndche tiene conto della profondità invece di una semplice ricerca di>>, in modo che un trailer contenente un dizionario nidificato (ad esempio/Encrypt << ... >>) non venga più interrotto prima di una voce/Infofinale
Modificato (Changed)
TPdf.ValidatePdfUaora sopprime il grossolanopvuaiFontNotEmbeddeda livello di byte quando il precisopvuaiPdfiumFontNotEmbeddeddel modello a oggetti Pdfium si è già attivato, in modo che il report preliminare non contenga più due righe quasi duplicate per incorporare i font per lo stesso difettopvuaiLangInvalidFormat(§7.2) ora risolve un riferimento indiretto/Lang(N 0 R) al suo oggetto stringa e ne valida il contenuto, in modo che un tag di lingua a cui si fa riferimento indirettamente non sia più un punto cieco
Version 1.99.0
Corretto (Fixed)
pvuaiLangInvalidFormat(§7.2) non concede più un pass gratuito alle stringhe/Langcodificate in esadecimale: le coppie UTF-16BE (con un BOMFE FF) e le stringhe esadecimali ASCII nude vengono ora decodificate e sottoposte allo stesso controllo grammaticale BCP 47 delle stringhe letterali(...), in modo che una stringa/Langesadecimale non valida venga rilevata, mentre una conforme (ad esempio un UTF-16BEen-US) non rischia più di essere segnalata
Modificato (Changed)
pvuaiFontMissingToUnicode(§7.21.7) ora esenta/MacExpertEncodinginsieme a/WinAnsiEncodinge/MacRomanEncoding, in corrispondenza con le quattro condizioni di esenzione elencate nella clausola
Version 1.98.0
Aggiunto (Added)
pvuaiNeedAppearancesTrue(§7.18.4) segnala un AcroForm il cui flag/NeedAppearancesè true, impedendo il blocco affidabile delle apparizioni dei widget e impedendo alle tecnologie assistive di associarle all'albero della struttura; portato dal validatore PDF/A e vincolato alla presenza di/AcroFormper restringere la superficie di scansione
Modificato (Changed)
- Regressione del corpus veraPDF: collegate le coppie pass+fail di §7.20 Reference-XObject e le coppie pass+fail di §7.21.4.2 subset CharSet/CIDSet in
Live_Corpus_ValidatePdfUaMatchesConformance; i campioni pass di §7.21.7 ToUnicode-forbidden-value e §7.18.6.2 media-clip sono stati collegati anche come guardie contro i falsi positivi (i loro campioni fail utilizzano layout di dizionario che la scansione a livello di byte non rileva, quindi viene collegato solo il lato pass) - L'elenco delle asserzioni pass-path del corpus ha ottenuto 15 nuove guardie a zero falsi positivi, in modo che ogni controllo attivo di struttura e a livello di byte
pvuai*sia ora esercitato rispetto a campioni conformi (in precedenza solo circa 30 dei 60 problemi attivi erano protetti); la guardiapvuaiLangInvalidFormatè stata deliberatamente omessa perché il verificatore a livello di byte segnala in modo conservativo le stringhe/Langcodificate in esadecimale che non può decodificare
Version 1.97.0
Corretto (Fixed)
- Rafforzamento di
ValidatePdfUaStructureElements: il percorso della catena parentaleEnclosingTableora trasporta un contatore di salti (limitato dal numero di elementi), in modo che un cicloParentIndexmalformato su un array sintetico di elementi di struttura non possa più bloccare il chiamante; l'allocazione dell'array di ID marked-content inValidatePdfUaPageContentTaggingè ora limitata a un milione di voci, prevenendo un'allocazione multi-GB su unMarkedContentIDmalformato o dannoso
Modificato (Changed)
- Il commento di documentazione dell'enum
pvuaiOrderedListMissingListNumberingdescrive ora accuratamente ciò che fa il controllo: segnala un elementoLil cui valore diListNumberingè al di fuori del set descritto nella Tabella 347 di ISO 32000-1 (un attributo assente non viene segnalato); il commento precedente implicava che rilevasse anche le liste ordinate mancanti dell'attributo, cosa che l'implementazione non fa - I due campioni di errore del corpus per il mismatch di WMode
7.21.3.3-t02sono ora collegati inLive_Corpus_ValidatePdfUaMatchesConformance— a partire dalla v1.95.0 lo stream CMap viene decompresso con FlateDecode, quindi il confronto tra dizionario e contenuto viene ora eseguito su un lato leggibile; il commento obsoleto “not wired” è stato rimosso
Version 1.96.0
Aggiunto (Added)
- Coerenza cross-standard:
TPdf.ValidatePdfUaottiene due controlli portati dal validatore PDF/A;pvuaiAnnotationFlagsViolation(§7.18.1) segnala un'annotazione non esente che contiene il flag Hidden / Invisible / NoView, che interrompe il flusso di lettura delle tecnologie assistive;pvuaiActionTargetMissing(§7.18.5) segnala un'azione GoToR / URI / SubmitForm a cui manca la chiave di destinazione richiesta (/F+/D, /URI, /F), lasciando il collegamento inutilizzabile per le tecnologie assistive
Corretto (Fixed)
- Unione dell'albero della struttura cross-page: il ciclo di accumulo
AllElemsinTPdf.ValidatePdfUaora ricollega ilParentIndexdi ciascun elemento dall'array locale di pagina all'array unito; senza questo passaggio, gli elementi figli della pagina 2 mantenevano un indice locale che puntava alla sezione della pagina 1, corrompendo silenziosamente ogni controllo dipendente da ParentIndex (struttura di tabelle/liste, conteggio dei figli H di §7.4.4, EnclosingTable) - Analisi di RoleMap:
PdfReadRoleMapPairsnon interrompe più l'intera scansione chiave/valore quando un valore è un riferimento indiretto (N 0 R) o un array ([...]) — entrambe forme valide di RoleMap secondo ISO 32000-1 14.8.5.1; ora salta solo quella voce (Continue) invece di fare unBreak, eliminando i falsi positivi dipvuaiRoleMapUnresolvedsui tipi mappati dopo una voce indiretta o array
Modificato (Changed)
FPdfPreflightReport: 18 valori attivi diTPdfUaValidationIssueche in precedenza ricadevano nella categoria generica “missing marker” e nella relativa raccomandazione ora mostrano categorie accurate (Structure / Content / Metadata / Security) e raccomandazioni specifiche per clausola; corretto anche l'errore di battiturapuaNone / pua1→pucNone / puc1inPDFSpecComplianceMatrix.md
Version 1.95.0
Modificato (Changed)
- Passaggio di richiamo e robustezza per
TPdf.ValidatePdfUa: il controllo §7.21.3.3pvuaiCMapWModeMismatche il controllo §7.21.7pvuaiToUnicodeForbiddenValueora decomprimono gli stream CMap / ToUnicode compressi conFlateDecodeprima della scansione (in precedenza venivano giudicati solo gli stream non compressi, un noto falso negativo); gli helper condivisiPdfInflate/PdfReadAndDecodeStreamsono stati promossi daFPdfPdfa/FPdfPdfxaFPdfPdfCommonin modo che ogni unità di conformità condivida una singola copia
Aggiunto (Added)
pvuaiSubsetCharSetEmpty(§7.21.4.2) segnala unFontDescriptordi sottoinsieme Type 1 che contiene una chiave/CharSetil cui valore stringa è vuoto — l'esistentepvuaiSubsetMissingCharSetintercettava solo una chiave mancante; un/CIDSetvuoto non viene segnalato, poiché un font senza CID può legittimamente contenere una bitmap vuota
Version 1.94.0
Aggiunto (Added)
- Il secondo controllo di
TPdf.ValidatePdfUaha colmato sei lacune ISO 14289-1 emerse da una revisione clausola per clausola e da una nuova scansione delle API native di Pdfium già integrate ma non utilizzate dal percorso PDF/UA;pvuaiHeadingFormatInvalid(§7.4.3) segnala tag di intestazione definiti dall'utente che iniziano con H ma contengono separatori, spazi o numeri romani anziché pure cifre arabe;pvuaiMissingDocumentOutline(§7.17, raccomandato) segnala un documento multipagina che non contiene una struttura di segnalibri (i documenti a pagina singola sono esenti);pvuaiStructElementLangInvalid(§7.2) segnala un valore/Langdell'elemento di struttura che non è un tag BCP 47 valido;pvuaiWidgetMissingPrintField(§7.14 / §7.18.4) segnala un elemento di struttura Widget a cui manca il proprietario dell'attributo PrintField;pvuaiLinkNotInStructureTree(§7.18.5) segnala un documento le cui annotazioni/Subtype /Linknon sono esposte come elementi di struttura Link;pvuaiPdfiumAnnotationMissingContentsepvuaiPdfiumLinkMissingContents(§7.18.1 / §7.18.5) aggiungono una precisa scansione delle annotazioni del modello a oggetti Pdfium che esenta le annotazioni nascoste, esterne alla crop box, Popup e Widget — eliminando i falsi positivi dell'euristica a livello di byte, che non può leggere i flag/Fo/Rect
Version 1.93.0
Aggiunto (Added)
TPdf.ValidatePdfUaora sovrappone un passaggio del modello a oggetti Pdfium all'ispettore a livello di byte, rispecchiando l'architettura PDF/A round-7: percorre gli oggetti testo di ogni pagina tramiteFPDFTextObj_GetFont→FPDFFont_GetIsEmbedded(pvuaiPdfiumFontNotEmbedded, §7.21.4) ed esegue la scansione di ogni carattere tramiteFPDFText_HasUnicodeMapError(pvuaiPdfiumUnicodeMapError, §7.21.7) eFPDFText_GetUnicode(pvuaiPdfiumNotDefGlyph, §7.21.8) — più preciso rispetto alle euristiche a livello di byte, che si attivano solo quando non sono presenti programmi di font o non appare affatto/ToUnicode; il percorso si interrompe anticipatamente a tre livelli: il ciclo di pagina termina quando tutti e tre i problemi del livello Pdfium sono già impostati, il ciclo per oggetto termina al primo font non incorporato e la scansione dei caratteri salta il passaggio.notdefquandoUnicodeMapErrorè già stato riscontrato; PDF/UA era l'ultimo validatore di standard PDF senza un livello di modello a oggetti Pdfium
Version 1.92.0
Aggiunto (Added)
- Creato
Tests.PdfR— il primo file di test per il validatore PDF/R-1 (FPdfPdfr), che copre la validazione dell'intestazione, il divieto di ObjStm, il rilevamento dei raster-marker e una guardia file pulito contro i falsi positivi; tutte e sei le suite di test degli standard PDF dispongono ora di file di test dedicati: PdfA(80), PdfUa(101), PdfX(7), PdfE(5), PdfVT(15), PdfR(4) = 212 test totali
Version 1.91.0
Aggiunto (Added)
ValidatePdfEeValidatePdfVThanno ottenuto controlli a livello di contenuto precedentemente disponibili solo nei validatori PDF/A, PDF/UA e PDF/X:pveiLzwForbidden,pveiJavaScriptForbidden,pveiFormFieldsForbidden(solo PDF/E),pveiEmbeddedFilesForbidden(solo PDF/E),pveiOpiForbidden,pvviLzwForbidden,pvviJavaScriptForbidden,pvviEmbeddedFilesForbidden,pvviOpiForbidden;TPdf.ValidatePdfEeTPdf.ValidatePdfVTottengono anche un livello di modello a oggetti Pdfium (pveiPdfiumFontNotEmbedded/pvviPdfiumFontNotEmbedded) che percorre gli oggetti testo di pagina tramiteFPDFFont_GetIsEmbedded, interrompendosi anticipatamente al primo font non incorporato
Version 1.90.0
Aggiunto (Added)
TPdf.ValidatePdfXora sovrappone un passaggio del modello a oggetti Pdfium all'ispettore a livello di byte: percorre gli oggetti testo di ogni pagina tramiteFPDFTextObj_GetFont→FPDFFont_GetIsEmbeddede segnala un font non incorporato comepvxiPdfiumFontNotEmbedded— più preciso dell'euristica a livello di byte che si attiva solo quando non sono presenti programmi di font; il percorso si interrompe anticipatamente al primo font non incorporato trovato
Modificato (Changed)
- Percorso dell'albero di struttura in
TPdf.ValidatePdfUa: la chiamata per pagina aValidatePdfUaPageContentTagging(che compila una mappa di rivendicazione degli ID marked-content ed esegue controlli incrociati su ogni oggetto testo o immagine) viene ora saltata sulle pagine successive una volta riscontratopvuaiUntaggedContent— gli elementi della struttura vengono comunque raccolti per i controlli incrociati cross-page (ID nota unico, sequenza di intestazioni), ma la costosa fase di tagging del contenuto per pagina si interrompe anticipatamente
Version 1.89.0
Modificato (Changed)
- Prestazioni del livello del modello a oggetti Pdfium per
TPdf.ValidatePdfA: il percorso per pagina/oggetto si interrompe anticipatamente a tre livelli — il ciclo di pagina termina quando tutti i problemi applicabili al livello Pdfium sono già stati riscontrati, il ciclo per oggetto termina quando sono impostati entrambi i problemi per oggetto (font incorporato + trasparenza) e la scansione dei caratteri di testo della pagina salta il passaggio.notdefquandoUnicodeMapErrorè già stato riscontrato; i controlli di disponibilità delle APIAssigned()e i flag di conformità vengono memorizzati in booleani locali una volta sola prima del ciclo anziché essere rivalutati per ogni pagina/oggetto/carattere; su un documento multipagina non conforme, il percorso può ora fermarsi dopo la prima pagina invece di eseguire la scansione di tutte le pagine; su un documento conforme, il sovraccarico per pagina è inferiore (nessuna chiamataAssignedripetuta)
Version 1.88.0
Aggiunto (Added)
ValidatePdfXha ottenuto otto nuovi valori diTPdfXValidationIssuea livello di contenuto che coprono le restrizioni per lo scambio di stampe imposte da PDF/X oltre ai marcatori di formato file:pvxiLzwForbidden(/LZWDecode),pvxiJavaScriptForbidden(/JavaScript),pvxiFormFieldsForbidden(/AcroForm//XFA),pvxiAdditionalActions(/AA),pvxiEmbeddedFilesForbidden(/EmbeddedFiles//FileAttachment),pvxiOpiForbidden(/OPI//Alternates),pvxiMissingTrimBox(nessun/TrimBoxsu alcuna pagina) epvxiTrappedNotSet(/Trappedassente o/Unknown); in precedenza il validatore PDF/X controllava solo i marcatori XMP/OutputIntent; questo è il suo primo controllo a livello di contenuto; gli helper condivisiPdfStructureBytes/PdfHasName/PdfCountNamesono stati aggiunti aFPdfPdfCommonin modo che tutte le unità di conformità possano utilizzarli
Version 1.87.0
Aggiunto
- La validazione PDF/UA ora copre le regole sui font compositi ISO 14289-1 §7.21.3:
pvuaiCidSystemInfoMismatchsegnala i font Type0 il cui CMap incorporato e il CIDFont discendente non concordano suRegistry/Orderingo il cuiSupplementdel CIDFont supera quello del CMap,pvuaiCMapNotEmbeddedsegnala i CMap referenziati per nome (comeEncodingoUseCMap) che non sono CMap predefiniti della Tabella 118 di ISO 32000-1, epvuaiCMapWModeMismatchsegnala i CMap incorporati il cuiWModenel dizionario differisce dal WMode nel contenuto del loro stream
Risolto
- Il controllo §7.21.3.2
pvuaiCidFontMissingCidToGidMapmancava i dizionari CIDFontType2 il cui valore/coppia chiaveSubtypeè separato da un'andata a capo, e ora segnala anche un valore nameCIDToGIDMapdiverso daIdentity
Version 1.86.0
Aggiunto
- La validazione PDF/UA ora copre le regole di codifica TrueType ISO 14289-1 §7.21.6:
pvuaiTrueTypeEncodingInvalidsegnala i font TrueType non simbolici il cuiEncodingè assente o non è néMacRomanEncodingnéWinAnsiEncoding(direttamente o tramiteBaseEncoding), epvuaiSymbolicTrueTypeEncodingsegnala i font TrueType simbolici che portano un nomeEncodingnon standard
Version 1.85.1
Modificato
- Il controllo dell'ordine di tabulazione ISO 14289-1 §7.18.3
pvuaiMissingTabsOrderora viene eseguito per pagina: ogni pagina contenente annotazioni deve dichiarare/Tabs /Snel proprio dizionario di pagina, quindi una pagina conforme non maschera più una pagina priva di tale dichiarazione
Version 1.85.0
Aggiunto
- La validazione PDF/UA ora distingue i moduli XFA dinamici da quelli statici in conformità a ISO 14289-1 §7.15:
pvuaiXfaDynamicsegnala i moduli la cui configurazione XFA impostadynamicRendersurequired
Modificato
- Il precedente flag candidato per qualsiasi XFA
pvuaiXfaPresentè ritirato e non viene più emesso (gli XFA statici sono conformi a §7.15); il valore dell'enum rimane per compatibilità API
Version 1.84.0
Aggiunto
- La validazione PDF/UA ora rileva i contenuti reali non etichettati richiesti da ISO 14289-1 §7.1:
pvuaiUntaggedContentsegnala gli oggetti di testo e immagine resi che non sono né rivendicati dall'albero strutturale della pagina (tramite i loro ID di contenuto contrassegnato) né contrassegnati come Artifact - Nuovi helper a livello di pagina
GetPageContentMarkInfoseValidatePdfUaPageContentTaggingcon il recordTPdfPageContentMarkInfoper uso diretto
Version 1.83.0
Aggiunto
- La validazione PDF/UA ora applica il modello di intestazione ISO 14289-1 §7.4.4:
pvuaiHeadingModelMixedsegnala i documenti che mescolano il tag genericoHcon le intestazioni numerateH1..Hn, epvuaiHeadingMultipleInNodesegnala i nodi strutturali che contengono più di un'intestazione figlioH
Version 1.82.0
Aggiunto
- La validazione PDF/UA ora risolve la RoleMap richiesta da ISO 14289-1 §7.1:
pvuaiRoleMapRemapsStandardsegnala le voci della RoleMap che ridefiniscono un tipo strutturale standard, epvuaiRoleMapUnresolvedsegnala i tipi strutturali non standard utilizzati la cui catena RoleMap è assente, pendente o ciclica — le catene indirette che raggiungono un tipo standard sono accettate, e le voci RoleMap non utilizzate non vengono mai giudicate - Nuovi helper
PdfUaIsStandardStructType,PdfReadRoleMapPairs(con decodifica dell'escape PDF name#hh) eValidatePdfUaRoleMapUsageper uso diretto
Version 1.81.0
Aggiunto
- La validazione PDF/UA ora copre la taggatura delle liste ISO 32000-1 richiesta da ISO 14289-1 §7.6:
pvuaiListStructureInvalidsegnala gli elementi LI fuori da un contenitore L e le parti Lbl/LBody fuori da un elemento LI, accettando al contempo le liste annidate e l'uso legittimo di Lbl all'interno degli elementi Note e BibEntry
Version 1.80.0
Aggiunto
- La validazione PDF/UA ora copre la taggatura delle tabelle ISO 32000-1 richiesta da ISO 14289-1 §7.5:
pvuaiTableStructureInvalidsegnala le celle TH/TD fuori da una riga TR e le righe o i gruppi di righe fuori dal loro contenitore Table,pvuaiTableHeaderMissingScopesegnala le celle di intestazione la cui relazione non è determinabile né tramite un attributo Scope né tramite un'associazione Headers/ID, epvuaiTableHeadersUndefinedIdsegnala i riferimenti Headers in documenti che non definiscono ID di elementi strutturali TPdfStructureElementespone gli attributi di tabellaScope,HasHeaders,HeadersIds,ColSpaneRowSpan, risolti durante la visita dell'albero strutturale
Modificato
- La visita dell'albero strutturale ora legge tutti gli attributi di layout e di tabella in un unico passaggio sui dizionari degli attributi di ciascun elemento anziché una scansione per attributo
Version 1.79.1
Aggiunto
- Portato l'esempio
AnnotationsLabsu Lazarus e C++Builder, unendosi all'esistente esempio console Delphi
Risolto
TPdf.CreateAnnotationpoteva sollevare “Cannot set attachment points” per le annotazioni di markup che usano punti quad (Highlight, Underline, StrikeOut, Squiggly) perché la nuova annotazione non aveva ancora uno slot quad da sostituire; ora invece accoda il primo quad
Version 1.79.0
Aggiunto
- Nuovo esempio console Delphi
AnnotationsLab: crea annotazioni Text, Highlight, Square e Circle, le scrive in un PDF, quindi ricarica il file ed enumera l'elenco delle annotazioni della pagina
Version 1.78.0
Aggiunto
- Nuovi
TPdf.MeasureTexteTPdf.MeasureTextWidth: misurano la larghezza e l'altezza renderizzate di una stringa per un dato font e dimensione (unità utente PDF, 1 unità = 1/72 di pollice) senza aggiungere contenuto a una pagina, rendendo possibile la logica di layout e word-wrap sopraAddText; forniti dall'unità indipendenteFPdfMeasurecome helper di classe - Nuovo
TPdf.WrapText: word wrap avido (greedy) basato suMeasureTextWidthche divide il testo sugli spazi e impacchetta le parole in righe non più larghe di una data larghezza (unità utente PDF); una singola parola troppo lunga ottiene la propria riga (nessuna interruzione intra-parola), restituendo le righe mandate a capo come array
Version 1.77.0
Aggiunto
ValidatePdfAha ottenuto tre nuovi valoriTPdfAValidationIssueche coprono le clausole precedentemente valutate “NO” o “reader behaviour” dal precedente audit dei divari (ordinali accodati, valori esistenti invariati):pvaiPdfiumNotDefGlyph(PDF/A-2 6.2.11.8 — un carattere che si risolve in Unicode 0 senza un errore di mappatura, il sintomo a runtime di un riferimento glifo.notdef; rilevato tramite il livello del modello a oggetti Pdfium),pvaiWordBreakMissing(Level A 6.8.3.2 — una stringa di visualizzazione del flusso di contenuto più lunga di 20 caratteri senza spazio, una probabile violazione di parole unite; euristica grossolana che evita falsi positivi CJK), epvaiLinkActionMissingTarget(6.6.3 — un'azione GoToR/URI/SubmitForm a cui manca la chiave del target di visualizzazione in modo che un lettore non possa presentarla)
Version 1.76.0
Aggiunto (Added)
ValidatePdfAha ottenuto tre nuovi valoriTPdfAValidationIssue(ordinali aggiunti in coda, valori esistenti invariati):pvaiNameNotValidUtf8(PDF/A-2/3 6.1.8 — un token/BaseFonto/FontNamecontenente byte ≥ 0x80 che non formano un UTF-8 valido),pvaiInlineImageLzwForbidden(PDF/A-2/3 6.1.10 — un'immagine in linea in un flusso di contenuto della pagina utilizza il filtro LZW o Crypt) epvaiTrueTypeDifferencesForbidden(6.3.7 Cor.2 — un font TrueType non simbolico il cui dizionario Encoding contiene/Differences)
Version 1.75.0
Aggiunto (Added)
ValidatePdfAha ottenuto tre nuovi valoriTPdfAValidationIssue(ordinali aggiunti, valori esistenti invariati):pvaiIntegerImplementationLimit(PDF/A-2/3 6.1.13 — un token numerico che supera il limite dei numeri interi con segno a 32 bit 2,147,483,647),pvaiBlendModeNotWhitelisted(PDF/A-2/3 6.2.10 — un valore/BMal di fuori del set di blend-mode standard ISO 32000-1 §11.3.5; integra ilpvaiTransparentColorSpacedi PDF/A-1 che consente solo Normal/Compatible), epvaiHexStringOddDigits(6.1.6 — una stringa esadecimale<...>con un numero dispari di cifre esadecimali)
Version 1.74.0
Aggiunto (Added)
ValidatePdfAha ottenuto tre nuovi valoriTPdfAValidationIssue(ordinali aggiunti, valori esistenti invariati):pvaiPermissionsViolation(6.1.12 — un dizionario/Permscontenente/DigestLocation,/DigestMethodo/DigestValueinsieme a/DocMDP),pvaiTransActionForbidden(PDF/A-2 6.5.1 — un'azione di transizione Trans, rilevata tramite il pattern del dizionario delle azioni/S /Transper evitare falsi positivi con/Transparency), epvaiPdfiumObjectTransparency(PDF/A-1 6.4 — un oggetto pagina ha una trasparenza reale secondoFPDFPageObj_HasTransparency, estendendo il livello del modello a oggetti Pdfium introdotto nella v1.73.0 per rilevare gli effetti di blend-mode/soft-mask che la scansione dei nomi a livello di byte può mancare)
Version 1.73.0
Aggiunto (Added)
TPdf.ValidatePdfAora sovrappone un passaggio del modello a oggetti Pdfium sopra l'ispettore a livello di byte: analizza tutti gli oggetti di testo di ogni pagina tramiteFPDFPage_GetObject→FPDFTextObj_GetFont→FPDFFont_GetIsEmbeddede segnala un font reso non incorporato comepvaiPdfiumFontNotEmbedded(ISO 19005 6.3.4), e carica ogni pagina di testo per scansionareFPDFText_HasUnicodeMapErrore segnala una mappatura Unicode danneggiata comepvaiPdfiumUnicodeMapError(6.3.8). Questi sono controlli che l'ispettore a livello di byte non può eseguire — vede solo nomi token, non handle di font risolti o stato di mappatura per carattere — e vengono uniti nel risultato a livello di byte. La funzione autonoma a livello di byteValidatePdfAComplianceè invariata
Version 1.72.0
Aggiunto (Added)
ValidatePdfAha ottenuto cinque nuovi valoriTPdfAValidationIssue(ordinali aggiunti, valori esistenti invariati):pvaiNeedsRenderingPresent(PDF/A-2 6.4.2 — il catalogo non deve contenere/NeedsRendering),pvaiDestOutputProfileRef(PDF/A-3 6.2.3 — un OutputIntent non deve contenere/DestOutputProfileRef),pvaiEmbeddedFileMissingUF(PDF/A-3 6.8 — una specifica di file con/EFdeve contenere anche/UF),pvaiXmpPacketBytesAttr(6.7.5 — l'intestazione del pacchetto XMP non deve contenere gli attributi deprecatibytes=oencoding=), epvaiAnnotationToggleNoView(PDF/A-2 6.3.2 — il bit/FToggleNoView dell'annotazione, valore 512, è vietato)
Version 1.71.0
Modificato
ValidatePdfUaora sollevapvuaiOrderedListMissingListNumbering(ISO 14289-1 7.6): il walker dell'albero della struttura risolve l'attributo di layoutListNumberingsu ogni elementoLtramite l'API degli attributi di Pdfium e segnala qualsiasi valore al di fuori dell'insieme della Tabella 347 di ISO 32000-1 (Decimal,UpperRoman,LowerRoman,UpperAlpha,LowerAlpha,None,Circle,Disc,Square). Un attributo assente non viene segnalato, poiché l'elenco potrebbe non essere ordinato; questo colma l'ultima lacuna residua di ISO 14289-1 registrata alla fine del round 5
Version 1.70.0
Aggiunto
ValidatePdfUaha ottenuto quattro nuovi valoriTPdfUaValidationIssue(ordinali accodati, valori esistenti invariati):pvuaiSubsetMissingCidSet(ISO 14289-1 7.21.4.2 — unFontDescriptordi un sottoinsieme CID deve dichiarare/CIDSet),pvuaiToUnicodeForbiddenValue(7.21.7 — una CMap ToUnicode non deve mappare alcun codice aU+FEFFoU+FFFE; i flussi non compressi vengono scansionati per le forme di output<FEFF>/<FFFE>),pvuaiLangInvalidFormat(7.2 —/Langdeve essere un tag RFC 1766 / BCP 47 valido; una grammatica permissiva accettaen,en-US,zh-Hans,es-419e segnala valori chiaramente non conformi), epvuaiOrderedListMissingListNumbering(7.6 — mantenuto per completezza dell'API; non ancora sollevato dal validatore perché per distinguere in modo affidabile gli elenchi ordinati da quelli non ordinati è necessario il valore dell'attributoListNumbering, che il walker dell'albero della struttura non espone)
Version 1.69.0
Aggiunto
ValidatePdfUaha ottenuto due nuovi valoriTPdfUaValidationIssue(ordinali accodati, valori esistenti invariati):pvuaiWidgetOutsideForm(ISO 14289-1 7.18.4 — un elemento di struttura Widget deve essere annidato all'interno di un elementoForm; il walker dell'albero della struttura ora verifica il tipo di genitore diretto di ogni Widget) epvuaiSubsetMissingCharSet(7.21.4.2 — unFontDescriptordi un sottoinsieme di Tipo 1 deve dichiarare/CharSet, identificato dal prefisso di sei lettere+del nome del sottoinsieme in/FontName)
Version 1.68.0
Aggiunto
ValidatePdfUaha ottenuto due nuovi valoriTPdfUaValidationIssue(ordinali accodati, valori esistenti invariati):pvuaiUriActionIsMap(ISO 14289-1 7.18.5 — un dizionario di azione URI non deve contenere/IsMapcon valoretrue, poiché disabilita la destinazione del link accessibile) epvuaiHeadingSequenceViolation(7.4.2 — le intestazioni numerate devono iniziare daH1e una sequenza discendente non deve saltare un livello intermedio, ad es.H1→H3è una violazione). Il controllo delle intestazioni è la prima regola PDF/UA a livello di albero della struttura nel validatore:ValidatePdfUaStructureElementsora scorre l'elenco degli elementi tipizzati e verifica la sequenzaH1…H6(eH7+secondo 7.4.3) nell'ordine del documento
Version 1.67.0
Aggiunto
ValidatePdfUaha ottenuto cinque nuovi valoriTPdfUaValidationIssue(ordinali accodati, valori esistenti invariati):pvuaiLinkMissingContents(ISO 14289-1 7.18.5 — un'annotazione Link deve contenere una descrizione alternativa tramite/Contents),pvuaiAnnotationMissingContents(7.18.1 — qualsiasi annotazione non esente senza/Contentsdeve avere una descrizione alternativa; Popup e Widget sono esenti),pvuaiEmbeddedFileMissingName(7.11 — un dizionario di specifica del file deve contenere/Fe/UF),pvuaiMediaClipMissingAlt(7.18.6.2 — un dizionario di dati di clip multimediale deve contenere/CTe/Alt), epvuaiCidFontMissingCidToGidMap(7.21.3.2 — un CIDFont di Tipo 2 incorporato deve contenere/CIDToGIDMap)
Version 1.66.0
Aggiunto
ValidatePdfUaha ottenuto cinque nuovi valoriTPdfUaValidationIssue(ordinali accodati, valori esistenti invariati):pvuaiRoleMapMissing(ISO 14289-1 7.1 — un documento taggato con tipi di struttura non standard deve contenere un/RoleMap),pvuaiOptionalContentAsKey(7.10 — un dizionario di configurazione del contenuto opzionale non deve contenere la chiave di stato automatico/AS),pvuaiXfaPresent(7.15 — la presenza di/XFAin un AcroForm viene segnalata poiché gli XFA dinamici sono vietati),pvuaiTrapNetAnnotation(7.18.2 — le annotazioni/TrapNetsono vietate), epvuaiReferenceXObject(7.20 — i Reference XObject, identificati dal marcatore/Ref, sono vietati)
Risolto
ValidatePdfUanon genera più falsi positivi perpvuaiEncryptionPresentsu ogni file crittografato: PDF/UA consente la crittografia purché la chiave/Pdel dizionario di crittografia abbia il bit in posizione 10 (valore 1024) impostato, il che garantisce l'accesso alle tecnologie assistive (7.16). La violazione precisa è ora segnalata tramite il nuovopvuaiEncryptionPBitMissing;pvuaiEncryptionPresentviene mantenuto nell'enum per compatibilità dell'API ma non viene più sollevato dal validatore a livello di byte
Version 1.65.0
Aggiunto
ValidatePdfAha ottenuto cinque nuovi valoriTPdfAValidationIssue(ordinali accodati, valori esistenti invariati):pvaiCidFontMissingCidToGidMap(ISO 19005-1 6.3.3.2 Cor.2 — un CIDFont di Tipo 2 incorporato deve contenere/CIDToGIDMap),pvaiSubsetMissingCharSet(6.3.5 — unFontDescriptordi un sottoinsieme di Tipo 1 deve contenere/CharSet),pvaiSubsetMissingCidSet(6.3.5 — unFontDescriptordi un sottoinsieme CID deve contenere/CIDSet),pvaiWidgetActionForbidden(6.6.1 — un'annotazione Widget non deve contenere/Ao/AA), epvaiOptionalContentAsKey(ISO 19005-2 6.9 — un dizionario di configurazione del contenuto opzionale non deve contenere la chiave di stato automatico/AS, ora rilevante perché PDF/A-2 consente il contenuto opzionale)
Version 1.64.0
Aggiunto
ValidatePdfAha ottenuto otto nuovi valoriTPdfAValidationIssue(ordinali accodati, valori esistenti invariati):pvaiHeaderBinaryMarkerMissing(ISO 19005-1 6.1.2 — l'intestazione%PDF-x.ydeve essere seguita da un commento%con almeno quattro byte maggiori di 127),pvaiExternalStreamRef(6.1.7 — un dizionario di flusso non deve contenere/F,/FFiltero/FDecodeParms),pvaiOutputIntentScheme(6.2.2 — il/Sdi OutputIntent deve essere/GTS_PDFA1),pvaiInfoXmpDateMismatch(6.7.3 — InfoCreationDate/ModDatedeve apparire anche comexmp:CreateDate/xmp:ModifyDate),pvaiMarkInfoMissing(6.8.2.2 — il Livello A richiede/MarkInfocon/Marked true),pvaiAnnotationApDictViolation(6.5.3 Cor.2 — il dizionario/APdell'annotazione deve contenere solo/N),pvaiEmbeddedFileMissingAFRelationship(ISO 19005-3 Annex E.2 — ogni filespec associato deve contenere/AFRelationship), epvaiJpeg2000Violation(ISO 19005-2 6.2.8.3 — un'immagine JPEG2000 deve dichiarare 1, 3 o 4 componenti)
Risolto
ValidatePdfAnon genera più falsi positivi perpvaiAnnotationFlagsViolationsui documenti che usano un nome di risorsa font a lettera singola come/Font << /F 5 0 R >>; la scansione del flag/Fè ora limitata a un contesto di annotazione (/Subtypedi un tipo di annotazione), corrispondendo al comportamento documentato (6.5.3)ValidatePdfAora segnala il requisito dei file associati PDF/A-3 per ogni file: un documento viene segnalato solo quando un/Type /Filespecincorporato che fa riferimento a un flusso incorporato tramite/EFè privo di/AFRelationship, invece del precedente controllo a livello di intero documento 'tutto o niente' (ISO 19005-3 Annex E.2)- Aggiunta l'azione deprecata
/SetStateall'insieme delle azioni vietate insieme a/SetOCGState, in modo che il nome dell'azione nel PDF Reference venga intercettato direttamente (6.6.1)
Version 1.63.0
Aggiunto (Aggiunto)
- Aggiunti
TPdf.MeasureTexteTPdf.MeasureTextWidth: misurano la larghezza e l'altezza di rendering del testo con un font e una dimensione specificati senza aggiungere contenuti alla pagina (in unità utente PDF, 1 unità = 1/72 pollice), consentendo calcoli di layout e a capo automatico suAddText; forniti dall'unità autonomaFPdfMeasurecome class helper
Modificato (Modificato)
Demo\Delphi\MergePDF,Demo\CBuilder\MergePDFeDemo\Lazarus\MergePDFmigliorati per tutti e tre gli IDE: selezione dell'intervallo di pagine per file, percorso di output opzionale, deduplicazione, log di esecuzione, pulsante di annullamento e riepilogo dell'unione; segnalibri e metadati vengono importati dalla prima fonte- Le demo di
CreatePDFper tutti e tre gli IDE ora includono un'opzione «Testo europeo» per scrivere testo con accenti in ceco, francese, tedesco, spagnolo, portoghese, polacco e turco, per verificare la selezione dei font e la gestione Unicode (il precedente esempioEuropeanTextè stato integrato) - Rimossi gli esempi
ExtractTextPageseEuropeanText: la funzionalità di estrazione del testo pagina per pagina diExtractTextPagesè ora coperta dalle opzioni di intervallo e separatore di pagina diExtractText; il rendering multilingua diEuropeanTextè stato integrato inCreatePDF
Version 1.62.2
Corretto
- Le intestazioni C++Builder (
.hpp) sono state rigenerate per tutte le versioni e piattaforme RAD Studio (Win32/Win64/Win64x); si erano discostate dalle sorgenti Pascal, lasciando firme di funzione obsolete e unità mancanti che raggiungevano gli utenti C++Builder tramite la distribuzione dei sorgenti
Version 1.62.1
Corretto
- È stata ripristinata la compilazione dei sorgenti su RAD Studio 12 Athens e precedenti: un'assegnazione di
TArray<Byte>nel percorso di convalida PDF/UA usava una conversione implicita di array disponibile solo in Delphi 13 e non compilava sugli IDE più vecchi
Version 1.62.0
Aggiunto
TPdf.RenderPageThumbnailrenderizza qualsiasi pagina per indice in un bitmap adattato al rapporto d'aspetto senza cambiare la pagina corrente del documento, la pagina caricata o attivareOnPageChange
Corretto
TPdfThumbnailViewnon guida più ilPageNumberdel documento host durante il disegno; prima ogni ridisegno ricaricava le pagine, attivavaOnPageChangee scartava la pagina di testo, cosa che poteva disturbare unTPdfViewcollegato e innescare cicli di ridisegno. Le miniature ora vengono renderizzate tramiteRenderPageThumbnailsenza questi effetti collaterali- La convalida di conformità PDF/X ora ispeziona i documenti con flussi di riferimenti incrociati (PDF 1.6, tipici di PDF/X-4) e gli oggetti memorizzati in flussi di oggetti compressi, invece di segnalare quei file in blocco come non conformi; il marcatore
GTS_PDFXVersionviene letto sia dalla forma elemento sia dalla forma attributo RDF di XMP - La convalida PDF/R ora segnala
pvriInfoXmpMismatchquando il dizionario Info e XMP divergono su Producer o Creator; il problema era stato dichiarato ma non sollevato - I timer di riempimento dei moduli vengono ora tracciati per richiesta, così un documento che ne esegue più di uno alla volta (per esempio un intervallo JavaScript insieme al lampeggio del cursore del campo) li conserva tutti invece di perderli tutti tranne l'ultimo
- Il disegno di
TPdfViewe i suoi metodi pubbliciRenderPage/RenderTilemantengono ora il blocco di rendering del documento, serializzandosi rispetto al rendering nel thread di lavoro dello stessoTPdf(PDFium non è thread-safe) - Il testo non ASCII scritto nei metadati PDF/X, PDF/R e PDF/VT (nomi di condizione OutputIntent, Creator, Producer) viene ora codificato come stringa UTF-16BE secondo ISO 32000-1 §7.9.2.2 invece che come UTF-8 grezzo, che i lettori conformi leggerebbero in modo errato
- Gli helper di conformità ora leggono correttamente i flussi di metadati incorporati il cui
/Lengthè un riferimento indiretto, caricano i byte sorgente conReadBuffer(così una lettura corta fallisce in modo pulito) e rifiutano un offsetstartxrefnegativo invece di rischiare una lettura fuori intervallo
Version 1.61.0
Modificato
- Correzioni delle dichiarazioni FFI/ABI che possono richiedere di ricompilare il codice che implementa i callback interessati: il callback di riempimento moduli
FFI_OpenFileora portacdecl(convenzione di stack Win32), e il parametrovaluediFPDFAnnot_SetStringValueeFPDFAttachment_SetStringValueè oraFPDF_WIDESTRING(UTF-16LE) per corrispondere alle intestazioni PDFium - I callback di caricamento progressivo
FX_FILEAVAIL.IsDataAvaileFX_DOWNLOADHINTS.AddSegmentora prendono offsetsize_t, esize_tha la larghezza di un puntatore in Free Pascal / Lazarus Win64 (prima veniva troncato a 32 bit), correggendo la disponibilità dei dati e le chiamate APIoutsize_tsu FPC Win64
Corretto
- Sicurezza della memoria: un use-after-free del timer di riempimento dei moduli quando si distrugge un
TPdfcon un cursore AcroForm attivo; un doppioFPDF_CloseDocumentnel percorso di errore diImportNPagesToOne; eccezioni Pascal che uscivano dai callbackFPDF_FILEWRITE/FPDF_FILEACCESSoltre il confine C durante il salvataggio e l'inserimento JPEG; e un overflow di interi nell'estrazione del testo durante la lettura da un indice iniziale fino alla fine della pagina TPdfFuture<T>ora consegna in modo affidabile il suo callback di risultato; la risposta veniva prima quasi sempre scartata e poteva toccare un thread liberato perché il worker si liberava prima che la risposta accodata venisse eseguita- L'output PDF/A, PDF/X, PDF/E, PDF/R, PDF/VT e PDF/UA ora scrive voci di tabella dei riferimenti incrociati esattamente lunghe 20 byte, come richiesto da ISO 32000-1 §7.5.4
- L'iniezione dei marker di conformità non distrugge più un dizionario quando la chiave rimossa (per esempio
/Trapped) era l'ultima voce, cosa che prima inghiottiva la chiusura>>e produceva un oggetto malformato - I flussi di profilo ICC di OutputIntent dichiarano ora il numero di componenti
/Nrichiesto per PDF/X e PDF/VT (già presente per PDF/A); i documenti sorgente cifrati vengono decifrati prima dell'iniezione dei marker PDF/X, PDF/E, PDF/R, PDF/VT e PDF/UA, così l'output è valido invece di risultare silenziosamente corrotto - Il BOM xpacket UTF-8 nell'XMP generato viene emesso come byte esatti, correggendo la corruzione sulle installazioni Delphi la cui code page ANSI non è Latin-1; i trailer di aggiornamento incrementale ora conservano il riferimento
/Infodel documento SaveAscon compressione non tronca più i flussi il cui/Lengthè un riferimento indiretto, e le tabelle dei riferimenti incrociati ricostruite ora usano voci da 20 byte, numeri di generazione reali e scartano il puntatore/Prevobsoleto- La convalida di conformità legge correttamente i marker di versione XMP in forma di attributo per PDF/E e PDF/X, così i file PDF/X-4 serializzati come attributi vengono riconosciuti; richiede l'identificatore esatto
PDF/E-1, legge correttamente i flussi di metadati con/Lengthindiretto e non confonde più per falso positivo la chiave/IDo/StructTreeRootdi un elemento di struttura quando controlla il trailer PDF/UA; un offsetstartxrefmalformato non genera più un errore di intervallo TPdfThumbnailView: l'ultima pagina è ora raggiungibile con la barra di scorrimento, la pagina corrente del documento host viene ripristinata dopo il disegno delle miniature e la gestione standard dell'uscita del mouse viene di nuovo inviata- I bitmap di pagina e di immagine in scala di grigi non vengono più renderizzati con una tavolozza errata;
TPdfViewnon resta più con un riferimento pendente quando il suoTPdfviene liberato per primo - Report di preflight: HTML viene salvato come UTF-8 per corrispondere al charset dichiarato, e l'escape delle stringhe JSON produce sequenze
\ucorrette per i caratteri non ASCII in Free Pascal - Build di prova: la finestra di dialogo di promemoria della prova ora compare invece di essere soppressa prima di potersi mostrare
TPdfStreamAdapterora rifiuta flussi superiori a 4 GiB con un errore chiaro invece di troncare silenziosamente la lunghezza passata a PDFium
Version 1.60.1
Modificato
- Le demo AccessibilityReader per Delphi, Lazarus e C++Builder ora eseguono la lettura ad alta voce tramite
TPdfReadingSession: ogni pagina viene assemblata in un unico frammento parlato conBuildSpokenTextFromWords, le posizioni parola SAPI alimentanoFeedSpokenPosition, e la sessione avanza nelle pagine e guida il cursore parola della vista, sostituendo l'orchestrazione scritta a mano che ogni demo portava prima - Il tracciamento karaoke a livello di parola nelle demo funziona ora anche quando NVDA è il motore di sintesi:
EstimatePacingscandisce il cursore di lettura in base al tempo di parlato trascorso, mentre prima NVDA leggeva ad alta voce senza alcun tracciamento delle parole - Pause e Resume nelle demo funzionano ora anche con NVDA:
ResumeRestartsChunkrilegge la pagina corrente dal suo inizio al Resume, mentre SAPI conserva la sua pausa e ripresa native sul posto
Version 1.60.0
Aggiunto
- Rendering in tempo reale per bassa visione in
TPdfView: le nuove opzioni di renderingreInvertereNightDuotonericolorano ogni tassello di pagina renderizzato (inversione totale dei colori, oppure una tavolozza notturna a due tinte) prima che vengano disegnate le sovrapposizioni di ricerca, selezione, lettura e cursore parola, portando le trasformazioni colore bitmap esistenti nella visualizzazione interattiva sia per il layout a pagina singola sia per quello a pagine affiancate; il cambio di opzioni provoca un ridisegno immediato NightDuotoneInkeNightDuotonePaperconfigurano la tavolozza notturna, con testo ambra su pagina nera come predefinito;reInvertha la precedenza quando entrambe le opzioni sono impostate
Version 1.59.0
Aggiunto
TPdfReadingSession: un componente di orchestrazione della lettura ad alta voce agnostico al motore vocale. Mantiene il cursore del frammento, il cursore della parola e lo stato di riproduzione (Play/PlayFrom/Pause/Resume/Stop), avanza attraverso i frammentiTPdfSpokenTextcaricati mentre l'host segnala il motore inattivo tramiteTick, traduce i decimali del testo parlato di nuovo nei caratteri di pagina e guida automaticamente il cursore parola di unTPdfViewcollegato; l'host collega qualsiasi motore vocale tramiteOnSpeake gli eventi di richiesta di annullamento, pausa e ripresa, così la libreria non collega alcuna API vocale da solaFeedSpokenPositionconsuma le posizioni parola del motore (comeStatus.InputWordPositiondi SAPI);EstimatePacingconEstimatedWordsPerMinutescandisce i motori privi di segnale di posizione;ResumeRestartsChunkrilegge il frammento corrente per i motori senza pausa nativaOnChunkChange,OnWordChangeeOnFinishedvengono emessi solo per cambiamenti reali, e una vista collegata liberata si scollega automaticamente, così il codice host resta privo di flicker e sicuro da crash
Version 1.58.0
Aggiunto
EstimateSpokenWordIndexstima quale parola un motore vocale stia pronunciando dal tempo trascorso e da un ritmo in parole al minuto, assegnando proporzionalmente più tempo alle parole più lunghe, così i motori che non riportano la posizione parola (come il client controller di NVDA) possono comunque pilotare il cursore di lettura a livello di parola; il chiamante fornisce il tempo trascorso, quindi la routine resta senza dipendenza dall'orologio e testabile unitariamente
Version 1.57.0
Aggiunto
- Assemblaggio del testo parlato con mappatura su due domini per il tracciamento della lettura ad alta voce:
BuildSpokenTextFromWordseSpokenTextAppendcostruiscono la stringa consegnata a un motore text-to-speech a partire dai riquadri parola della pagina mentre registrano una tabella di intervalli, eSpokenToPageChartraduce uno scostamento parlato segnalato dal motore (comeStatus.InputWordPositiondi SAPI) di nuovo all'indice del carattere di pagina, così il tracciamento dell'evidenziazione a livello di parola resta corretto quando il testo parlato non è tutto il testo della pagina (regioni saltate, lettura per unità, sostituzioni di pronuncia) - I tipi
TPdfSpokenTexteTPdfSpokenSpantrasportano la stringa parlata più gli intervalli di pagina sorgente da cui è stata costruita; gli offset sui separatori inseriti si risolvono nella parola mappata successiva e gli offset oltre gli intervalli mappati non segnalano alcuna corrispondenza
Version 1.56.9
Aggiunto (Aggiunto)
Demo\Delphi\PreflightReportaggiunge un’anteprima del piano d’azione che raccoglie gli standard non superati, le priorità, le azioni successive, i codici problema e le raccomandazioni in una checklist di rimedioDemo\Delphi\PreflightReportCliaccettaplan/actionplancome formato di output per esecuzioni file singolo e batch, scrivendo la stessa checklist di rimedio in un file di testo
Modificato (Modificato)
- Entrambi i demo Delphi PreflightReport mostrano ora i conteggi degli stati pass / action / review accanto a standard e problemi totali
Version 1.56.8
Modificato (Modificato)
ViewerInteractionLabora include comandi per salto pagina, comandi di zoom manuale, log delle coordinateDeviceToPage/PageToDevicebasato su click e un log di interazione più chiaro per controlli su selezione, ricerca, rotazione e navigazione- Le pagine readme di
ViewerInteractionLabdocumentano ora il flusso di interazione aggiunto in tutto il set di readme demo localizzati
Version 1.56.7
Aggiunto (Aggiunto)
AccessibilityWorkbenchClimappa ogni segnalazione rilevata al Success Criteria WCAG 2.1 e alla clausola ISO 14289-1 (PDF/UA-1) e mostra nei report una sezione di copertura degli standardAccessibilityWorkbenchClicalcola un punteggio di accessibilità documentato da 0 a 100 con una scala di penalità pubblicata e una fascia excellent / good / needs work / poor, visibile per file e come media di batchAccessibilityWorkbenchCliaccettafailscore=Nper marcare il run come fallito (exit code 2) quando una qualsiasi file scende sotto NAccessibilityWorkbenchCliscrive un log SARIF 2.1.0 quando il nome del riepilogo batch termina con.sarif, con una regola per tipo di rilevamento e i tag WCAG 2.1 e PDF/UA per ingestion CI e code-scanningAccessibilityWorkbenchCliaggiunge il comandoversionche stampa la versione collegata di PDFiumPas
Version 1.56.6
Aggiunto (Aggiunto)
IntakeWorkbenchClicalcola un hash forense SHA-256 per ogni file in ingresso (degrado aunavailablesui compilatori senzaSystem.Hash) e lo riporta in ogni formatoIntakeWorkbenchCliaccettapasswords=file.txtper sbloccare in prova documenti con password da un elenco candidato, registrando l’indice candidato corrispondente senza mai loggare il testo della passwordIntakeWorkbenchCliaccettacopyto=dirper instradare ogni file auditato in una sottocartella per livello di rischio, trasformando l’auditor in un ordinatore d’ingressoIntakeWorkbenchCliscrive un log SARIF 2.1.0 quando il nome del riepilogo batch termina con.sarif, con una regola per flag di rischio e un risultato per file segnalato per ingestion CI e code-scanningIntakeWorkbenchCliaggiunge il comandoversionche stampa la versione collegata di PDFiumPas
Version 1.56.5
Aggiunto (Aggiunto)
IntakeWorkbenchCliora deriva le azioni post-intake consigliate come accept, request-password, manual-review, quarantine e deduplicate, e espone i conteggi delle azioni nei riepiloghi batchAccessibilityWorkbenchCliora deriva le azioni di remediation consigliate come pass-through, remediate-tags, run-ocr, remediate-semantics e manual-review, con conteggi batch corrispondenti
Modificato (Modificato)
- Entrambi i demo CLI orientati agli strumenti espongono l’azione consigliata in output console, text, HTML, JSON e CSV, così gli operatori batch possono instradare i file senza rischio di post-elaborazione o campi di stato
Version 1.56.4
Corretto (Risolto)
- Leggere in ciclo annotazioni, segnalibri o link-annotazioni non lascia più perduti i testi dell’elemento precedente: i record risultato di
TPdfAnnotation,TBookmarkeTLinkAnnotationvengono ora azzerati con inizializzazione consapevole dei tipi gestiti invece di zero raw della memoria, così i documenti con molti elementi testuali non gonfiano più la memoria del processo per tutta la durata dell’applicazione - La distruzione di un
TPdfche aveva registrato un handlerOnUnsupportedFeatureora lo stacca dal callback PDFium globale del processo, così un successivo caricamento documento da un’altra istanzaTPdfsenza proprio handler non può più dispatchare nel componente liberato (use-after-free)
Version 1.56.3
Corretto (Risolto)
AccessibilityWorkbenchClinon conta più le pagine vuote come pagine di reading-order euristiche, così i documenti taggati con pagine divisorie vuote mantengono lo stato di accessibilità corretto; le pagine senza contenuto leggibile sono ora riportate separatamente- La rilevazione header di tabella di
AccessibilityWorkbenchClinon assegna più una tabella esterna alle celleTHappartenenti a una tabella annidata, e i nomi di form-field e font sono confrontati case-sensitive in modo che campi distinti non vengano uniti - Gli inventari host URL di
IntakeWorkbenchClieliminano ora userinfo, query e frammento, così un link costruito cometrusted.example@evil.exampleè attribuito all’host reale e i targetmailto:contribuiscono il proprio dominio invece di risultare invisibili - I report Markdown di
IntakeWorkbenchClieseguono l’escape dei backticks in percorsi controllati da attaccanti, host e nomi allegato, così la formattazione del report non può essere rotta dall’interno di un documento
Modificato (Modificato)
AccessibilityWorkbenchClisegnala i fallimenti di font-scan e form-field-scan come contatori separati, marca i font non embedded che hanno anche istanze embedded e limita liste font lunghe con un marcatore di troncamento esplicito- I riepiloghi batch di
IntakeWorkbenchCliaggiungono una colonna per conteggio delle attachment-annotation, e il censimento delle annotazioni per pagina è limitato a 20000 annotazioni per pagina con il limite riportato in ogni formato
Version 1.56.2
Aggiunto (Aggiunto)
AccessibilityWorkbenchCliora verifica incorporamento dei font, tooltip dei campi modulo, origine dell'ordine di lettura, outline del documento, struttura di tabelle ed elenchi, testo alternativo sospetto e dettagli di revisione per pagina più ricchi, così i report accessibility in batch identificano più obiettivi di correzioneIntakeWorkbenchCliora segnala limiti di scansione delle pagine, azioni launch e remote-go-to, inventari degli host URI, conteggi delle annotazioni, funzionalità PDFium non supportate, identificatori documento duplicati e flag di rischio ampliati per la revisione intake automatizzata
Modificato (Modificato)
IntakeWorkbenchCliaccettamaxpages=Nnelle modalità file singolo e batch per limitare la scansione delle pagine per documento completando comunque i report metadata, attachment, script, XFA, signature e risk
Version 1.56.1
Corretto (Risolto)
- Il caricamento di un
pdfium.dllprecedente a cui manca un'esportazione più recente ora fallisce in modo pulito: il percorso di errore reimposta ogni punto di ingresso API associato, quindi i controlliAssigned()(ad esempio suFPDF_GetLastErroroFPDF_GetSecurityHandlerRevision) indicano che la libreria non è caricata invece di chiamare il modulo già scaricato e andare in crash con una violazione di accesso UnloadLibraryora azzera tutti i binding API di PDFium, non solo le funzioni di supporto V8 opzionali, quindi dopo il rilascio della DLL non sopravvivono puntatori a funzione obsoleti
Version 1.56.0
Aggiunto (Aggiunto)
- Cursore di lettura karaoke parola per parola in
TPdfView:TrackReadingWordAtmappa l offset carattere della parola corrente di un motore di sintesi vocale, come SAPIStatus.InputWordPosition, sui riquadri parola della pagina, evidenzia la parola che lo contiene come sovrapposizione distinta sopra il blocco di lettura, la porta in vista e restituisce l indice parola, così la parola pronunciata si illumina mentre la voce avanza SetReadingWordeClearReadingWordimpostano o cancellano direttamente la parola evidenziata da unTPdfWordBox; reimpostare la stessa parola non esegue operazioni, quindi il tracciamento parola per parola non fa mai sfarfallare la vistaReadingWordColoreReadingWordFollowcontrollano il colore del cursore parola e se la vista scorre automaticamente fino alla parola pronunciata
Version 1.55.2
Corretto (Risolto)
- ViewerInteractionLab ora dà più spazio verticale alle righe della barra strumenti, quindi Open PDF, Create Sample, navigazione, ricerca e controlli di selezione non si sovrappongono più con caratteri scalati
Version 1.55.1
Corretto (Risolto)
- ViewerInteractionLab ora colloca Prev, Next e Rotate sulla seconda riga della barra strumenti, evitando la sovrapposizione all avvio con Open PDF e Create Sample
Version 1.55.0
Aggiunto (Aggiunto)
- Ponte da parola a selezione per la lettura con selezione:
TPdfView.SelectWordBoxeSelectWordSpanselezionano una singola casella parola o una sequenza sulla stessa pagina daPageWordBoxestramite gli intervalli carattere, così la parola o riga letta può anche essere selezionata e copiata WordBoxIndexAtCharIndexmappa un indice carattere alla casella parola che lo contiene e guida l’evidenziazione parola per parola mentre avanza il cursore TTS
Version 1.54.0
Aggiunto (Aggiunto)
- Accessor per la compilazione vocale dei moduli che leggono il campo attivo direttamente dal cursore logico:
FocusedFormFieldValue,FocusedFormFieldNameeFocusedFormFieldDetailssuTPdfeTPdfViewriportano il valore del campo corrente, il nome leggibile (/TUtooltip con fallback a/T) e l'interoTPdfFormFieldInfo(tipo, flag, opzioni), cioè tutto ciò che un'interfaccia vocale deve annunciare mentre avanza in un modulo
Corretto (Risolto)
FocusedFormFieldValuelegge il campo tramiteFocusedFormFieldIndexinvece del focus interattivo di pdfium, così un compilatore di moduli guidato dalla voce ottiene il valore corretto anche senza cursore visibile sullo schermo (l'esistenteFocusedFormFieldTextcontinua a riflettere il focus di pdfium e resta invariato)
Version 1.53.0
Aggiunto (Aggiunto)
- Supporto all'evidenziazione a livello di parola:
TPdf.PageWordBoxeseTPdfView.PageWordBoxessuddividono una pagina in recordTPdfWordBox, ciascuno con il testo della parola, il relativo intervallo di caratteri e un rettangolo di delimitazione nello spazio pagina, così un lettore di accessibilità può evidenziare a turno ogni parola pronunciata ("lettura karaoke") passando il rettangolo aSetReadingHighlight BuildWordBoxesespone come API separata il passaggio di tokenizzazione, convertendo il testo della pagina in word box con intervalli di caratteri
Version 1.52.0
Aggiunto (Aggiunto)
- Gli helper di rendering per ipovisione
InvertPdfBitmap,GrayscalePdfBitmapeDuotonePdfBitmapapplicano trasformazioni colore in place a un bitmap renderizzato a 32 bit, così un lettore di accessibilità può mostrare le pagine invertite / in modalità scura, in scala di grigi oppure con uno schema personalizzato a due colori (per esempio sfondo scuro con testo chiaro) per utenti ipovedenti - Le trasformazioni operano per pixel e si comportano allo stesso modo su VCL e Lazarus/LCL, lasciando inalterate le dimensioni del bitmap
Version 1.51.0
Aggiunto (Aggiunto)
- Unità di lettura a livello di frase per l'ascolto assistito sincronizzato:
TPdf.ReadingUnits,TPdf.DocumentReadingUnitseTPdfView.ReadingUnitslinearizzano il flusso di contenuto leggibile in recordTPdfReadingUnitordinati e di dimensione frase, ciascuno con il testo da pronunciare, il tipo semantico, la pagina, i rettangoli di evidenziazione e il tag lingua, così un'app screen reader può avanzare nella pagina o nell'intero documento un'unità parlata alla volta - Navigazione semantica con
NextReadingUnitOfKind, che consente a un'interfaccia vocale di saltare all'intestazione, figura, voce di elenco o cella di tabella successiva o precedente senza scandire manualmente il flusso BuildReadingUnitsconverte direttamente qualsiasiTPdfContentFragmentsin unità di lettura: intestazioni e descrizioni di figure/Alt restano integre, mentre i paragrafi vengono spezzati ai confini di frase, i punti decimali vengono preservati e il cursore di lettura è un semplice indice posseduto dal chiamante
Version 1.50.0
Aggiunto (Aggiunto)
ValidatePdfAora è in grado di esaminare documenti PDF 1.5+ che memorizzano il catalogo, l'OutputIntent o altri dizionari all'interno di flussi di oggetti compressi (/Type /ObjStm). I flussi di oggetti vengono decompressi e gli oggetti che contengono vengono risolti, così questi documenti sono validati nel merito anziché essere segnalati come privi dei propri marcatori PDF/A
Version 1.49.5
Corretto (Risolto)
ValidatePdfAnon segnala più come problema l'assenza di una descrizionepdfaExtension:schemas. Lo schema dell'identificatore PDF/A (pdfaid) è ben noto, quindi né veraPDF né PDF/A-2/-3 richiedono una descrizione di schema di estensione per esso, e segnalarne l'assenza faceva risultare erroneamente non conforme ogni PDF/A di terze parti già conforme. I documenti prodotti dalla libreria stessa includono comunque la descrizione
Version 1.49.4
Corretto (Risolto)
ValidatePdfAora rileva il livello di conformità quando l'identificatore PDF/A è scritto come attributi XML (pdfaid:part="2") anziché come elementi figli, così i documenti in forma di attributo non vengono più segnalati con un livello sconosciuto. Questo corregge anche un effetto a cascata per cui un livello non rilevato faceva ripiegare i controlli specifici della parte sulle regole rigorose di PDF/A-1, segnalando erroneamente file incorporati e trasparenze che PDF/A-2 e PDF/A-3 consentono
Version 1.49.3
Corretto (Risolto)
ValidatePdfAora esamina i documenti PDF 1.5+ i cui dati di cross-reference sono un cross-reference stream (file privi della parola chiavetrailer). Il livello di conformità, il/IDdel trailer e gli altri marcatori vengono letti dal dizionario del cross-reference stream, così questi documenti sono validati nel merito anziché essere segnalati come del tutto non conformi
Version 1.49.2
Corretto (Risolto)
ValidatePdfAnon segnala più un problema spurio di font non incorporato su documenti che incorporano tutti i propri font. L'euristica precedente confrontava il numero di token/FontDescriptorcon i programmi di font incorporati, ma ogni font incorporato contribuisce con due token/FontDescriptor(il riferimento al dizionario del font più l'oggetto descrittore), perciò ogni file con font incorporati veniva erroneamente segnalato. Il controllo ora segnala soltanto un documento che fa riferimento a font senza incorporare alcun programma di font, coerentemente con la corrispondente correzione diValidatePdfUa
Version 1.49.1
Corretto (Risolto)
- L'output PDF/A ora risulta conforme come PDF/A-1b e PDF/A-1a con veraPDF: il flusso del profilo ICC dell'OutputIntent sRGB incorporato (referenziato da
/DestOutputProfile) ora dichiara il conteggio dei componenti/Nrichiesto (3 per il profilo RGB integrato), come imposto da ISO 19005-1 6.2.3.2. I documenti prodotti daSaveAsPdfAin precedenza non superavano la validazione rigorosa PDF/A-1 perché il flusso del profilo di destinazione ometteva/N; il valore è derivato dall'intestazione del profilo ICC, quindi anche un profilo CMYK o Gray fornito dal chiamante riceve il conteggio corretto
Version 1.49.0
Corretto (Risolto)
ValidatePdfUanon segnala più erroneamente l'assenza dell'identificazione XMP su PDF taggati conformi — l'identificatore PDF/UA (pdfuaid:part),dc:title, le date XMP e il/IDdel trailer vengono ora letti dai byte del documento originale anziché dalla copia risalvata, che omette il flusso XMP/Metadatae, per i file con cross-reference-stream, il/IDdel trailer- Il controllo di incorporamento dei font di
ValidatePdfUaè stato corretto, così un documento che incorpora tutti i propri font non viene più segnalato come avente font non incorporati; ora segnala soltanto un documento che fa riferimento a font senza incorporare alcun programma di font ValidatePdfUaora accetta un elemento di strutturaFormulail cui testo alternativo è fornito tramiteActualTextanziché tramite una voceAlt(ISO 14289-1 §7.7), coerentemente con la regola esistente perFigure
Version 1.48.0
Aggiunto (Aggiunto)
- Selezione testuale programmatica su
TPdfView:SelectTextRange(per pagina e intervallo di caratteri) eSetSelection(per intervalli espliciti suddivisi per pagina) selezionano il testo da codice — per esempio per leggere ed evidenziare un brano; entrambi ridisegnano e generanoOnSelectionChangequando la selezione cambia.SelectionRangeslegge la selezione corrente come intervalli di caratteri suddivisi per pagina, mentreSelectionRectanglesne restituisce i rettangoli in coordinate di pagina per l'evidenziazione personalizzata o lo scorrimento fino alla selezione
Version 1.47.0
Aggiunto (Aggiunto)
- Navigazione tra i campi modulo per la compilazione guidata vocale, sia su
TPdfsia suTPdfView:FormFieldTabOrder,FocusedFormFieldIndex,FocusFormField,FocusNextFormField,FocusPreviousFormField,ClearFormFieldFocuseFocusedFormFieldText. Questi spostano un cursore logico di campo sui campi widget della pagina nell'ordine di tabulazione (con avvolgimento alle estremità), così un lettore assistivo può percorrere il modulo, annunciare ogni campo tramiteFormFieldInfo[Index].AlternateName(il tooltip /TU) e compilarlo tramiteFormField[Index] - Evento
TPdfView.OnFormFieldFocusChange, generato quando il cursore di campo si sposta (con l'indice del nuovo campo, oppure -1 quando viene azzerato)
Version 1.46.0
Aggiunto (Aggiunto)
- Flusso di contenuti per la lettura assistita ad alta voce:
TPdf.ReadableContent,TPdf.ReadablePageContent,TPdf.DocumentReadableContenteTPdfView.ReadableContentrestituiscono un elenco ordinato di elementi semanticiTPdfContentFragment, ciascuno con il testo da pronunciare (i glifi reali, oppureActualText/Alt per le figure), un tipo di frammento (titolo con livello, paragrafo, figura, voce di elenco, cella di tabella, collegamento, semplice), la lingua, la pagina in base 1 e i rettangoli di evidenziazione per blocco e per singola riga. I PDF taggati vengono linearizzati nell'ordine di lettura logico a partire dall'albero di struttura; le pagine non taggate ripiegano sull'ordine di rendering, così qualsiasi documento può essere letto ad alta voce - Evidenziazione di lettura sincronizzata su
TPdfView:SetReadingHighlight,ClearReadingHighlighte la proprietà pubblicataReadingHighlightColorevidenziano il blocco attualmente in lettura, sopra le sovrapposizioni di ricerca e selezione - Nuovi tipi pubblici
TPdfContentFragment,TPdfContentFragments,TPdfReadableContent,TPdfContentFragmentKindeTPdfReadingOrderSource, e il nuovo helperClassifyStructType
Version 1.45.0
Aggiunto (Aggiunto)
ValidatePdfUaora percorre anche l'albero di struttura taggato attivo e segnala tre violazioni di contenuto ad alta confidenza che la scansione a livello di byte non è in grado di rilevare: un elementoFigureprivo di voce Alt e di ActualText (ISO 14289-1, 7.3), un elementoFormulasenza attributo Alt (7.7) e un elementoNoteche manca di un ID univoco (7.9). Tre nuovi valori diTPdfUaValidationIssueespongono questi problemi:pvuaiFigureMissingAlt,pvuaiFormulaMissingAltepvuaiNoteMissingId. La traversata dell'albero viene saltata per i documenti non taggati- Nuovo helper pubblico
ValidatePdfUaStructureElementsche applica le regole dell'albero di struttura a un elenco piatto di elementi (come restituito daTPdf.StructureElements), consentendo di eseguire o testare i controlli in unit test senza caricare un documento completo
Version 1.44.5
Corretto (Risolto)
- Il controllo di incorporamento font di
ValidatePdfA(pvaiFontNotEmbedded, ISO 19005-1, 6.3.4) ora rileva anche i font semplici non incorporati che non contengono alcun/FontDescriptor, in particolare i 14 font standard Type 1 (Helvetica, Times, Courier e così via) che PDF/A richiede vengano incorporati senza alcuna esenzione. In precedenza un font di questo tipo passava inosservato; il controllo ora conta anche i dizionari di font semplici (/Type1,/TrueType,/MMType1) rispetto ai programmi font incorporati, rispecchiando la correzione PDF/UA introdotta in 1.44.3
Version 1.44.4
Corretto (Risolto)
ValidatePdfVTora respinge alberi DPart ISO 16612-2 §6.5 malformati in cui/DPartsè un array piatto di riferimenti invece dell'array of arrays richiesto, oppure in cui un leaf DPart ripete la pagina/Startcome/Endanche se l'intervallo contiene una sola paginaValidatePdfVTora valida i nomi/NodeNameListcome valori XML NMTOKEN dopo l'espansione degli escape#xxdi PDF name, quindi i nomi di livello gerarchico non validi vengono segnalati tramitepvviMissingDPartRootinvece di essere accettati come struttura DPart utilizzabile
Version 1.44.3
Corretto (Risolto)
- Il controllo di incorporamento font di
ValidatePdfUa(pvuaiFontNotEmbedded, ISO 14289-1, 7.21.4) ora rileva anche i font semplici non incorporati che non contengono alcun/FontDescriptor, in particolare i 14 font standard Type 1 (Helvetica, Times, Courier e così via) per i quali PDF/UA non prevede esenzioni dall'incorporamento. In precedenza un font di questo tipo passava inosservato e un documento che lo utilizzava poteva essere segnalato come conforme; il controllo ora conta anche i dizionari di font semplici (/Type1,/TrueType,/MMType1) rispetto ai programmi font incorporati
Version 1.44.2
Corretto (Risolto)
ValidatePdfVTora lascia un marcatorepdfvtid:GTS_PDFVTVersionpresente ma non riconosciuto comepvcUnknowninvece di declassarlo apvcNone, così stringhe non valide a livello di file comePDF/VT-2srestano distinguibili dai documenti che non portano alcun marcatore PDF/VT; PDF/VT-2s viene identificato dal MIME stream header in ISO 16612-2 Annex A, non dal marker XMP di un file PDF- Il controllo
/DPartRootora valida in modo più rigoroso la tree semantics di ISO 16612-2 §6.5:/DPartRootNodee/NodeNameListdevono descrivere la profondità DPart effettiva, i DPart parent links devono formare un albero,/Starte/DPartssono mutuamente esclusivi, e il/DPartdi ogni pagina deve puntare al leaf DPart che la copre nello stesso ordine depth-first del page tree
Version 1.44.1
Corretto (Risolto)
SaveAsPdfVTora scrive una Document Part Hierarchy minima di ISO 16612-2 §6.5 quando il PDF sorgente non contiene un/DPartRootutilizzabile. L'albero generato collega ogni pagina tramite/DPart, conserva una gerarchia valida esistente e lascia i metadati destinatario/DPM più ricchi al workflow chiamanteValidatePdfVTora valida la struttura DPart utilizzabile, legge i valori XMP PDF/VT sia dagli attributi RDF sia dal testo degli elementi, e applica l'abbinamento esatto tra PDF/VT e base PDF/X: PDF/VT-1 richiede PDF/X-4, mentre PDF/VT-2 richiede PDF/X-4p, PDF/X-5g o PDF/X-5pgTPdfVTSaveOptions.Conformance = pvc2non scrive più marcatori PDF/VT-2 monofile non validi. Il writer monofile normalizza l'output a PDF/VT-1 perché PDF/VT-2 richiede semantica di insieme di file
Version 1.44.0
Aggiunto (Aggiunto)
ValidatePdfUasegnala ora anche le violazioni PDF/UA a livello di contenuto verificabili sui byte, oltre ai marcatori di formato file: un programma di font non incorporato (ISO 14289-1, 7.21.4), un font privo di una CMap/ToUnicodein assenza di una codifica di font semplice esente (7.21.7), e un documento che contiene annotazioni ma non dichiara alcun ordine di tabulazione/Tabs /Ssulla pagina (7.18.3)- Tre nuovi valori di
TPdfUaValidationIssue—pvuaiFontNotEmbedded,pvuaiFontMissingToUnicodeepvuaiMissingTabsOrder— vengono restituiti daValidatePdfUae inclusi nel rapporto di preflight. Si tratta di euristiche approssimative concepite come suggerimenti di preflight piuttosto che come una verifica completa di ISO 14289-1
Version 1.43.1
Corretto (Risolto)
SaveAsPdfUaapplica ora obbligatoriamente le voci di catalogo ISO 14289-1, 7.1/ViewerPreferences/DisplayDocTitle truee/MarkInfo/Marked true/Suspects falseanche quando il documento sorgente fornisce già tali dizionari con valori mancanti o in contrasto. In precedenza i marcatori venivano inseriti solo quando i dizionari erano completamente assenti; pertanto un sorgente che conteneva, ad esempio, un/ViewerPreferencesprivo diDisplayDocTitleoppure un/MarkInfocon/Marked falseproduceva un file non conforme- Le chiavi preesistenti in un dizionario
/ViewerPreferenceso/MarkInfogià presente vengono conservate, e un dizionario fornito come riferimento indiretto viene risolto prima che le chiavi obbligatorie vengano applicate
Version 1.43.0
Aggiunto (Aggiunto)
ValidatePdfAapplica ora le regole PDF/A-2 / PDF/A-3 per i file incorporati e associati e per il testo di livello U. I file incorporati restano respinti per PDF/A-1; per PDF/A-3 un file incorporato privo della chiave/AFRelationshiprichiesta (ISO 19005-3 Allegato E) viene segnalato, mentre gli allegati PDF/A-2 sono consentiti (la loro conformità non viene verificata in modo ricorsivo). Un nuovo problemapvaiUnicodeMappingMissingsegnala un documento PDF/A-2u o PDF/A-3u i cui font non contengono alcuna tabella di corrispondenza/ToUnicode(ISO 19005-2 6.2.11.7). La trasparenza e il contenuto opzionale restano segnalati solo per PDF/A-1
Version 1.42.0
Aggiunto (Aggiunto)
- PDF/A-2 (ISO 19005-2) e PDF/A-3 (ISO 19005-3) sono ora supportati a tutti e tre i livelli di conformità — a, b e u — da
SaveAsPdfA,ValidatePdfAe dalla proprietàPdfAConformance. L'enumerazioneTPdfAConformanceacquisiscepac2a,pac2u,pac3aepac3u(PDF/A-1 non ha il livello u). Il salvataggio scrive i valoripdfaid:part(2 o 3) epdfaid:conformance(A, B o U) corrispondenti, mantenendo il sottotipo OutputIntentGTS_PDFA1che ISO 19005-2 conserva per compatibilità. Una richiesta di livello A viene comunque declassata al corrispondente livello B (per qualsiasi parte) quando il documento non possiede la struttura con tag richiesta da quel livello
Version 1.41.0
Aggiunto (Aggiunto)
ValidatePdfAora rileva le violazioni PDF/A a livello di contenuto che l'iniezione di marcatori non può correggere, oltre ai marcatori strutturali che già segnalava: JavaScript e altre azioni vietate, azioni aggiuntive (/AA), file incorporati,LZWDecode, trasparenza (soft masks e transparency groups), contenuto opzionale (/OCProperties), sottotipi di annotazione vietati (FileAttachment, Sound, Movie, 3D, Screen),/NeedAppearances truee/XFAdi AcroForm, font i cui descrittori non contengono un programma di font incorporato, e una dichiarazione di livello A fatta senza la struttura con tag richiesta da ISO 19005-1 6.8. I controlli su trasparenza, contenuto opzionale e file incorporati si applicano solo a PDF/A-1 (queste funzionalità sono consentite in PDF/A-2 e PDF/A-3). Nuovi valoriTPdfAValidationIssueespongono ciascun caso; i valori esistenti restano invariati
Version 1.40.3
Corretto (Risolto)
SaveAsPdfAora rimuove qualsiasi cifratura del documento di origine prima di produrre l'output PDF/A. ISO 19005-1 6.1.3 vieta la chiave/Encryptdel trailer, ma il percorso di salvataggio in precedenza conservava il gestore di sicurezza dell'origine, quindi salvare un documento cifrato come PDF/A produceva un file cifrato e non conforme. Il salvataggio PDF/A ora decifra prima il documento. I documenti non cifrati non sono interessati
Version 1.40.2
Corretto (Risolto)
- Impedito a
SaveAsPdfAdi emettere una falsa dichiarazione di conformità PDF/A livello A. Quando viene richiesto il livello A (pac1a) ma il documento di origine non possiede i marcatori di struttura con tag richiesti da ISO 19005-1 6.8 — un/StructTreeRootnel catalogo e un dizionario/MarkInfocon/Marked true— il file salvato viene ora identificato come il corrispondente livello B (pdfaid:conformance=B) invece di dichiarare il livello A. L'output PDF/A-1b puramente visivo non è interessato
Version 1.40.1
Corretto (Risolto)
- Rafforzata la convalida di conformità della versione PDF in modo che l'azione
SetOCGState(set-optional-content-group-state) venga riconosciuta come funzionalità PDF 1.5. Il salvataggio verso un target PDF 1.2, 1.3 o 1.4 che contiene un'azioneSetOCGStateviene ora rifiutato per allinearsi a ISO 32000-1 (Table 198); in precedenza un'azione di questo tipo poteva passare nell'output a versione inferiore. La distinta azione obsoleta PDF 1.2SetStatecontinua a essere accettata a partire da PDF 1.2
Version 1.40.0
Aggiunto (Aggiunto)
- Collegata l'API upstream
FPDFPageObj_AddExistingMark(), che applica una marcatura di contenuto esistente a un oggetto di pagina. Quando oggetti di pagina consecutivi condividono la stessa marcatura, il PDF salvato li unisce in un'unica marcatura che li comprende tutti; gli oggetti non consecutivi ricevono copie separate - Collegata l'API upstream
FPDFTextObj_SetFontSize()per modificare la dimensione in punti di un oggetto di testo esistente, a complemento del collegamento già presente diFPDFTextObj_GetFontSize()
Modificato (Modificato)
- Aggiornate le DLL di runtime PDFium incluse (Win32 e Win64, build standard e V8) allo snapshot upstream del 2026-06-02
Version 1.39.53
Modificato (Modificato)
- Gli esempi Delphi
PDFViewer,SplitVieweMultiPageViewerora aprono i documenti in modalitàZoom to Pageper impostazione predefinita - Il rendering iniziale ora adatta l'intera pagina all'area del visualizzatore prima che l'utente scelga un livello di zoom manuale
TPdf.AboutInfo, i metadati del pacchetto Lazarus e i metadati di versione dell'installer sono stati aggiornati per indicare 1.39.53
Version 1.39.52
Modificato (Modificato)
Demo\Lazarus\CreatePDFè stato migliorato: l’esempio introduttivo ora genera un PDF di due pagine con vector paths, table content, embedded image, text annotation, rotated text e un document-building walkthrough più chiaro- Sono state aggiunte pagine
README.htmlpiù curate per ogni cartella demo Delphi, C++Builder e Lazarus, sostituendo l’ultimo README demo solo testuale con una guida leggibile nel browser - Aggiornati
TPdf.AboutInfo, i metadati del pacchetto Lazarus e i metadati di versione dell’installer a 1.39.52
Version 1.39.51
- I riepiloghi batch di
Demo\Delphi\PreflightReportCliora includono totali di stato standard per risultati Pass, Action required e Review negli standard selezionati - Le righe per file ora includono conteggi action-required e review nei riepiloghi TXT / HTML / JSON / CSV, rendendo più semplice ispezionare gli artefatti CI senza aprire ogni report generato
- Aggiornati
TPdf.AboutInfo, i metadati del pacchetto Lazarus e i metadati di versione dell'installer a 1.39.51
Version 1.39.50
- La modalità batch per directory di
Demo\Delphi\PreflightReportCliè stata migliorata:batchdir=folderora raccoglie i percorsi PDF trovati, li ordina e poi genera i report in un ordine stabile - Le scansioni ricorsive delle directory ora producono un ordine di report e righe di riepilogo riproducibile, mentre l'elaborazione esplicita
batch=list.txtcontinua a preservare l'ordine del file elenco - Aggiornati
TPdf.AboutInfo, i metadati del pacchetto Lazarus e i metadati di versione dell'installer a 1.39.50
Version 1.39.49
- I riepiloghi batch di
Demo\Delphi\PreflightReportCliora registrano le run settings: tipo di origine, percorso di origine, stato ricorsivo, directory di output, formato del report, standard selezionati e modalitàfailon= - I riepiloghi JSON ora includono un oggetto
run, i riepiloghi TXT e HTML mostrano una sezione run settings, e le righe CSV ripetono le stesse colonne di audit per fogli di calcolo e CI pipelines - Aggiornati
TPdf.AboutInfo, i metadati del pacchetto Lazarus e i metadati di versione dell'installer a 1.39.49
Version 1.39.48
- Il batch output naming di
Demo\Delphi\PreflightReportClie stato migliorato, cosi duplicate input file names che condividono lo stessooutdir=non sovrascrivono piu i rispettivi generated reports - Batch runs ora aggiungono i suffissi
-2,-3e successivi quando un generated report path e gia stato assegnato nella stessa esecuzione, e summaries registrano il collision-safe report path finale TPdf.AboutInfo, Lazarus package metadata e installer version metadata sono stati aggiornati per indicare 1.39.48
Version 1.39.47
- I batch summaries di
Demo\Delphi\PreflightReportClisono stati migliorati: gli output TXT e JSON ora includono aggregate totals per total files, processed files, failed files, issues e corrispondenzefailon= - CSV summaries restano una row table pura per i consumers esistenti, mentre HTML summaries continuano a mostrare le stesse aggregate metrics nel dashboard header
TPdf.AboutInfo, Lazarus package metadata e installer version metadata sono stati aggiornati per indicare 1.39.47
Version 1.39.46
Demo\Delphi\PreflightReportClie stato migliorato consummary=batch.html/.htmcosi i batch runs possono produrre un browser-readable dashboard oltre ai TXT / CSV / JSON manifests- HTML summaries mostrano le metriche total, processed, failed, issue e corrispondenza
failon=, poi elencano ogni input con report links, status, counts ed error text TPdf.AboutInfo, Lazarus package metadata e installer version metadata sono stati aggiornati per indicare 1.39.46
Version 1.39.45
Demo\Delphi\PreflightReportClie stato migliorato conbatchdir=foldererecursivecosi gli script possono esaminare PDF folders direttamente senza scrivere prima un list file- Directory batch mode riusa il comportamento
outdir=,summary=,standards=efailon=di list-based batch mode; non-recursive esamina solo la folder selezionata erecursiveinclude subfolders TPdf.AboutInfo, Lazarus package metadata e installer version metadata sono stati aggiornati per indicare 1.39.45
Version 1.39.44
- Migliorato
Demo\Delphi\PreflightReportCliconsummary=batch.csv|json|txtcosì i batch runs possono emettere un machine-readable manifest accanto ai per-file reports - Batch summaries includono ogni input path, report path, status, standard count, passed count, issue count, stato di match
failon=ed error text per CI jobs e scripts esterni - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.44
Version 1.39.43
- Migliorato
Demo\Delphi\PreflightReportCliconbatch=list.txteoutdir=reportscosì gli scripts possono generare preflight reports per un elenco di file PDF in una sola esecuzione - Batch mode salta le righe vuote e le righe di commento
#, deriva ogni report name.preflight.<ext>dal PDF di input, continua dopo per-file errors e riepiloga processed e failed files prima di terminare - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.43
Version 1.39.42
- Migliorato
Demo\Delphi\PreflightReportCliconfailon=none|issues|action|review, così i CI jobs possono trasformare i preflight results generati in exit codes deterministici - La CLI ora restituisce exit code 2 quando una
failon=rule selezionata corrisponde dopo la generazione del report file e dell'optional attached-report PDF, mentre i runtime errors continuano a restituire exit code 1 - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.42
Version 1.39.41
- Migliorato
Demo\Delphi\PreflightReportCliconattach=output.pdf, così un preflight report generato può essere incorporato come document-level attachment in una nuova PDF copy - La CLI mantiene su disco il TXT / HTML / Markdown / JSON / CSV report file generato e rifiuta di allegarlo al input PDF path originale, riducendo il rischio di sovrascrittura accidentale
- Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.41
Version 1.39.40
- Aggiunto
Demo\Delphi\PreflightReportCli, un Delphi console companion per generareFPdfPreflightReportin modo scriptable senza aprire un viewer - La CLI supporta la creazione di sample senza argomenti, input / output arguments, optional password, formati di output
text/html/md/json/csvestandards=filtering per PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R e PDF/VT - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.40
Version 1.39.39
FPdfPreflightReporte stato ampliato conTPdfPreflightReport.ToMarkdowneSaveMarkdownToFile, cosi i preflight reports possono essere esportati come Markdown adatto agli issue tracker- Gli esempi
PreflightReportper Delphi, C++Builder e Lazarus aggiungono Markdown preview switching e azioni Save MD accanto al workflow TXT / HTML / JSON / CSV esistente TPdf.AboutInfo, Lazarus package metadata e installer version metadata sono stati aggiornati per riportare 1.39.39
Version 1.39.38
- Gli esempi
SecurityAuditper Delphi, C++Builder e Lazarus aggiungono JSON audit report export accanto al workflow TXT save / copy esistente - Il JSON report contiene
format,generatedAt,summary,findingCounte righefindingsstrutturate con campi severity, area e detail TPdf.AboutInfo, Lazarus package metadata e installer version metadata sono stati aggiornati per riportare 1.39.38
Version 1.39.37
FPdfPreflightReportè stato migliorato conTPdfPreflightReport.ToCsveSaveCsvToFile, così i preflight reports possono essere esportati come spreadsheet-friendly CSV- I samples Delphi, C++Builder e Lazarus
PreflightReportsono stati aggiornati con CSV preview switching e Save CSV actions insieme al workflow TXT / HTML / JSON esistente TPdf.AboutInfo, Lazarus package metadata e installer version metadata sono stati aggiornati per indicare 1.39.37
Version 1.39.36
FPdfPreflightReportè stato migliorato conTPdfPreflightReport.IssueCategoryCountse con i tipi riutilizzabiliTPdfPreflightIssueCategoryCounteTPdfPreflightIssueCategoryCountsper aggregare i marker-level issues per categoryTPdfPreflightReport.ToText,ToHtmleToJsonsono stati aggiornati affinché l'output generato da PreflightReport includa issue-category count summaries insieme a per-standard rows e detailed issue recommendations- Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.36
Version 1.39.35
- Il sample
PrintDialogesteso è stato rinominato inPrintPreferencesper Delphi, C++Builder e Lazarus, così il demo name ora corrisponde al workflow di PDF author print preferences, N-up printing, odd / even filtering, grayscale, cell border e duplex mapping - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.35
Version 1.39.34
Demo\Delphi\PrintPDFora supporta il caricamento PDF tramite trascinamento, e il workflow esistenteDemo\CBuilder\PrintPDFè documentato insieme agli esempi PrintPDF Delphi e Lazarus- Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.34
Version 1.39.33
- Aggiunto
Demo\CBuilder\SplitView, completando SplitView sample matrix per Delphi, C++Builder e Lazarus - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.33
Version 1.39.32
- Aggiunto
Demo\Lazarus\SplitView, portando side-by-side PDF comparison in Lazarus con two- or three-pane layouts, active-view navigation, synchronized commands, zoom presets e rotation - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.32
Version 1.39.31
- Aggiunto
Demo\Lazarus\PrintPDF, portando lo standard PDF print workflow in Lazarus con preview navigation, page ranges, copies, collate mode, progress e cancellation - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.31
Version 1.39.30
- Aggiunto
Demo\Lazarus\FontProperties, completando la matrice di esempi FontProperties in Delphi, C++Builder e Lazarus - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.30
Version 1.39.29
- Aggiunto
Demo\CBuilder\FontProperties, portando l'ispezione indicizzata dei metadati di caratteri e font in C++Builder insieme all'esempio Delphi - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.29
Version 1.39.28
- Aggiunto
Demo\Delphi\ExtractTextPages, completando la matrice di esempi per l'estrazione del testo pagina per pagina in Delphi, C++Builder e Lazarus - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.28
Version 1.39.27
- Aggiunto
Demo\Lazarus\PrintDialog, completando il PrintDialog sample matrix in Delphi, C++Builder e Lazarus - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.27
Version 1.39.26
- Aggiunto
Demo\CBuilder\PrintDialog, portando il N-up printing e PDF author print preferences workflow su C++Builder insieme al sample Delphi - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.26
Version 1.39.25
- Aggiunto
Demo\CBuilder\ViewerInteractionLab, completando il ViewerInteractionLab sample matrix in Delphi, C++Builder e Lazarus - Aggiornati library build workflow e Win64 C++Builder package outputs affinché i
TPdfViewviewer interaction methods vengano collegati correttamente nei Win64 demos - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.25
Version 1.39.24
- Aggiunto
Demo\Lazarus\ViewerInteractionLab, portando il focused viewer interaction workflow su Lazarus insieme al sample Delphi - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.24
Version 1.39.23
- Aggiunto
Demo\Lazarus\SearchAndSelect, completando la SearchAndSelect sample matrix per Delphi, C++Builder e Lazarus - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.23
Version 1.39.22
- Aggiunti
Demo\CBuilder\ContentExtractionLabeDemo\Lazarus\ContentExtractionLab, portando il multi-category content extraction workflow a tutti i demo IDE supportati - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.22
Version 1.39.21
- Migliorati
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReporteDemo\CBuilder\PreflightReportcon un preview format selector per controllare text o JSON output prima di salvare i report - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.21
Version 1.39.20
- Aggiunto l'export JSON a
FPdfPreflightReporttramiteTPdfPreflightReport.ToJsoneSaveJsonToFile, con summary leggibile dalla macchina, per-standard status / priority, next action e issue detail - Aggiornati
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReporteDemo\CBuilder\PreflightReportcon azioni Save JSON accanto all'export TXT / HTML - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.20
Version 1.39.19
- Migliorato
FPdfPreflightReportconTPdfPreflightStatus, issue categories, per-standard priority e next-action guidance nei report TXT / HTML - Aggiornati
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReporteDemo\CBuilder\PreflightReportper mostrare status, priority, issue count e next action nella summary grid - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.19
Version 1.39.18
- Aggiunto
Demo\Lazarus\SecurityAudit, completando la matrice di esempi Delphi, C++Builder e Lazarus per il workflow di audit PDF risk-surface in sola lettura - L'esempio Lazarus enumera permissions, attachments, JavaScript actions, URI / Launch link annotations, web links, signatures, XFA state, V8 / XFA helper availability e unsupported-feature callbacks, quindi salva o copia la finding list come TXT report
- Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.18
Version 1.39.17
- Aggiunto
Demo\CBuilder\SecurityAudit, portando il workflow di audit PDF risk-surface in sola lettura in C++Builder accanto all'esempio Delphi esistente - L'esempio C++Builder enumera permissions, attachments, JavaScript actions, URI / Launch link annotations, web links, signatures, XFA state, V8 / XFA helper availability e unsupported-feature callbacks, quindi salva o copia la finding list come TXT report
- Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.17
Version 1.39.16
- Aggiunto
Demo\CBuilder\SearchAndSelect, portando il workflow viewer SearchAndSelect autonomo in C++Builder accanto all'esempio Delphi esistente - L'esempio C++Builder crea o apre PDFs, elenca matches su tutte le pagine con page / character-index previews, supporta Previous / Next e double-click navigation, ed evidenzia i matches della pagina corrente con
HighlightSearchText - Espone anche
AllowUserTextSelection,SelectedText,SelectAll,CopySelectionToClipboard,ClearSelection,OnSelectionChangee opzioni spreadDisplayMode; i metadati di versione ora riportano 1.39.16
Version 1.39.15
- Aggiunto
Demo\CBuilder\WatermarkStamp, completando la demo matrix Delphi, Lazarus e C++Builder per workflow riutilizzabili di Form XObject watermark e stamp - L’esempio C++Builder crea PDF target e stamp, riusa la stamp page tramite
CreateXObjectFromPage, applica transforms conTPdfMatrixe salva centered watermarks, corner stamps e page number labels - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.15
Version 1.39.14
- Aggiunto
Demo\Lazarus\WatermarkStamp, portando in Lazarus il workflow riutilizzabile di Form XObject watermark e stamp - L’esempio Lazarus crea PDF target e stamp, riusa la stamp page tramite
CreateXObjectFromPage, applica transforms conTPdfMatrixe salva centered watermarks, corner stamps e page number labels - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.14
Version 1.39.13
- Aggiunto
Demo\CBuilder\PreflightReport, completando la matrice di demo Delphi, Lazarus e C++Builder per il workflow riutilizzabileFPdfPreflightReport - L’esempio C++Builder usa
FPdfPreflightReport.hppper generare standard summaries, TXT report previews, TXT / HTML report files e il comportamento Open Last Report - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.13
Version 1.39.12
- Aggiunto
Demo\Lazarus\PreflightReport, portando in Lazarus il workflow di preflight report per PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R e PDF/VT - L’esempio Lazarus può aprire o creare un PDF, selezionare target standards, visualizzare summary rows e TXT report output, salvare TXT / HTML reports e aprire il report salvato più di recente
- Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.12
Version 1.39.11
Demo\Delphi\SearchAndSelectè stato migliorato con un elenco dei risultati di ricerca su tutte le pagine che registra page number, character index e preview text- Aggiunti Previous / Next match navigation e double-click result jumping, mantenendo il comportamento di
HighlightSearchTextsulla pagina corrente - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per indicare 1.39.11
Version 1.39.10
Demo\Delphi\SecurityAuditè stato migliorato con azioni Save Report e Copy Report che esportano il summary corrente e le finding rows come TXT audit report- Il demo ora cancella il report export state quando l'audit panel viene reimpostato, mantenendo i reports copiati o salvati allineati ai findings visibili
TPdf.AboutInfo, Lazarus package metadata e installer version metadata sono stati aggiornati per riportare 1.39.10
Version 1.39.9
Demo\Delphi\ContentExtractionLabè stato migliorato con source-PDF save, report copy-to-clipboard e azioni all / none category selection- Il demo ora invalida il report corrente quando category selection cambia, così le TXT / JSON exports riflettono il extraction scope visibile
TPdf.AboutInfo, Lazarus package metadata e installer version metadata sono stati aggiornati per riportare 1.39.9
Version 1.39.8
- Aggiunto
Demo\Delphi\ContentExtractionLab, un workflow sample unificato di content extraction per document metadata, page text, page objects, images, attachments, links, annotations, bookmarks e font / character metrics - Il sample può aprire un PDF esistente o creare un synthetic PDF con contenuti text, image, attachment e annotation, quindi generare summary rows e report TXT / JSON dettagliati
- Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.8
Version 1.39.7
- Aggiunto
Lib\FPdfPreflightReport.pas, un helper riutilizzabile per report che raccoglieValidatePdfA,ValidatePdfUa,ValidatePdfE,ValidatePdfX,ValidatePdfReValidatePdfVTin un oggettoTPdfPreflightReport - Aggiunto
Demo\Delphi\PreflightReport, un workflow sample che apre o crea un PDF, seleziona target standards, mostra summary rows e issue recommendations, e salva report TXT o HTML - I report generati descrivono esplicitamente il limite della marker-level validation integrata, così le applicazioni possono affiancare content-level preflight tools dedicati quando necessario
- Aggiornati
TPdf.AboutInfo, Lazarus package metadata, package project lists e installer version metadata per indicare 1.39.7
Version 1.39.6
- Aggiunto
Demo\Delphi\SearchAndSelect, un esempio viewer workflow mirato per search highlighting, text selection, selected-text preview, copy, clear e spread display modes - L'esempio dimostra
HighlightSearchText, opzioni di ricerca match-case / whole-word,AllowUserTextSelection,SelectedText,SelectAll,CopySelectionToClipboardeClearSelectionsenza aggiungere nuove API di libreria - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.6
Version 1.39.5
Demo\Delphi\ViewerInteractionLabè stato esteso in un esempio di esperienza UI del viewer nello stile di SearchAndSelect conHighlightSearchText, opzioni match-case / whole-word, anteprima del testo selezionato e controlli esistenti di selection / clipboardDemo\Delphi\PrintDialogè stato esteso per ispezionare PDF author print preferences:PrintCopies,PrintPageRanges,PrintScaling,PrintPaperHandlinge il duplex mapping visibile diSetPdfPrintPaperHandlingDevMode- Aggiunto
Demo\Delphi\SecurityAudit, un esempio risk-surface in sola lettura che elenca permissions, attachments, document JavaScript, URI / Launch links, web links, signatures, XFA state e V8 / XFA helper availability - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.5
Version 1.39.4
- Aggiunti
Demo\CBuilder\ImageToPDFeDemo\Lazarus\ImageToPDF, completando la matrice di esempi ImageToPDF per Delphi, C++Builder e Lazarus - I nuovi esempi dimostrano selezione multi-immagine, anteprima dell'immagine selezionata, una pagina PDF per immagine, dimensionamento pagina A4 portrait / landscape, ridimensionamento centrato dell'immagine, avanzamento per immagine e apertura del PDF generato dopo il salvataggio
- Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.4
Version 1.39.3
- Aggiunto
Demo\CBuilder\BatchExport, portando il workflow di esportazione multi-file da PDF a JPG in C++Builder insieme agli esempi Delphi e Lazarus esistenti - L'esempio dimostra
LoadCustomDocument,IPdfCancellationTokenSource, inputTFileStreamin streaming, avanzamento per file e per pagina, gestione dell'annullamento, input DPI / quality / password e apertura della cartella di output al completamento - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.3
Version 1.39.2
- Aggiunto
Demo\Delphi\WatermarkStamp, un esempio eseguibile di workflow Form XObject che crea un PDF di destinazione e uno stamp PDF riutilizzabile, quindi applica filigrane centrate, timbri in alto a destra ed etichette con numero di pagina su ogni pagina - L'esempio dimostra
CreateXObjectFromPage,InsertFormObjectFromXObject,TPdfMatrixeFPDFPageObj_SetMatrixsenza aggiungere nuove API della libreria - Aggiornato
Docs\en-us\Examples.htmlper usare il pattern correnteTPdfMatrix.Handlequando si passano matrici aFPDFPageObj_SetMatrix - Aggiornati
TPdf.AboutInfo, Lazarus package metadata e installer version metadata per riportare 1.39.2
Version 1.39.1
- Aggiunto
Demo\Delphi\ViewerInteractionLab, un esempio mirato diTPdfViewper modalità di visualizzazione, modalità di adattamento, colori pagina, rotazione, selezione testuale dell'utente, azioni Appunti e feedback delle coordinateDeviceToPage - Aggiunto
Demo\CBuilder\StandardsLab/Demo\Lazarus\StandardsLabcosì gli utenti Lazarus possono eseguire il workflow di validazione e marker-output per PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R e PDF/VT - Le unit standard sono ora elencate in
Lib\37.0\PDFiumPas.dprojeLib\FPC\PDFiumLaz.lpk, e la build del demo DelphiSplitViewè stata corretta rimuovendo un import duplicato diWinapi.ShellAPI - Corretti i blocchi della build batch dei demo Delphi in
BatchExport,PDFViewer,MultiPageViewereSplitViewsenza modificarne il comportamento a runtime - Corretta la compatibilità della build batch dei demo C++Builder in
PDFViewereMultiPageViewersostituendonullptrconNULLper la modalità di progetto corrente - Aggiornati
TPdf.AboutInfo, i metadati del pacchetto Lazarus e i metadati di versione dell'installer per riportare 1.39.1
Version 1.39.0
- Aggiunto
Demo\Delphi\StandardsLab, un esempio eseguibile di workflow per standard che carica o crea un PDF, esegueValidatePdfA,ValidatePdfUa,ValidatePdfE,ValidatePdfX,ValidatePdfReValidatePdfVT, e mostra conformance rilevata, stato di superamento e conteggi issue in una sola griglia - I pulsanti di salvataggio di StandardsLab chiamano
SaveAsPdfA,SaveAsPdfUa,SaveAsPdfE,SaveAsPdfX,SaveAsPdfReSaveAsPdfVT, rendendo visibile l'output marker degli standard PDF senza scrivere un harness personalizzato - Aggiornati
TPdf.AboutInfo, metadati del pacchetto Lazarus e metadati versione dell'installer per indicare 1.39.0
Version 1.38.0
- Gli overlay di ricerca e selezione testo di
TPdfViewora usano alpha blending reale invece della pittura con mask logica, preservando il contenuto della pagina sotto le evidenziazioni - Aggiunto
SetPdfPrintPaperHandlingDevModeper mappareTPrintPaperHandlingsui valori WindowsDEVMODE.dmDuplex:DMDUP_SIMPLEX,DMDUP_HORIZONTALeDMDUP_VERTICAL TPdfView.SmoothScrollora anima i comandi line/page della scrollbar in timer-driven segments; il thumb tracking resta immediatoTPdf.AboutInfoe metadati versione degli installer aggiornati a 1.38.0
Version 1.37.0
TPdfora possiede un lock di rendering per istanza che serializzaRenderPage,RenderTile,RenderPageProgressive, reload pagina e unload documento. Il rendering da worker tramite componente condiviso è ora praticabile; l’applicazione coordina ancora mutazioni e ciclo di vita- Corretto il wrapper bitmap zero-copy per rifiutare DIB
TBitmapbottom-up e usare un buffer PDFium con copia finale, eliminando errori stride corruption / access violation nei test render VCL - Comportamento di selezione
TPdfViewrifinito:AllowUserTextSelectionblocca solo l’input utente, le API di selezione da codice continuano a disegnare, eSelectAllsegue lo spread visibile reale così la copertina non seleziona più pagina 2. Test Delphi, Lazarus e C++Builder estesi TPdf.AboutInfoe metadati versione degli installer aggiornati a 1.37.0
Version 1.36.0
- Attivata la selezione testuale per l'utente finale in
TPdfView— la proprietàAllowUserTextSelectionriservata in v1.17.0 ora governa una pipeline completa di selezione tramite trascinamento. Un clic sinistro su un carattere di testo entra in modalità selezione (hit-test automatico); un clic sinistro su un'area vuota continua a eseguire il pan come prima. Il widget form-fill mantiene la priorità, quindi un clic su un campo modulo continua a mettere a fuoco il campo invece di avviare una selezione - Il doppio clic seleziona la parola, il triplo clic seleziona la riga,
Ctrl+Aseleziona la pagina corrente (entrambe le pagine nelle modalità di visualizzazione spread) eCtrl+Ccopia la selezione negli Appunti di Windows comeCF_UNICODETEXT Shift+Left/Shift+Rightestende la selezione di un carattere alla volta (passando anche alla pagina adiacente in modalità spread);Shift+Home/Shift+Endla estende fino al bordo visivo della riga usando l'altezza del riquadro del carattere seme come tolleranza di clustering della riga, così le righe con corpi misti restano raggruppate correttamente- Quando il puntatore passa sopra il testo il cursore diventa
crIBeam; quando esce dal testo torna al cursore predefinito. Durante un trascinamento di selezione, entrare in una dead zone di 20 pixel lungo qualsiasi bordo del viewer attiva lo scorrimento automatico della pagina (tick da 50 ms, 16 px / tick, limitato agli stessi confini usati dal percorso di pan), così la selezione può estendersi oltre il viewport corrente senza dover prima rilasciare il mouse - La selezione tra pagine funziona nelle modalità di visualizzazione spread
dmTwoPageContinuous,dmTwoPageContinuousWithCover: un trascinamento avviato sulla pagina sinistra e terminato su quella destra seleziona l'intervallo contiguo che attraversa entrambe.SelectedTextunisce le porzioni per pagina con CR/LF, così il testo ricostruito si legge come normale contenuto multilinea - Nuova proprietà pubblicata
SelectionColor(predefinitaclHighlight, il colore di selezione di sistema di Windows) — indipendente daHighlightColor, che colora in giallo i risultati di ricerca. Le evidenziazioni di ricerca e una selezione trascinata attiva possono quindi apparire contemporaneamente sullo schermo senza conflitto di colori - Nuovo evento pubblicato
OnSelectionChange, emesso ogni volta che gli intervalli materializzati della selezione cambiano davvero e mai quando la stessa selezione viene riapplicata identica, così le applicazioni host possono collegarlo direttamente al testo della barra di stato o allo stato abilitato dei pulsanti senza debouncing - Nuova API pubblica su
TPdfView:HasSelection,SelectionCharCount,SelectedText,ClearSelection,SelectAll,CopySelectionToClipboard. Questi sono entry point a livello di codice e funzionano sempre indipendentemente daAllowUserTextSelection— il flag limita solo l'input dell'utente (mouse, Ctrl+C, Ctrl+A, Shift+arrows), così gli host kiosk possono disabilitare la selezione guidata dall'utente continuando però a costruire pulsanti toolbar "Select All / Copy" che pilotano la stessa API - Un menu contestuale predefinito con voce
Copy/复制viene collegato automaticamente quando l'host non ha assegnato il proprioPopupMenu— la normale sequenza "seleziona testo, clic destro, copia" funziona subito. La didascalia viene scelta tra inglese e cinese in base aSysLocale.PriLangID; gli host che necessitano di una localizzazione completa (o di un menu più ricco) devono solo assegnare il proprioPopupMenue il predefinito viene soppresso - La selezione viene cancellata automaticamente su
SetPdf,SetPageNumber,SetActive(False)e nei passaggi diDisplayMode, conOnSelectionChangeemesso esattamente una volta quando la selezione precedente non era vuota. Il sottosistema form-fill mantiene la priorità — mentre un campo modulo è in modifica, tutte le scorciatoie da tastiera della selezione cedono il passo così il campo riceveCtrl+C/Ctrl+A/Shift+arrowsper la propria selezione - Le suite di regressione Delphi e Lazarus sono state estese a 202 casi ciascuna, e la suite C++Builder a 159 casi, coprendo valori predefiniti, round-trip, comportamento dell'API pubblica, cancellazioni su cambio stato, drag del mouse (hit-text / hit-blank), clic contro drag, commutazione del cursore IBeam, doppio clic parola, triplo clic riga, scorciatoie da tastiera, collegamento / soppressione / didascalia del popup predefinito e selezione cross-page nelle modalità spread, inclusa una verifica di round-trip CR/LF degli Appunti
Version 1.35.0
- Aggiunto supporto per l'iniezione dei marker PDF/VT (ISO 16612-2:2010): TPdf.SaveAsPdfVT promuove il documento corrente a un file conforme PDF/VT-1 o PDF/VT-2 (il sottoinsieme PDF per la stampa variabile e transazionale). PDF/VT si basa su PDF/X-4 — ISO 16612-2 §6.2.1 richiede che ogni file PDF/VT-1 sia conforme anche a PDF/X-4 — quindi l'iniettore scrive l'intero set di marker PDF/X-4 (XMP
pdfxid:GTS_PDFXVersion = "PDF/X-4", Info/GTS_PDFXVersion (PDF/X-4)e/Trapped, catalogo/OutputIntentsche fa riferimento a un dizionario OutputIntent con profilo ICC incorporato) insieme alle proprietà specifiche di PDF/VT - L'iniezione specifica di PDF/VT copre XMP
pdfvtid:GTS_PDFVTVersion(= "PDF/VT-1" o "PDF/VT-2" secondo §6.3 Table 2) epdfvtid:GTS_PDFVTModDate(mantenuto sincronizzato conxmp:ModifyDatesecondo §6.3 NOTE 1), oltre a una descrizione pdfaExtension:schemas che dichiara sia il namespace pdfxid sia quello pdfvtid (URI NPEShttp://www.npes.org/pdfx/ns/id/ehttp://www.npes.org/pdfvt/ns/id/). Il trailer include un array/ID - Aggiunto TPdf.SaveAsPdfVTToStream per l'output PDF/VT in memoria e una scorciatoia predefinita
TPdf.SaveAsPdfVT(FileName)che produce PDF/VT-1 con OutputIntent sRGB IEC61966-2.1 incluso (3144 byte, lo stesso profilo usato da SaveAsPdfA / SaveAsPdfX) e/Trapped /False - Aggiunto TPdf.ValidatePdfVT: verifica un PDF aperto per i marker di conformità PDF/VT (presenza di XMP
pdfvtid:GTS_PDFVTVersioneGTS_PDFVTModDate, uguaglianza trapdfvtid:GTS_PDFVTModDateexmp:ModifyDate, presenza dell'identificatore sottostantepdfxid:GTS_PDFXVersion, presenza di/DPartRootnel catalogo secondo §6.5,/OutputIntentscon/DestOutputProfile, /ID nel trailer, stato di cifratura e presenza dixmp:CreateDate/ModifyDate) e restituisce TPdfVTValidationResult con il livello di conformità rilevato e l'insieme dei problemi trovati - Aggiunta la proprietà TPdf.PdfVTConformance: restituisce il livello di conformità del documento attualmente aperto (pvc1, pvc2, pvcNone o pvcUnknown) senza richiedere una chiamata esplicita a ValidatePdfVT
- Nuovi tipi esportati nella nuova unit FPdfPdfvt: TPdfVTConformance (pvcUnknown/None/1/2), TPdfVTTrappedState (ptvUnspecified/True/False/Unknown), TPdfVTValidationResult, TPdfVTValidationIssue e TPdfVTSaveOptions
- La gerarchia Document Part (
DPartRoot/DParttree secondo §6.5) è una struttura di livello applicativo che dipende dalla mappatura destinatario/intervallo di pagine del flusso di stampa variabile. SaveAsPdfVT NON sintetizza un DPart tree — ValidatePdfVT espone l'assenza di/DPartRootcomepvviMissingDPartRootcosì i chiamanti possono instradare i file PDF/VT attraverso un passaggio separato di costruzione del DPart. I requisiti PDF/X-4 a livello di contenuto (embedding font, trasparenza, colore gestito ICC, divieti OPI / JavaScript / Reference XObject e così via) restano responsabilità dell'autore del documento e della pipeline di rendering PDFium - Aggiornata la stringa TPdf.AboutInfo per riportare la versione attuale del prodotto
Version 1.34.0
- Aggiunto supporto per l'iniezione dei marker PDF/R-1 (ISO 23504-1:2020): TPdf.SaveAsPdfR promuove il documento corrente a un file conforme PDF/R-1 (il sottoinsieme PDF per il trasporto di immagini raster usato per documenti scansionati). L'iniezione copre i requisiti applicabili a livello di formato file — il commento di identificazione di versione univoco
%PDF-raster-1.0scritto tra il dizionario trailer e la parola chiave startxref (§5), il dizionario catalogo ridotto alla white list di §6.3 (sopravvivono solo Version / ViewerPreferences / PageLayout / PageMode / AcroForm / Metadata), il Document Information Dictionary ridotto alla white list di §6.4.3 (solo Creator / Producer / CreationDate / ModDate), uno stream XMP di catalogo che trasporta le quattro voci di §6.4.4 Table 1 e un array trailer /ID - Aggiunto TPdf.SaveAsPdfRToStream per l'output PDF/R in memoria e una scorciatoia
TPdf.SaveAsPdfR(FileName)per il caso d'uso più comune - Aggiunto TPdf.ValidatePdfR: verifica un PDF aperto per i marker di conformità PDF/R-1 (commento a piè pagina
%PDF-raster-x.y, versione dell'header, assenza di /Type /ObjStm, conformità del catalogo alla white list, conformità del dizionario Info alla white list, presenza dello stream di metadati XMP, trailer /ID) e restituisce TPdfRValidationResult con il livello di conformità rilevato e l'insieme dei problemi trovati - Aggiunta la proprietà TPdf.PdfRConformance: restituisce il livello di conformità del documento attualmente aperto (prc1, prcNone o prcUnknown) senza richiedere una chiamata esplicita a ValidatePdfR
- Nuovi tipi esportati nella nuova unit FPdfPdfr: TPdfRConformance, TPdfRValidationResult, TPdfRValidationIssue e TPdfRSaveOptions.
TPdfRSaveOptions.Defaultimposta StripInfoOptionalEntries e StripCatalogOptionalEntries su True, così l'iniettore produce per impostazione predefinita un catalogo e un dizionario Info conformi a §6.3 / §6.4.3; i chiamanti possono impostarli su False per conservare le voci del sorgente (in tal caso l'output non soddisferà quelle clausole PDF/R, ma gli altri marker resteranno applicati) - I requisiti a livello di contenuto restano responsabilità del PDF sorgente: struttura Contents per pagina (§6.5.1), forma MediaBox
[0 0 w h](§6.5.3), restrizioni sui filtri (§6.2.2 — solo FlateDecode, CCITTFaxDecode bitonale, DCTDecode 8-bit gray/RGB), assenza di object streams (§6.2.4) e layout strip secondo §6.6. Questi requisiti non possono essere imposti via post-processing — PDF/R è strutturalmente un sottoinsieme molto più rigido degli altri standard PDF/x e richiede che i byte sorgente vengano generati correttamente. ValidatePdfR espone i problemi di formato file che questa unit può rilevare; abbinarlo a un validatore PDF/R del TWAIN Working Group per verifiche complete - Aggiornata la stringa TPdf.AboutInfo per riportare la versione attuale del prodotto
Version 1.33.0
- Aggiunto supporto per l'iniezione dei marker PDF/X (famiglia ISO 15930): TPdf.SaveAsPdfX promuove il documento corrente a un file conforme PDF/X-1a:2001, PDF/X-3:2002 o PDF/X-4 tramite post-elaborazione del PDF base con un aggiornamento incrementale. L'iniezione copre i requisiti applicabili a livello di formato file — stream XMP con
pdfxid:GTS_PDFXVersion(epdfxid:GTS_PDFXConformanceper PDF/X-1a / PDF/X-3) insieme alla corrispondente descrizione pdfaExtension:schemas, un Document Information Dictionary riscritto con le voci/GTS_PDFXVersion,/GTS_PDFXConformancee/Trapped, un catalogo aggiornato con/OutputIntents [N 0 R]che punta a un dizionario OutputIntent con/S /GTS_PDFXe un profilo ICC incorporato, e un array trailer/ID - Aggiunto TPdf.SaveAsPdfXToStream per l'output PDF/X in memoria e una scorciatoia
TPdf.SaveAsPdfX(FileName)che produce PDF/X-4 con OutputIntent sRGB IEC61966-2.1 incorporato (3144 byte, identico al profilo usato da SaveAsPdfA) - Aggiunto TPdf.ValidatePdfX: verifica un PDF aperto per i marker di conformità PDF/X (identificatore XMP pdfxid e uguaglianza con il valore del dizionario Info, descrizione dello schema di estensione pdfxid, array /OutputIntents con /DestOutputProfile, presenza di Title, trailer /ID, stato di cifratura, presenza di xmp:CreateDate / xmp:ModifyDate) e restituisce TPdfXValidationResult con il livello rilevato e l'insieme dei problemi trovati
- Aggiunta la proprietà TPdf.PdfXConformance: restituisce il livello di conformità del documento attualmente aperto (pxc1a, pxc3, pxc4, pxcNone o pxcUnknown) senza richiedere una chiamata esplicita a ValidatePdfX. La stringa di versione XMP viene analizzata per distinguere i tre livelli di conformità
- Nuovi tipi esportati nella nuova unit FPdfPdfx: TPdfXConformance (pxcUnknown/None/1a/3/4), TPdfXTrappedState (ptUnspecified/True/False/Unknown), TPdfXValidationResult, TPdfXValidationIssue e TPdfXSaveOptions.
TPdfXSaveOptions.Defaultpunta a PDF/X-4 con OutputIntent sRGB e/Trapped /False; i chiamanti possono sovrascrivereConformance, fornire un blob CMYKIccProfileDataper i flussi di stampa commerciale o cambiareOutputCondition/OutputConditionIdentifier/RegistryNameper puntare a una specifica voce di registro di caratterizzazione ICC (per esempio FOGRA39, GRACoL2006_Coated1v2) - I requisiti a livello di contenuto (tutti i font incorporati, niente JavaScript, nessuna annotazione visibile, divieto di OPI, regole di trasparenza per PDF/X-1a / PDF/X-3 e così via) restano responsabilità dell'autore del documento e della pipeline di rendering PDFium. Abbinare ValidatePdfX a uno strumento di preflight come callas pdfaPilot o la Ghent PDF Workgroup Output Suite per una verifica completa della conformità
- Aggiornata la stringa TPdf.AboutInfo per riportare la versione attuale del prodotto
Version 1.32.0
- Aggiunto supporto per iniezione marker PDF/E-1 (ISO 24517-1:2008): TPdf.SaveAsPdfE promuove il documento corrente a file conforme PDF/E-1 tramite post-elaborazione del PDF base con un aggiornamento incrementale. L’iniezione copre i requisiti a livello formato file — flusso XMP con
pdfe:ISO_PDFEVersion = "PDF/E-1"e descrizione pdfaExtension:schemas, Document Information Dictionary riscritto con la voce obbligatoria/ISO_PDFEVersion (PDF/E-1)di §5, equivalenza Info-XMP ereditata da ISO 19005-1 §6.7 via §13.1 e array/IDnel trailer (§6.2) - Aggiunto TPdf.SaveAsPdfEToStream per output PDF/E in memoria e scorciatoia
TPdf.SaveAsPdfE(FileName) - Aggiunto TPdf.ValidatePdfE: verifica i marker di conformità e restituisce TPdfEValidationResult
- Aggiunta proprietà TPdf.PdfEConformance: restituisce il livello senza chiamare ValidatePdfE esplicitamente
- Nuovi tipi esportati nella nuova unit FPdfPdfe: TPdfEConformance, TPdfEValidationResult, TPdfEValidationIssue, TPdfESaveOptions
- La riscrittura dell’Info dictionary è una novità nel percorso PDF/x di PDFiumPas — riscrive l’oggetto Info esistente con lo stesso numero (riferimento /Info del trailer preservato) e ne sintetizza uno nuovo se il trailer sorgente non ha /Info
- I requisiti a livello contenuto (embedding font, CMap ToUnicode, XObject / chiavi ExtGState / form XFA proibiti) restano responsabilità dell’autore
- Stringa TPdf.AboutInfo aggiornata per riportare la versione attuale del prodotto
Version 1.31.0
- Aggiunto supporto per iniezione marker PDF/UA-1 (ISO 14289-1:2014): TPdf.SaveAsPdfUa promuove il documento corrente a file conforme PDF/UA-1 tramite post-elaborazione del PDF base con un aggiornamento incrementale. L’iniezione copre i requisiti a livello formato file applicabili tramite post-elaborazione — flusso di metadata XMP con
pdfuaid:part = 1e descrizione pdfaExtension:schemas corrispondente,dc:titleobbligatorio, catalog/MarkInfo << /Marked true /Suspects false >>e/ViewerPreferences << /DisplayDocTitle true >>(solo se la sorgente non li ha), catalog/Lang(quando il chiamante fornisce un tag BCP 47) e array/IDnel trailer - Aggiunto TPdf.SaveAsPdfUaToStream per output PDF/UA in memoria, e una scorciatoia con opzioni di default
TPdf.SaveAsPdfUa(FileName)per il caso comune - Aggiunto TPdf.ValidatePdfUa: verifica in un PDF aperto i marker di conformità PDF/UA-1 (esistenza di StructTreeRoot, /Lang, /MarkInfo /Marked true con /Suspects = false, /ViewerPreferences /DisplayDocTitle true, identificatore XMP pdfuaid:part, presenza di dc:title, /ID del trailer, stato di cifratura) e restituisce un risultato strutturato con il livello di conformità rilevato e l’insieme dei problemi trovati
- Aggiunta proprietà TPdf.PdfUaConformance: restituisce il livello di conformità del documento aperto (puc1, pucNone o pucUnknown) senza chiamare ValidatePdfUa esplicitamente
- Nuovi tipi esportati nella nuova unit FPdfPdfua: TPdfUaConformance, TPdfUaValidationResult, TPdfUaValidationIssue, TPdfUaSaveOptions
- I campi vuoti di TPdfUaSaveOptions (Title / Author / Subject / Keywords / Creator / Producer / CreationDate / ModDate / DocumentId / InstanceId / Language) sono auto-popolati da FPDF_GetMetaText / FPDF_GetFileIdentifier / FPDFCatalog_GetLanguage
- I requisiti a livello contenuto (completezza tagging StructTreeRoot, testo Alt di Figure, CMap ToUnicode, embedding font, ecc.) restano responsabilità dell’autore del documento — SaveAsPdfUa allega solo marker di formato. ValidatePdfUa segnala l’assenza di StructTreeRoot come
pvuaiMissingStructTreeRoot - Stringa TPdf.AboutInfo aggiornata per riportare la versione attuale del prodotto
Version 1.30.0
- L’output PDF/A-1b ora soddisfa i requisiti di equivalenza tra Document Information Dictionary e XMP di ISO 19005-1 (con Cor.1:2007): ogni voce dell’Info dictionary che PDFium scrive nel PDF di base viene riflessa nel pacchetto XMP, inclusi Title (dc:title), Author (dc:creator), Subject (dc:description secondo Cor.1), Keywords (pdf:Keywords), Creator (xmp:CreatorTool), Producer (pdf:Producer), CreationDate (xmp:CreateDate) e ModDate (xmp:ModifyDate). Viene emesso anche xmp:MetadataDate
- Il trailer di un documento PDF/A contiene ora sempre un array /ID (requisito obbligatorio di ISO 19005-1 6.1.3). Quando TPdf.SaveAsPdfA elabora un documento la cui sorgente ha già un file identifier, vengono riutilizzati gli ID di 16 byte permanent e changing; altrimenti viene derivato un ID di fallback deterministico di 16 byte dai byte di origine
- Il XMP iniettato ora incorpora la descrizione dell’extension schema pdfaid richiesta da ISO 19005-1 6.7.8 (sostituito da Cor.1): pdfaid è considerato un extension schema rispetto a XMP Specification 2004, quindi tutti i file conformi devono dichiarare i suoi property names, value types e categories nel contenitore pdfaExtension:schemas
- TPdfASaveOptions ha cinque nuovi campi opzionali: Producer, CreationDate, ModDate (stringhe data PDF in formato “D:YYYYMMDDHHmmSSOHH'mm'”), DocumentId e InstanceId (stringhe da 16 byte per l’array /ID del trailer). TPdf.SaveAsPdfA / SaveAsPdfAToStream riempiono automaticamente i campi mancanti tramite FPDF_GetMetaText e FPDF_GetFileIdentifier, quindi il codice esistente continua a funzionare senza modifiche
- TPdf.ValidatePdfA / TPdf.PdfAConformance ora segnalano tre problemi aggiuntivi: pvaiMissingTrailerId (nessun /ID nel trailer), pvaiMissingXmpDates (manca xmp:CreateDate o xmp:ModifyDate) e pvaiMissingExtensionSchema (descrizione dell’extension schema pdfaid assente)
- I caratteri non ASCII in Title, Author, Subject, Keywords, Creator e Producer sono ora codificati come UTF-8 nel pacchetto XMP (XMP Specification richiede UTF-8), preservando i metadati multilingue attraverso SaveAsPdfA
- Stringa TPdf.AboutInfo aggiornata per riportare la versione attuale del prodotto
Version 1.29.0
- Aggiornate le DLL PDFium incluse (Win32 e Win64, sia build standard sia con V8) allo snapshot upstream del 2026-05-22, integrando le correzioni upstream ai percorsi di crash di FPDFText_SetText / FPDFText_SetCharcodes e vari irrobustimenti interni del progetto PDFium
- Esposto il nuovo flag di salvataggio FPDF_SUBSET_NEW_FONTS di PDFium in FPdfPageOps.pas, consentendo ai chiamanti di FPDF_SaveAsCopy di richiedere il subsetting automatico dei file di font incorporati per gli oggetti di testo appena aggiunti. Le costanti esistenti FPDF_INCREMENTAL, FPDF_NO_INCREMENTAL e FPDF_REMOVE_SECURITY sono ora definite con la forma a scorrimento di bit upstream (il vecchio valore numerico 3 viene mantenuto come FPDF_REMOVE_SECURITY_DEPRECATED per compatibilità binaria)
- Aggiunti l'enum FPDF_FONT_BACKEND_TYPE (FREETYPE / FONTATIONS) e il corrispondente campo m_FontLibraryType su FPDF_LIBRARY_CONFIG in FPdfView.pas, in modo che le applicazioni che inizializzano PDFium con il renderer Skia possano scegliere il backend dei font all'avvio
- Aggiornata la firma di TFPDFPage_InsertObject per allinearsi all'upstream: la funzione C ora restituisce FPDF_BOOL (TRUE in caso di successo, FALSE se page_object è NULL o se il trasferimento di ownership fallisce) invece di void. Le chiamate esistenti di PDFiumPas continuano a compilare invariate, poiché Delphi / FPC consentono di ignorare il valore di ritorno di una funzione
- Corretta la stringa TPdf.AboutInfo affinché riporti la versione attuale del prodotto (era rimasta ferma a v1.27.0 dalla versione 1.28.0 dedicata solo alla documentazione)
Version 1.28.0
- Sostanzialmente ampliata la documentazione interna in tutta la API reference: ogni voce di property, method, event e global function include ora una Description di 3 paragrafi, un elenco Remarks, un Delphi Example multi-riga e un blocco See Also più ricco — coprendo oltre 200 pagine precedentemente sintetiche, inclusi tutti i counter di TPdf, i getter dei metadati, gli accessor di font e caratteri, le proprietà a livello di pagina, i record indicizzati, i metodi a livello di documento e l'intera superficie di stato / display / event di TPdfView
- Affinato il layout dell'help per allinearlo alla baseline visiva losLab usata nella reference di HotXLS: dimensioni h1/h2 uniformate, stili della griglia di navigazione API consolidati nel StyleSheet condiviso e rimossi gli override CSS inline per-pagina su Navigation.html
- La documentazione include ora uno script di supporto (Docs\Build-Expand-Entries.ps1) che rigenera l'arricchimento delle pagine delle voci da una singola tabella dati per una manutenzione ripetibile
Version 1.27.0
- Aggiunto supporto alla creazione di PDF/A-1b: TPdf.SaveAsPdfA salva qualsiasi documento aperto come file conforme a PDF/A-1b tramite post-elaborazione del PDF di base con un aggiornamento incrementale che inietta un flusso di metadati XMP, un OutputIntent ICC sRGB e un catalogo del documento aggiornato — il tutto senza richiedere API DLL aggiuntive. Funziona su qualsiasi piattaforma supportata da PDFiumPas
- Aggiunto TPdf.SaveAsPdfAToStream per l'output PDF/A in memoria
- Aggiunto TPdf.ValidatePdfA: controlla un PDF aperto per verificarne la conformità PDF/A (marker XMP pdfaid, OutputIntent con profilo ICC incorporato, crittografia) e restituisce un risultato strutturato con il livello di conformità rilevato e un insieme di problemi specifici trovati
- Aggiunta property TPdf.PdfAConformance: restituisce il livello di conformità del documento attualmente aperto (pac1b, pac1a, pac2b, pac3b, pacNone o pacUnknown) senza dover invocare esplicitamente ValidatePdfA
- Esportati nuovi tipi: TPdfAConformance, TPdfAValidationResult, TPdfAValidationIssue, TPdfASaveOptions (nella nuova unit FPdfPdfa.pas)
- SaveAsPdfA supporta un profilo ICC personalizzato tramite TPdfASaveOptions.IccProfileData; se lasciato vuoto viene utilizzato automaticamente il profilo sRGB IEC61966-2.1 integrato (HP/Microsoft, 3144 bytes)
- Sostituito il riferimento HTML monolitico con un sistema di help web ristrutturato: 302 singole pagine di voci API (una per ogni property, method, event e global function) che coprono TPdf e TPdfView, ciascuna con una descrizione completa, tabella dei parametri, esempio di codice Delphi e link See Also
- Aggiunto Navigation.html: un indice di navigazione API completo su una pagina organizzato in sei sezioni (TPdf properties/methods/events, TPdfView properties/methods/events, global functions) con una griglia flex a 5 colonne per una scansione rapida
- Ricostruiti TPdf.html e TPdfView.html come pagine compatte di panoramica dei componenti che mantengono le sezioni type-reference (Types, Constants, Global Variables) e rimandano alle singole pagine delle voci per tutti i membri
- Aggiunta ricerca full-text basata su Search.js con corrispondenza incrementale lato client su tutte le 312 pagine indicizzate
- Aggiornate tutte le barre di navigazione del sito per puntare a Navigation.html
Version 1.26.0
- Aggiunto Demo/Lazarus/BatchExport, il port LCL della demo Delphi BatchExport v1.14.0. Stesso set di funzionalità: esportazione PDF -> JPG multi-file con avanzamento generale per file, avanzamento corrente per pagina, input DPI / qualità / password e un batch cancellabile in modo cooperativo supportato da IPdfCancellationToken. La cartella di output viene aperta nel file manager della piattaforma al termine dell'estrazione
Version 1.25.0
- Aggiunto il riutilizzo di pagine Form XObject a TPdf, abilitando workflow di watermark, sovrapposizione di template e “stamp di una pagina su molte”: CreateXObjectFromPage produce un handle riutilizzabile da qualsiasi pagina di un altro documento; InsertFormObjectFromXObject inserisce UNA copia della pagina incapsulata nella pagina corrente. Restituisce il FPDF_PAGEOBJECT inserito in modo che il chiamante possa posizionarlo / scalarlo / ruotarlo con FPDFPageObj_SetMatrix e gli helper TPdfMatrix di v1.9.0
- La nuova classe Pascal TPdfXObject incapsula l'handle FPDF_XOBJECT di PDFium e lo chiude automaticamente nel suo destructor, eliminando il cerimoniale manuale di FPDF_CloseXObject
- Estese le suite di regression Delphi e Lazarus a 147 casi ciascuna e la suite C++Builder a 123 casi, coprendo i contratti di creazione di handle e di inserimento di page-object
Version 1.24.0
- Aggiunto TPdf.RenderPageProgressive — una variante cancellabile di RenderPage che pilota il loop di rendering progressivo di PDFium e interroga un IPdfCancellationToken v1.7.0 tra le iterazioni, in modo che render lunghi ad alta DPI possano essere interrotti a metà pagina invece di bloccare il chiamante fino al completamento
- Restituisce un valore TPdfProgressiveStatus: prsDone, prsCancelled o prsFailed. Passare AToken = nil per renderizzare fino al completamento senza mai mettere in pausa (nessuna possibilità di prsCancelled)
- Utilizza lo stesso zero-copy fast path introdotto in v1.21.0 — PDFium renderizza direttamente nel DIB del TBitmap di destinazione. Lo stesso fallback legacy si applica quando il DIB non può essere incapsulato
- Estese le suite di regression Delphi e Lazarus a 145 casi ciascuna e la suite C++Builder a 121 casi, coprendo nil-token (completa), token pre-cancellato (prsCancelled) ed equivalenza di pixel con RenderPage sincrono su un token vivo
Version 1.23.0
- Aggiunti sei nuovi metodi TPdfView che espongono alle applicazioni la selezione di testo dei form-widget e l'Undo/Redo di PDFium: GetSelectedFormText restituisce il testo attualmente selezionato all'interno del form widget con focus; SelectAllFormText seleziona tutti i caratteri; FormUndo / FormRedo / FormCanUndo / FormCanRedo pilotano la cronologia di editing del widget con focus. Le API PDFium sottostanti erano già bindate ma senza un punto di ingresso di alto livello. Tutti e sei terminano in modo sicuro in cortocircuito quando la view è inattiva o il documento non ha un widget AcroForm con focus
- Estese le suite di regression Delphi e Lazarus a 142 casi ciascuna e la suite C++Builder a 119 casi, coprendo il contratto no-form-no-focus per ogni nuovo metodo
Version 1.22.0
- Aggiunti wrapper di composizione pagine a TPdf: ImportPagesByIndex accetta un array di indici a base zero per copiare pagine specifiche da un documento di origine; ImportNPagesToOne restituisce un nuovo TPdf le cui pagine sono composite N-up di questo documento; MovePages riordina le pagine in-place. Le API PDFium sottostanti erano già bindate ma senza un punto di ingresso Pascal-friendly
- ImportPagesByIndex accetta un array vuoto per importare ogni pagina di origine (equivalente a passare nil al livello di ABI C)
- Estese le suite di regression Delphi e Lazarus a 136 casi ciascuna e la suite C++Builder a 115 casi, coprendo importazione di sottoinsiemi, importazione dell'intero documento, riordino di pagine e composito N-up
Version 1.21.0
- Migliorate le prestazioni di rendering passando TPdf.RenderPage / TPdf.RenderTile (e i corrispondenti helper TPdfView) a un percorso di output zero-copy. PDFium ora scrive direttamente nel buffer DIB del TBitmap di destinazione invece che in un buffer interno che veniva poi copiato riga per riga, risparmiando una copia di memoria di width x height x 4 bytes per ogni render. Il miglioramento è più evidente ad alta DPI (pannelli thumbnail, export print-quality, batch export)
- Il vecchio percorso per-scanline è mantenuto come fallback di sicurezza per il caso improbabile in cui il DIB di destinazione non possa essere incapsulato (dimensioni estreme, stride insolito, OOM). Il comportamento è byte-identico tra i due percorsi, solo più lento nel fallback
- Estese le suite di regression Delphi e Lazarus a 132 casi ciascuna e la suite C++Builder a 112 casi, coprendo upgrade del caller-bitmap a pf32bit, round-trip delle dimensioni e un test di coerenza dello stride su bitmap di grandi dimensioni
Version 1.20.0
- Aggiunta evidenziazione dei risultati di ricerca a TPdfView: HighlightSearchText(Text, MatchCase, MatchWholeWord) esegue la scansione della pagina di view corrente e restituisce il numero di corrispondenze trovate, dipingendo una maschera HighlightColor su ogni corrispondenza ad ogni redraw. ClearHighlight rimuove le evidenziazioni; il passaggio della view a una pagina diversa le elimina automaticamente poiché le corrispondenze sono specifiche per pagina
- HighlightColor ha valore predefinito clYellow ed è published in modo che le applicazioni possano adattare il tema dell'evidenziazione alla loro palette UI
- Estese le suite di regression Delphi e Lazarus a 129 casi ciascuna e la suite C++Builder a 109 casi, coprendo colore predefinito, round-trip del colore, “corrispondenze di parole reali in fixture” contro la stringa di sample.pdf e il contratto “parola mancante restituisce zero corrispondenze”
Version 1.19.0
- Aggiunta property FitMode a TPdfView con quattro valori: pfmNone (zoom manuale), pfmActualSize (100%), pfmFitPage (l'intera pagina entra nel viewport) e pfmFitWidth (la larghezza della pagina corrisponde alla larghezza del viewport). La modalità di adattamento attiva viene riapplicata automaticamente su Resize e quando cambia la pagina corrente, in modo che documenti lunghi con dimensioni di pagina miste rimangano perfettamente inquadrati
- Impostare direttamente Zoom annulla la modalità di adattamento attiva (FitMode torna a pfmNone), in linea con la convenzione standard dei lettori PDF in cui digitare un valore di zoom esce da Fit Page / Fit Width
- Il valore predefinito è pfmNone in modo che le applicazioni esistenti mantengano il loro comportamento di zoom esplicito
- Estese le suite di regression Delphi e Lazarus a 124 casi ciascuna e la suite C++Builder a 106 casi, coprendo valore predefinito, round-trip della modalità, fit-page che produce uno zoom reale su un documento caricato e zoom-manuale-annulla-fit-mode
Version 1.18.0
- Aggiunta property PageColor a TPdfView, disaccoppiando lo sfondo della pagina PDF renderizzata dal Color del controllo circostante. Il valore predefinito è clWhite, in modo che le pagine PDF vengano ora renderizzate bianco-carta indipendentemente dal tema dell'applicazione host. I visualizzatori in dark-mode possono ora mantenere scura l'area di scorrimento lasciando bianca la pagina PDF effettiva (o di qualsiasi colore scelto dall'applicazione)
- Cambiamento di comportamento: le applicazioni che impostavano TPdfView.Color per ricolorare la pagina PDF dovrebbero ora impostare PageColor. L'esperienza predefinita migliora per il caso comune (pagine bianche su sfondi di controllo a tema) senza alcuna modifica al codice
- Estese le suite di regression Delphi e Lazarus a 120 casi ciascuna e la suite C++Builder a 103 casi, coprendo valore predefinito e round-trip del colore
Version 1.17.0
- Aggiunti toggle di lock-down dell'input utente a TPdfView in modo che le applicazioni che integrano il visualizzatore in kiosk, pannelli di preview o contesti read-only possano disabilitare i gesti di navigazione senza fare subclassing: AllowUserPageChange controlla le nuove scorciatoie da tastiera PgUp / PgDn / Ctrl+Home / Ctrl+End; ChangePageOnMouseScrolling controlla i nuovi salti di pagina wheel-up / wheel-down; AllowUserTextSelection è riservato per il futuro percorso di selezione testo via mouse-drag. Tutti e tre hanno valore predefinito True in modo che le applicazioni esistenti effettuino l'upgrade senza alcun cambio di comportamento
- La navigazione di pagina con rotellina del mouse salta Ctrl+wheel in modo che le applicazioni possano mantenere Ctrl+wheel riservato per lo zoom
- Estese le suite di regression Delphi e Lazarus a 118 casi ciascuna e la suite C++Builder a 101 casi, coprendo valori predefiniti e round-trip dei toggle
Version 1.16.2
- Estesa la copertura di regression di TPdfView per i click sui link delle annotazioni quando la pagina del visualizzatore differisce dalla pagina TPdf associata, utilizzando un vero percorso di click del mouse headless su Delphi, Lazarus e C++Builder
- Le suite Delphi e Lazarus eseguono ora 114 casi ciascuna e C++Builder esegue 99 casi
Version 1.16.1
- Corretta la gestione dei click sui link in TPdfView in modo che le azioni automatiche di annotazione e web-link utilizzino la pagina attualmente visualizzata dal viewer, anche quando il componente TPdf associato è parcheggiato su una pagina diversa
- Irrobustito TPdfThumbnailView contro riferimenti Pdf pendenti quando il componente TPdf collegato viene distrutto
- Aggiunta copertura di regression sul ciclo di vita dei riferimenti dei thumbnail; le suite Delphi e Lazarus eseguono ora 113 casi ciascuna e C++Builder esegue 98 casi
- Sincronizzati README, documentazione di test, contenuto search/index dell'HTML Help e output dei pacchetti C++ generati con gli aggiornamenti di integrazione da v1.7.0 a v1.16.0
Version 1.16.0
- Aggiunta una nuova demo Delphi PrintDialog (Demo/Delphi/PrintDialog) focalizzata sulla stampa N-up (1 / 2 / 4 / 9 pagine per foglio) con filtro pagine dispari / pari, rendering in scala di grigi e bordi opzionali da 1 pixel per cella. È una piccola e deliberata compagna della demo PrintPDF esistente, che già copre preview, file recenti, zoom e scaling
Version 1.15.0
- Aggiunto un nuovo componente TPdfThumbnailView (unit FPdfThumbnail) che renderizza un thumbnail di pagina per riga in un pannello laterale scorrevole con evidenziazione hover e selezione, oltre alla navigazione click-to-go. Progettato per affiancare un TPdfView in modo che gli utenti finali possano sfogliare un documento lungo per pagina
- Il componente è registrato nella scheda della tavolozza losLab insieme a TPdf e TPdfView; properties chiave: Pdf, CurrentPageIndex, ThumbnailWidth, ThumbnailHeight, TextColor, HoverColor, SelectionColor, BorderColor e l'evento OnPageClick
- Estese le suite di regression Delphi e Lazarus a 112 casi ciascuna e la suite C++Builder a 97 casi, coprendo valori predefiniti, round-trip delle dimensioni thumbnail, clamping di valori estremi, round-trip del colore e assegnazione di event handler
Version 1.14.0
- Aggiunta una nuova demo Delphi BatchExport (Demo/Delphi/BatchExport) che mostra come convertire molti file PDF in JPG in un'unica passata utilizzando TPdf.LoadCustomDocument per il caricamento in streaming, IPdfCancellationToken per la cancellazione cooperativa e barre di avanzamento generale per file + corrente per pagina. La demo utilizza un'istanza TPdf per file (PDFium stesso non è thread safe) e apre la cartella di output in Explorer quando l'estrazione termina con successo
Version 1.13.0
- Aggiunto un overlay UI di async-rendering a TPdfView tramite tre nuove properties: AsyncRendering, LoadingText e LoadingColor. Quando AsyncRendering è True il percorso di paint single-page disegna un piccolo indicatore “Loading...” sopra la pagina renderizzata in modo che le applicazioni che usano il proprio worker per render lunghi condividano un affordance visiva coerente
- I valori predefiniti preservano il comportamento esistente: AsyncRendering è False, quindi le applicazioni che non aderiscono non vedono alcun cambio visivo
- La documentazione chiarisce che PDFium stesso non è thread safe — per delegare effettivamente il render a un worker il chiamante deve mantenere un TPdf per worker; la prossima demo batch-export mostra quel pattern
- Estese le suite di regression Delphi e Lazarus a 106 casi ciascuna e la suite C++Builder a 93 casi, coprendo valori predefiniti e round-trip delle tre properties
Version 1.12.0
- Aggiunta gestione dei link click-driven a TPdfView. La nuova property LinkOptions controlla il comportamento automatico per i quattro tipi di azione di link PDF: goto (salto di pagina), URI (ShellExecute), launch (ShellExecute) ed embedded GotoR (riservato). I valori predefiniti abilitano loAutoGoto e loAutoOpenURI; loAutoLaunch e loAutoEmbeddedGoto rimangono off in modo che un click accidentale non possa eseguire un programma arbitrario
- Aggiunti gli eventi OnAnnotationLinkClick e OnWebLinkClick che si attivano prima di qualsiasi azione automatica e consentono alle applicazioni di ispezionare il link, marcarlo come Handled o reindirizzarlo (per esempio, a un prompt di sicurezza)
- Il rilevamento del click sui link viene eseguito solo quando il gesto è un click piuttosto che un drag, utilizzando un nuovo anchor MouseDown in modo che i gesti di pan continuino a fluire attraverso il percorso di scroll esistente invariati
- Estese le suite di regression Delphi e Lazarus a 102 casi ciascuna e la suite C++Builder a 91 casi, coprendo LinkOptions predefinito, round-trip del set e assegnazione di event handler
Version 1.11.0
- Aggiunto polish visivo a TPdfView: le properties PageShadowSize, PageShadowColor e PageBorderColor dipingono un'ombra drop opzionale sotto il rettangolo della pagina e un bordo di un pixel attorno ad essa. I valori predefiniti preservano il precedente aspetto piatto (PageShadowSize = 0; il bordo viene disegnato nel clBlack predefinito ma si confonde nello sfondo bianco predefinito finché i chiamanti non cambiano i colori)
- Aggiunta una property SmoothScroll come flag opt-in per un futuro animation di scroll incrementale; la property ha round-trip oggi ed è collegata in modo che le applicazioni possano persistere la preferenza, mentre il lato rendering utilizza ancora il comportamento di scroll immediato esistente
- Estese le suite di regression Delphi e Lazarus a 98 casi ciascuna e la suite C++Builder a 89 casi, coprendo valori predefiniti, round-trip della property e il clamp di shadow-size negativo
Version 1.10.0
- Aggiunto inserimento diretto di immagini tramite nuovi overload TPdf.AddImage e TPdfView.AddImage che accettano un percorso di file oppure un TBitmap, oltre all'esistente AddPicture basato su TPicture. AddImage(FileName) riconosce qualsiasi formato registrato con le unit grafiche VCL o LCL (BMP, PNG tramite l'unit PngImage, JPG, ecc.) e percorre la stessa pipeline di AddPicture in modo che il comportamento sia identico
- AddImage(TBitmap) salta l'intermediario TPicture, semplificando i chiamanti che già detengono un TBitmap proveniente da operazioni di rendering o di generazione batch
- Estese le suite di regression Delphi e Lazarus a 92 casi ciascuna e la suite C++Builder a 84 casi, coprendo inserimento di bitmap, limiti di page-object, rifiuto di bitmap nil e caricamento di file BMP
Version 1.9.0
- Aggiunto supporto di alto livello alle matrici di trasformazione tramite la nuova classe TPdfMatrix nell'unit FPdfMatrix. TPdfMatrix incapsula FS_MATRIX di PDFium con un'API OO per Translate, Scale, Rotate, HorizontalFlip, VerticalFlip, CentralFlip, Skew e Multiply, adatta a comporre trasformazioni prima di passarle a FPDFPageObj_SetMatrix e ad API PDFium simili
- TPdfMatrix.Multiply effettua correttamente lo snapshot dei sei elementi della matrice prima di calcolare i nuovi valori di riga, correggendo un problema latente in cui le implementazioni Pascal alternative sovrascrivono elementi precedenti durante la stessa chiamata e producono risultati errati per qualsiasi composizione oltre la semplice traslazione
- Estese le suite di regression Delphi e Lazarus a 88 casi ciascuna e la suite C++Builder a 81 casi, coprendo identity, reset, translate / scale / flip, ordine di composizione post-moltiplicativa e il caso di regression di Multiply
Version 1.8.0
- Aggiunto caricamento di stream on-demand tramite il nuovo metodo TPdf.LoadCustomDocument(AStream, AOwnsStream) e la classe helper TPdfStreamAdapter, basata su FPDF_LoadCustomDocument di PDFium. PDFium legge ora blocchi dal TStream fornito solo quando necessario, quindi PDF molto grandi o remoti non richiedono più una copia in memoria upfront
- Aggiunta proprietà opzionale dello stream: passando AOwnsStream = True si trasferisce il ciclo di vita del TStream a TPdf, che lo libera quando viene eseguito UnloadDocument
- Estese le suite di regression Delphi e Lazarus a 79 casi ciascuna e la suite C++Builder a 75 casi, coprendo caricamento in streaming tramite TFileStream, pulizia dello stream posseduto e il contratto di sopravvivenza all'unload dello stream posseduto esternamente
Version 1.7.0
- Aggiunte primitive di cancellazione async cooperativa nella nuova unit FPdfAsync, esponendo IPdfCancellationToken / IPdfCancellationTokenSource e un singleton PdfNoCancellationToken riutilizzabile in modo che i workflow di rendering ed export di lunga durata possano supportare semantiche pulite di cancel-from-UI
- Aggiunto un helper leggero TPdfFuture<T> che esegue un worker su un thread di background e posta l'envelope TPdfFutureResult<T> di nuovo al main thread, distinguendo i casi di successo, cancellazione e fallimento
- Estese le suite di regression Delphi e Lazarus a 76 casi ciascuna e la suite C++Builder a 73 casi, con copertura condivisa di stato di cancellazione, cancel idempotente, fan-out di callback e registrazione post-cancel
Version 1.6.10
- Aggiunto l'accesso di alto livello TPdf.PrintPageRanges alla preferenza di intervallo di pagine di stampa del visualizzatore PDF, restituendo intervalli di pagine a base uno per il codice applicativo
- Aggiunti TPdf.SetFormFieldFlags / SetFormFieldFlagsAt e gli helper corrispondenti di TPdfView in modo che le applicazioni possano aggiornare i flag dei campi AcroForm tramite l'API pubblica, inclusa la copertura dei flag di password e multi-select
- Irrobustita la copertura ABI del binding PDFium per FPDF_DWORD dimensionato per Windows, le callback FPDF_FILEACCESS e i campi slot dell'embedder V8
Version 1.6.9
- Aggiunti binding di basso livello per il rendering Skia per le API FPDF_RenderPageSkia e FPDF_FFLDrawSkia appena esportate nelle DLL PDFium standard e V8 incluse
- Estesi i controlli di copertura del binding pubblico in modo che il caricamento delle DLL standard e V8 verifichi ora i punti di ingresso di rendering Skia insieme alle sonde di capacità V8/XFA esistenti
Version 1.6.8
- Aggiunti TPdf.SetTextPositions e TPdfSingleArray per impostare posizioni per-carattere su oggetti di testo esistenti tramite la API FPDFText_SetPositions appena esportata
- Promossa FPDFText_SetPositions a binding richiesto per le DLL PDFium attualmente incluse, confermando al contempo che i punti di ingresso di rendering Skia rimangono non disponibili perché le DLL non li esportano ancora
- Estese le suite di regression Delphi, C++Builder e Lazarus a 65 casi ciascuna con copertura di posizione del testo
Version 1.6.7
- Aggiunto l'accesso di alto livello TPdf alle azioni JavaScript name-tree del documento, restituendo nomi di azione e script tramite JavaScriptAction e JavaScriptActions
- Aggiunto TPdf.FileIdentifier per leggere gli ID di trailer permanenti e cambianti come TBytes binari senza il byte terminatore di PDFium
- Aggiunti TPdf.PageBox, GetPageBox e SetPageBox per MediaBox, CropBox, BleedBox, TrimBox e ArtBox sulla pagina corrente
- Confermato che le DLL PDFium attualmente incluse lasciano solo i punti di ingresso di rendering Skia non disponibili a runtime perché tali export non sono presenti
- Estese le suite di regression Delphi, C++Builder e Lazarus a 64 casi ciascuna con copertura di JavaScript del documento, ID di trailer e page-box
Version 1.6.6
- Aggiunto supporto a runtime per la DLL PDFium V8-enabled inclusa. Impostare EnableV8Engine prima del caricamento seleziona ora pdfium.v8.dll dall'albero DLLs\Win32 o DLLs\Win64 ed espone i binding V8/XFA-only quando la DLL caricata li fornisce
- Aggiunti V8FeaturesAvailable, XfaBStrHelpersAvailable, GetRecommendedV8Flags e binding opzionali di basso livello per FPDF_BStr_*, FPDF_GetRecommendedV8Flags e FPDF_GetArrayBufferAllocatorSharedInstance
- Resa FPDFText_SetPositions opzionale in modo che PDFiumPas continui a caricarsi con DLL PDFium che non esportano quel setter sperimentale di posizione del testo
- Estese le suite di regression Delphi, C++Builder e Lazarus a 61 casi ciascuna con copertura delle capacità standard-DLL e V8-DLL
Version 1.6.5
- Aggiunta ispezione del structure-tree di Tagged PDF tramite TPdf.StructureElements e TPdfView.StructureElements, inclusi tipo di elemento, titolo, testo alternativo, testo effettivo, testo di espansione, lingua, ID di marked-content, conteggi di figli e conteggi di attributi
- Aggiunta selezione del print mode PDFium di Windows tramite TPdfPrintMode e SetPdfPrintMode, coprendo i print mode EMF, solo-testo, PostScript, pass-through, image-mask e Type 42
- Aggiunti binding di basso livello per i restanti export pubblici PDFium della DLL standard che coprono azioni JavaScript, flag di form di annotazione/colore di font, stato attivo di page-object, inserimento indicizzato, valori float di content-mark, dati del profilo ICC di immagine, rimozione di form-object e posizioni di testo
- Estese le suite di regression Delphi, C++Builder e Lazarus a 59 casi ciascuna con copertura di structure-tree di Tagged PDF, print mode e binding di export pubblici
Version 1.6.4
- Aggiornate le demo Delphi, C++Builder e Lazarus per aprire automaticamente i PDF generati, il testo/le immagini esportati e le cartelle di output dei batch dopo la creazione riuscita
Version 1.6.3
- Estese le suite di regression allineate Delphi, C++Builder e Lazarus a 56 casi ciascuna con copertura GUI di TPdfView per gli helper di fit-zoom, round-trip di coordinate device/page, hit-testing di caratteri e pan via mouse attraverso controlli di visualizzatore con finestra nascosta
- Le fixture di TPdfView usano ora una dimensione di viewer esplicita e sottoclassi di solo test che esercitano gli handler di mouse protected mantenendo le suite completamente headless
Version 1.6.2
- Corretto TPdf.AddPage(0, ...) in modo che la prima pagina inserita diventi immediatamente la pagina attiva. Il codice di esempio esistente continua a funzionare, mentre PageNumber ora riporta una pagina a base uno valida dopo l'inserimento
- Sincronizzata la versione del pacchetto Lazarus ed estese le suite di regression allineate Delphi, C++Builder e Lazarus a 52 casi ciascuna
Version 1.6.1
- Corretto un requisito di versione minima errato nel validatore di conformità di versione PDF di v1.6.0: l'azione SetState è stata riclassificata da PDF 1.5 a PDF 1.2, in linea con PDF 1.2 Reference 6.9.9. I target di SaveAs PDF 1.3 / 1.4 che contengono azioni SetState vengono ora salvati correttamente invece di essere rifiutati
- Aggiunti controlli lessicali corrispondenti per PDF 1.2 secondo la stessa sezione di spec: le azioni Sound, Movie e NOP più lo spazio colore Separation sono ora bloccati quando la versione target scelta è precedente a PDF 1.2
- Estese le suite di regression Delphi, C++Builder e Lazarus a 50 casi ciascuna aggiungendo un test positivo di accettazione PDF 1.4 SetState che blocca il limite corretto
Version 1.6.0
- Irrobustiti i target SaveAs PDF 1.0 - PDF 1.7 espliciti con un validator completo di feature-versione che copre l'intera timeline di feature da PDF 1.1 a ISO 32000-1. Il validator blocca ora i salvataggi che contengono voci di dizionario, nomi di filtri, sottotipi di annotazione, tipi di azione, font, spazi colore o parametri di crittografia introdotti dopo la versione target scelta. Esempi: JBIG2Decode (1.4+), MarkInfo / Tagged PDF (1.4+), OutputIntents (1.4+), ICCBased / DeviceN / BleedBox / TrimBox / ArtBox / StructTreeRoot (1.3+), annotazioni Polygon / PolyLine / Caret / Screen / Watermark / Redact, crittografia AES e AES-256 (CFM AESV2 / AESV3), voci di catalogo Perms / Legal / Requirements / NeedsRendering e azioni version-gated come JavaScript, Trans, SetState, Rendition, GoToE, GoTo3DView vengono tutte rifiutate quando la versione PDF target non può rappresentarle
Version 1.5.13
- Estese le suite di regression Delphi, C++Builder e Lazarus a 49 casi ciascuna, aggiungendo copertura diretta per il rifiuto di spazi colore ICCBased, MarkInfo di Tagged PDF, annotazioni Polygon, crittografia AES (V2) e annotazioni Redact contro target PDF 1.2 / 1.3 / 1.4 / 1.5 / 1.6 rispettivamente
Version 1.5.12
- Corretta la post-elaborazione di SaveAs per le riscritture di catalogo incrementali. PDFiumPas valida ora l'ultimo oggetto indiretto ripetuto, in modo che gli override esistenti di catalog /Version vengano sostituiti correttamente quando si salva verso una versione target PDF più vecchia esplicita
- Estese le suite di regression Delphi, C++Builder e Lazarus a 44 casi ciascuna, aggiungendo copertura diretta per la sostituzione di catalog /Version obsoleto, normalizzazione di catalog version PDF 1.4 e rifiuto di feature di trasparenza e portable-collection quando la versione target PDF selezionata non può rappresentarle
Version 1.5.11
- Irrobustito l'output SaveAs versionato per target PDF 1.3, 1.4, 1.5, 1.6 e 1.7 espliciti. PDFiumPas normalizza ora i marker di versione del catalogo, mantiene l'OpenAction Fit Height predefinito version-safe e rifiuta feature PDF più recenti quando la versione target selezionata non può rappresentarle
- Aggiunta copertura di regression Delphi, C++Builder e Lazarus che salva e ricarica file PDF 1.3 - PDF 1.7 espliciti, verificando l'header finale, l'OpenAction Fit Height predefinito e la versione PDF riportata
Version 1.5.10
- Passato dall'opzione B della spec all'opzione C aggiungendo smoke test di TPdfView in tutte e tre le suite IDE (Tests.PdfView). Ogni suite costruisce un TForm parent nascosto (tramite TForm.CreateNew sui lati Pascal e
new TForm(NULL, 0)sul lato C++Builder), riparenta un TPdfView, imposta Active := True e poi verifica la superficie di round-trip per PageCount, PageNumber predefinito, Zoom, Rotation, DisplayMode e che View.Text corrisponda al TPdf.Text sottostante. Ogni suite IDE esegue ora 39 casi
Version 1.5.9
- Passato dall'opzione A della spec all'opzione B aggiungendo smoke test di rendering in tutte e tre le suite IDE. Ogni suite Tests.Render chiama TPdf.RenderPage su sample.pdf e verifica tre segnali robusti invece di checksum byte-per-byte: la bitmap restituita corrisponde esattamente alla dimensione di pixel richiesta; dimensioni richieste diverse (200x100, 64x256) producono bitmap corrispondenti; e la pagina renderizzata è almeno per il 95% di sfondo bianco con almeno 50 (Lazarus: 20) pixel non bianchi che marcano il testo antialiased. Ogni suite IDE esegue ora 33 casi
Version 1.5.8
- Chiusi i gruppi originali del test plan A(2) aggiungendo sette regression in più per IDE: TPdf.CreateAnnotation costruisce un'annotazione anHighlight più un round-trip SaveAs/LoadDocument, il percorso di lettura AcroForm su Demo/Delphi/FormFill/cmp_fill_out_and_merge_forms.pdf (FormType è ftAcroForm, FormFieldCount > 0, FlattenAllPages porta i campi a zero) e copertura di percorso di lettura silenziosa per Bookmarks, LinkAnnotationCount e WebLinkCount su un documento che non ha nessuna di quelle feature. Ogni suite IDE esegue ora 30 casi
Version 1.5.7
- Estese le suite Delphi (DUnitX), Lazarus (FPCUnit) e C++Builder (GoogleTest) con sette nuove regression per IDE: PdfVersion, PageRotation, TPdf.FindFirst / FindNext per ricerca di sottostringa, accordo CharacterOrigin / CharacterRectangle rispetto all'origine di AddText, registrazione di CreateAttachment più un round-trip SaveAs/LoadDocument e un round-trip AddText di testo accentato che verifica che il percorso di embedding TrueType europeo di v1.3.0 mantenga intatti i code point supplementari Latin-1
Version 1.5.6
- I PDF salvati ricevono ora un'azione di apertura Fit Height predefinita sulla prima pagina quando non è presente alcun OpenAction esistente, in modo che i lettori PDF visualizzino inizialmente i documenti generati con zoom alla altezza di pagina
- Aggiunta copertura di regression Delphi, Lazarus e C++Builder per l'OpenAction generato e l'impostazione Fit Height
Version 1.5.5
- Aggiunti regression test attraverso le suite Delphi (DUnitX), Lazarus (FPCUnit) e C++Builder (GoogleTest) per la superficie di API di ispezione di caratteri e font indicizzati (TPdf.FontBaseName, FontFamilyName, FontWeight, FontItalicAngle, FontData, FontIsEmbedded, CharacterFontWeight, CharacterAngle). La suite Lazarus salta intenzionalmente FontData, che attualmente causa access-violation all'interno di FPDFFont_GetFontData sotto FPC
Version 1.5.4
- Aggiunta una demo C++Builder Attachment portata dall'esempio Delphi, che copre creazione di PDF, aggiunta, elencazione, estrazione, eliminazione e salvataggio di allegati di file embedded con visualizzazione del sottotipo MIME
Version 1.5.3
- Esposto il calcolo di spread-page che supporta le modalità a due pagine di TPdfView come helper a livello di unit ComputeSpreadPages(DisplayMode, PageNumber, PageCount, out LeftPageNo, out RightPageNo). Il comportamento è invariato; l'helper rende la regola cover-aware testabile indipendentemente senza istanziare un viewer
- Aggiunti cinque regression test attraverso le suite Delphi (DUnitX), Lazarus (FPCUnit) e C++Builder (GoogleTest) coprendo documenti vuoti, l'accoppiamento standard a due pagine, la pagina di copertina da sola in dmTwoPageContinuousWithCover, coppie post-copertina e comportamento di clamping per ultima pagina / fuori intervallo
Version 1.5.2
- Aggiunto supporto della lingua del documento tramite TPdf.Language, mappato alla voce /Lang del catalogo PDF
- Aggiunto l'accesso al sottotipo MIME degli allegati con TPdf.AttachmentType
- Aggiunto anRedact a TPdfAnnotationSubtype e aggiunti helper di rimozione di page-object per TPdf e TPdfView
- Aggiornate le demo viewer e attachment per visualizzare le nuove informazioni di lingua e tipo di allegato quando disponibili
Version 1.5.1
- Aggiunto dmTwoPageContinuousWithCover per TPdfView in modo che i layout del viewer possano mostrare la prima pagina da sola e poi continuare con spread a due pagine
- Aggiornate le demo MultiPageViewer Delphi, C++Builder e Lazarus per esporre la modalità di visualizzazione a due pagine cover-aware
Version 1.5.0
- Aggiunte suite di test automatizzate smoke-level per Delphi (DUnitX), Lazarus (FPCUnit) e C++Builder (GoogleTest). Le tre suite condividono una singola fixture PDF in Tests\TestData ed eseguono gli stessi sette casi ciascuna, coprendo caricamento del documento, info di pagina, estrazione di testo, metadati, round-trip di salvataggio, validazione dell'header PDF e la property Compressed
Version 1.4.3
- Migliorata la demo FontProperties per mostrare sia le API di metadati font di TPdfView che di TPdf, inclusi handle di font, dimensione dei dati di font e metriche di carattere
- Aggiunte properties di ispezione di caratteri e font indicizzati a TPdfView e aggiornata la demo FontProperties per interrogare i metadati di font dei text-object
Version 1.4.2
- Aggiunte properties di ispezione di caratteri e font indicizzati a TPdf per l'analisi del testo senza richiedere un viewer. Le properties indicizzate per carattere (CharacterAngle, CharacterFontSize, CharacterFontWeight) interrogano metriche per-carattere dallo stream di testo della pagina corrente. Le properties indicizzate per page-object (FontAscent, FontBaseName, FontData, FontDescent, FontFamilyName, FontHandle, FontIsEmbedded, FontItalicAngle, FontWeight) interrogano i metadati di font per qualsiasi oggetto di testo sulla pagina corrente
- Gli oggetti di pagina non-testo restituiscono valori zero o vuoti sicuri per tutte le properties Font* invece di sollevare un errore, rendendo semplice iterare ogni oggetto di pagina e ispezionare solo quelli di testo
- FontBaseName legge direttamente il nome PostScript base font invece di ricadere sul nome della famiglia di font, fornendo un identificatore più accurato per i font embedded
Version 1.4.1
- Aggiunte versioni C++Builder e Lazarus della demo EuropeanText in modo che tutte le famiglie IDE supportate possano verificare la generazione di testo europeo accentato con font TrueType di sistema
- Aggiunte versioni C++Builder e Lazarus della demo FormFill, includendo PDF di form di esempio, modifica di campi, rigenerazione dell'aspetto, salvataggio del compilato e workflow di salvataggio flattened
Version 1.4.0
- Aggiunto supporto Lazarus / Free Pascal: il nuovo pacchetto PDFiumLaz fornisce gli stessi componenti TPdf, TPdfView e correlati sotto il widget set LCL, estendendo la libreria all'IDE Lazarus e al compilatore Free Pascal accanto agli esistenti pacchetti Delphi e C++Builder
- Aggiunte versioni Lazarus delle demo in modo che gli sviluppatori Lazarus possano esplorare ogni feature con esempi eseguibili
- Corretto un problema di compilazione Lazarus in cui le define condizionali di Free Pascal venivano valutate insieme ai controlli di versione del compilatore Delphi, causando il fallimento delle build FPC che tentavano di risolvere nomi di unit Delphi-specifici
Version 1.3.1
- Documentato il workflow di flattening dei form nel set di help: GenerateFormAppearances, FlattenPage, FlattenAllPages e le costanti FLAT_* / FLATTEN_* correlate sono ora coperti in TPdf, TPdfView, nell'API reference, nella matrice delle feature e negli esempi di programmazione
- Corretta la tabella di architettura nella pagina di overview in modo che elenchi le unit di binding effettive distribuite nella cartella Lib
Version 1.3.0
- Migliorato il supporto ai caratteri europei durante la creazione di PDF. TPdf.AddText carica ora e mette in cache il font TrueType di sistema corrispondente prima di creare un oggetto di testo, preservando i caratteri accentati di ceco, francese, tedesco, spagnolo, portoghese, polacco e turco che i font standard integrati di PDFium non possono rappresentare
- Le applicazioni che producevano in precedenza punti interrogativi o glifi di sostituzione per testo Latino non-ASCII verranno ora renderizzate correttamente senza alcuna modifica al codice. Aggiunta la demo EuropeanText per illustrare la feature
Version 1.2.0
- Aggiunto refresh dell'aspetto AcroForm a TPdf: chiamare GenerateFormAppearances dopo aver modificato i valori di FormField[] aggiorna l'aspetto del widget in modo che i valori compilati siano visibili nei lettori PDF standard senza richiedere una sessione di editing interattiva
- Aggiunti helper di flattening dei form a TPdf (FlattenPage / FlattenAllPages) e TPdfView (FlattenPage per la pagina di view corrente). Il flattening incorpora permanentemente i valori di campo compilati come normale contenuto di pagina e rimuove il layer di form interattivo, producendo un documento statico che viene renderizzato in modo coerente su tutti i viewer
- Aggiunto Demo\Delphi\FormFill per dimostrare i workflow fill-and-save e fill-and-flatten con un PDF AcroForm di esempio
Version 1.1.2
- Aggiunta compressione di stream PDF in fase di salvataggio. La nuova property TPdf.Compressed (abilitata di default) riscrive gli stream di contenuto non compressi come stream compressi FlateDecode al salvataggio, riducendo significativamente la dimensione del file per i PDF generati programmaticamente. Le applicazioni che richiedono output non compresso semplice possono impostare Compressed a False prima di chiamare SaveAs
Version 1.1.1
- Le build del pacchetto Win64 non includono più le unit di registrazione design-time, prevenendo fallimenti di build quando il pacchetto Win64 viene distribuito in un contesto solo-runtime
- Il loader della DLL PDFium cerca ora prima nella sottodirectory applicativa Win32 o Win64, usando i nomi standard pdfium.dll e pdfium.v8.dll, e ricade sulla directory flat dell'applicazione e sulla system directory di Windows. Ciò corrisponde al layout di DLL incluso con il pacchetto dei componenti, rendendo l'installazione semplice
Version 1.1.0
- Corretto un difetto visivo di clipping nella modalità a due pagine di TPdfView: il contenuto della pagina sanguinava attraverso il gutter perché sia il tile di pagina sinistra che destra condividevano un singolo rettangolo di clipping. Ogni tile ora effettua il clipping in modo indipendente in modo che il contenuto rimanga entro il proprio confine di pagina
- Migliorato il messaggio di errore della demo Delphi quando la DLL PDFium non può essere trovata, fornendo un prompt più chiaro con il nome e la posizione attesi della DLL