Note de lansare PDFiumPas
Istoricul versiunilor pentru funcțiile PDFiumPas vizibile utilizatorului, corectări, îmbunătățiri ale vizualizatorului, generarea documentelor, ieșirea PDF/A, randare și actualizările documentației
Ultima lansare
- Cea mai recentă versiune: 2.57.0; Data lansării:
Version 2.57.0
Adăugat (Added)
TPdfThumbnailView.Orientationsuportă layout-uri verticale și orizontale de miniaturi păstrând în același timp valoarea implicită verticală existentăFirstVisiblePageIndex,LastVisiblePageIndexșiEnsureCurrentPageVisibleexpun și controlează fereastra de vizualizare a miniaturilor cu indecși de pagină bazați pe unu
Schimbat (Changed)
- Modificarea
CurrentPageIndexderulează acum miniatura selectată în vizibilitate în ambele orientări - Testele Delphi, Lazarus și C++Builder acoperă acum valorile implicite de orientare, comutarea, intervalele vizibile și vizibilitatea paginii selectate
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele instalatorului raportează acum consecvent Version 2.57.0
Version 2.56.2
Schimbat (Changed)
HighlightSearchText,AddSearchTextHighlightșiClearHighlightinvalidează acum doar dreptunghiurile de dispozitiv pentru intervalele de căutare care au fost adăugate sau eliminate, în loc să repicteze întreaga vizualizare- Înlocuirea evidențierilor cu aceleași potriviri sau adăugarea de potriviri duplicate nu mai programează o repictare inutilă
- Testele Delphi, Lazarus și C++Builder acoperă acum invalidarea limitată, actualizările idempotente, ștergerea și siguranța vizualizărilor inactive
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele instalatorului raportează acum consecvent Version 2.56.2
Version 2.56.1
Schimbat (Changed)
TPdfThumbnailViewreutilizează acum bitmap-urile randate pentru paginile care rămân vizibile peste repictări și poziții adiacente de derulare- Cache-ul reține doar intervalul curent de pagini vizibile și eliberează intrările precis când paginile părăsesc acel interval, documentul atribuit se schimbă sau dimensiunile miniaturilor se schimbă
- Testele Delphi, Lazarus și C++Builder acoperă acum reutilizarea cache-ului, tăierea ferestrei de vizualizare, invalidarea dimensiunii, înlocuirea documentului și distrugerea componentei
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele instalatorului raportează acum consecvent Version 2.56.1
Version 2.56.0
Adăugat (Added)
TPdfView.CutSelectedFormTextToClipboardșiTPdfView.PasteFormTextFromClipboardoferă editare Unicode prin clipboard pentru widget-ul de formular editabil focusat
Schimbat (Changed)
- Editoarele de formular focusate gestionează acum comenzile rapide standard copy, cut, paste și select-all înainte de a transmite intrarea text către PDFium
- Cut și paste resping câmpurile read-only și sesiunile fără permisiune de completare-formular sau modificare, în timp ce cut copiază cu succes înainte de a elimina textul selectat
- Testele Delphi, Lazarus și C++Builder acoperă acum comportamentul fără-focus, drumul dus-întors al comenzii rapide și respingerea read-only
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele instalatorului raportează acum consecvent Version 2.56.0
Version 2.55.0
Adăugat (Added)
TPdfView.AddSearchTextHighlightadaugă potriviri unice pentru un alt termen de căutare la overlay-ul paginii curente, permițând mai multor interogări să rămână evidențiate împreună
Schimbat (Changed)
HighlightSearchTextrămâne punctul de intrare pentru înlocuire și acum împarte scanerul aditiv, în timp ce intervalele duplicate de caractere sunt ignorate șiClearHighlightelimină setul acumulat complet- Testele Delphi, Lazarus și C++Builder acoperă acum acumularea de interogări distincte și suprimarea intervalelor duplicate
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele instalatorului raportează acum consecvent Version 2.55.0
Version 2.54.0
Adăugat (Added)
TPdfexpune acum instantanee complete de obiect-pagină, actualizări de stil în lot, transformări afine de obiect, segmente de cale, căi de decupare și copii Form XObject- Inspecția caracterelor include acum culori de umplere și de contur, nume și indicatori de font, limite glifare libere, matrice efective, handle-uri de obiect-text și conversie din indice-caracter în indice-text
- Adnotările fac acum drum dus-întors cu geometria chenarului și fluxurile de aspect normal, rollover și down
- Accesorii noi de miniaturi brute și decodate, transformări de conținut-pagină și adnotare, plus
RenderPageWithMatrixoferă căi directe avansate de randare și editare
Schimbat (Changed)
- Modificările de stil ale obiectelor-pagină pot fi acum comise ca un singur lot, astfel încât PDFium regenerează conținutul paginii o singură dată
- Randarea matriceală folosește calea bitmap zero-copy existentă atunci când layout-ul bitmap-ului destinație este compatibil
Version 2.53.1
Remediat (Fixed)
- Caption-ul de meniu Copy chinezesc încorporat folosește acum puncte de cod Unicode independente de codificare și se afișează corect în compilările Lazarus
- Lanțurile de instrumente Delphi mai vechi pot acum compila
FPdfAsyncatunci când unitatea lorWinapi.Windowsomite declarațiaGetTickCount64
Version 2.53.0
Adăugat (Added)
- Fixture de test nou
Tests.ApiCoveragecare acoperă API-urile publice TPdf care anterior aveau acoperire de test end-to-end zero:GetPageBox/SetPageBox(citire/scriere MediaBox/CropBox, erori de cutie-lipsă și drum dus-întors la salvare),FlattenPage/FlattenAllPages(valoare returnată și păstrare a numărului de pagini),GenerateFormAppearances(no-op pe documente non-formular),SaveAsEncrypted/SaveAsEncryptedToStream(AES-256 cu drum dus-întos al parolei — verifică că fișierul criptat refuză să se deschidă fără parolă și se deschide cu ea), validarea limitelorDeletePage(pagina 0 și în afara intervalului ridicăEPdfError), și sentinelii de adnotareHasContents/HasAuthorintroduși în v2.38.0 (verificând căDefault(TPdfAnnotation)îi lasăFalse)
Version 2.52.0
Adăugat (Added)
TPdfView.CopySelectedFormTextToClipboardcopiază selecția de text din interiorul widget-ului AcroForm focusat în clipboard-ul Windows caCF_UNICODETEXT
Schimbat (Changed)
- Operațiile de copiere text-pagină și formular-focusat împart acum același scriitor Unicode defensiv de clipboard și lasă clipboard-ul neschimbat când selecția lor este goală
- Testele Delphi, Lazarus și C++Builder acoperă acum apelurile de copiere-formular inactive sau nefocusate și un drum dus-întors al selecției de formular focusat prin clipboard-ul Windows
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele instalatorului raportează acum consecvent Version 2.52.0
Version 2.51.0
Adăugat (Added)
TPdfView.SelectLineAtselectează linia de text vizual care conține o pagină bazată pe unu și un indice de caracter bazat pe zero fără a necesita intrare de mouse
Schimbat (Changed)
- Selecția programatică de linie, selecția prin triplu-clic și
Shift+HomesauShift+Endîmpart acum un singur model de limită-linie pe casete de caractere - Testele Delphi, Lazarus și C++Builder acoperă acum selecție stabilă de linie și indecși de pagină sau caracter invalizi
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele instalatorului raportează acum consecvent Version 2.51.0
Version 2.50.0
Adăugat (Added)
TPdf.LoadDocumentacceptă acum o fereastrăIndexșiCountbazată pe zero într-un bufferTBytes, permițând PDF-urilor încorporate să se încarce fără a aloca o felie temporară de byte-array
Schimbat (Changed)
- Încărcarea pe interval-de-octeți respinge ferestrele negative sau în afara limitelor înainte de a schimba starea documentului și păstrează opțiunile existente de durată de viață pentru buffer stocat și buffer-împrumutat
- Testele Delphi, Lazarus și C++Builder acoperă acum ferestre PDF încorporate și argumente de interval de octeți invalide
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele instalatorului raportează acum consecvent Version 2.50.0
Version 2.49.1
Adăugat (Added)
TPdfView.FitModesuportă acumpfmFitHeightpentru adaptarea paginii curente la înălțimea vizibilă a ferestrei de vizualizare, permitând derularea orizontală când este necesar
Remediat (Fixed)
- Modurile de adaptare converg acum după ce vizibilitatea barei de derulare modifică zona client, menținând rezultatele fit-page, fit-width și fit-height consecvente între VCL și LCL
- Testele de vizualizare Delphi, Lazarus și C++Builder acoperă acum selectarea
pfmFitHeightși drumurile dus-întors de enumerare TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele instalatorului raportează acum consecvent Version 2.49.1
Version 2.49.0
Adăugat (Added)
- Suprafața publică de legare PDFium acoperă acum toate cele 470 de funcții exportate în anteturile revizuite, inclusiv accesul la descrierile atașamentelor prin
FPDFAttachment_SetDescriptionșiFPDFAttachment_GetDescription TPdfexpune acum descrieri ale atașamentelor, validitatea referințelor încrucișate, decalajele de sfârșit de trailer, revizuirea security-handler, încărcarea în memorie pe 64 de biți, intervalele de byți de semnătură, intervalele de text ale linkurilor web și instantanee extinse de date de imagine, filtru, metadate și profil ICC- Asistenții de formulare suportă acum focusul nativ al câmpurilor, interogările și actualizările opțiunilor de selecție focalizate, redirecționarea rotiței mouse-ului, tușele de cerneală scrijabile și suprapunerile de formulare după randarea progresivă
Schimbat (Changed)
FormFieldCount, indecșii câmpurilor de formular și ordinea de tabulare descriu acum doar adnotările widget în loc să includă adnotări de pagină nelegate- Paginile
TPdffără interfață intră acum și ies din ciclul de viață al paginii de completare a formularului, astfel încât focusul nativ și API-urile câmpurilor focalizate funcționează fără unTPdfView - Exporturile descrierilor atașamentelor sunt limitate de capabilități, astfel încât aplicațiile care folosesc o compilare PDFium mai veche pot încărca încă biblioteca și detecta funcția indisponibilă
Remediat (Fixed)
- Randarea progresivă a paginii pictează acum controalele de formular când completarea formularelor este activată
- Testele Delphi, Lazarus și C++Builder acoperă acum noile diagnosticuri de document, descrierile atașamentelor, căile de cerneală, comportamentul formularelor, intervalele de byți de semnătură, intervalele linkurilor web și metadatele imaginilor
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele instalatorului raportează acum consecvent Version 2.49.0
Version 2.48.0
Adăugat (Added)
TPdfMatrixexpune acum fabrici, clonare și atribuire, diagnosticuri de stare finită și invertibilitate, comparare bazată pe toleranță, acces la translație, raportare determinantă și decompoziție afină- Compunerea prepend, rotația conștientă de pivot, scalarea, înclinarea și răsturnările, plus maparea dreptunghiurilor stretch, contain și cover suportă fluxuri de lucru în spațiu local și machete adaptate fără aritmetică manuală a coeficienților
- Accesul invers nemutant, maparea inversă a punctelor, transformările de vectori și patrulatere, loturi dinamice de puncte și dreptunghiuri, variante in-place și limite transformate într-o singură trecere extind suprafața geometrică reutilizabilă
Schimbat (Changed)
- Translația, scalarea și răsturnările axelor actualizează acum doar coeficienții afectați în loc să fie dirijate prin înmulțire afină generală
- Transformarea dreptunghiurilor normalizează intrarea o singură dată, folosește un drum exact specializat aliniat pe axe unde este posibil și calculează limite rotite generale fără înregistrări temporare de puncte
- Transformările de loturi de puncte și dreptunghiuri alocă un singur șir de rezultate sau reutilizează stocarea apelantului, în timp ce limitele punctelor transformate sunt acumulate într-o singură trecere fără un șir intermediar
Remediat (Fixed)
- Maparea dreptunghiurilor respinge rezultatele de dimensiune zero, nefinite și cu depășire
Singleînainte de a publica o matrice inutilizabilă - Testele Delphi, Lazarus și C++Builder verifică acum ordinea de compunere, invarianții de pivot, drumurile dus-întors inverse, dreptunghiurile adaptate, decompoziția și comportamentul geometriei în masă
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele instalatorului raportează acum consecvent Version 2.48.0
Version 2.47.0
Adăugat (Added)
FPdfAsyncfurnizează acum motive și mesaje de anulare structurate, înregistrări de apel invers eliminabile, surse bazate pe limită de timp, așteptare anulare și operații try-cancel atomice prin interfețe extinse care păstrează API-ul originalTPdfFuture<T>.RunExadaugă expedierea răspunsului și prioritatea workerului configurabile, în timp ce plicurile de rezultate expun ID-uri de operații, validitatea valorilor, numele claselor de excepții, sincronizarea completării și asistenții de completare reutilizabiliTPdfAsyncExecutoradaugă un pool de workeri fix reutilizabil cu patru benzi de prioritate FIFO, contrapresiune opțională de coadă limitată, mâner de sarcini anulabile, așteptare conștientă de limită de timp, instantanee de sarcini, statistici agregate și oprire grațioasă
Schimbat (Changed)
- Sarcinile asincrone repetate pot reutiliza firele de workeri și operațiile de coadă O(1) în loc să creeze un fir pentru fiecare sarcină, în timp ce completarea sincronizată rămâne disponibilă pentru gazdele UI
- Eșecurile executorului și future păstrează diagnosticurile clasei și mesajului de excepție, anularea păstrează motivul său original, iar excepțiile de apel invers rămân izolate de ciclul de viață al workerului și de oprire
- Testele Delphi, Lazarus și C++Builder acoperă acum suprafața extinsă de anulare, metadate future, controlul sarcinilor, contrapresiune, ordonarea priorităților, statistici, eșec și oprire
Remediat (Fixed)
- Proprietarii de anulare concurenți primesc acum un rezultat determinist al primului scriitor în loc să se bazeze pe o secvență separată de observare și anulare
- Așteptarea de inactivitate a firului principal procesează răspunsurile sincronizate ale sarcinilor, împiedicând un worker finalizat să lase executorul permanent neinactiv în timpul unei opriri coordonate
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele instalatorului raportează acum consecvent Version 2.47.0
Version 2.46.0
Adăugat (Added)
FPdfAsn1expune acum clase de identificator, codificare și decodificare a numărului de etichetă înalt pe 64 de biți, înregistrări TLV analizate, ferestre de cititor copil cu copiere zero, decoadere primitive tipizate și felii de conținut sau valori codificate- Scriitorii DER suportă acum intervalul complet INTEGER pe 64 de biți fără semn, conținut INTEGER arbitrar validat, ENUMERATED, selectare automată UTCTime sau GeneralizedTime, etichete application și private, SEQUENCE cu valori multiple și ieșire SET OF sortată canonic
ValidateDerreturnează erori de validare conștiente de decalaj impunând limite configurabile de imbricare, număr de noduri, lungime conținut, număr de erori, rădăcină și sortare SET opțională
Schimbat (Changed)
- Concatenarea DER și compunerea cu valori multiple folosesc o singură alocare de ieșire, memoțiile tampon ale scriitorului expun operații reserve, count, capacity și transfer de proprietate, iar sortarea SET OF folosește acum sortare prin interclasare
O(n log n) - Valorile BOOLEAN, INTEGER, BIT STRING, OBJECT IDENTIFIER, NULL, UTF8String, PrintableString, IA5String, UTCTime și GeneralizedTime primesc verificări de formă canonică în timpul codificării, decodificării tipizate sau validării
- Pachetul de runtime Lazarus exportă acum
FPdfAsn1, iar suiturile de testare Delphi, Lazarus și C++Builder exersează aceeași suprafață DER publică
Remediat (Fixed)
- Numerele de etichetă specifice contextului mai mari de 30 nu mai sunt trunchiate în cei cinci biți de identificare inferiori
- Identificatorii de etichetă înalt malformați, lungimile definite neminimale, UTF-8 invalid, umplutura BIT STRING diferită de zero, câmpurile de timp invalide, rădăcinile finale și încălcările limitelor de resurse sunt respinse determinist
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele instalatorului raportează acum consecvent Version 2.46.0
Version 2.45.0
Adăugat (Added)
FPdfPreflightReportatribuie acum severitatea Info, Warning sau Error fiecărei probleme și expune API-uri de severitate, status, categorie, cod-problemă, lookup, search, flattening și filtering la nivel de standard și raport- Rapoartele preflight exportă acum SARIF 2.1.0, JUnit XML, NDJSON și XML nativ prin metode
To*șiSave*ToFilecorespunzătoare pentru conductele CI, automatizare și streaming - Amprente de raport SHA-256 stabile identifică rezultate de validare echivalente independent de căile sursă și marcajele temporale de generare
Schimbat (Changed)
- Rapoartele JSON, CSV, text, Markdown și HTML includ acum severitatea și rezumate de status extinse; HTML adaugă subtitluri de tabel accesibile și un rezumat de status
- Construcția colecțiilor de probleme și standarde folosește creștere geometrică a capacității, rezultatele interogărilor sunt predimensionate, escape JSON scrie într-o singură memorie tampon de ieșire limitată, iar toate fișierele de raport folosesc un singur scriitor UTF-8 direct
- Rezumatele categoriilor de probleme folosesc sortare deterministă, marcajele temporale includ milisecunde, JSON transportă
formatVersion: 2, iar celulele CSV neutralizează formulele din foi de calcul
Remediat (Fixed)
- Exportul JSON păstrează acum perechi Unicode suplimentare valide și înlocuiește unitățile de cod surrogate UTF-16 izolate în loc să emită date scalare malformate
- Exportul HTML face acum escape apostrofurilor, iar vizualizările de raport filtrate dețin șiruri de probleme independente în loc să partajeze stocare de rezultate mutabilă
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele instalatorului raportează acum consecvent Version 2.45.0
Version 2.44.0
Adăugat (Added)
- Semnele de carte și destinațiile expun starea de deschidere, numerele de descendenți, țintele acțiunilor, modurile de vizualizare a destinației și până la patru parametri de vizualizare
Metadata,GrantedPermissions,UserGrantedPermissions,HasPermissionșiUserHasPermissionoferă instantanee tipizate de inspecție a documentului și interogări de permisiuniExtractThumbnail(PageNumber)randează o pagină solicitată fără a schimba pagina activă, iar rezultatele de marcare temporală RFC 3161 expun politica, momentul generării și detaliile nonce
Modificat (Changed)
- Rutele pentru semne de carte, JavaScript, metadate, destinații și miniaturi folosesc tampoane validate în două treceri, creștere geometrică a colecțiilor și traversare sigură împotriva ciclurilor
- Post-procesarea salvării rezolvă catalogul activ, arborele de pagini și acțiunea de deschidere prin revizia xref curentă, memorează fluxurile de obiecte decodate și scanează dicționarele PDF cu limite lexicale
- Analiza partajată PDF aplică acum antete exacte de obiecte, generații, chei de dicționar, lungimi de flux, geometria predictorului, intervale de întregi și limite de comentariu, șir literal și șir hexazecimal
- Validarea răspunsurilor RFC 3161 leagă acum atât nonce, cât și
messageImprintSHA-256, necesită un semnatar structural valid și aplică reguli stricte de lungime DER, OID, INTEGER și GeneralizedTime
Remediat (Fixed)
- Documentele incrementale nu mai selectează cataloage duplicate inactive sau sufixe de referință malformate atunci când se adaugă o acțiune de deschidere implicită
- Jetoanele de marcare temporală cu lungimi DER în formă lungă păstrează jetonul codificat complet, în timp ce ordonarea malformată a câmpurilor opționale CMS și seturile goale de semnatari sunt respinse
- Compilările Delphi curate scriu acum câmpurile seed nonce PAdES prin copieri de octeți sigure la aliniere și transmit octeții de răspuns XFA cu tipul exact de pointer nativ
Version 2.43.0
Adăugat (Added)
- Înregistrările de câmpuri și adnotări XFDF expun acum flaguri de prezență care disting o valoare XML omisă de o valoare explicit goală
Modificat (Changed)
- Importul XFDF acceptă elemente și atribute cu prefix de spațiu de nume, conținut mixt text și CDATA, referințe la entități și valori semnificative pentru spațiile albe, respingând în același timp referințele invalide la scalari Unicode
- Importul și exportul XFDF folosesc potrivirea indexată a câmpurilor și tampoane geometrice limitate, îmbunătățind debitul și comportamentul de vârf al alocării pentru formulare adânc imbricate, colecții mari de adnotări, liste de cerneală, vârfuri și patrulatere de marcare
- Validarea PDF/A și PDF/UA folosește creștere limitată pentru colecții mari de pagini, fluxuri, nume de structură și RoleMap; rezolvarea RoleMap pentru PDF/UA urmează acum tablouri directe și obiecte de nume sau tablou indirect cu generație exactă
Remediat (Fixed)
- Ciclurile complete XFDF păstrează acum căile de câmp adânc imbricate, valorile explicite goale ale câmpurilor, conținuturile explicite goale ale adnotărilor și distincția dintre conținut absent și gol
- Încărcările invalide de tampoane de memorie și atribuirile de pagini în afara intervalului sunt respinse fără a lăsa o stare parțială a documentului sau paginii, iar o reîncărcare nativă eșuată a paginii păstrează pagina activă anterior
- Identificatorii mari de conținut marcat și tampoanele de metadate de semnătură sunt limitate și validate înainte de alocare sau acces nativ
Version 2.42.0
Adăugat (Added)
TPdfMatrixoferă acumInvert,TryInvert,TransformPointșiTransformRectpentru cartografierea coordonatelor, testarea de lovire, limitele normalizate și gestionarea explicită a matricelor singulareTPdf.WrapTexta primit o supraîncărcareBreakLongWordscare separă textul CJK și alte texte fără spații, menținând împreună perechile surrogate UTF-16 valideTPdfAnnotation.AttachmentPointSetsexpune fiecare patrulater din adnotările de marcare pe mai multe linii, în timp ce câmpulAttachmentPointsexistent rămâne un alias pentru primul set
Modificat (Changed)
- Extragerea textului, construirea conținutului lizibil, căutarea cuvintelor și cartografierea decalajelor de text vorbit folosesc acum alocare limitată și căi de căutare binară, reducând alocările repetate și scanările liniare pe paginile mari
- Serializarea ASN.1 și generarea PDF-urilor criptate folosesc acum tampoane de ieșire geometrice; ordonarea obiectelor criptate folosește sortare
O(n log n), iar rândurile xref sunt scrise direct în tamponul final WrapTextpăstrează limitele de linie CR, LF și CRLF și reutilizează un singur obiect nativ de măsurare pentru întreaga operație- Importul și exportul XFDF păstrează fiecare patrulater de marcare; importul aplică, de asemenea, culorile RGB/interioare și analizează coordonatele zecimale independent de localizarea procesului
Remediat (Fixed)
- Apelanții moșteniți pot din nou actualiza conținutul și autorul adnotării prin atribuirea de șiruri ne-goale fără a seta sentinelii mai noi
HasContentsșiHasAuthor - Șirurile de adnotări explicit goale folosesc acum un tampon nativ valid terminat cu zero, astfel încât ștergerea
/Contents,/Tși a altor chei opționale de text nu mai transmite un pointer nil către PDFium
Version 2.41.0
Modificat (Changed)
- Raportul preflight
SaveJsonToFile,SaveMarkdownToFileșiSaveTextToFilescrie acum UTF-8 pe Delphi (potrivindu-se cuSaveHtmlToFileexistent), în loc de pagina de cod ANSI a sistemului; caracterele non-ASCII din căile de fișiere, recomandări și notele de domeniu erau distorsionate pe Delphi când erau salvate prin aceste metode SaveCsvToFilescrie acum UTF-8 cu un prefix BOM, astfel încât Excel pentru Windows detectează automat codificarea; fără BOM, Excel tratează un CSV UTF-8 ca pagina de cod 1252 și distorsionează caracterele non-ASCII
Remediat (Fixed)
- Demonstrația
ExtractImagespierdea obiecteleTBitmapcache-uite înFExtractedImagescând formularul era închis fără a le șterge explicit în prealabil; formularul suprascrie acumDestroypentru a apelaClearExtractedImages, eliberând fiecare bitmap cache-uit
Version 2.40.0
Modificat (Changed)
TPdf.RenderPage(HDC, ...)maschează acum excepțiile FPU/SSE în jurul apeluluiFPDF_RenderPage, potrivindu-se cuTPdfView.RenderPage(HDC)(remediat în v2.25.0) și cu fiecare punct de intrare de randare care returnează un bitmap; supraîncărcarea direct-to-DC la nivel deTPdflăsa anterior excepțiile FPU nemascate pe compilatoarele pre-D12
Remediat (Fixed)
ColorToARGBreturnează acum un pixel complet transparent (alfa 0) pentruclNoneșiclDefaultîn loc să trateze valoarea sentinelă ca o culoare RGB literală; comportamentul anterior producea o umplere întunecată, aproape opacă, atunci când un apelant transmiteaclNoneașteptând „fără culoare”
Version 2.39.1
Remediat (Fixed)
- Salvările explicite în PDF 1.3 elimină acum intrările
/SMask /None,/AIS falseși/TK truecare doar repetă starea grafică inițială, continuând în același timp să respingă starea de transparență non-implicită
Version 2.39.0
Modificat (Changed)
CreatePDFșiImageToPDFfolosesc acum destinații de salvare confirmate și raportează succesul numai atunci cândSaveAsse finalizează cu succesBatchExport,PDFtoJpgșiSplitPDFalocă acum directoare de ieșire unice, astfel încât rulările repetate și intrările cu același nume să păstreze rezultatele anterioareSplitViewparcurge acum căutarea o singură dată fără a lăsa în urmă stări de pagină ascunse după anulare sau lipsă de potrivire, și întrerupe lucrările de imprimare incomplete în loc să trimită rezultate parțiale
Remediat (Fixed)
MergePDFrespinge acum jetoanele de interval de pagini malformate și căile de ieșire care suprascriu sursa, numără paginile importate efectiv și refuză să salveze un rezultat gol- Demonstrațiile
Attachmentpentru Delphi și C++Builder comit acum salvările pe aceeași cale prin înlocuirea fișierelor sigură la rollback, astfel încât o redenumire eșuată să nu poată elimina PDF-ul original
Version 2.38.0
Modificat (Changed)
SetAnnotationDataprotejează acum scrierile/Contentsși/Authorîn spatele sentinelilorHasContents/HasAuthorpeTPdfAnnotation, potrivindu-se cu modelul existentHasName/HasSubject/HasIcon; anterior, aceste două câmpuri erau scrise necondiționat, astfel încât atribuirea unei înregistrăriDefault(TPdfAnnotation)pentru a actualiza doar culoarea sau flagurile suprascria în mod silențios conținutul și autorul existent al adnotării cu șiruri goale;GetPageAnnotationsetează acum sentinelii, astfel încât un ciclu de citire-modificare-scriere să păstreze valorile originale
Remediat (Fixed)
GenerateFormAppearancescitește acum valoarea casetei de selectare/butonului radio prinFPDFAnnot_GetFormFieldValue(care navighează la dicționarul de câmp părinte conform ISO 32000-1 §12.7.5) în loc deFPDFAnnot_GetStringValue(Annot, 'V', ...)(care citește dicționarul widgetului); widgetul nu conține de obicei/V, așa că/ASnu a fost niciodată sincronizat cu starea bifată, iar o casetă de selectare/buton radio aplatizat era randat ca nebifat
Version 2.37.0
Modificat (Changed)
ParseTsaUrllimitează acum portul la1..65535după analiză; o valoare supradimensionată a portului s-ar fi înfășurat altfel prin trunchiereaDWORDși ar fi putut ajunge pe un port valid- XFDF
ParseFieldacceptă acum un parametru de adâncime (implicit 0, limitat la 64) și returnează un câmp gol la limită, astfel încât o cale de elemente<field>imbricate cu rea intenție la o adâncime de 100 000 nu mai poate provoca depășirea stivei
Remediat (Fixed)
- Cererea HTTP TSA se protejează acum împotriva unui corp de cerere gol înainte de a transmite
@ReqDer[0]cătreWinHttpSendRequest; o dereferențiere a unui tablou dinamic cu lungime zero ar accesa un pointer neîmpământat;BuildTimeStampReqreturnează întotdeauna o SEQUENCE ne-goală, dar locul de apel apără acum contractul
Note (Notes)
- Comentariul din antetul
FPdfTsaWindespre verificarea revocării HTTPS a fost corectat: WinHttp validează implicit lanțul de certificate ale serverului, dar nu efectuează verificarea revocării CRL/OCSP decât dacă este activată explicit prinWinHttpSetOption; formularea anterioară susținea că verificarea revocării „este inclusă gratuit”, ceea ce era înșelător
Version 2.36.0
Modificat (Changed)
- Cererile HTTP TSA trimit acum un antet explicit
Content-Lengthîn plus față de anteteleContent-TypeșiAccept; WinHttp îl sintetizează din lungimea totală, dar unele proxy-uri RFC 3161 necesită un antet explicit și resping cererea cu411 Length Requiredîn lipsa acestuia - Exportul XFDF renunță acum la caracterele de control C0 (altele decât TAB/LF/CR care sunt deja escaped) în loc să emită o secvență invalidă backslash-hex; secvența anterioară de salvare
\-01Fnu este XML valid (backslash nu are o semnificație specială în XML), așa că orice cititor conform ar fi respins documentul ca fiind malformat InjectAssociatedFilesscrie acum/Subtypeîn dicționarul de flux EmbeddedFile atunci când apelantul furnizeazăTAssociateFile.MIMEType; câmpul era declarat și documentat, dar injectorul codifica anterior fix/Type /EmbeddedFileși îl ignora (ISO 32000-2 §7.11.4 permite/Subtypeîn flux)
Remediat (Fixed)
- Importul XFDF sărea peste primul octet de conținut după un BOM UTF-8 și peste primul octet când nu era prezent niciun BOM:
BytesToAnsi(Bytes, 4, ...)(BOM) șiBytesToAnsi(Bytes, 1, ...)(fără BOM) foloseau decalaje de pornire eronate cu o unitate deoareceBytesToAnsipreia un indice de tablou cu baza 0; apelurile folosesc acum3și0 ExtractSignatureValueavea două erori de indentare cuifsuspendat, undeR.Position:= CNrula necondiționat pentru ramurile opționalecertificates [0]șisignedAttrs [0]; ramurile sunt acum încapsulate înbegin/end, astfel încât poziția este avansată numai atunci când TLV-ul opțional a fost într-adevăr citit (aceeași clasă de eroare a fost remediată înAddSignatureTimestampToCmsîn v2.22.0)
Version 2.35.0
Modificat (Changed)
TFPDFAvail_IsDocAvail,TFPDFAvail_IsPageAvailșiTFPDFAvail_IsFormAvailpreiau acumhints: PFX_DOWNLOADHINTSîn loc devar hints: FX_DOWNLOADHINTS, astfel încât modul documentat de interogare exclusivă cunullptr(verificarea disponibilității curente fără solicitarea de date suplimentare) să fie accesibil din Delphi; antetul PDFium permite în mod explicit cahintssă fie null; legarea anterioară prinvarfăcea acest lucru imposibilTFPDF_SetSystemFontInfopreia acumpFontInfo: PFPDF_SYSFONTINFOîn loc devar pFontInfo: FPDF_SYSFONTINFO, astfel încât apelanții să poată transmitenilpentru a cere PDFium să nu mai folosească o interfață de font de sistem înregistrată anterior (calea de dezactivare documentată)TPdfThumbnailView.Paintcalculează acumVisibleRowscu aceeași formulă caUpdateScrollBarRange(ClientHeight div RowHeight), astfel încât numărul de rânduri desenate să se potrivească cu dimensiunea paginii barei de defilare; formula anterioară de desenare exclusivă ((ClientHeight - FMarginY) div RowHeight + 1) putea diferi cu un rând la înălțimi limită, irosind o randare pe un rând din afara paginii sau omițând ultimul rând vizibil
Version 2.34.0
Adăugat (Added)
TPdf.SaveAsEncrypted/SaveAsEncryptedToStream— API de nivel înalt care salvează documentul și apoi îl criptează cu PDF 2.0 AES-256-CBC (V=5/R=5/R=6); primește unTPdfEncryptOptionscu parola de utilizator/proprietar, permisiuni și revizie; deleagă cătreEncryptDocumentBytes- Criptarea șirurilor literale StrF:
EncryptDocumentBytescriptează acum șirurile literale(...)din obiectele non-stream (dicționarul Info, etc.) în șiruri hexadecimale AES-256-CBC, potrivindu-se cu formatul de criptare a fluxului (IV de 16 octeți + text cifrat PKCS7); șirurile hexadecimale<...>sunt lăsate neatinse
Version 2.33.0
Adăugat (Added)
- Injectoarea de criptare AES-256-CBC pe tot documentul în unitatea
FPdfEncrypt.pas;EncryptDocumentBytespreia un PDF în text clar și o parolă, criptează fiecare obiect de flux indirect (IV de 16 octeți + AES-256-CBC PKCS7 sub cheia de fișier), corectează/Length, adaugă obiectul dicționar/Encryptși reconstruiește un tabel complet de referințe încrucișate clasic + trailer cu/Encryptși/ID; completează stiva de criptare PDF 2.0 (bloc AES + GCM + SHA-512/384 + derivare cheie R6 + dicționar + scanare document) - Funcția ajutătoare
EncryptStreamPayload— formatul de flux PDF 2.0 AES-256 (IV adăugat înaintea textului cifrat AES-CBC-PKCS7), reutilizabilă de către apelanții care își gestionează propria dispunere a obiectelor
Version 2.32.0
Adăugat (Added)
- Hash SHA-512 / SHA-384 (FIPS 180-4) în noua unitate
FPdfSha512.pas; Pure-Pascal, portat din HotPDF; necesar pentru iterația de hash a parolei PDF 2.0 R6, care se ramifică pe o valoare mod-3 pe 128 de biți pentru a alege SHA-256/384/512 la fiecare rundă; verificat prin cazurile de testare cu răspuns cunoscut din anexa B.1 a standardului FIPS-180-4 - Derivarea cheii de criptare PDF 2.0 și generatorul de dicționar Encrypt în noua unitate
FPdfEncrypt.pas; implementează algoritmul 2.B din ISO 32000-2 §7.6.4.3 (iterația de hash R6: AES-128-CBC + selecție iterativă SHA-256/384/512), derivă cheia de criptare a fișierului de 32 de octeți plus intrările/O,/U,/OE,/UE,/Permsși construiește dicționarul Encrypt V=5/R=5/R=6 cu/CFM /AESV3; portat din PDFlibPas, adaptat la stilul TBytes
Version 2.31.0
Adăugat (Added)
- Primitive cifru bloc AES (FIPS 197) în noua unitate
FPdfAes.pas; cifruri bloc Pure-Pascal AES-128 și AES-256 plus funcții ajutătoare pentru modul CBC și un backend CSPRNG, portate din HotPDF; testele cu răspuns cunoscut din FIPS-197 Apendicele C.2 / C.3 verifică corectitudinea; aceasta este fundația criptografică pentru stiva de criptare din PDF 2.0 - Criptare autentificată AES-GCM (NIST SP 800-38D) în noua unitate
FPdfAesGcm.pas; implementează GHASH (multiplicare GF(2^128)), GCTR și construcția GCM AEAD peste primitivele de bloc AES; cazurile de testare NIST GCM 1 și 3 (AES-128) se potrivesc exact cu textul cifrat și tagul autoritar; cazul de testare 13 (AES-256) realizează un ciclu complet; GCM este modul ISO/TS 32003 pentru PDF 2.0 - Validarea integrității ParentTree și ClassMap pentru PDF/A Level A (ISO 19005-1 §6.8.3);
pvaiParentTreeMissingsemnalează un StructTreeRoot fără arborele de numere /ParentTree;pvaiClassMapUnresolvedsemnalează o referință de clasă /C fără un /ClassMap
Version 2.30.0
Adăugat (Added)
- Injecția de fișiere asociate (
InjectAssociateFiles/TPdf.SaveAsWithAssociateFiles, ISO 32000-2 §7.11.4); noua unitateFPdfAssocFilesatașează tablouri/AFde referințe filespec la catalog sau la orice dicționar de pagină, acoperind toate cele opt valori/AFRelationshipdin Tabelul 45 ISO 32000-2; reutilizează modelul de actualizare incrementală dovedit deInjectPadesDssMarkers - Suport pentru PDF/X-6 (ISO 15930-9:2020);
TPdfXConformanceadaugăpxc6; injectorul și validatorul îl trec prin identificareapdfxid:GTS_PDFXVersion; PDF/X-6 este succesorul bazat pe PDF 2.0 al PDF/X-4 pentru schimbul complet - PDF/A interzice acțiunea
/Thread(lacună în lista permisă din ISO 19005-1 §6.6.1); lista acțiunilor interzise acoperă acum Thread alături de Launch, ResetForm, ImportData, SetOCGState, SetState, GoTo3DView, Rendition și Hide
Remediat (Fixed)
- Calea de validare pentru PDF/A-4e respectă acum aceleași verificări de structură etichetată, MarkInfo și pauze de cuvinte ca și Level A; reducerea cerințelor de la salvare din v2.29.0 a acoperit
PdfAIsLevelE, dar three porți deValidatePdfAComplianceverificau doarPdfAIsLevelA, astfel încât un document PDF/A-4e lipsit de structură etichetată trecea silențios - Deriva testelor OCG
/BaseState: trecerea de post-procesare din v2.28.0 a lărgit corect acceptarea la/ONsau/OFF(Tabelul 8.70 ISO 32000-1), dar testele Delphi și C++ se așteptau în continuare ca/OFFsă fie respins; testele folosesc acum o valoare cu adevărat invalidă (/Undefined) și un nou test pozitiv blochează acceptarea/OFF - Potrivirea excesivă geospațială
/Subtype /GEO:ContainsDictionarySubtype('GEO')potrivea orice dicționar care conținea jetonul, inclusiv cele nerelaționate, cum ar fi un/ViewerPreferences << /Subtype /GEO >>rătăcit; noua funcțieContainsMeasureDictionarySubtypenecesită în plus/Type /Measuresau o cheie soră exclusivă pentru Measure, astfel încât dicționarele non-Measure să nu mai declanșeze cerința ExtensionLevel 3 a ADBE
Version 2.29.0
Adăugat (Added)
- Suport pentru PDF/A-4 (ISO 19005-4:2020) în validator, injectorul XMP și stratul modelului de obiecte Pdfium;
TPdfAConformanceadaugăpac4base,pac4fșipac4e; nivelul de bază este PDF 2.0 (ISO 32000-2) și înlocuiește nivelurile moștenite A/B/U levels cu bază + F (formular) + E (accesibilitate);ValidatePdfAreads apdfaid:part=4XMP packet (base omits the conformance element),SaveAsPdfAîl emite, iarSignPadesWithPdfAacceptăpac4baseca un container de arhivă pe termen lung - Legarea
FPDFBookmark_GetColor— ultimul export public PDFium nelegat (469/469);TBookmarkobține câmpurileHasColorșiColorpopulate din tabloul de semne de carte/C(ISO 32000-1 §12.3.3); legarea folosește o încărcare tolerantă, astfel încât DLL-urile mai vechi care preced exportul să continue să funcționeze - Verificarea versiunii de antet PDF/E-1 (ISO 24517-1 §5)
pveiBadPdfVersion— PDF/E-1 se bazează pe PDF 1.6 și un antet diferit de 1.6 este acum semnalat - PDF/R-1 (ISO 23504-1)
pvriEncryptVersionMismatch— criptarea este permisă numai pe un antet%PDF-2.0; un corp 1.x care conține/Encrypteste acum semnalat (anterior era o instrucțiune fără efect) - PDF/R-1
pvriBadMediaBox— fiecareMediaBoxal paginii va fi[0 0 w h];PdfRHasNonZeroMediaBoxOrigineste un scaner ASCII independent de setările regionale care omite casetele MediaBox cu referințe indirecte - PDF/A Level A
pvaiRoleMapUnresolved(ISO 19005-1 §6.8.3.4) — un RoleMap prezent, dar incomplet, care lasă tipurile de structură personalizate/Sneasociate este acum semnalat, închizând lacuna lăsată de verificarea de prezență existentăpvaiRoleMapMissing
Remediat (Fixed)
PdfVersionToName(20)returna"1.0"în loc de"2.0", corupând intrarea/Versiondin catalog și mesajele validatorului pentru fiecare salvare PDF 2.0; formatatorul împarte acum major.minor în mod explicit pentru codurile de versiune>= 20- Codificatorul negative-INTEGER din
FPdfAsn1.pasnu a reușit să se compileze sub Delphi 12 (E2015peInteger(-(V<0))), blocând întregul proiect de testare; remediat prin utilizareaInt64(-Ord(V<0))pentru masca de extensie a semnului - Lista de adnotări interzise în PDF/A include acum
/RichMediaîn toate părțile (omisă anterior; ISO 32000-1 §12.5.6.35 o interzice în PDF/A)
Version 2.28.0
Adăugat (Added)
TPdfVersioninclude acumpv20pentru PDF 2.0 (ISO 32000-2);DecodePdfVersion(20)returneazăpv20în loc depvUnknown, iarEncodePdfVersion(pv20)emite 20, astfel încât versiunea unui document PDF 2.0 să nu mai fie pierdută la citirea înapoi și să poată fi scrisă în mod explicit
Modificat (Changed)
DecodeDateanalizează acum șirurile de date PDF cu câmpuri opționale suplimentare conform PDF Reference 3.8.3, în loc să necesite forma completă de 23 de caractereD:YYYYMMDDHHmmSSOHH'mm'; datele trunchiate conforme, cum ar fiD:20260712,D:20260712153000șiD:20260712153000Z, sunt acum acceptate; anterior, acestea erau respinse de o poartă strictăLength=23; decalajul orar al fusului orar este acum validat în raport cu intervalul real UTC-12..UTC+14 în loc de> 23FPdfMeasure.MeasureTextcodifică acum numele fontului caAnsiStringpentru FPC /UTF8Encodepentru Delphi, potrivindu-se cu celelalte locuri de apel FPDF_BYTESTRING ale bibliotecii, în loc de o conversie simplăAnsiStringcare distorsiona numele de familii non-ASCII prin pagina de cod curentă
Remediat (Fixed)
- Calea valorilor negative din
TDerWriter.Integerse bloca sau producea DER malformat: buclawhile V <> -1 do V := V shr 8lăsaInnergol pentruValue = -1(eroare de interval pe următorulInner[Length(Inner)-1]) și supra-producea octeți pentru alte valori negative; codificatorul extrage acum octeții în complement față de doi cu deplasări de extensie a semnului și se oprește corect atunci când restul este pură extensie de semn; câmpurile CMS/PAdES INTEGER sunt pozitive, deci acest lucru afectează doar apelanții care transmit valori negative, dar calea este acum corectă TPdf.GetCharacterOriginșiTPdfView.GetCharacterOriginignorau valoarea de returnare aFPDFText_GetCharOriginși returnau un punct neinițializat în caz de eșec; rezultatul este acum inițializat cu zero, iar o citire eșuată returnează originea (potrivindu-se cu contractulGetCharacterRectangle)
Version 2.27.0
Modificat (Changed)
- Demonstrațiile
PDFViewerșiMultiPageViewerpentru Delphi, C++Builder și Lazarus acceptă acumEnterșiF3, resetează contextul la schimbarea opțiunilor și rezervăEscpentru anularea căutării sau imprimării - Imprimarea urmărește rotația curentă și selectează orientarea portret sau peisaj
- Demonstrațiile
ViewerInteractionLabacceptăCtrl+A,Ctrl+C,Enter,F3șiEscfără interceptarea comenzilor native
Corectat (Fixed)
- Anularea imprimării în C++Builder și Lazarus întrerupe lucrarea imprimantei și buclele imbricate
- Butonul Cancel din
MultiPageViewerDelphi este conectat, iar câmpurile păstrează editarea cu săgeți, Home și End
Version 2.26.0
Modificat (Changed)
TPdf.GetObjectBitmap,TPdf.GetBitmap,TPdf.GetThumbnailși echivalenteleTPdfViewiau blocarea de randare în jurulFPDFImageObj_GetBitmap/FPDFPage_GetThumbnailAsBitmapTPdf.RenderPageThumbnailrespectă/Rotateși recalculează potrivirea pentru/Rotate 90și270
Corectat (Fixed)
TPdfView.GetCharacterRectangleinițializează dreptunghiul la zero la eroareaFPDFText_GetCharBoxși returneazăRect(0,0,0,0)GetLinkAnnotationsfolosește acumsize-1pentru căile URI și fișier
Version 2.25.0
Modificat (Changed)
TPdf.AddText,SetText,AddPathșiInsertFormObjectFromXObjectinvalidează pagina de text din cache și adnotările de link înainte de regenerarea conținutuluiTPdfView.RenderPage(HDC, ...)ia blocarea de randare și maschează excepțiile FPU/SSE- Demonstrația
PrintPDFapeleazăPrinter.Abortla anulare
Corectat (Fixed)
TPdf.GetCharacterșiGetCharcodereturnează U+FFFD pentru puncte peste U+FFFF; folosițiGetTextpentru UTF-16 completGetWebLinkslimitează la zero un număr negativ returnat deFPDFLink_CountRectsTPdf.DestroyștergePassworddin memorie
Version 2.24.0
Adăugat (Added)
TPdf.DeletePageși operațiile cu atașamente validează indicii și ridicăEPdfErrorîn afara intervalului
Corectat (Fixed)
- Handle-urile obiectelor de pagină din
TPdf.AddText,AddBitmapșiAddJpegImagesunt distruse la excepție TPdf.UnloadPagedistruge handle-ulFPathabandonat prinFPDFPageObj_DestroyTPdf.InsertFormObjectFromXObjectapeleazăUpdatePagedupă inserare
Version 2.23.0
Corectat (Fixed)
- Validarea
/BaseStateacceptă acum și/OFFpe lângă/ON - Validarea
/Intentacceptă/Designși tablouri precum[/View /Design] - Detectarea Measure geospațială nu mai necesită
/Type /Measureopțional și recunoaște/Subtype /GEO
Version 2.22.0
Modificat (Changed)
- Calculele zoomului de potrivire
TPdfViewfolosescClientWidth/ClientHeightîn loc deWidth/Height, astfel încâtpfmFitPage/pfmFitWidth/pfmFitHeightse potrivesc zonei vizibile AddSignatureTimestampToCmsridică unExceptionpentru câmpul CMS SignerInfo necitibil (version / sid / digestAlgorithm / signedAttrs / signatureAlgorithm)
Corectat (Fixed)
- Handle-ul cheii private CNG din
ResolveWinSignereste eliberat prinNCryptFreeObject EcDsaP1363ToDerrespinge jumătatea complet zerorsausși nu emiteINTEGER 0
Version 2.21.12
Corectat (Fixed)
- Salvările explicite în PDF 1.5 până la PDF 1.7 resping acum structurile
/OCPropertiesale catalogului malformate, inclusiv intrările necesare/OCGssau/Dlipsă, valorile de configurare implicite invalide și intrările de stare care nu sunt tablouri
Version 2.21.11
Corectat (Fixed)
- Salvările explicite ale versiunii PDF resping acum intrările directe sau indirecte ale paginii
/Annotsale căror dicționare de adnotare omit intrarea necesară/Subtypesau/Rect
Version 2.21.10
Corectat (Fixed)
- Salvările explicite în PDF 1.7 cer acum ca dicționarele geospațiale
/Type /Measure /Subtype /GEOși adnotările Projection să declare/Extensions /ADBEcu/BaseVersion /1.7și/ExtensionLevel 3sau mai nou
Version 2.21.9
Corectat (Fixed)
- Salvările explicite în PDF 1.7 cer acum ca adnotările RichMedia și acțiunile
RichMediaExecutesă declare/Extensions /ADBEcu/BaseVersion /1.7și/ExtensionLevel 3sau mai nou
Version 2.21.8
Corectat (Fixed)
- Salvările explicite în PDF 1.7 cer acum ca fluxurile PRC 3D să declare
/Extensions /ADBEcu/BaseVersion /1.7și/ExtensionLevel 1sau mai nou, în loc să trateze PRC ca o caracteristică principală a PDF 1.7
Version 2.21.7
Corectat (Fixed)
- Salvările explicite în PDF 1.4 și mai vechi resping acum intrările XObject de imagine
/SMaskInData, inclusiv o valoare explicită de0, deoarece canalele de mască moale JPEG 2000 încorporate necesită PDF 1.5 sau mai nou
Version 2.21.6
Corectat (Fixed)
- Salvările explicite în PDF 1.4 și mai vechi resping acum XObject-urile de imagine de 16 biți care necesită PDF 1.5 sau mai nou, în timp ce țintele PDF 1.5 până la PDF 1.7 păstrează datele de imagine
/BitsPerComponent 16
Version 2.21.5
Corectat (Fixed)
- Salvările explicite în PDF 1.4 și mai vechi resping acum valorile
/PageLayout /TwoPageLeftși/TwoPageRightdin catalogul documentului care necesită PDF 1.5 sau mai nou, în timp ce țintele PDF 1.5 până la PDF 1.7 păstrează dispunerea pe două pagini solicitată
Version 2.21.4
Corectat (Fixed)
- Salvările explicite în PDF 1.3 resping acum intrările
/Langdin catalogul documentului care necesită PDF 1.4 sau mai nou, în timp ce țintele PDF 1.4 până la PDF 1.7 păstrează identificatorul de limbă
Version 2.21.3
Corectat (Fixed)
- Salvările explicite PDF 1.3 resping acum arborii de nume
/EmbeddedFilesdin document, care necesită PDF 1.4 sau mai nou, fără a respinge fluxurile de fișiere încorporate referențiate prin specificații de fișiere mai vechi
Version 2.21.2
Corectat (Fixed)
- Ultima versiune: 2.21.4; Data lansării:
Version 2.21.1
Corectat (Fixed)
- Validarea referințelor hibride aplică acum intrările suplimentare
/XRefStmînaintea marcajelor xref clasice din aceeași revizuire, astfel că adnotările comprimate și alte obiecte limitate de versiune nu mai sunt ratate când tabelul de compatibilitate le marchează ca libere
Version 2.21.0
Modificat (Changed)
- Toate exemplele de vizualizare Delphi, C++Builder și Lazarus pot deschide un PDF transmis ca prim argument în linia de comandă, iar exemplele
MultiPageViewerpentru C++Builder și Lazarus oferă comenzi rapide explicite pentru selectare totală și copiere
Corectat (Fixed)
- Ultima versiune: 2.21.12; Data lansării:
Version 2.20.0
Modificat (Changed)
- Toate exemplele de vizualizare Delphi, C++Builder și Lazarus oferă acum comenzi rapide consistente pentru deschidere, căutare, salvare, imprimare, zoom și navigarea paginilor, iar fiecare variantă
ViewerInteractionLabsuportă și salturi de pagină, zoom manual validat 10–600%, jurnale de interacțiune persistente și verificări tur-retur ale coordonatelor de clic
Version 2.19.1
Corectat (Fixed)
- Validarea explicită a versiunii PDF urmează acum lanțul activ de revizuiri clasice, hibride sau xref-stream, inclusiv intrările de obiecte comprimate, astfel că obiectele depășite, eliberate și nereferențiate nu mai cauzează erori false de versiune a funcționalității
Version 2.19.0
Modificat (Changed)
- Exemplele de atașamente, extragere imagini, extragere text, conversie pagini și împărțire pentru C++Builder și Lazarus folosesc acum foldere de ieșire dedicate sau fișiere finalizate în siguranță, denumiri stabile cu zero-padding, actualizări de progres responsive și rezumate de finalizare cu numărul de erori per element
Corectat (Fixed)
CJKTextLabpentru C++Builder măsoară acum textul prin funcțiile de editare PDFium exportate, iarMergePDFevită o suprasarcină ambiguă de mesaj VCL, restaurând compilații curate în RAD Studio 37
Version 2.18.3
Corectat (Fixed)
- Marca temporală Document Time-stamp PAdES B-LTA este acum înregistrată ca un câmp de semnătură detectabil — un Widget invizibil accesibil prin
/Annotsde pe prima pagină și prin/Fieldsdin AcroForm (ETSI EN 319 142-1 §5.4.3) — în loc de un obiect orfan inaccesibil pe care validatoarele ce enumeră câmpurile de semnătură nu îl puteau găsi; adnotările și câmpurile existente sunt păstrate
Version 2.18.2
Corectat (Fixed)
- Semnarea PAdES și scrierea cross-reference clasică generează acum o eroare clară când o deplasare de octeți depășește lățimea fixă de 10 cifre (~9,3 GB) în loc să lase silențios marcajul
/ByteRangenescris (producând o semnătură invalidă) sau să depășească linia xref de 20 octeți (ISO 32000-1 §7.5.4); ieșirea cu flux cross-reference folosește câmpuri binare de 8 octeți și nu este afectată
Version 2.18.1
Corectat (Fixed)
- Semnarea PAdES rezolvă acum referințele indirecte
/Annots,/AcroFormși/Fieldsde pe prima pagină prin antetul complet al obiectului (ISO 32000-1 §7.5.3) și prin numărul de generație real al referinței; o căutare simplă de subșir potrivea anterior un număr de obiect din interiorul unuia mai lung (rezolvând5 0 Rla15 0 obj) iar o generație codificată fix rata obiecte cugen>0, corupând matricele câmpurilor de semnătură sau respingând documente valide - Când catalogul, prima pagină,
/Annots,/AcroFormsau/Fieldsse află într-un flux de obiecte, semnarea reîncearcă acum pe o copie extinsă înainte de a eșua, în loc să respingă documentul
Version 2.18.0
Adăugat (Added)
ReadPdfVersionInforaportează versiunea antetului, versiunea efectivă de bază, suprascrierea din catalog și nivelul extensiei Adobe Developer dintr-un flux PDF
Modificat (Changed)
- Salvările explicite PDF 1.3–1.7 validează acum structurile de catalog, resurse de pagină, XFA, redactare și extensii ale dezvoltatorilor în contextul obiectului proprietar; ieșirea criptată cu versiune explicită și normalizarea incrementală PDF 1.3 sunt respinse pentru a păstra integritatea documentului
- Salvările pe cale de fișier scriu acum într-un fișier temporar alăturat și înlocuiesc destinația numai după ce toate verificările de compresie, normalizare și versiune reușesc
Corectat (Fixed)
- Ieșirea PDF 1.3 include acum resursa completă obligatorie
/ProcSetși elimină cheile de transparență PDF 1.4 când repetă doar valorile inițiale ale stării grafice PDF 1.3 - Fișierele cu referințe hibride, xref-stream și object-stream nu mai sunt rescrise de compresorul xref clasic, prevenind eliminarea intrărilor de obiecte comprimate
- Numele care seamănă cu cheile de transparență sau funcționalitate catalog din interiorul șirurilor, comentariilor sau hărților de resurse nerelate nu mai cauzează erori false de versiune țintă
Version 2.17.0
Adăugat (Added)
- Semnăturile PAdES sunt acum înregistrate ca adnotări Widget invizibile în matricea
/Annotsde pe prima pagină și în matricea/Fieldsdin AcroForm, păstrând adnotările și câmpurile de formular existente
Modificat (Changed)
- Actualizările incrementale PDF/A, PDF/X, PDF/E, PDF/R, PDF/UA, PDF/VT și PAdES păstrează acum reprezentarea cross-reference a documentului sursă: documentele xref-stream primesc o actualizare xref-stream conform ISO 32000-1 §7.5.8.1, în timp ce documentele clasice continuă să primească un tabel xref
- Deplasările cross-reference,
startxref,/Prev, valorile PAdES ByteRange și procesarea intervalelor SHA-256 folosesc acum poziții pe 64 de biți cu hashing fragmentat, permițând fișiere mai mari de 2 GB în build-uri pe 64 de biți - Pachetele XMP inscriptibile generate rezervă acum 2048 de octeți de umplutură înainte de instrucțiunea de închidere a pachetului
Version 2.16.10
Corectat (Fixed)
- Extinderea object-stream nu mai reînviie copii vechi ale obiectelor pe care o actualizare incrementală le-a migrat din fluxul de obiecte într-o definiție simplă (ISO 32000-1 §7.5.7); verificările de conformitate și injecția de marcaje rezolvau anterior catalogul sau dicționarul de metadate depășit pe astfel de fișiere
Version 2.16.9
Corectat (Fixed)
- Pe Free Pascal, șirurile de text al căror input nu este UTF-8 valid sunt lărgite octet cu octet ca Latin-1 și scrise ca șiruri hexadecimale UTF-16BE; octeții înalți bruti scăpau anterior într-un șir literal, ceea ce nu este o codificare text-string PDF 1.7 legală
- Decodificarea fluxului recunoaște acum datele deflate brute fără ambalajul RFC 1950 zlib (un defect comun al scriitorilor defectuoși) și le decompreseaza în mod raw, astfel că scanările de conformitate nu mai rămân orbite silențios pe astfel de fluxuri
Version 2.16.8
Corectat (Fixed)
- Actualizările incrementale scrise de calea de post-procesare a salvării actualizează acum al doilea element (în schimbare) al trailerului
/IDconform ISO 32000-1 §14.4; ambele elemente erau copiate anterior textual, astfel că instrumentele de caching și sincronizare vedeau un identificator neschimbat după fiecare actualizare
Version 2.16.7
Corectat (Fixed)
- Blanking-ul corpului fluxului utilizat de scanările de conformitate necesită acum ca cuvântul cheie
streamsă fie urmat de un sfârșit de linie (ISO 32000-1 §7.3.8.1); cuvântul dintr-un șir literal precum(downstream)blanchea anterior toată structura următoare până la următorulendstream, ascunzând violențele reale de la verificările la nivel de octet - Scanările de funcționalitate interzise PDF/X și PDF/E blanchează suplimentar șirurile literale și comentariile (§7.2.2), astfel că o valoare precum
/Title (see /JavaScript docs)sau un token comentat nu mai produce o constatare falsăJavaScript,AcroFormsauLZWDecode
Version 2.16.6
Corectat (Fixed)
- Intrările DPM PDF/VT sunt acum validate la momentul scrierii conform documentației: numele cheilor care violează regula NMTOKEN din ISO 16612-2 §6.6 sau regula prefixului registrantului din Anexa E, și numele duplicate, sunt respinse în loc să fie scrise în dicționarul DPart — un nume care conținea un spațiu se împărțea anterior într-o pereche cheie/valoare falsă și corupa dicționarul
Version 2.16.5
Corectat (Fixed)
- Eliminarea unei intrări de dicționar al cărei valoare este un șir hexadecimal (cum ar fi
/Check <...>) elimină acum întreaga intrare; injectoarele lăsau anterior o valoare hexadecimală orfană, producând un dicționar sintactic greșit - Eliminarea unei intrări a cărei referință indirectă folosește linii noi între tokeni (ISO 32000-1 §7.3.10 permite orice spațiu alb) nu mai lasă în urmă numărul de generație și cuvântul cheie
R
Version 2.16.4
Corectat (Fixed)
- Scanarea numărului maxim de obiecte nu mai necesită ca antetele de obiecte să înceapă o linie (ISO 32000-1 §7.5.3 permite orice spațiu alb sau delimitator înaintea lor), astfel că injectoarele nu mai pot aloca un număr de obiect care colizionează cu un antet
N G objinline și corupe silențios fișierul; numerele de obiecte sunt limitate de plafonul din Anexa C - Fluxurile al căror
/Lengtheste o referință indirectă rezolvă acum obiectul întreg referențiat și folosesc valoarea sa când se aliniează cuendstreamde închidere; astfel de fluxuri erau anterior delimitate printr-o căutare de șablon, care trunca corpurile ce conțineau legal secvența de octețiendstream— tipic pentru atașamentele PDF încorporate
Version 2.16.3
Corectat (Fixed)
- Pasele de compresie a fluxului transmit documentele cu flux cross-reference (fișiere PDF 1.5+ fără cuvântul cheie clasic
trailer) neschimbate; calea de reconstrucție analiza anterior greșitstartxrefca locație a tabelului și sintetiza un trailer ghicit, care putea produce un fișier care nu putea fi deschis - Compresorul sare fluxurile de metadate XMP astfel că un document PDF/A îți păstrează fluxul de metadate obligatoriu nefiltrat (ISO 19005-1 §6.7.2), și lasă neatinse fluxurile de fișiere externe (
/Fcu/FFilter) - Tabelul cross-reference reconstruit scanează o copie a documentului fără fluxuri, astfel că conținutul binar al fluxurilor nu mai poate falsifica antetele de obiecte sau umfla tabelul;
/Size-ul trailerului reconstruit reflectă acum tabelul real iar numerele de obiecte sunt limitate la plafonul din Anexa C - Localizarea tabelului original cross-reference acceptă terminații de linie numai CR (ISO 32000-1 §7.5.1) și nu mai poate potrivi literele
xrefdin interiorulstartxref; scanarea cuvântului cheie de flux a câștigat același guard de coadăendstreamutilizat în altă parte și avansează acum dincolo de corpurile de flux sărite
Version 2.16.2
Corectat (Fixed)
- Analizarea întregilor în cititorii PDF la nivel de octet acceptă acum semnul explicit
+permis de ISO 32000-1 §7.3.3 și respinge șirurile de cifre care ar fi depășite, astfel că documentele ostile sau corupte nu mai pot împacheta lungimile și deplasările analizate în valori înșelătoare
Version 2.16.1
Corectat (Fixed)
- Injectorul PDF/UA scrie valoarea
/Langdin catalog ca un șir text PDF corespunzător; anterior rula valoarea prin scaperul XML, astfel că o etichetă de limbă conținând&sau paranteze producea o intrare coruptă, iar intrarea non-ASCII era scrisă ca UTF-8 brut - Intrarea Info
/ISO_PDFEVersiondin PDF/E folosește codificatorul partajat de șiruri text, menținând valorile non-ASCII legale în PDF 1.7 - Scaparea XML pentru pachetele XMP elimină caracterele de control ilegale în XML 1.0, astfel că metadatele copiate dintr-un document sursă deteriorat nu mai pot face întregul flux de metadate neconform
- Conversia datei PDF-la-XMP validează că câmpurile de dată sunt numerice și completează un câmp de minute lipsă, prevenind datele ISO 8601 malformate în XMP generat; pe platformele non-Windows, marca de timp fallback include acum și ora zilei în loc de data brută
Version 2.16.0
Adăugat (Added)
- Decodificarea fluxului reconstruiește acum predictorii
/DecodeParms(predictorii PNG 10–15 și predictorul TIFF 2, ISO 32000-1 §7.4.4.4) după FlateDecode, respectând/Colors,/BitsPerComponentși/Columns; fluxurile de obiecte comprimate cu un predictor — o alegere frecventă a scriitorului PDF 1.5+ — prezentau anterior octeți diferențiați, astfel că obiectele pe care le poartă erau invizibile silențios pentru scanările de conformitate și injecția de marcaje
Corectat (Fixed)
- Detecția FlateDecode analizează acum valoarea
/Filterca un nume sau array în loc de o potrivire de subșir, astfel că lanțurile de filtre în cascadă și aparițiile cuvântului în valori nerelate nu mai declanșează un inflate fals; lanțurile nesuportate se retrag la octeții bruti ca înainte
Version 2.15.1
Corectat (Fixed)
- Scanerul de dicționar sare acum șirurile literale, șirurile hexadecimale și comentariile în timp ce balansează
<</>>(ISO 32000-1 §7.2.2), astfel că dicționarele ce conțin valori precum(A >> B)sau un șir hexadecimal alăturat delimitatorului de închidere nu mai sunt trunchiate în timpul analizei trailer-ului, catalogului și scanărilor de conformitate - Extragerea șirurilor literale decodifică acum setul complet de escape din §7.3.4.2 Tabelul 3 —
\n \r \t \b \f, octal\ddd, continuări de linie și normalizarea EOL fără escape — în loc să copieze litera de escape textual, restaurând comparațiile corecte de/Producer,/GTS_PDFXVersionși/ISO_PDFEVersionpentru scriitorii care folosesc escape-uri octale - Șirurile literale scrise de injectoarele de marcaje escapează acum CR, LF și alte caractere de control astfel că valorile supraviețuiesc normalizării EOL pe partea cititorului octet cu octet
Version 2.15.0
Corectat (Fixed)
- Actualizările incrementale scrise de injectoarele de marcaje PDF/A, PDF/X, PDF/E, PDF/R, PDF/UA și PDF/VT și de căile de semnare PAdES și DSS păstrează acum identificatorul permanent de fișier al documentului sursă: primul element
/IDdin trailer este copiat textual conform ISO 32000-1 §14.4 și doar al doilea element (în schimbare) este reîmprospătat; anterior ambele elemente erau regenerate, astfel că referințele externe și fluxurile de lucru de validare pe termen lung vedeau o identitate diferită a documentului după fiecare salvare - Semnăturile PAdES, injecția DSS și Document Time-stamp B-LTA transmit acum referința
/Infodin trailer sursă (ISO 32000-1 §7.5.6), astfel că proprietățile documentului nu mai dispar din panourile cititorului după semnare; trailerul Document Time-stamp câștigă și array-ul/ID - Fallback-ul trailerului
/Infopentru documentele cu flux cross-reference localizează acum corect dicționarul fluxului XRef și păstrează numărul de generație al referinței; anterior nu potrivea niciodată pe fișierele PDF 1.5+ conforme, eliminând silențios/Info
Version 2.14.4
Corectat (Fixed)
- Data
/Ma dicționarului de semnătură scrisă deTPdf.SignPadesșiSignPadesBytespoartă acum prefixul obligatoriuD:și marcajul offset UTCZcerut de ISO 32000-1 §7.9.4; validatoarele stricte respingeau anterior ora de semnare ca un șir de date malformat
Version 2.14.3
Corectat (Fixed)
- Căutările cheilor de dicționar din cititorul PDF partajat potrivesc acum tokeni de nume întregi (ISO 32000-1 §7.3.5); anterior un flux al cărui dicționar lista
/Length1înaintea/Length(tipic pentru fluxurile FontFile) era trunchiat la numărul greșit de octeți, orbind silențios scanările PDF/A, PDF/UA și alte scanări de conformitate care citeau fluxuri de fonturi, CMap sau metadate - Căutările cheilor
/Encrypt,/Root,/Sizeși/Infodin trailer nu mai potrivesc chei mai lungi care împart același prefix (cum ar fi/EncryptMetadata) - Extinderea object-stream nu mai are încredere într-o valoare
/Ncoruptă sau ostilă: valorile non-întregi produc acum 0 în loc de un număr neinițializat, iar o limită superioară derivată din/Firstprevine alocări supradimensionate la scanarea documentelor malformate
Version 2.14.2
Corectat (Fixed)
- Injectoarele de marcaje PDF/X, PDF/VT, PDF/UA, PDF/E și PDF/R copiază acum documentele sursă criptate neschimbate în loc să adauge secțiuni de actualizare în text simplu; comportamentul anterior producea fișiere al căror trailer cel mai recent pierduse intrarea
/Encrypt(ISO 32000-1 §7.5.6), astfel că cititorii conformi citeau corpul criptat ca text simplu TPdf.SignPades,SignPadesBytesșiInjectPadesDssMarkersgenerează acumEPadesCryptocând documentul sursă este criptat, în loc să emită silențios un fișier corupt sau neverificabil; eliminați criptarea înainte de semnare sau de încorporarea materialului DSS
Version 2.14.1
Corectat (Fixed)
TPdf.SignPadesșiSignPadesBytescompletează acum retroactiv toate cele patru câmpuri/ByteRangeale dicționarului de semnătură; anterior ultimele trei câmpuri rămâneau la zero-substituenții lor, astfel că semnăturile produse declarau un interval de octeți gol și eșuau verificarea în validatoarele conforme- Dicționarele Document Time-stamp PAdES B-LTA primesc aceeași corecție de completare retroactivă
/ByteRange ValidatePadesComplianceacceptă acum structura standard de semnătură unde golul din intervalul de octeți conține valoarea hexadecimală/Contentsși verifică că al doilea segment al intervalului se termină exact la sfârșitul fișierului; anterior doar intervalele fără goluri treceau verificarea de acoperire
Version 2.14.0
Adăugat (Added)
TPdf.ExportXFDFserializează fiecare valoare câmp de formular și adnotare pe toate paginile într-un document XFDF (ISO 19444-1), emițând<fields>pentru valorile formularelor ierarhice și<annots>pentru toate subtipurile de adnotare suportate (text, highlight, underline, strikeout, squiggly, line, circle, square, caret, polygon, polyline, stamp, ink, freetext, fileattachment, sound, link, redact)TPdf.ImportXFDFcitește un document XFDF înapoi în PDF-ul încărcat, re-creând adnotările pe paginile corespunzătoare și aplicând valorile câmpurilor adnotărilor lor widget- Înregistrarea
TPdfAnnotationa câștigatName(NM),Subject,ModificationDate(M),CreationDate,Icon,Opacity(CA), punctele finale ale liniei, vârfurile poligonului/poliliniei și câmpurile gesturilor ink-list astfel că turneele XFDF păstrează metadatele complete ale adnotărilor - Noul eșantion
XfdfLabîn seturile demo Delphi, C++Builder și Lazarus demonstrează turul export/import
Version 2.13.6
Corectat (Fixed)
ValidatePdfAtratează acum fluxurile/Metadatadin catalog fără/Type /Metadatasau/Subtype /XMLca metadate XMP lipsă prinpvaiMissingXmpMetadata- Rapoartele de verificare prealabilă PDF/A clasifică acum
pvaiMissingXmpMetadataca Metadate și recomandă un flux/Metadatadin catalog cu/Type /Metadata,/Subtype /XML, XMP nefiltrat și marcajepdfaid
Version 2.13.5
Corectat (Fixed)
ValidatePdfAraportează acum adnotările Widget fără un dicționar de aspect și adnotările PDF/A-2 / PDF/A-3 care necesită dar le lipsește/APprinpvaiAnnotationApDictViolation- Rapoartele de verificare prealabilă PDF/A clasifică acum
pvaiAnnotationApDictViolationca conținut pe care injecția de marcaje nu îl poate repara
Version 2.13.4
Corectat (Fixed)
ValidatePdfAraportează acum imaginile inline PDF/A-2 și PDF/A-3 a căror valoare/Isau/InterpolateestetrueprinpvaiImageDictionaryViolation, corespunzând acoperirii existente a dicționarului XObject Image- Rapoartele de verificare prealabilă PDF/A clasifică acum
pvaiImageDictionaryViolationca conținut pe care injecția de marcaje nu îl poate repara
Version 2.13.3
Corectat (Fixed)
ValidatePdfAraportează acum imaginile inline PDF/A-1 care folosesc filtrele/LZWDecodesau prescurtate/LZWîn fluxurile de conținut prinpvaiInlineImageLzwForbidden, corespunzând acoperirii existente pentru imagini inline PDF/A-2 și PDF/A-3- Scanerul de filtre pentru imagini inline avansează acum dincolo de numele de resurse principale precum
/GS1, evitând blocajele la scanarea fluxurilor de conținut PDF/A-1 mai largi
Version 2.13.2
Adăugat (Added)
TPdf.SetFocusedFormFieldTextscrie text în bufferul de editare al câmpului de formular focalizat curent prinFORM_ReplaceSelection, simetric cuFocusedFormFieldText. Pentru câmpurile text/combo AcroForm valoarea se fixează la/Vla pierderea focusului și persistă; pentru câmpurile text XFA scrierea ajunge doar în bufferul in-memory (PDFium nu expune niciun API public pentru reconcilierea valorilor XFA înapoi în pachetul datasets, deci nu persistă la salvare)- Platforma gazdă JavaScript este acum atașată ori de câte ori motorul V8 este disponibil, indiferent dacă documentul este XFA — astfel JavaScript AcroForm încorporat (scripturi la nivel de doc, calcule de câmpuri,
app.alert) poate executa și el. Anteriorm_pJsPlatformera conectat doar pentru documentele XFA, lăsând JS AcroForm silențios dezactivat
Modificat (Changed)
- Atașarea platformei JavaScript este acum independentă de decizia XFA din
InitializeFormFill— tabelulm_pJsPlatformeste construit ori de câte oriV8FeaturesAvailableeste true, aplicat după conectarea versiunii/callback-ului XFA mai degrabă decât imbricat în interiorul acesteia
Version 2.13.1
Adăugat (Added)
- Noile evenimente gazdă surfacează informații pe care callback-urile de completare a formularelor v2.13.0 le înghițeau anterior:
OnXfaUriAction,OnXfaPageCountChanged,OnXfaFocusChange,OnXfaEmail,OnXfaHttpRequest,OnXfaOpenFile,OnJavaScriptBeep,OnJavaScriptPrint,OnJavaScriptMail,OnJavaScriptSubmitForm. Fiecare eveniment are implicit comportamentul no-op existent când nu este atribuit, deci gazdele existente nu sunt afectate - Proprietatea read-only
TPdf.XfaFormPacketsreturnează un snapshot instantaneu al tuturor pachetelor XFA (TXfaPacketList), îndeplinind tipurileTXfaPacket/TXfaPacketListdeclarate anterior dar nefolosite - Codurile de eroare PDFium specifice XFA
FPDF_ERR_XFALOAD/FPDF_ERR_XFALAYOUTsunt acum legate și surfacate prinLastPdfError, înlocuind eroarea generică "Unknown error" pentru eșecurile de încărcare/layout XFA
Modificat (Changed)
FFI_DoURIActionWithKeyboardModifierconsultă acumOnXfaUriActionînainte de a executa un URI dintr-un câmp XFA, oferind gazdei drept de veto (securitate: un câmp XFA malițios putea anterior lansa URL-uri arbitrare necondiționat). Gestionarii neatribuiți păstrează default-ul anteriorShellExecuteWDecodeFormFieldTypedirecționează acum tipurile de câmpuri XFA prinIsXfaFormFieldîn loc de un case explicit cu 8 ramuri, menținând enum-ul aliniat cuFPDF_FORMFIELD_XFA_*prin offset ordinal
Corectat (Fixed)
ValidatePdfAraportează acum afirmațiile PDF/A-1 care folosesc fluxuri cross-reference PDF 1.5 sau fluxuri de obiecte cu noua problemăpvaiPdfA1Pdf15Structure, continuând să permită fluxurile de obiecte pentru PDF/A-2 și PDF/A-3
Version 2.13.0
Adăugat (Added)
- Suport complet runtime XFA (XML Forms Architecture):
TPdf.InitializeFormFillconectează acum toate cele 14 callback-uriFPDF_FORMFILLINFOdin versiunea 2 (FFI_DisplayCaret,FFI_GotoURL,FFI_PageEvent,FFI_PopupMenu,FFI_OpenFile,FFI_EmailTo,FFI_UploadTo,FFI_GetPlatform,FFI_GetLanguage,FFI_DownloadFromURL,FFI_PostRequestURL,FFI_PutRequestURL,FFI_OnFocusChange,FFI_DoURIActionWithKeyboardModifier) și atașează unIPDF_JsPlatformastfel că unpdfium.dllactivat XFA poate randa și scripta formulare XFA dinamice - Noua unitate
Lib\FPdfXfa.pascare declară constantele XFA (FXFA_PAGEVIEWEVENT_*,FXFA_MENU_*,FXFA_SAVEAS_*,FPDF_FORMFIELD_XFA_*) și tipurileTXfaPacket/TXfaSaveFormatcare anterior erau referențiate doar în comentarii - Cititor de pachete XFA statice pe
TPdf:GetXfaPacketCount/GetXfaPacketName/GetXfaPacketContent/GetXfaPacketByNameplusGetXfaTemplate/GetXfaDatasets/GetXfaConfigextrag pachetele XFAtemplate,datasetsșiconfigca XML brut fără a necesita un runtime activat XFA — util pentru auditarea conformității și migrarea datelor - Sonde de capabilitate: global
XfaFeaturesAvailable, și per-documentTPdf.XfaRuntimeAvailable(dacăFPDF_LoadXFAa reușit efectiv) șiTPdf.XfaStaticReadable(dacă exporturile cititorului de pachete se rezolvă) TPdfFormFieldTypeextins cufiXfa,fiXfaCheckBox,fiXfaComboBox,fiXfaImageField,fiXfaListBox,fiXfaPushButton,fiXfaSignature,fiXfaTextField, cuDecodeFormFieldTypecare mapează noile valoriFPDF_FORMFIELD_XFA_*- Evenimente JavaScript gazdă pe
TPdf:OnJavaScriptAlert,OnJavaScriptResponse,OnXfaGotoUrlșiOnXfaRuntimeMissingpermit gazdei să personalizeze dialogurile JS și navigarea XFA, sau să reacționeze când un document XFA nu poate rula motorul - Noul eșantion Delphi
XfaLabdemonstrând detectarea XFA, extragerea pachetelor, sondarea capabilităților și calea fallback de runtime lipsă
Modificat (Changed)
TPdf.LoadDocumentpre-scanează acum intrarea pentru marcaje XFA (/XFAîn dicționarul AcroForm, sau catalog/NeedsRendering) și, când le găsește, auto-selecteazăpdfium.v8.dllsetândEnableV8Engine := Trueînainte ca biblioteca singleton să fie încărcată prima dată; odată ce un simplupdfium.dlleste încărcat procesul nu poate comuta, deciOnXfaRuntimeMissingsemnalează acel cazTPdf.GetPageCountreflectă acum numărul de pagini pe care motorul XFA îl raportează prinFFI_PageEventdupă repaginarea dinamică, nu doar arborele static de pagini PDF- Când un document XFA este deschis dar runtime-ul este indisponibil,
InitializeFormFillfixează acumversion=1șixfa_disabled=1în loc să solicite versiunea 2 cu callback-uri neatribuite, care anterior risca o dereferențiere a unui pointer de callback invalid
Version 2.12.2
Corectat (Fixed)
ValidatePdfAComplianceraportează acum namespace-urile XMP personalizate utilizate fărăpdfaExtension:schemasacceptând în continuare metadatele standardpdfaidfără declarații de extensie- Validarea fișierelor încorporate PDF/A-3 necesită acum atât intrările de nivel superior
/F, cât și/UFpe dicționarele filespec și ignorează cheile imbricate de flux/EFla verificarea acelor nume
Version 2.12.1
Corectat (Fixed)
ValidatePdfACompliancedecodifică acum tokenurile de nume PDF escapate înainte de a potrivi JavaScript, LZWDecode, Type1 și alte nume interzise, astfel că numele obfuscate dar semantic identice sunt raportate corect- Verificările de imagini inline PDF/A resping acum valorile
/Filterși/Fcare folosesc/LZWDecode, prescurtat/LZW, sau/Crypt, inclusiv formele array și ale numelor escapate - Validarea PDF/A raportează acum fluxurile de metadate cu filtre interzise, profilurile ICC OutputIntent al căror număr de componente
/Neste lipsă sau inconsistent, și specificațiile fișierelor încorporate PDF/A-3 cu/AFRelationshiplipsă sau invalid
Version 2.12.0
Adăugat (Added)
- Cererile HTTP TSA setează acum timeout-uri explicite de 30 s pentru fiecare fază (resolve/connect/send/receive) prin
WinHttpSetTimeouts, astfel că o autoritate de marcare temporală lentă sau inaccesibilă nu poate bloca thread-ul de semnare pe termen nedefinit în loc să se bazeze pe default-urile implicite WinHttp - Derivarea nonce per cerere pentru cererile de marcă temporală PAdES B-T / B-LTA când apelantul omite
TPadesSignOptions.Nonce: un fold SHA-256 al contorului monoton + ceasul de perete +GetTickCount64+ id de proces înlocuiește fallback-ul fix anterior$100000000, astfel că două cereri emise în aceeași milisecundă nu mai reutilizează același nonce anti-replay PdfInflatelimitează acum ieșirea decompresat la 256 MiB pentru a opri un flux comprimat zlib care epuizează memoria pe o intrare ostilă sau coruptă (o “bombă zlib”); limita este generoasă pentru orice flux PDF real
Modificat (Changed)
- Blending-ul overlay
TPdfView(highlight de căutare, selectare text, cuvânt de citire, selectare spread) nu mai foloseșteGetPixel/SetPixelVper pixel; dreptunghiul este acum blended printr-unTBitmapoff-screen pe 32-bpp șiScanLineîntr-o singură trecere, eliminând mii de crossing-uri kernel GDI per paint și făcând selecțiile mari responsive FPdfAsn1.TDerReader.ReadIntegerrespinge acum câmpurile INTEGER mai lungi de 8 octeți (și negativele de 8 octeți al căror bit de semn ar necesitashl >= 64), returnând 0 în loc să calculeze o valoare greșită prin comportament de shift nedefinit pe intrările ASN.1 CMS/PAdESParseTimeStampRespnu mai returnează nonce-ul cererii înapoi caTPadesTimestamp.Nonce; până când aterizează walker-ul TSTInfo care verifică nonce-ul returnat, câmpul rămâne 0 pentru a semnala “neverificat” în loc să dea apelantilor false încredere că răspunsul timestamp este proaspăt
Corectat (Fixed)
PointsToPixelsreturna intrarea sa neschimbată pentru fiecare DPI: divizorul eraPointsPerInch(constanta 72) în loc de literalul 72, colapsând formula laResult := Points. Orice apelant extern care face dimensionare points→device-pixel prin acest helper primește acum corectPoints × PixelsPerInch / 72PdfMaxObjNumsubnumăra pe documentele care folosesc fluxuri de obiecte (PDF 1.5+ ObjStm): obiectele comprimate într-un/ObjStmnu poartă niciun marcajN 0 obj, deci scanarea la nivel de octet brut le rata, iar injectoarele care alocăMaxObj+1pentru obiecte noi colizionau cu membrii ObjStm ascunși și corupeau silențios fișierul. Scanarea extinde acum mai întâi fluxurile de obiecte astfel că fiecare număr de obiect este vizibilInjectPdfAMarkersnu mai falsifică o afirmație de conformitate PDF/A pe un document criptat: PDF/A (ISO 19005-1 §7.1) interzice criptarea, iar injectorul copia anterior sursa cu marcajele chiar dacă validarea imediat următoare ar respinge-o. CândHasEncrypteste setat sursa este acum transmisă neschimbată. Calea normalăTPdf.SaveAsPdfAelimină deja criptarea (saRemoveSecurity) înainte de injecție, deci aceasta afectează doar apelantii direcțiPdfReadStreamBytesrefuză acum un/Lengthmai mare decât întregul fișier înainte de a aloca bufferul rezultat, închizând o cale de alocare timpurie pe o lungime indirectă coruptă sau ostilă
Version 2.11.0
Adăugat (Added)
- Înregistrarea PDFium
FPDF_FILEHANDLERdeclară acum cele șase callback-uri ale sale (Release,GetSize,ReadBlock,WriteBlock,Flush,Truncate) ca câmpuri reale în loc de comentarii, corespunzând layout-ului antetului C. Callback-urile de transfer de fișiere FFI XFA (FFI_OpenFile/FFI_EmailTo/FFI_UploadTo/FFI_DownloadFromURL) care returnează sau consumăPFPDF_FILEHANDLERrămân neimplementate în stratul Pascal de completare a formularelor, dar tipul este acum structural corect pentru orice cale viitoare XFA de submit/upload - Încărcarea și descărcarea bibliotecii PDFium (
LoadLibrary/UnloadLibrary) sunt acum serializate de o secțiune critică globală pentru proces, astfel că două thread-uri workerTPdfFuture<T>(sau un worker care concurează cu thread-ul principal) nu pot observa ambelePDFiumLibrary=0și dubla-legare, sau elibera DLL-ul în timp ce un alt thread este la mijlocul legării - O secțiune
initialization/finalizationapelează acumUnloadLibraryla descărcarea unității, asigurând căFPDF_DestroyLibraryrulează (joncțiunea thread-ului worker, eliminarea izolației V8, demontarea font-ului/cache-ului) în loc să se bazeze pe OS pentru a recupera DLL-ul
Modificat (Changed)
TPdf.SetActiveînghite acum orice excepție în timpul încărcării (anterior doarEPdfError), astfel că o eroare de flux sau o violare de acces în timpul configurării form/pagina lasăActive=Falseîn loc de o componentă parțial încărcată cu stare indeterminată- Codificare consistentă a caracterelor pentru argumentele cheii de metadate PDFium:
TPdf.GetMetaTextfolosește acum același split FPCAnsiString/ DelphiUTF8EncodecaGetViewerPreferenceși căile de încărcare, în loc de o simplă conversieAnsiString(Tag) - Duplificatele
BytesToAnsi,AnsiToBytes,WriteBytesși ajutoareleWriteStrau fost deduplicate:FPdfCompressle importă acum dinFPdfPdfCommon(aliasurile saleWriteBytesToStream/WriteAnsiToStreamsunt retrase) și supraîncărcarea redundantă cu trei argumenteBytesToAnsidinFPdfPdfaeste eliminată.FPdfAsn1își păstrează copia locală prin design pentru a menține stratul de criptografie liber de unitatea stratului de conformitate
Corectat (Fixed)
- Scurgere de resurse în
TPdf.LoadDocument(fișier, memorie,TBytes,TMemoryStream, flux personalizat) șiTPdf.CreateDocument: dacăInitializeFormFillsauReloadPagegenera o excepție după ceFPDF_LoadDocument/FPDF_CreateNewDocumentreușise, handle-ul nativFPDF_DOCUMENTera scurs deoareceFActiveera încă False în acel moment. Fiecare cale împachetează acum configurarea post-încărcare întry/exceptși închide documentul la eșec, lăsând componenta în stare inactivă curată - Diagnostice mai prietenoase la încărcarea DLL-ului PDFium:
CheckLoadLibrarydetecteazăERROR_BAD_EXE_FORMAT(193) și raportează o nepotrivire de arhitectură 32/64 de biți indicând build-ulDLLs/Win32sauDLLs/Win64corespunzător, în loc să relayeze doar eroarea generică a OS.CheckGetProcAddressafirmă acum căpdfium.dllimplementat este mai vechi decât legătura când un export necesar este lipsă, în loc de textul bare OS "procedure not found"
Version 2.10.1
Corectat (Fixed)
- Standardizarea sid în SignerInfo PAdES: identificatorul semnatarului folosește acum forma
issuerAndSerialNumberdin RFC 5652 §5.3 (issuer Name + serialNumber, ambele extrase textual din DER certificatului semnatarului), înlocuind vechiulsubjectKeyIdentifier+ substituent SHA-256 cu întregul certificat, pe care Adobe Acrobat și alte validatoare conforme îl respingeau. Un nou parcurgător TbsCertificate DER (ExtractIssuerAndSerial) citește issuer SEQUENCE și serial INTEGER ca octeți TLV bruti — numerele de serie depășesc frecvent domeniulInt64, astfel că TLV brut este obligatoriu. FormasubjectKeyIdentifierrămâne ca fallback doar când analizarea DER a certificatului eșuează
Modificat (Changed)
TCmsSignerId.SerialNumber: Int64a fost înlocuit cuSerialDer: TBytes(TLV brut serialNumber). Constructorul CMS încorporează TLV secționat textual înIssuerAndSerialNumber, evitând depășireaInt64pentru numerele de serie CA de 20 octeți (limita superioară RFC 5280 §4.1.2.2)
Version 2.10.0
Adăugat (Added)
- Validare pe termen lung PAdES B-LT: când
TPadesSignOptions.Level >= plB_LT,SignPadesBytesadaugă o actualizare incrementală care transportă un dicționar/DSScu certificatul semnatarului și întregul lanț intermediar (rădăcina auto-semnată este exclusă conform RFC 5652 §10.2.3), plus marcajul/Extensions /ESICLevel 1 (EN 319 142-1 §5.4.2) - Marcă temporală de arhivare PAdES B-LTA: când
Level >= plB_LTAșiTsaUrleste setat, se adaugă un dicționar de semnătură Document Time-stamp (/SubFilter /ETSI.RFC3161) al cărui/ByteRangeacoperă întregul fișier; marcajul ESIC este promovat la Level 2. Astfel se completează cele patru niveluri de bază PAdES (B-B, B-T, B-LT, B-LTA) - Colectarea lanțului de certificate:
ResolveWinSignerapelează acumCertGetCertificateChainși populeazăTPadesResolvedSigner.ChainCertDercu certificatele CA intermediare, astfel încât/DSS /Certsdin B-LT transportă fiecare certificat necesar validării semnăturii fără căutări externe.CertFreeCertificateContexteste acum legat, închizând scurgerea unui context per semnătură notată în v2.8.0 - Flux de integrare PDF/A:
TPdf.SignPadesWithPdfAconvertește mai întâi documentul la PDF/A (cel mai înalt nivel pe care biblioteca îl emite astăzi), apoi aplică semnătura PAdES solicitată — modelul de container de arhivare pe termen lung recomandat în EN 319 142-1 Annex A.7
Version 2.9.0
Adăugat (Added)
- Marcă temporală de încredere PAdES B-T:
TPadesSignOptionsprimește câmpurileLevel,TsaUrlșiNonce. CândLevel >= plB_TșiTsaUrleste setat,SignPadesBytesextrage valoarea semnăturii din CMS-ul construit, solicită o marcă temporală RFC 3161 peste ea și încorporează TimeStampToken-ul returnat ca atribut nesemnat SignerInfosignature-time-stamp— pasul de timp de încredere B-T (EN 319 142-1 §6.3 req o) FPdfTsa: client RFC 3161 multiplatformă —BuildTimeStampReq(versiunea 1, SHA-256 messageImprint peste valoarea semnăturii, nonce, certReq=true),ParseTimeStampResp(acceptă PKIStatus 0/1, respinge 2+, extrage TimeStampToken ContentInfo textual) șiRequestTimestamp(construire+POST+analizare într-o singură operație).PadesTsaAvailablepornește funcția pe platformele fără backend HTTPFPdfTsaWin: backend Windows WinHttp, legat dinamic din winhttp.dll (zero dependențe noi la compilare; HTTPS negociat de depozitul de certificate Windows). Oglendește modelul de legare dinamicăFPdfCryptoWinFPdfCms:ExtractSignatureValueparcurge un CMS construit pentru a recupera octeții bruti ai semnăturii (intrarea hash TSA), iarAddSignatureTimestampToCmsreconstruiește ContentInfo cu un nouunsignedAttrs [1](0xA1) care transportă atributul de marcă temporală. Validatorul stage-1 recunoaște rezultatul ca semnătură B-T
Version 2.8.0
Adăugat (Added)
- Stivă de semnare PAdES B-B: patru blocuri de construcție noi, pur-Pascal/multiplatformă (
FPdfSha256,FPdfAsn1,FPdfCms,FPdfCrypto) plus un backend CNG Windows (FPdfCryptoWin) permitTPdf.SignPades/SignPadesToStreamsă producă o semnătură PAdES B-B completă. Certificatul semnatarului este rezolvat prin amprenta SHA-1 din depozitul Current User “MY”; RSA-PSS (recomandat), RSA PKCS#1 v1.5 și ECDSA sunt toate suportate prinNCryptSignHash FPdfSha256: SHA-256 FIPS 180-4 autonom (Init/Update/Final + ajutoare într-o singură operație). FPC 3.2.2 nu livrează nicio unitate SHA-2, astfel că biblioteca deține una pentru a menține fiecare cale de cod CMS pe un singur tipTSHA256Digestfără ramificări RTLFPdfAsn1: codor DER (TDerWriter) și cititor (TDerReader) care acoperă SEQUENCE/SET/OID/INTEGER/OCTET STRING/UTCTime/GeneralizedTime/etichete context-specifice, cu codificarea definite-length și gestionarea IMPLICIT-tag pe care CMS o cereFPdfCms: constructor CAdES SignedData (BuildSignedData) care emite atributele semnate content-type, message-digest și signing-certificate-v2 pe care baseline PAdES le impune, cu signing-time și commitment-type-indication opționale. Digestul signedAttrs este calculat peste forma etichetată SET (0x31) și reemis cu eticheta IMPLICIT [0] (0xA0) conform RFC 5652 §5.4FPdfCrypto+FPdfCryptoWin: abstracție a backend-ului criptografic cuPadesCryptoAvailable/ResolvePadesSigner, iar implementarea Windows leagă dinamic crypt32.dll / ncrypt.dll (fără nouă dependență DLL la compilare). Semnăturile ECDSA sunt recodate din forma Windows IEEE P1363 r¦s în forma DERECDSA-Sig-Valuepe care CMS o cereSignPadesBytes: injectare de semnătură la nivel de octet — rezervă un slot hex/Contentscu lățime fixă, calculează/ByteRangede acoperire, creează digestul documentului, construiește și încorporează CMS-ul și adaugă actualizarea incrementală. Validatorul (v2.7.0) recunoaște rezultatul ca semnătură PAdES B-B
Version 2.7.0
Adăugat (Added)
- Validator structural PAdES (ETSI EN 319 142-1 V1.2.1): noua unitate
FPdfPadesși metodaTPdf.ValidatePadesinspectează dicționarele de valoare a semnăturii accesibile din/ByteRange, parcurgSignedDataCMS din interiorul/Contentssuficient de adânc pentru a confirma forma CAdES detached și detectează cele patru niveluri de bază (B-B, B-T, B-LT, B-LTA) plus dicționarele Document Time-stamp (/SubFilter /ETSI.RFC3161) - Set de probleme PAdES la nivel de clauză: 26 enumuri
ppei*acoperă acceptabilitatea/SubFilter(adbe.pkcs7.sha1șiadbe.x509.rsa_sha1marcate ca interzise), acoperirea fișierului/ByteRange, interdicția/Cert, formaSignedDataCMS (un singur semnatar, eContent detașat, interval de versiuni), atributele semnate obligatorii (content-type,message-digest,signing-certificate/v2), digesturile interzise (MD5, SHA-1), excluderea reciprocă/Reasonvscommitment-type-indication(req d), cerința de timp de încredere B-T,/DSS+/Certs+ marcaj ESIC Level 1 pentru B-LT și Document Time-stamp + marcaj ESIC Level 2 pentru B-LTA - Injector DSS:
TPdf.SaveAsPadesDss/SaveAsPadesDssToStreamadaugă o actualizare incrementală care transportă un dicționar/DSS(cu tablourile de fluxuri/Certs,/OCSPs,/CRLs) și marcajul/Extensions /ESIC(Level 1 sau 2) pe o copie a documentului, păstrând octeții originali — pasul de încorporare a materialului de validare B-LT/B-LTA (clauza 5.4.2) - Etapă multiplatformă, fără dependențe: validatorul și injectorul sunt pur-Pascal și funcționează pe fiecare IDE suportat (Delphi, Lazarus, FPC, C++Builder); pentru această versiune nu este necesar niciun backend criptografic și nu este introdusă nicio dependență DLL nouă
Version 2.6.0
Modificat (Changed)
- Deduplicare între standarde: încă șapte funcții ajutătoare duplicate (PdfEnclosingObjNum, PdfDictRefNum, PdfExpandObjectStreams, PdfTextStr, ExtractLiteralString, ExtractXmpAttr) au fost eliminate din unitățile individuale ale standardelor și consolidate în
FPdfPdfCommon, reducând aproximativ ~300 de linii din povara mentenanței copy-paste - Calitatea PreflightReport: problemele claselor de conținut PDF/X și PDF/E care anterior cădeau în categoria generică “missing marker” au acum categorii precise Content/Metadata/Security și recomandări specifice clauzelor (aproximativ 15 enumuri în ambele standarde)
- Acoperirea testelor PDF/E și PDF/R: încă șase enumuri cu acoperire zero au primit teste pozitive (
pveiLzwForbidden,pveiJavaScriptForbidden,pveiFormFieldsForbidden,pveiEmbeddedFilesForbidden,pvriBadHeader,pvriProhibitedInfoEntry) - Corectare compilare Lazarus:
Tests.PdfVT(o unitate DUnitX doar pentru Delphi adăugată în v2.5.x) este acum exclusă din proiectul Lazarus pentru a restabili compilarea
Version 2.5.3
Adăugat (Added)
- Completitudinea OutputIntent (PDF/X-4 §6.2.4):
pvviOutputIntentSchemesemnalează un OutputIntent al cărui/Snu este/GTS_PDFX;pvviOutputIntentMissingIdentifiersemnalează un/OutputConditionIdentifierlipsă - Excepția Reference XObject pentru PDF/VT-2 (§6.2.2):
pvviReferenceXObjectForbiddennu mai este declanșat pentru un fișierPDF/VT-2, care poate folosi în mod legal Reference XObjects pe o bază X-5g/5pg - Validarea caracterelor de delimitare MIME (RFC 2046 §5.1.1):
vtmviBoundaryInvalidCharsemnalează o delimitare ale cărei caractere cad în afara setului bchars sau a cărei lungime depășește 70
Corectat (Fixed)
InjectPdfVTMarkersscrie acum Info/CreationDateși/ModDatedin opțiunile de salvare, astfel încât fișierul produs treceValidatePdfVTCompliancefără un falspvviInfoModDateMismatch(injectorul rescrisese anterior datele XMP, dar lăsase datele dicționarului Info învechite)
Version 2.5.2
Adăugat (Added)
- Consistența Info
/ModDate(§6.3 NOTE 2, baza PDF/X-4):pvviInfoModDateMismatchsemnalează un/ModDatedin dicționarul Info care, după normalizarea de la data-PDF la data-XMP, nu este egal cuxmp:ModifyDate - Conformitatea fragmentului inline PDF/VT-2s (Annex A.2): validatorul MIME rulează acum
ValidatePdfVTCompliancepe fiecare parte inlineapplication/pdfși semnalează un corp non-PDF/VT prinvtmviInlinePdfNotPdfVT
Version 2.5.1
Adăugat (Added)
- Validarea împărțirii DParts (ISO 16612-2 §6.5 Table 4):
pvviDPartsBadChunkingsemnalează un tablou/DPartsale cărui sub-tablouri ne-finale nu au exact 8192 de intrări sau al cărui ultim sub-tablou cade în afara intervalului 1..8192 - Consistența RecordLevel între fluxuri (Annex A.2): validatorul MIME PDF/VT-2s extrage acum
/RecordLeveldin fiecare PDF inline și semnalează dezacordul prinvtmviRecordLevelMismatch, complementând verificarea NodeNameList existentă - Indicii pentru obiecte grafice recurente (§6.7):
pvviGtsScopeInvalidValuesemnalează un/GTS_Scopeîn afara {SingleUse, Record, File, Stream, Global, Unknown};pvviGtsScopeRecordWithoutRecordLevelsemnalează/Recordfără un/RecordLevel;pvviGtsXidNotUuidsemnalează un/GTS_XIDcare nu este un uuid: URI conform RFC 4122;pvviGtsEnvMissingsemnalează un/GTS_Envlipsă când/GTS_Scopeeste Stream sau Global (§6.7.4) - Detectarea referințelor anticipative MIME (Annex A.2):
vtmviForwardReferencesemnalează un PDF inline care citează un nume de fișier (prin/EF /F) ne-introdus de o parte de atașament anterioară în flux
Corectat (Fixed)
ExtractNodeNameListFromPdfșiExtractRecordLevelFromPdfdinFPdfPdfvtMimeau rezolvat o eroare off-by-one recurentă, în care decalajul 1-based returnat deAnsiFindKeyera tratat ca decalaj absolut de octeți în PDF-ul extins
Version 2.5.0
Adăugat (Added)
- Metadatele părții de document PDF/VT (DPM, ISO 16612-2 §6.6):
TPdfVTSaveOptionsa primitDpmEntriesșiDpmTarget, astfel încât un scriitor poate atașa un dicționar/DPMnodului DPart sintetizat, cu validarea numelui de cheie împotriva regulii second-class-prefix din Annex E și a regulilor NMTOKEN / unicitate / formăGTS_Managed§6.6 pe partea validatorului - Schimb de fluxuri PDF/VT-2s (Annex A): noua unitate
FPdfPdfvtMimefurnizeazăBuildPdfVT2sStreamșiValidatePdfVT2sStreampentru plicul MIMEmultipart/mixedcare transportă fragmente inline PDF/VT plus profiluri ICC atașate, cu regula de ordonare a antetuluiX-PDFVT-Stream-version: 1și verificarea de consistențăNodeNameListîntre fluxuri TPdf.ValidatePdfVTefectuează acum o numărare autoritativă a acțiunilor JavaScript prinFPDFDoc_GetJavaScriptActionCount, complementând scanarea numelui/JavaScriptla nivel de octet
Corectat (Fixed)
- Corectitudinea
Trappedîn PDF/VT pe baza PDF/X-4: valoarea enumptvUnknowneste eliminată (PDF/X-4 interzice/Unknown),ptvUnspecifiedeste normalizat la/Falsela scriere (un/Trappedabsent este de asemenea interzis), iar o nouă problemăpvviTrappedInvalidsemnalează o valoare absentă sauUnknown ValidatePdfVTComplianceextinde acum fluxurile de obiecte (PdfExpandObjectStreams) înainte de scanare, astfel încât un catalog, un dicționar OutputIntent sau Metadata stocat într-un ObjStm comprimat (PDF 1.5+, tipic pentru producătorii PDF/X-4) este accesibil căutărilor la nivel de octet
Modificat (Changed)
- PDF/VT-1 moștenește acum interdicțiile complete de conținut PDF/X-4:
pvviAcroFormForbidden(/AcroFormsau/XFA),pvviAdditionalActionsForbidden(catalog/AA),pvviMissingTrimBoxșipvviReferenceXObjectForbidden(Reference XObject, doar X-5g/5pg) - Deduplicare între standarde:
BuildDictObj,IccComponentCount, profilul ICC sRGB integrat (GetSrgbIccProfile),PdfTextStr,PdfEnclosingObjNum,PdfDictRefNumșiPdfExpandObjectStreamsau fost promovate din copii locale triplificate dinFPdfPdfa/FPdfPdfx/FPdfPdfvtîntr-o singură locație canonică înFPdfPdfCommon; literalul ICC de 3144 octeți există acum exact o singură dată în baza de cod
Version 2.4.0
Corectat (Fixed)
InjectPdfUaMarkersnu mai elimină referința/Infodin trailer pe o bază de flux de referințe încrucișate (cross-reference-stream): componenta localăSourceTrailerInfoRef(care nu avea opțiunea de rezervă pentru fluxul xref) a fost înlocuită dePdfSourceTrailerInfoRefpartajată (promovată din copia PDF/A care avea opțiunea de rezervă încă din v2.0.0)- Versiunea partajată a
PdfReadStreamBytesgestionează acum referințele indirecte/Length N G R(importate din copia locală PDF/A), astfel încât validatoarele PDF/VT, PDF/R și PDF/E nu mai citesc greșit sau omit fluxurile de metadate XMP produse de instrumente care utilizează Length indirect (Acrobat, Ghostscript)
Modificat (Changed)
- Deduplicare între standarde: copiile locale ale
PdfReadTrailerdinFPdfPdfașiFPdfPdfx, copiile locale aleSourceTrailerInfoRefdinFPdfPdfașiFPdfPdfua, precum și copia localăPdfReadStreamBytesdinFPdfPdfaau fost șterse — versiunile partajate dinFPdfPdfCommonse aplică acum peste tot, eliminând aproximativ ~330 de linii de cod duplicat și reducând efortul de întreținere pentru menținerea copiilor sincronizate - Acoperirea testelor pentru PDF/X: șapte enumerări (enums) de clase de conținut care anterior aveau acoperire zero au primit teste pozitive (
pvxiLzwForbidden,pvxiJavaScriptForbidden,pvxiFormFieldsForbidden,pvxiAdditionalActions,pvxiEmbeddedFilesForbidden,pvxiMissingTrimBox,pvxiTrappedNotSet)
Version 2.3.0
Modificat (Changed)
- Continuă acoperirea testelor pentru PDF/A: încă trei enums cu acoperire zero au primit teste pozitive;
pvaiForbiddenRenderingIntent(§6.2.9) semnalează un nume de rendering-intent non-standard într-un flux de conținut;pvaiJpeg2000Violation(§6.2.2) semnalează o imagine JPXDecode cu/NumComponentsîn afara intervalului {1,3,4} la Part 2;pvaiInlineImageLzwForbidden(§6.1.10) semnalează o imagine inline care utilizează filtrul LZW la Part 2
Version 2.2.0
Modificat (Changed)
- Teste de regresie pentru cross-reference-stream: testul existent
Validate_XrefStreamTrailer_DetectsConformanceverifică acum și faptul că referința catalogului/Metadataeste rezolvată, iar proprietatea XMPpdfaid:parteste citită pe o bază de tip xref-stream (nu doar/Root+/ID); un nou testInjectPdfA_XrefStreamBase_RoundTripsprotejează calea de tip xref-stream a injectorului adăugată în v2.0.0; două teste între standarde (PdfE_XrefStreamBase_NotRejectedAsUnparsable,PdfR_XrefStreamBase_NotRejectedAsUnparsable) verifică faptul că validatorii PDF/E și PDF/R nu mai resping fișierele PDF cu xref-stream ca fiind imposibil de analizat - Acoperirea datoriei de testare pentru PDF/A:
Validate_MinimalPdf_FlagsRequiredMarkersverifică faptul că un PDF strict minimal declanșeazăpvaiMissingPdfAIdentifier,pvaiMissingOutputIntent,pvaiMissingIccProfile,pvaiMissingXmpMetadatașipvaiMissingXmpDates— închizând decalajul de simetrie față de validatorii PDF/E și PDF/X, care aveau deja teste echivalente; alte două enumerări cu acoperire zero au primit teste pozitive:pvaiUnembeddedFontșipvaiSubsetMissingCidSet
Version 2.1.0
Corectat (Fixed)
- PDF/E a fost omis din greșeală din corecția pentru fluxul de referințe încrucișate (cross-reference-stream) din v2.0.0: atât
InjectPdfEMarkerscât șiValidatePdfEComplianceapelau în continuarePdfReadTrailerfărăAcceptXrefStream, astfel încât injectorul PDF/E eșua în mod silențios la ieșirea PDF 1.5+ (valoarea implicită pentruSaveAsCopydin pdfium); ambele puncte de apel transmit acumTrue - Mecanismul de fallback partajat pentru cross-reference-stream din
PdfReadTrailerinclude acum protecția/Type /XRefpe care copiile locale PDF/A și PDF/X o aveau deja, astfel încât un offsetstartxrefcorupt care indică spre un dicționar fără legătură eșuează în mod curat în loc să fie analizat greșit ca fiind trailerul - Rezolvitorul
/Langcu referință indirectă dinValidatePdfUaCompliance(v2.0.0) era inaccesibil:PdfFindObjDictgăsește doar dicționare<<, dar un obiect șir/Langeste(...)sau<...>fără dicționar; acesta a fost înlocuit cu o scanare directă a corpului obiectului care localizează tokenul șir
Modificat (Changed)
- Șapte funcții ajutătoare duplicate inactive (PdfStructureBytes, PdfHasName, PdfCountName, BuildStreamObj) care erau copii identice la nivel de octet ale versiunilor din
FPdfPdfCommonau fost eliminate dinFPdfPdfașiFPdfPdfua— versiunile partajate se aplică acum peste tot prin intermediuluses
Version 2.0.0
Corectat (Fixed)
- Eșec silențios între standarde: funcția ajutătoare partajată
PdfReadTrailer(utilizată de injectoarele și validatorii de marcaje PDF/UA, PDF/X, PDF/VT și PDF/R) acceptă acum un parametruAcceptXrefStreamși recurge la dicționarul de obiecte cross-reference-stream atunci când nu este prezent niciun cuvânt cheietrailer(PDF 1.5+); anterior, rezultatulSaveAsCopyal pdfium (care folosește un flux de referințe încrucișate) determina eșecul silențios al fiecărui injector de marcaje — octeții sursă erau copiați nemodificați, iar apelul returna în continuare succes; validatorul PDF/R-1.0 (a cărui bază PDF 2.0 este întotdeauna un cross-reference stream) era practic inoperant; implementarea matură a validatorului PDF/A a fost portată în funcția ajutătoare partajată, astfel încât fiecare standard beneficiază de aceasta - Scanarea dicționarului trailer în
InjectPdfUaMarkersandInjectPdfAMarkersfolosește acum funcțiaPdfDictEndcare ține cont de adâncime în locul unei simple căutări>>, astfel încât un trailer care conține un dicționar imbricat (de exemplu,/Encrypt << ... >>) nu mai este întrerupt înainte de o intrare/Infode la sfârșit
Modificat (Changed)
TPdf.ValidatePdfUasuprimă acum eroarea brutăpvuaiFontNotEmbeddedde la nivel de octet atunci când eroarea precisă din modelul de obiecte PdfiumpvuaiPdfiumFontNotEmbeddeda fost deja declanșată, astfel încât raportul preflight nu mai conține două rânduri aproape duplicate de tipul „embed your fonts” pentru același defectpvuaiLangInvalidFormat(§7.2) rezolvă acum o referință indirectă/Lang(N 0 R) la obiectul său de tip șir și validează conținutul, astfel încât o etichetă de limbă referită indirect nu mai reprezintă un punct mort
Version 1.99.0
Corectat (Fixed)
pvuaiLangInvalidFormat(§7.2) nu mai permite trecerea directă a șirurilor/Langcodificate hexazecimal: perechile UTF-16BE (cu BOMFE FF) și șirurile hexazecimale ASCII simple sunt acum decodificate și supuse aceleiași verificări gramaticale BCP 47 ca și șirurile literale(...), astfel încât un/Langhexazecimal malformat este detectat, în timp ce unul conform (de exemplu, un UTF-16BEen-US) nu mai riscă să fie semnalat
Modificat (Changed)
pvuaiFontMissingToUnicode(§7.21.7) exceptează acum/MacExpertEncodingalături de/WinAnsiEncodingși/MacRomanEncoding, corespunzând celor patru condiții de exceptare enumerate în clauză
Version 1.98.0
Adăugat (Added)
pvuaiNeedAppearancesTrue(§7.18.4) semnalează un AcroForm al cărui marcaj/NeedAppearanceseste true, astfel încât aspectul widget-urilor nu este blocat în mod fiabil, iar tehnologia de asistență nu le poate asocia cu arborele de structură — portat din validatorul PDF/A și filtrat după prezența/AcroFormpentru a restrânge suprafața de scanare
Modificat (Changed)
- Regresie corpus veraPDF: s-au conectat perechea pass+fail pentru §7.20 Reference-XObject și perechile pass+fail pentru setul secundar CharSet/CIDSet conform §7.21.4.2 în
Live_Corpus_ValidatePdfUaMatchesConformance— eșantioanele de succes pentru valoarea interzisă ToUnicode conform §7.21.7 și clipul media conform §7.18.6.2 au fost de asemenea conectate ca protecții împotriva alarmelor false (eșantioanele lor de eșec utilizează structuri de dicționar pe care scanarea la nivel de octet nu le detectează, astfel încât doar partea de succes este conectată) - Lista de aserțiuni pentru căile de succes din corpus a primit 15 noi protecții cu zero alarme false, astfel încât fiecare verificare activă
pvuai*la nivel de octet și de structură este acum testată pe eșantioane conforme (anterior doar aproximativ 30 din cele 60 de probleme active erau protejate) — protecția pentrupvuaiLangInvalidFormata fost omisă în mod deliberat deoarece verificatorul la nivel de octet semnalează preventiv șirurile/Langcodificate hexazecimal pe care nu le poate decodifica
Version 1.97.0
Corectat (Fixed)
- Consolidarea
ValidatePdfUaStructureElements: parcurgerea lanțului de părințiEnclosingTableconține acum un contor de salturi (limitat de numărul de elemente), astfel încât un cicluParentIndexmalformat pe un tablou sintetic de elemente de structură nu mai poate bloca apelantul — alocarea tabloului de ID-uri de conținut marcat dinValidatePdfUaPageContentTaggingeste acum limitată la maximum un milion de intrări, prevenind o alocare de mai mulți gigaocteți în cazul unuiMarkedContentIDmalformat sau malițios
Modificat (Changed)
- Comentariul de documentare pentru enumerarea
pvuaiOrderedListMissingListNumberingdescrie acum cu precizie ce face verificarea: semnalează un elementLa cărui valoareListNumberingeste în afara setului din Tabelul 347 ISO 32000-1 (un atribut absent nu este semnalat) — comentariul anterior sugera că detecta și listele ordonate cărora le lipsește atributul, ceea ce implementarea nu face - Cele două eșantioane de eșec din corpus pentru nepotrivirea WMode
7.21.3.3-t02sunt acum conectate înLive_Corpus_ValidatePdfUaMatchesConformance— începând cu v1.95.0 fluxul CMap este decompressat cu FlateDecode, astfel încât compararea dicționarului cu conținutul se execută acum pe date lizibile — comentariul învechit „not wired” a fost eliminat
Version 1.96.0
Adăugat (Added)
- Consistență între standarde:
TPdf.ValidatePdfUaprimește două verificări portate din validatorul PDF/A —pvuaiAnnotationFlagsViolation(§7.18.1) semnalează o adnotare neexceptată care are marcajele Hidden / Invisible / NoView, ceea ce întrerupe fluxul de citire al tehnologiilor de asistență —pvuaiActionTargetMissing(§7.18.5) semnalează o acțiune GoToR / URI / SubmitForm căreia îi lipsește cheia țintă obligatorie (/F+/D, /URI, /F), lăsând legătura inutilizabilă de către tehnologiile de asistență
Corectat (Fixed)
- Îmbinarea arborelui de structură între pagini: bucla de acumulare
AllElemsdinTPdf.ValidatePdfUarecalculează acum bazaParentIndexpentru fiecare element de la tabloul local al paginii la tabloul îmbinat — fără aceasta, elementele fiu ale paginii 2 păstrau un indice local de pagină care trimitea în porțiunea paginii 1, corupând în mod silențios orice verificare dependentă de ParentIndex (structura tabelelor/listelor, numărul de copii H conform §7.4.4, EnclosingTable) - Analiza RoleMap:
PdfReadRoleMapPairsnu mai oprește întreaga scanare cheie/valoare atunci când o valoare este o referință indirectă (N 0 R) sau un tablou ([...]) — ambele fiind forme RoleMap valide conform ISO 32000-1 14.8.5.1 — acum doar ignoră acea intrare (Continue) în loc deBreak, eliminând alarmele falsepvuaiRoleMapUnresolvedpentru tipurile mapate după o intrare indirectă sau de tip tablou
Modificat (Changed)
FPdfPreflightReport: 18 valori active deTPdfUaValidationIssuecare anterior ajungeau în categoria generală „missing marker” și recomandarea aferentă au acum categorii precise (Structure / Content / Metadata / Security) și recomandări specifice clauzelor — de asemenea, a fost corectată greșeala de tiparpuaNone / pua1→pucNone / puc1dinPDFSpecComplianceMatrix.md
Version 1.95.0
Modificat (Changed)
- Revizuire și verificare de corectitudine pentru
TPdf.ValidatePdfUa: verificareapvuaiCMapWModeMismatchdin §7.21.3.3 și verificareapvuaiToUnicodeForbiddenValuedin §7.21.7 decomprimă acum fluxurile CMap / ToUnicode comprimate cuFlateDecodeînainte de scanare (anterior erau evaluate doar fluxurile necomprimate, o problemă cunoscută de rezultate fals negative) — funcțiile ajutătoare partajatePdfInflate/PdfReadAndDecodeStreamau fost mutate dinFPdfPdfa/FPdfPdfxînFPdfPdfCommon, astfel încât toate unitățile de conformitate folosesc aceeași copie
Adăugat (Added)
pvuaiSubsetCharSetEmpty(§7.21.4.2) semnalează unFontDescriptorde subset Type 1 care conține o cheie/CharSeta cărei valoare de șir este goală — verificarea existentăpvuaiSubsetMissingCharSetdetecta doar cheia lipsă — un/CIDSetgol nu este semnalat, deoarece un font fără CID-uri poate conține în mod legitim o hartă de biți goală
Version 1.94.0
Adăugat (Added)
- Auditul de a doua trecere pentru
TPdf.ValidatePdfUaa închis șase lacune ISO 14289-1 identificate printr-o revizuire clauză cu clauză și o rescanare a API-urilor native Pdfium deja incluse, dar neutilizate de calea PDF/UA —pvuaiHeadingFormatInvalid(§7.4.3) semnalează etichetele de antet definite de utilizator care încep cu H, dar conțin separatori, spații sau cifre romane în loc de cifre arabe simple —pvuaiMissingDocumentOutline(§7.17, recomandat) semnalează un document multipagină care nu conține un cuprins de semne de carte (documentele cu o singură pagină sunt exceptate) —pvuaiStructElementLangInvalid(§7.2) semnalează o valoare/Langdintr-un element de structură care nu este un cod BCP 47 valid —pvuaiWidgetMissingPrintField(§7.14 / §7.18.4) semnalează un element de structură Widget căruia îi lipsește proprietarul de atribut PrintField —pvuaiLinkNotInStructureTree(§7.18.5) semnalează un document ale cărui adnotări/Subtype /Linknu sunt expuse ca elemente de structură Link —pvuaiPdfiumAnnotationMissingContentsșipvuaiPdfiumLinkMissingContents(§7.18.1 / §7.18.5) adaugă o scanare precisă a adnotărilor din modelul de obiecte Pdfium care exceptează adnotările ascunse, în afara CropBox, Popup și Widget, eliminând alarmele false ale euristicii la nivel de octet, care nu poate citi marcajele/Fsau/Rect
Version 1.93.0
Adăugat (Added)
TPdf.ValidatePdfUaadaugă acum o trecere bazată pe modelul de obiecte Pdfium peste inspectorul la nivel de octet, reflectând arhitectura PDF/A runda 7: parcurge obiectele de text ale fiecărei pagini prin intermediulFPDFTextObj_GetFont→FPDFFont_GetIsEmbedded(pvuaiPdfiumFontNotEmbedded, §7.21.4) și scanează fiecare caracter prinFPDFText_HasUnicodeMapError(pvuaiPdfiumUnicodeMapError, §7.21.7) șiFPDFText_GetUnicode(pvuaiPdfiumNotDefGlyph, §7.21.8) — procesul este mult mai precis decât euristicile la nivel de octet, care se declanșează doar când nu există programe de font sau nu apare deloc/ToUnicode— parcurgerea se oprește rapid pe trei niveluri: bucla paginii se termină când toate cele trei probleme de pe nivelul Pdfium sunt deja setate, bucla pe obiect se oprește la primul font neîncorporat, iar scanarea caracterelor omite trecerea.notdefatunci cândUnicodeMapErrors-a produs deja — PDF/UA era ultimul validator de standard PDF fără un nivel bazat pe modelul de obiecte Pdfium
Version 1.92.0
Adăugat (Added)
- S-a creat
Tests.PdfR— primul fișier de test pentru validatorul PDF/R-1 (FPdfPdfr), care acoperă validarea antetului, interzicerea ObjStm, detectarea marcajelor raster și o protecție fără alarme false pentru fișiere curate — toate cele șase suite de teste pentru standardele PDF au acum fișiere de test dedicate: PdfA(80), PdfUa(101), PdfX(7), PdfE(5), PdfVT(15), PdfR(4) = 212 teste în total
Version 1.91.0
Adăugat (Added)
ValidatePdfEșiValidatePdfVTau primit verificări la nivel de conținut care anterior erau disponibile doar în validatorii PDF/A, PDF/UA și PDF/X:pveiLzwForbidden,pveiJavaScriptForbidden,pveiFormFieldsForbidden(doar PDF/E),pveiEmbeddedFilesForbidden(doar PDF/E),pveiOpiForbidden,pvviLzwForbidden,pvviJavaScriptForbidden,pvviEmbeddedFilesForbidden,pvviOpiForbidden—TPdf.ValidatePdfEșiTPdf.ValidatePdfVTprimesc de asemenea un nivel bazat pe modelul de obiecte Pdfium (pveiPdfiumFontNotEmbedded/pvviPdfiumFontNotEmbedded) care parcurge obiectele de text ale paginii prinFPDFFont_GetIsEmbedded, opriindu-se rapid la primul font neîncorporat găsit
Version 1.90.0
Adăugat (Added)
TPdf.ValidatePdfXadaugă acum o trecere bazată pe modelul de obiecte Pdfium peste inspectorul la nivel de octet: parcurge obiectele de text ale fiecărei pagini prinFPDFTextObj_GetFont→FPDFFont_GetIsEmbeddedși raportează un font neîncorporat capvxiPdfiumFontNotEmbedded— procesul este mai precis decât euristica la nivel de octet, care se declanșează doar când nu există programe de font — parcurgerea se oprește rapid la primul font neîncorporat găsit
Modificat (Changed)
- Parcurgerea arborelui de structură din
TPdf.ValidatePdfUa: apelul per-paginăValidatePdfUaPageContentTagging(care construiește harta de revendicare a ID-urilor de conținut marcat și verifică încrucișat fiecare obiect de text/imagine) este acum omis pe paginile următoare odată cepvuaiUntaggedContenta fost deja găsit — elementele de structură sunt în continuare colectate pentru verificările între pagini (ID-ul unic Note, secvența de antete), dar trecerea costisitoare de etichetare a conținutului per-pagină se oprește devreme
Version 1.89.0
Modificat (Changed)
- Performanța nivelului bazat pe modelul de obiecte Pdfium din
TPdf.ValidatePdfA: parcurgerea paginilor/obiectelor se oprește acum rapid pe trei niveluri — bucla de pagini se termină când toate problemele aplicabile din nivelul Pdfium au fost deja găsite, bucla per-obiect se oprește când ambele probleme per-obiect (încorporare font + transparență) sunt setate, iar scanarea caracterelor pe paginile de text omite trecerea.notdefcândUnicodeMapErrors-a produs deja — verificările de disponibilitate a API-uluiAssigned()și marcajele de conformitate sunt stocate în variabile booleene locale o singură dată înainte de buclă, în loc să fie reevaluate la fiecare pagină/obiect/caracter — pe un document mare neconform, parcurgerea se poate opri acum după prima pagină în loc să scaneze toate paginile; pe un document conform, costul suplimentar per pagină este mai mic (fără apeluriAssignedrepetate)
Version 1.88.0
Adăugat (Added)
ValidatePdfXa primit opt noi valoriTPdfXValidationIssuela nivel de conținut, care acoperă restricțiile de schimb tipografic (print-exchange) impuse de PDF/X dincolo de marcajele formatului de fișier:pvxiLzwForbidden(/LZWDecode),pvxiJavaScriptForbidden(/JavaScript),pvxiFormFieldsForbidden(/AcroForm//XFA),pvxiAdditionalActions(/AA),pvxiEmbeddedFilesForbidden(/EmbeddedFiles//FileAttachment),pvxiOpiForbidden(/OPI//Alternates),pvxiMissingTrimBox(fără/TrimBoxpe nicio pagină) șipvxiTrappedNotSet(/Trappedabsent sau/Unknown) — validatorul PDF/X verifica anterior doar marcajele XMP/OutputIntent; aceasta este prima sa trecere la nivel de conținut — funcțiile ajutătoare partajatePdfStructureBytes/PdfHasName/PdfCountNameau fost adăugate înFPdfPdfCommonpentru a fi folosite de toate unitățile de conformitate
Version 1.87.0
Adăugat
- Validarea PDF/UA acoperă acum regulile fonturilor compuse ISO 14289-1 §7.21.3:
pvuaiCidSystemInfoMismatchmarchează fonturile Type0 ale căror CMap încorporat și CIDFont descendent nu sunt de acord cu privire laRegistry/Orderingsau al cărorSupplementCIDFont îl depășește pe cel al CMap-ului,pvuaiCMapNotEmbeddedmarchează CMap-urile referite prin nume (caEncodingsauUseCMap) care nu sunt CMap-uri predefinite conform ISO 32000-1 Tabelul 118, iarpvuaiCMapWModeMismatchmarchează CMap-urile încorporate al cărorWModedin dicționar diferă de WMode din conținutul fluxului lor
Remediat
- Verificarea
pvuaiCidFontMissingCidToGidMapdin §7.21.3.2 omitea dicționarele CIDFontType2 al căror perechere cheie/valoareSubtypeera separată printr-o linie nouă; acum marchează și o valoare de numeCIDToGIDMapdiferită deIdentity
Version 1.86.0
Adăugat
- Validarea PDF/UA acoperă acum regulile de codificare TrueType ISO 14289-1 §7.21.6:
pvuaiTrueTypeEncodingInvalidmarchează fonturile TrueType non-simbolice al cărorEncodinglipsește sau nu este niciMacRomanEncoding, niciWinAnsiEncoding(direct sau prinBaseEncoding), iarpvuaiSymbolicTrueTypeEncodingmarchează fonturile TrueType simbolice care poartă un nume deEncodingnestandard
Version 1.85.1
Modificat
- Verificarea ordinii filelor ISO 14289-1 §7.18.3
pvuaiMissingTabsOrderrulează acum per pagină: fiecare pagină care conține adnotări trebuie să declare/Tabs /Sîn propriul dicționar de pagină, astfel încât o pagină conformă nu mai maschează una care nu îl are
Version 1.85.0
Adăugat
- Validarea PDF/UA distinge acum formularele XFA dinamice de cele statice conform ISO 14289-1 §7.15:
pvuaiXfaDynamicmarchează formularele a căror configurație XFA seteazădynamicRenderlarequired
Modificat
- Indicatorul candidat anterior pentru orice XFA
pvuaiXfaPresenteste retras și nu mai este generat (XFA static este conform cu §7.15); valoarea enum rămâne pentru compatibilitatea API
Version 1.84.0
Adăugat
- Validarea PDF/UA detectează acum conținut real neetichetat, cerut de ISO 14289-1 §7.1:
pvuaiUntaggedContentmarchează obiectele text și imagine randate care nu sunt revendicate de arborele de structură al paginii (prin ID-urile lor de conținut marcat) și nici marcate ca Artefact - Noi funcții auxiliare la nivel de pagină
GetPageContentMarkInfosșiValidatePdfUaPageContentTaggingcu înregistrareaTPdfPageContentMarkInfopentru utilizare directă
Version 1.83.0
Adăugat
- Validarea PDF/UA aplică acum modelul de titluri ISO 14289-1 §7.4.4:
pvuaiHeadingModelMixedmarchează documentele care combină eticheta genericăHcu titluri numerotateH1..Hn, iarpvuaiHeadingMultipleInNodemarchează nodurile de structură care conțin mai mult de un titlu copilH
Version 1.82.0
Adăugat
- Validarea PDF/UA rezolvă acum RoleMap-ul cerut de ISO 14289-1 §7.1:
pvuaiRoleMapRemapsStandardmarchează intrările RoleMap care redefinesc un tip de structură standard, iarpvuaiRoleMapUnresolvedmarchează tipurile de structură non-standard utilizate al căror lanț RoleMap este lipsă, rupt sau ciclic — lanțurile indirecte care ajung la un tip standard sunt acceptate, iar intrările RoleMap neutilizate nu sunt niciodată judecate - Noi funcții auxiliare
PdfUaIsStandardStructType,PdfReadRoleMapPairs(cu decodarea escape PDF#hhpentru nume) șiValidatePdfUaRoleMapUsagepentru utilizare directă
Version 1.81.0
Adăugat
- Validarea PDF/UA acoperă acum etichetarea listelor ISO 32000-1 cerută de ISO 14289-1 §7.6:
pvuaiListStructureInvalidmarchează elementele LI aflate în afara unui container L și părțile Lbl/LBody aflate în afara unui element LI, acceptând în același timp listele imbricate și utilizarea legitimă a Lbl în elementele Note și BibEntry
Version 1.80.0
Adăugat
- Validarea PDF/UA acoperă acum etichetarea tabelelor ISO 32000-1 cerută de ISO 14289-1 §7.5:
pvuaiTableStructureInvalidmarchează celulele TH/TD aflate în afara unui rând TR și rândurile sau grupurile de rânduri aflate în afara containerului lor Table,pvuaiTableHeaderMissingScopemarchează celulele antet a căror relație nu poate fi determinată nici prin atributul Scope, nici printr-o asociere Headers/ID, iarpvuaiTableHeadersUndefinedIdmarchează referințele Headers din documentele care nu definesc niciun ID de element de structură TPdfStructureElementexpune atributele de tabelScope,HasHeaders,HeadersIds,ColSpanșiRowSpan, rezolvate în timpul parcurgerii arborelui de structură
Modificat
- Parcurgerea arborelui de structură citește acum toate atributele de aspect și tabel într-o singură trecere peste dicționarele de atribute ale fiecărui element, în loc de o scanare per atribut
Version 1.79.1
Adăugat
- S-a portat exemplul
AnnotationsLabcătre Lazarus și C++Builder, alăturându-se exemplului de consolă existent din Delphi
Reparat
TPdf.CreateAnnotationar fi putut genera o eroare “Cannot set attachment points” pentru adnotările de tip markup care utilizează puncte quad (Highlight, Underline, StrikeOut, Squiggly) deoarece noua adnotare nu avea încă un slot quad care să fie înlocuit; acum acesta se adaugă la sfârșitul listei (append) pentru primul quad
Version 1.79.0
Adăugat
- Exemplu nou de consolă Delphi
AnnotationsLab: creează adnotări Text, Highlight, Square și Circle, le scrie într-un fișier PDF, apoi reîncarcă fișierul și enumeră lista de adnotări a paginii
Version 1.78.0
Adăugat
- Noile
TPdf.MeasureTextșiTPdf.MeasureTextWidth: măsoară lățimea și înălțimea redată a unui șir pentru un anumit font și o anumită dimensiune (unități de utilizator PDF, 1 unitate = 1/72 inch) fără a adăuga conținut pe o pagină, făcând posibilă logica de layout și întrerupere a liniilor pe deasupraAddText; furnizat de unitatea de sine stătătoareFPdfMeasureca helper de clasă - Nou
TPdf.WrapText: word wrap (împachetare a cuvintelor) realizat pe bazaMeasureTextWidth, care divide textul la spații și grupează cuvintele pe linii cu lățime mai mică decât lățimea specificată (unități de utilizator PDF); un singur cuvânt prea lung ocupă propria sa linie (fără întreruperi în interiorul cuvântului), returnând liniile împachetate sub forma unui tablou (array)
Version 1.77.0
Adăugat
ValidatePdfAa primit trei noi valoriTPdfAValidationIssuecare acoperă clauzele evaluate anterior drept “NO” sau “reader behaviour” în auditul anterior (valorile ordinelor adăugate, valorile existente rămân neschimbate):pvaiPdfiumNotDefGlyph(PDF/A-2 6.2.11.8 — un caracter care se rezolvă în Unicode 0 fără o eroare de mapare, simptomul în timpul rulării al unei referințe la un glif.notdef; detectat prin stratul modelului de obiect Pdfium),pvaiWordBreakMissing(Nivel A 6.8.3.2 — un flux de conținut care afișează un șir mai lung de 20 de caractere fără niciun spațiu, probabil o încălcare a cuvintelor îmbinate; euristică generală care evită detecțiile false pentru limbile CJK) șipvaiLinkActionMissingTarget(6.6.3 — o acțiune GoToR/URI/SubmitForm căreia îi lipsește cheia de destinație de afișare, deci cititorul nu o poate prezenta)
Version 1.76.0
Adăugat (Added)
ValidatePdfAa primit trei valori noiTPdfAValidationIssue(ordinale adăugate, valorile existente rămân neschimbate):pvaiNameNotValidUtf8(PDF/A-2/3 6.1.8 — un token/BaseFontsau/FontNamecare conține octeți ≥ 0x80 ce nu formează un UTF-8 valid),pvaiInlineImageLzwForbidden(PDF/A-2/3 6.1.10 — o imagine inline dintr-un stream de conținut de pagină folosește filtrul LZW sau Crypt) șipvaiTrueTypeDifferencesForbidden(6.3.7 Cor.2 — un font TrueType non-simbolic al cărui dicționar Encoding poartă/Differences)
Version 1.75.0
Adăugat (Added)
ValidatePdfAa primit trei noi valoriTPdfAValidationIssue(ordinale adăugate, valorile existente rămân neschimbate):pvaiIntegerImplementationLimit(PDF/A-2/3 6.1.13 — un token numeric care depășește limita unui întreg cu semn pe 32 de biți de 2.147.483.647),pvaiBlendModeNotWhitelisted(PDF/A-2/3 6.2.10 — o valoare/BMîn afara setului standard de moduri de amestecare ISO 32000-1 §11.3.5; completeazăpvaiTransparentColorSpacedin PDF/A-1 care permite doar Normal/Compatible) șipvaiHexStringOddDigits(6.1.6 — un șir hex<...>cu un număr impar de cifre hexazecimale)
Version 1.74.0
Adăugat (Added)
ValidatePdfAa primit trei noi valoriTPdfAValidationIssue(ordinale adăugate, valorile existente rămân neschimbate):pvaiPermissionsViolation(6.1.12 — un dicționar/Permscare conține/DigestLocation,/DigestMethodsau/DigestValuealături de/DocMDP),pvaiTransActionForbidden(PDF/A-2 6.5.1 — o acțiune de tranziție Trans, detectată prin modelul de dicționar de acțiuni/S /Transpentru a evita potrivirile false cu/Transparency) șipvaiPdfiumObjectTransparency(PDF/A-1 6.4 — un obiect de pagină conține transparență reală conformFPDFPageObj_HasTransparency, extinzând stratul modelului de obiecte Pdfium introdus în v1.73.0 pentru a prinde efectele de mod de amestecare/mască moale pe care scanarea numelor la nivel de octet le poate rata)
Version 1.73.0
Adăugat (Added)
TPdf.ValidatePdfAsuprapune acum o trecere a modelului de obiecte Pdfium peste inspectorul la nivel de octet: acesta parcurge obiectele de text ale fiecărei pagini prinFPDFPage_GetObject→FPDFTextObj_GetFont→FPDFFont_GetIsEmbeddedși raportează un font randat neîncorporat capvaiPdfiumFontNotEmbedded(ISO 19005 6.3.4) și încarcă fiecare pagină de text pentru a scanaFPDFText_HasUnicodeMapError, raportând o mapare Unicode întreruptă capvaiPdfiumUnicodeMapError(6.3.8). Acestea sunt verificări pe care inspectorul la nivel de octet nu le poate face — el vede doar token-uri de nume, nu descriptori de fonturi rezolvați sau stare de mapare per-caracter — și sunt îmbinate în rezultatul la nivel de octet. Funcția independentă la nivel de octetValidatePdfACompliancerămâne neschimbată
Version 1.72.0
Adăugat (Added)
ValidatePdfAa primit cinci noi valoriTPdfAValidationIssue(ordinale adăugate, valorile existente rămân neschimbate):pvaiNeedsRenderingPresent(PDF/A-2 6.4.2 — catalogul nu trebuie să conțină/NeedsRendering),pvaiDestOutputProfileRef(PDF/A-3 6.2.3 — un OutputIntent nu trebuie să conțină/DestOutputProfileRef),pvaiEmbeddedFileMissingUF(PDF/A-3 6.8 — o specificație de fișier cu/EFtrebuie să conțină și/UF),pvaiXmpPacketBytesAttr(6.7.5 — antetul pachetului XMP nu trebuie să conțină atributele învechitebytes=sauencoding=) șipvaiAnnotationToggleNoView(PDF/A-2 6.3.2 — bitul ToggleNoView din adnotarea/F, valoarea 512, este interzis)
Version 1.71.0
Modificat
ValidatePdfUaraportează acumpvuaiOrderedListMissingListNumbering(ISO 14289-1 7.6): parcurgătorul arborelui de structură rezolvă atributul de layoutListNumberingpe fiecare elementLprin intermediul API-ului de atribute Pdfium și semnalează orice valoare în afara setului din Tabelul 347 din ISO 32000-1 (Decimal,UpperRoman,LowerRoman,UpperAlpha,LowerAlpha,None,Circle,Disc,Square). Un atribut absent nu este semnalat, deoarece lista poate fi neordonată; acest lucru închide ultima lacună reziduală ISO 14289-1 înregistrată la finalul rundei 5
Version 1.70.0
Adăugat
ValidatePdfUaa primit patru noi valoriTPdfUaValidationIssue(ordinale adăugate, valorile existente rămân neschimbate):pvuaiSubsetMissingCidSet(ISO 14289-1 7.21.4.2 — un subset CIDFontDescriptortrebuie să declare/CIDSet),pvuaiToUnicodeForbiddenValue(7.21.7 — un CMap ToUnicode nu trebuie să mapeze niciun cod laU+FEFFsauU+FFFE; fluxurile necomprimate sunt scanate pentru formele de ieșire<FEFF>/<FFFE>),pvuaiLangInvalidFormat(7.2 —/Langtrebuie să fie o etichetă validă RFC 1766 / BCP 47; o gramatică permisivă acceptăen,en-US,zh-Hans,es-419și semnalează clar valorile neconforme) șipvuaiOrderedListMissingListNumbering(7.6 — reținut pentru completitudinea API-ului; încă nu este raportat de validator deoarece distingerea fiabilă a listelor ordonate de cele neordonate necesită valoarea atributuluiListNumbering, pe care parcurgătorul arborelui de structură nu o expune)
Version 1.69.0
Adăugat
ValidatePdfUaa primit două noi valoriTPdfUaValidationIssue(ordinale adăugate, valorile existente rămân neschimbate):pvuaiWidgetOutsideForm(ISO 14289-1 7.18.4 — un element de structură Widget trebuie să fie imbricat în interiorul unui elementForm; parcurgătorul arborelui de structură verifică acum tipul părintelui direct al fiecărui Widget) șipvuaiSubsetMissingCharSet(7.21.4.2 — un subset Type 1FontDescriptortrebuie să declare/CharSet, identificat prin prefixul numelui de subset format din șase litere și+pe/FontName)
Version 1.68.0
Adăugat
ValidatePdfUaa primit două noi valoriTPdfUaValidationIssue(ordinale adăugate, valorile existente rămân neschimbate):pvuaiUriActionIsMap(ISO 14289-1 7.18.5 — un dicționar de acțiune URI nu trebuie să conțină/IsMapcu valoareatrue, deoarece dezactivează ținta linkului accesibil) șipvuaiHeadingSequenceViolation(7.4.2 — titlurile numerotate trebuie să înceapă laH1și o secvență descrescătoare nu trebuie să sară peste un nivel intermediar, de ex.H1→H3este o încălcare). Verificarea titlului este prima regulă PDF/UA la nivel de arbore de structură din validator:ValidatePdfUaStructureElementsparcurge acum lista de elemente tipizate și verifică secvențaH1…H6(șiH7+conform 7.4.3) în ordinea documentului
Version 1.67.0
Adăugat
ValidatePdfUaa primit cinci noi valoriTPdfUaValidationIssue(ordinale adăugate, valorile existente rămân neschimbate):pvuaiLinkMissingContents(ISO 14289-1 7.18.5 — o adnotare Link trebuie să conțină o descriere alternativă prin/Contents),pvuaiAnnotationMissingContents(7.18.1 — orice adnotare nescutită fără/Contentstrebuie să aibă o descriere alternativă; Popup și Widget sunt scutite),pvuaiEmbeddedFileMissingName(7.11 — un dicționar de specificație de fișier trebuie să conțină/Fși/UF),pvuaiMediaClipMissingAlt(7.18.6.2 — un dicționar de date de clip media trebuie să conțină/CTși/Alt) șipvuaiCidFontMissingCidToGidMap(7.21.3.2 — un CIDFont Type 2 încorporat trebuie să conțină/CIDToGIDMap)
Version 1.66.0
Adăugat
ValidatePdfUaa primit cinci noi valoriTPdfUaValidationIssue(ordinale adăugate, valorile existente rămân neschimbate):pvuaiRoleMapMissing(ISO 14289-1 7.1 — un document etichetat cu tipuri de structură non-standard trebuie să conțină un/RoleMap),pvuaiOptionalContentAsKey(7.10 — un dicționar de configurare a conținutului opțional nu trebuie să conțină cheia de stare automată/AS),pvuaiXfaPresent(7.15 — o prezență AcroForm/XFAeste semnalată deoarece XFA dinamic este interzis),pvuaiTrapNetAnnotation(7.18.2 — adnotările/TrapNetsunt interzise) șipvuaiReferenceXObject(7.20 — obiectele XObject de referință, bazate pe marcajul/Ref, sunt interzise)
Remediat
ValidatePdfUanu mai raportează rezultate fals pozitivepvuaiEncryptionPresentla fiecare fișier criptat: PDF/UA permite criptarea atât timp cât cheia dicționarului de criptare/Pare poziția bitului 10 (valoarea 1024) setată, ceea ce acordă acces tehnologiei de asistență (7.16). Încălcarea precisă este acum raportată prin noulpvuaiEncryptionPBitMissing;pvuaiEncryptionPresenteste reținut în enum pentru compatibilitatea API-ului, dar nu mai este raportat de validatorul la nivel de octet
Version 1.65.0
Adăugat
ValidatePdfAa primit cinci noi valoriTPdfAValidationIssue(ordinale adăugate, valorile existente rămân neschimbate):pvaiCidFontMissingCidToGidMap(ISO 19005-1 6.3.3.2 Cor.2 — un CIDFont Type 2 încorporat trebuie să conțină/CIDToGIDMap),pvaiSubsetMissingCharSet(6.3.5 — un subset Type 1FontDescriptortrebuie să conțină/CharSet),pvaiSubsetMissingCidSet(6.3.5 — un subset CIDFontDescriptortrebuie să conțină/CIDSet),pvaiWidgetActionForbidden(6.6.1 — o adnotare Widget nu trebuie să conțină/Asau/AA) șipvaiOptionalContentAsKey(ISO 19005-2 6.9 — un dicționar de configurare a conținutului opțional nu trebuie să conțină cheia de stare automată/AS, nou relevantă deoarece PDF/A-2 permite conținutul opțional)
Version 1.64.0
Adăugat
ValidatePdfAa primit opt noi valoriTPdfAValidationIssue(ordinale adăugate, valorile existente rămân neschimbate):pvaiHeaderBinaryMarkerMissing(ISO 19005-1 6.1.2 — antetul%PDF-x.ytrebuie să fie urmat de un comentariu%cu cel puțin patru octeți mai mari de 127),pvaiExternalStreamRef(6.1.7 — un dicționar de flux nu trebuie să conțină/F,/FFiltersau/FDecodeParms),pvaiOutputIntentScheme(6.2.2 — intenția de ieșire/Strebuie să fie/GTS_PDFA1),pvaiInfoXmpDateMismatch(6.7.3 — InfoCreationDate/ModDatetrebuie să apară și caxmp:CreateDate/xmp:ModifyDate),pvaiMarkInfoMissing(6.8.2.2 — Nivelul A necesită/MarkInfocu/Marked true),pvaiAnnotationApDictViolation(6.5.3 Cor.2 — dicționarul de adnotare/APtrebuie să conțină doar/N),pvaiEmbeddedFileMissingAFRelationship(ISO 19005-3 Anexa E.2 — fiecare specificație de fișier asociată trebuie să conțină/AFRelationship) șipvaiJpeg2000Violation(ISO 19005-2 6.2.8.3 — o imagine JPEG2000 trebuie să declare 1, 3 sau 4 componente)
Remediat
ValidatePdfAnu mai raportează rezultate fals pozitivepvaiAnnotationFlagsViolationpe documentele care utilizează un nume de resursă de font cu o singură literă, cum ar fi/Font << /F 5 0 R >>; scanarea flagului/Feste acum condiționată de un context de adnotare (/Subtypeal unui tip de adnotare), potrivindu-se comportamentului documentat (6.5.3)ValidatePdfAraportează acum cerința de fișier asociat PDF/A-3 per fișier: un document este semnalat doar atunci când un/Type /Filespecîncorporat care face referire la un flux încorporat prin/EFnu are/AFRelationship, în loc de verificarea anterioară de tip orice-sau-niciunul pentru întregul document (ISO 19005-3 Anexa E.2)- S-a adăugat acțiunea depreciată
/SetStatela setul de acțiuni interzise alături de/SetOCGState, astfel încât numele de acțiune din Referința PDF să fie detectat direct (6.6.1)
Version 1.63.0
Adăugat (Adăugat)
- Adăugate
TPdf.MeasureTextșiTPdf.MeasureTextWidth: măsoară lățimea și înălțimea randată a textului într-un font și dimensiune date, fără a adăuga conținut în pagină (unități utilizator PDF, 1 unitate = 1/72 inch), permițând calcule de aspect și întrerupere automată a rândului deasupraAddText; furnizate de unitatea independentăFPdfMeasureca class helper
Modificat (Modificat)
- Demo-urile
Demo\Delphi\MergePDF,Demo\CBuilder\MergePDFșiDemo\Lazarus\MergePDFau fost îmbunătățite pentru toate cele trei IDE-uri: interval de pagini per fișier, cale de ieșire opțională, deduplicare, jurnal de execuție, buton de anulare, sumar al fuziunii; marcaje și metadate din prima sursă - Demo-urile CreatePDF includ acum opțiunea European Text pentru text accentuat ceh/francez/german/spaniol/portughez/polonez/turc, verificând selecția fontului și gestionarea Unicode (fostul demo EuropeanText a fost fuzionat)
- Au fost eliminate
ExtractTextPagesșiEuropeanText: extragerea pagină cu pagină este acoperită de opțiunile de interval de pagini/separator dinExtractText; randarea multilingvă din EuropeanText a fost fuzionată în CreatePDF
Version 1.62.2
Corectat
- Au fost regenerate antetele C++Builder (
.hpp) pentru fiecare versiune și platformă RAD Studio (Win32/Win64/Win64x); acestea deviaseră de la sursele Pascal, lăsând semnături de funcții învechite și unități lipsă care ajungeau la utilizatorii C++Builder prin distribuția sursă
Version 1.62.1
Corectat
- A fost restabilită compilarea surselor în RAD Studio 12 Athens și versiunile anterioare: o atribuire
TArray<Byte>din calea de validare PDF/UA folosea o conversie implicită de array disponibilă doar în Delphi 13, care nu se compila în IDE-urile mai vechi
Version 1.62.0
Adăugat (Adăugat)
TPdf.RenderPageThumbnailrandează orice pagină după index într-un bitmap potrivit la raportul de aspect, fără a schimba pagina curentă a documentului, pagina încărcată sau a declanșaOnPageChange
Corectat (Remediat)
TPdfThumbnailViewnu mai controleazăPageNumberal documentului gazdă în timpul desenării; anterior, fiecare redesenare reîncărca pagini, declanșaOnPageChangeși arunca pagina de text, ceea ce putea perturba unTPdfViewlegat și putea declanșa bucle de redesenare. Miniaturile sunt randate acum prinRenderPageThumbnailfără astfel de efecte secundare- Validarea conformității PDF/X inspectează acum documentele cu cross-reference streams (PDF 1.6, tipic pentru PDF/X-4) și obiectele stocate în compressed object streams, în loc să raporteze astfel de fișiere în bloc ca neconforme; marcajul
GTS_PDFXVersioneste citit atât din forma de element, cât și din forma de atribut RDF din XMP - Validarea PDF/R raportează acum
pvriInfoXmpMismatchcând Info dictionary și XMP diferă la Producer sau Creator; problema era declarată anterior, dar nu era ridicată niciodată - Temporizatoarele form-fill sunt urmărite per cerere, astfel încât un document care rulează mai multe temporizatoare simultan (de exemplu un JavaScript interval lângă clipirea field caret) le păstrează pe toate în loc să le piardă pe toate cu excepția celui mai recent
- Desenarea
TPdfViewși metodele sale publiceRenderPage/RenderTiledețin acum document render lock, serializându-se față de randarea worker-thread a aceluiașiTPdf(PDFium nu este thread-safe) - Textul non-ASCII scris în metadata PDF/X, PDF/R și PDF/VT (nume de condiții OutputIntent, Creator, Producer) este acum codificat ca șir UTF-16BE conform ISO 32000-1 §7.9.2.2 în loc de raw UTF-8, pe care cititoarele conforme l-ar interpreta greșit
- Helper-ele de conformitate citesc corect embedded metadata streams al căror
/Lengtheste o indirect reference, încarcă source bytes cuReadBuffer(astfel încât o citire scurtă eșuează curat) și resping un offsetstartxrefnegativ în loc să riște o citire în afara intervalului
Version 1.61.0
Modificat (Modificat)
- Corectări ale declarațiilor FFI/ABI care pot necesita recompilarea codului care a implementat callback-urile afectate: callback-ul form-fill
FFI_OpenFilepoartă acumcdecl(convenția de stivă Win32), iar parametrulvaluealFPDFAnnot_SetStringValueșiFPDFAttachment_SetStringValueeste acumFPDF_WIDESTRING(UTF-16LE) pentru a corespunde antetelor PDFium - Callback-urile progressive-load
FX_FILEAVAIL.IsDataAvailșiFX_DOWNLOADHINTS.AddSegmentprimesc acum offset-urisize_t, iarsize_tare lățimea unui pointer pe Free Pascal / Lazarus Win64 (anterior era trunchiat la 32 de biți), reparând apelurile API de disponibilitate a datelor și apelurile APIoutsize_tpe FPC Win64
Corectat (Remediat)
- Siguranța memoriei: un use-after-free al temporizatorului form-fill la distrugerea unui
TPdfcu un AcroForm caret activ; unFPDF_CloseDocumentdublu pe calea de eroare aImportNPagesToOne; excepții Pascal care ies din callback-urileFPDF_FILEWRITE/FPDF_FILEACCESSpeste granița C în timpul salvării și inserării JPEG; și un overflow întreg la extragerea textului când se citește de la un index de început până la sfârșitul paginii TPdfFuture<T>livrează acum în mod fiabil callback-ul de rezultat; răspunsul era anterior aproape întotdeauna pierdut (și putea atinge un thread eliberat) deoarece worker-ul se elibera singur înainte ca răspunsul pus în coadă să ruleze- Ieșirea PDF/A, PDF/X, PDF/E, PDF/R, PDF/VT și PDF/UA scrie acum intrări cross-reference care au exact 20 de bytes, așa cum cere ISO 32000-1 §7.5.4
- Inserarea markerilor de standarde nu mai distruge un dictionary când cheia eliminată, de exemplu
/Trapped, era ultima intrare, ceea ce înainte înghițea închiderea>>și producea un object malformat - Fluxurile ICC de tip OutputIntent declară acum numărul de componente
/Ncerut pentru PDF/X și PDF/VT (deja prezent pentru PDF/A); documentele sursă criptate sunt decriptate înainte ca markerii PDF/X, PDF/E, PDF/R, PDF/VT și PDF/UA să fie inserați, astfel încât ieșirea este validă și nu coruptă în tăcere - BOM-ul xpacket UTF-8 din XMP-ul generat este emis ca bytes exacți, reparând coruperea pe instalările Delphi al căror ANSI code page nu este Latin-1; trailerele de incremental-update păstrează acum referința documentului
/Info SaveAscu comprimare nu mai trunchiază stream-urile al căror/Lengtheste o indirect reference, iar tabelele cross-reference reconstruite folosesc acum intrări de 20 de bytes, generation numbers reale și renunță la pointerul/Prevvechi- Validarea conformității citește markerii de versiune XMP în formă de atribut pentru PDF/E și PDF/X (astfel fișierele PDF/X-4 serializate ca atribut sunt recunoscute), cere identificatorul exact
PDF/E-1, citește corect stream-urile de metadata cu/Lengthindirect și nu mai face false-match la cheia/IDsau/StructTreeRoota unui structure element când verifică trailerul PDF/UA; un offsetstartxrefmalformat nu mai ridică o eroare de interval TPdfThumbnailView: ultima pagină este acum accesibilă cu bara de derulare, pagina curentă a documentului gazdă este restaurată după desenarea miniaturilor, iar tratarea standard a evenimentului mouse-leave este emisă din nou- Bitmapurile de pagină și imagine în grayscale nu mai sunt randate cu o paletă greșită;
TPdfViewnu mai rămâne cu o referință dangling atunci cândTPdf-ul său este eliberat primul - Rapoartele de preflight: HTML este salvat ca UTF-8 pentru a corespunde charset-ului declarat, iar escaparea șirurilor JSON produce secvențe
\ucorecte pentru caracterele non-ASCII pe Free Pascal - Buildurile trial: dialogul de reamintire a perioadei de probă apare acum în loc să fie suprimat înainte să poată fi afișat
TPdfStreamAdapterrespinge acum stream-urile mai mari de 4 GiB cu o eroare clară, în loc să trunchieze în tăcere lungimea transmisă către PDFium
Version 1.60.1
Modificat
- Distribuțiile AccessibilityReader pentru Delphi, Lazarus și C++Builder rulează acum lectura cu voce tare pe
TPdfReadingSession: fiecare pagină este asamblată într-un singur fragment rostit cuBuildSpokenTextFromWords, pozițiile cuvintelor din SAPI alimenteazăFeedSpokenPosition, iar sesiunea avansează paginile și controlează cursorul de cuvinte al vizualizatorului, înlocuind orchestrarea scrisă manual pe care o purta înainte fiecare demo - Urmărirea tip karaoke la nivel de cuvânt din demo-uri funcționează acum și când NVDA este motorul de vorbire:
EstimatePacingtemperează cursorul de lectură după timpul scurs de vorbire, unde NVDA citea anterior cu voce tare fără nicio urmărire a cuvintelor - Pauza și reluarea în demo-uri funcționează acum și cu NVDA:
ResumeRestartsChunkredă din nou fragmentul curent de la început la Resume, iar SAPI își păstrează pauza și reluarea native în loc
Version 1.60.0
Adăugat
- Randarea live pentru vedere slabă pe
TPdfView: noile opțiuni de randarereInvertșireNightDuotonerecolorează fiecare tile de pagină randat (inversare completă a culorilor sau o paletă duotone nocturnă) înainte ca suprapunerile de căutare, selecție, citire și cursor de cuvinte să fie desenate, aducând transformările de culoare ale bitmap-ului deja existente în vizualizatorul interactiv pentru layout-urile cu o singură pagină și cele cu pagini alăturate; comutarea opțiunilor declanșează imediat o nouă randare NightDuotoneInkșiNightDuotonePaperconfigurează paleta nocturnă, folosind implicit text chihlimbariu pe o pagină neagră;reInvertare prioritate când ambele opțiuni sunt setate
Version 1.59.0
Adăugat
TPdfReadingSession: un component de orchestrare pentru citirea cu voce tare, independent de motorul de vorbire. Păstrează cursorul de fragment, cursorul de cuvinte și starea redării (Play/PlayFrom/Pause/Resume/Stop), avansează prin fragmenteleTPdfSpokenTextîncărcate pe măsură ce gazda raportează motorul inactiv prinTick, traduce pozițiile din textul rostit înapoi la caracterele paginii și controlează automat cursorul de cuvinte al unuiTPdfViewatașat; gazda conectează orice motor de vorbire prinOnSpeakși evenimentele de cerere pentru anulare / pauză / reluare, astfel încât biblioteca nu leagă ea însăși nicio API de vorbireFeedSpokenPositionconsumă pozițiile cuvintelor motorului (de exemplu SAPIStatus.InputWordPosition);EstimatePacingcuEstimatedWordsPerMinutetemperează motoarele fără semnal de poziție;ResumeRestartsChunkredă din nou fragmentul curent pentru motoarele fără pauză nativăOnChunkChange,OnWordChangeșiOnFinishedse declanșează doar la schimbări reale, iar un vizualizator atașat eliberat se detașează automat, astfel încât codul gazdă rămâne fără clipiri și rezistent la erori
Version 1.58.0
Adăugat
EstimateSpokenWordIndexestimează ce cuvânt rostește un motor de vorbire pe baza timpului scurs și a unei rate de cuvinte pe minut, oferind cuvintelor mai lungi mai mult timp în mod proporțional, astfel încât motoarele care nu raportează poziția cuvântului (cum este clientul NVDA controller) pot totuși controla cursorul de lectură la nivel de cuvânt; apelantul furnizează timpul scurs, astfel încât rutina rămâne independentă de ceas și ușor de testat
Version 1.57.0
Adăugat
- Asamblare de text rostit cu mapare în două domenii pentru urmărirea lecturii cu voce tare:
BuildSpokenTextFromWordsșiSpokenTextAppendconstruiesc șirul transmis motorului text-to-speech din casetele de cuvinte ale paginii, în timp ce înregistrează un tabel de segmente, iarSpokenToPageChartraduce un offset din textul rostit raportat de motor (de exemplu SAPIStatus.InputWordPosition) înapoi la indexul caracterului din pagină, astfel încât urmărirea evidențierii la nivel de cuvânt rămâne corectă când textul rostit nu este întregul text al paginii (zone omise, citire pe unități, înlocuiri de pronunție) TPdfSpokenTextșiTPdfSpokenSpanpoartă șirul rostit plus intervalele de pagină sursă din care a fost construit; offseturile de pe separatoarele inserate se rezolvă la următorul cuvânt mapat, iar offseturile dincolo de intervalele mapate nu găsesc nicio potrivire
Version 1.56.9
Adăugat
Demo\Delphi\PreflightReportadaugă o previzualizare Action Plan care condensează standardele neîndeplinite, prioritățile, următoarele acțiuni, codurile de problemă și recomandările într-o listă de remediereDemo\Delphi\PreflightReportCliacceptăplan/actionplanca format de ieșire pentru rulările pe fișier unic și în lot, scriind aceeași listă de remediere într-un fișier text
Modificat
- Ambele demo-uri Delphi PreflightReport afișează acum numărul de stări trece / acțiune / revizuire alături de totalul standardelor și problemelor
Version 1.56.8
Modificat
ViewerInteractionLabinclude acum controale pentru saltul paginii, controale manuale de zoom, jurnalizare a coordonatelor bazată pe clic pentruDeviceToPage/PageToDevice, și un jurnal de interacțiune mai clar pentru verificările de selecție, căutare, rotire și navigare- Paginile readme ale
ViewerInteractionLabdocumentează acum fluxul de interacțiune adăugat în setul localizat de readme-uri ale demo-urilor
Version 1.56.7
Adăugat
AccessibilityWorkbenchClimapează fiecare problemă detectată la Success Criteria WCAG 2.1 și la zona de clauză ISO 14289-1 (PDF/UA-1) și afișează o secțiune de acoperire a standardelor în rapoarteAccessibilityWorkbenchClicalculează un scor de accesibilitate documentat, de la 0 la 100, cu o grilă de penalizare publicată și o bandă excelent / bun / necesită lucru / slab, afișată per fișier și ca medie a lotuluiAccessibilityWorkbenchCliacceptăfailscore=Npentru a face rularea să eșueze (cod de ieșire 2) când orice fișier are scor sub NAccessibilityWorkbenchCliscrie un jurnal SARIF 2.1.0 când numele rezumatului lotului se termină în.sarif, cu câte o regulă pentru fiecare tip de problemă, purtând etichetele WCAG 2.1 și PDF/UA pentru CI și ingestie de code-scanningAccessibilityWorkbenchCliadaugă o comandăversioncare afișează versiunea PDFiumPas legată
Version 1.56.6
Adăugat
IntakeWorkbenchClicalculează o amprentă criminalistică SHA-256 pentru fiecare fișier de intrare (degradând launavailablepe compilatoare fărăSystem.Hash) și o raportează în toate formateleIntakeWorkbenchCliacceptăpasswords=file.txtpentru a încerca deblocarea documentelor protejate cu parolă dintr-o listă de candidați, înregistrând indexul candidatului potrivit fără a jurnaliza vreodată textul paroleiIntakeWorkbenchCliacceptăcopyto=dirpentru a direcționa fiecare fișier auditat într-un subfolder pe nivel de risc, transformând auditorul într-un sortator de intrareIntakeWorkbenchCliscrie un jurnal SARIF 2.1.0 când numele rezumatului lotului se termină în.sarif, cu câte o regulă pentru fiecare indicator de risc și câte un rezultat pentru fiecare fișier marcat pentru CI și ingestie de code-scanningIntakeWorkbenchCliadaugă o comandăversioncare afișează versiunea PDFiumPas legată
Version 1.56.5
Adăugat
IntakeWorkbenchClideduce acum acțiuni recomandate după introducere precum accept, request-password, manual-review, quarantine și deduplicate, și expune numărul de acțiuni în rezumatele lotuluiAccessibilityWorkbenchClideduce acum acțiuni recomandate de remediere precum pass-through, remediate-tags, run-ocr, remediate-semantics și manual-review, cu numere de acțiuni corespunzătoare în lot
Modificat
- Ambele demo-uri CLI de nivel profesional afișează acțiunea recomandată în ieșirile console, text, HTML, JSON și CSV, astfel încât operatorii de lot să poată direcționa fișierele fără a prelucra riscurile sau câmpurile de stare
Version 1.56.4
Corectat
- Citirea în buclă a adnotărilor, marcajelor sau adnotărilor de tip link nu mai scurge șirurile de text ale elementului anterior: înregistrările rezultat pentru
TPdfAnnotation,TBookmarkșiTLinkAnnotationsunt acum curățate cu inițializare conștientă de tipurile gestionate în loc de zeroizarea brută a memoriei, astfel încât documentele care conțin un număr foarte mare de adnotări cu text să nu mai crească memoria procesului pe durata de viață a aplicației - Distrugerea unui
TPdfcare înregistrase un handlerOnUnsupportedFeatureîl detașează acum din callback-ul PDFium global al procesului, astfel încât o încărcare ulterioară de document de la o altă instanțăTPdffără propriul handler nu mai poate apela componenta eliberată (use-after-free)
Version 1.56.3
Corectat
AccessibilityWorkbenchClinu mai numără paginile goale drept pagini euristice de ordine de citire, astfel încât documentele etichetate cu pagini separatoare goale își păstrează starea corectă de accesibilitate; paginile fără conținut lizibil sunt raportate separatAccessibilityWorkbenchClinu mai creditează o tabelă externă pentru celuleleTHcare aparțin unei tabele imbricate, iar numele câmpurilor de formular și ale fonturilor sunt comparate diferențiat după majuscule și minuscule, astfel încât câmpurile distincte să nu fie fuzionateIntakeWorkbenchCliinventarele gazdelor URL elimină acum userinfo, query și fragment, astfel încât un link construit precumtrusted.example@evil.exampleeste atribuit gazdei reale, iar țintelemailto:își contribuie domeniul în loc să rămână invizibileIntakeWorkbenchClirapoartele Markdown scapă backtick-urile din căile, gazdele și numele atașamentelor controlate de atacator, astfel încât formatarea raportului să nu poată fi spartă din interiorul documentului
Modificat
AccessibilityWorkbenchCliraportează eșecurile de scanare a fonturilor și a câmpurilor de formular ca contoare separate, marchează fonturile neîncorporate care au și instanțe încorporate, și limitează listele lungi de fonturi cu un marker explicit de trunchiereIntakeWorkbenchClirezumatele lotului adaugă o coloană cu numărul de adnotări-atașament, iar recensământul adnotărilor per pagină este limitat la 20000 de adnotări pe pagină, cu limita raportată în toate formatele
Version 1.56.2
Adăugat
AccessibilityWorkbenchCliauditează acum încorporarea fonturilor, tooltip-urile câmpurilor de formular, sursa ordinii de citire, contururile documentului, structura tabelelor și listelor, textul alternativ suspect și detalii de revizuire per pagină mai bogate, astfel încât rapoartele batch de accesibilitate să identifice mai multe ținte de remediereIntakeWorkbenchCliraportează acum limitele de scanare a paginilor, acțiunile launch și remote-go-to, inventarele gazdelor URI, numărul de adnotări, funcțiile PDFium neacceptate, identificatorii de document duplicat și indicatori de risc extinși pentru revizuirea automată a intrărilor
Modificat
IntakeWorkbenchCliacceptămaxpages=Nîn modurile pe fișier unic și în lot pentru a limita scanările de pagini per document, completând totuși raportarea de metadate, atașamente, script, XFA, semnături și risc
Version 1.56.1
Corectat
- Încărcarea unui
pdfium.dllmai vechi căruia îi lipsește un export mai nou eșuează acum curat: calea de eșec resetează fiecare punct de intrare API legat, astfel încât verificărileAssigned()(de exemplu peFPDF_GetLastErrorsauFPDF_GetSecurityHandlerRevision) raportează biblioteca ca neîncărcată în loc să apeleze modulul deja descărcat și să se prăbușească cu o violare de acces UnloadLibrarygolește acum toate legăturile API PDFium, nu doar ajutoarele V8 opționale, astfel încât nicio adresă de funcție veche să nu supraviețuiască după eliberarea DLL-ului
Version 1.56.0
Adăugat
- Cursor de citire karaoke la nivel de cuvânt pe
TPdfView:TrackReadingWordAtmapează offsetul de caracter al cuvântului curent dintr-un motor text-to-speech (de exemplu SAPIStatus.InputWordPosition) pe casetele de cuvinte ale paginii, evidențiază cuvântul care îl conține ca o suprapunere distinctă deasupra blocului de citire, îl aduce în vedere și returnează indexul cuvântului, astfel încât cuvântul rostit să se lumineze pe măsură ce vocea avansează SetReadingWordșiClearReadingWordsetează sau curăță direct cuvântul evidențiat dintr-unTPdfWordBox; re-setarea aceluiași cuvânt nu face nimic, astfel încât urmărirea pe cuvinte nu face niciodată vizualizatorul să clipeascăReadingWordColorșiReadingWordFollowcontrolează culoarea cursorului de cuvinte și dacă vizualizatorul derulează automat cuvântul rostit în vedere
Version 1.55.2
Corectat
- ViewerInteractionLab oferă acum rândurilor din bara de instrumente mai mult spațiu vertical, astfel încât controalele Open PDF, Create Sample, navigare, căutare și selecție să nu se mai suprapună la fonturi scalate
Version 1.55.1
Corectat
- ViewerInteractionLab plasează acum Prev, Next și Rotate pe al doilea rând al barei de instrumente, evitând suprapunerea de la pornire cu Open PDF și Create Sample
Version 1.55.0
Adăugat
- Punte de la cuvânt la selecție pentru lectura „citește-l, selectează-l”:
TPdfView.SelectWordBoxșiSelectWordSpanselectează o singură casetă de cuvânt sau un interval de casete de cuvinte de pe aceeași pagină (dinPageWordBoxes) după intervalele lor de caractere, astfel încât cuvântul sau linia citită în acel moment să poată fi și selectată și copiată WordBoxIndexAtCharIndexmapează un index de caracter înapoi la caseta de cuvânt care îl conține, conducând evidențierea cuvânt cu cuvânt pe măsură ce cursorul de citire TTS avansează
Version 1.54.0
Adăugat
- Accesoriile de completare vocală a formularelor citesc câmpul focalizat direct din cursorul logic:
FocusedFormFieldValue,FocusedFormFieldNameșiFocusedFormFieldDetailspeTPdfșiTPdfViewraportează valoarea câmpului curent, numele lizibil pentru utilizator (tooltip-ul/TU, cu revenire la/T) șiTPdfFormFieldInfocomplet (type, flags, options) — tot ce are nevoie o interfață vocală ca să anunțe pe măsură ce trece printr-un formular
Corectat
FocusedFormFieldValuecitește câmpul dupăFocusedFormFieldIndexîn loc de focusul interactiv pdfium, astfel încât un completator de formulare condus vocal primește valoarea corectă chiar și fără cursor pe ecran (textul existentFocusedFormFieldTextreflectă în continuare focusul pdfium și rămâne neschimbat)
Version 1.53.0
Adăugat
- Suport pentru evidențiere la nivel de cuvânt:
TPdf.PageWordBoxesșiTPdfView.PageWordBoxesîmpart o pagină în înregistrăriTPdfWordBox, fiecare purtând textul cuvântului, intervalul său de caractere și un dreptunghi de încadrare în spațiul paginii, astfel încât un cititor de accesibilitate poate evidenția pe rând fiecare cuvânt rostit („karaoke” reading) prin trimiterea dreptunghiului laSetReadingHighlight BuildWordBoxesexpune separat pasul tokenizerului, transformând textul paginii în casete de cuvinte cu intervale de caractere
Version 1.52.0
Adăugat
- Ajutoarele de randare pentru vedere slabă
InvertPdfBitmap,GrayscalePdfBitmapșiDuotonePdfBitmapaplică transformări de culoare in-place unui bitmap randat pe 32 de biți, astfel încât un cititor de accesibilitate poate prezenta pagini inversate / dark-mode, în tonuri de gri sau într-o schemă personalizată cu două culori (de exemplu fundal închis cu text deschis) pentru utilizatorii cu vedere slabă - Transformările rulează per pixel și se comportă identic pe VCL și Lazarus/LCL, fără să modifice dimensiunile bitmap-ului
Version 1.51.0
Adăugat
- Unități de citire la nivel de propoziție pentru citire-asistată cu ascultare:
TPdf.ReadingUnits,TPdf.DocumentReadingUnitsșiTPdfView.ReadingUnitslinearizează fluxul de conținut lizibil în înregistrăriTPdfReadingUnitordonate, de dimensiunea unei propoziții — fiecare poartă textul de rostit plus tipul semantic, pagina, dreptunghiurile de evidențiere și eticheta de limbă, astfel încât o aplicație de screen-reader poate parcurge o pagină sau întregul document o unitate rostită pe rând - Navigare semantică cu
NextReadingUnitOfKind, permițând unei interfețe vocale să sară la următorul sau precedentul heading, figură, element de listă sau celulă de tabel fără a scana manual fluxul BuildReadingUnitsconvertește direct oriceTPdfContentFragmentsîn unități de citire: heading-urile și descrierile figure/alt rămân întregi, în timp ce paragrafele se împart la limitele propozițiilor, punctele zecimale sunt păstrate, iar cursorul de citire este un index simplu, deținut de apelant
Version 1.50.0
Adăugat
ValidatePdfApoate inspecta acum documente PDF 1.5+ care stochează catalogul, OutputIntent sau alte dictionary-uri în fluxuri de obiecte comprimate (/Type /ObjStm). Fluxurile de obiecte sunt expandate, iar obiectele pe care le conțin sunt rezolvate, astfel încât astfel de documente sunt validate pe baza conținutului lor în loc să fie raportate ca și cum le-ar lipsi markerii PDF/A
Version 1.49.5
Corectat
ValidatePdfAnu mai raportează ca problemă lipsa descrieriipdfaExtension:schemas. Schema de identificator PDF/A (pdfaid) este bine cunoscută, așa că nici veraPDF, nici PDF/A-2/-3 nu cer pentru ea o descriere extension-schema, iar marcarea absenței ei raporta greșit orice PDF/A terț conform. Documentele produse chiar de bibliotecă includ în continuare descrierea
Version 1.49.4
Corectat
ValidatePdfAdetectează acum nivelul de conformitate când identificatorul PDF/A este scris ca atribute XML (pdfaid:part="2") și nu ca elemente copil, astfel încât documentele în formă de atribute nu mai sunt raportate cu nivel necunoscut. Asta corectează și o cascadă în care un nivel nedetectat făcea ca verificările specifice părții să revină la regulile stricte PDF/A-1 și să marcheze greșit fișierele încorporate și transparența pe care PDF/A-2 și PDF/A-3 le permit
Version 1.49.3
Corectat
ValidatePdfAinspectează acum documente PDF 1.5+ ale căror date cross-reference sunt un flux cross-reference (fișiere care nu au cuvântul cheietrailer). Nivelul de conformitate, trailer/IDși ceilalți markeri sunt citiți din dictionary-ul fluxului cross-reference, astfel încât astfel de documente sunt validate pe baza conținutului lor și nu raportate ca fiind complet neconforme
Version 1.49.2
Corectat
ValidatePdfAnu mai raportează o problemă falsă de font neîncorporat pe documente care își încorporează toate fonturile. Heuristica anterioară compara numărul de token-uri/FontDescriptorcu programele de font încorporate, dar fiecare font încorporat contribuie cu două token-uri/FontDescriptor(referința din dictionary-ul fontului plus obiectul descriptor), așa că orice fișier cu fonturi încorporate era marcat greșit. Verificarea raportează acum doar un document care referă fonturi, dar nu încorporează deloc niciun program de font, în acord cu corectarea corespunzătoare dinValidatePdfUa
Version 1.49.1
Corectat
- Ieșirea PDF/A se validează acum ca PDF/A-1b și PDF/A-1a conform cu veraPDF: fluxul ICC al OutputIntent-ului sRGB încorporat (referit de
/DestOutputProfile) declară acum numărul de componente/Ncerut (3 pentru profilul RGB încorporat), așa cum cere ISO 19005-1 6.2.3.2. Documentele produse deSaveAsPdfApicau anterior validarea strictă PDF/A-1 deoarece fluxul profilului de destinație omitea/N; valoarea se derivează din antetul profilului ICC, astfel încât și un profil CMYK sau Gray furnizat de apelant primește numărul corect
Version 1.49.0
Corectat
ValidatePdfUanu mai raportează identificare XMP lipsă falsă pe PDF-uri etichetate conforme — identificatorul PDF/UA (pdfuaid:part),dc:title, datele XMP și trailerul/IDsunt acum citite din bytes-urile documentului original, nu din copia salvată din nou, care omite fluxul XMP/Metadatași, pentru fișierele cu cross-reference stream, trailerul/ID- Verificarea de încorporare a fonturilor din
ValidatePdfUaa fost corectată, astfel încât un document care își încorporează toate fonturile nu mai este raportat ca având fonturi neîncorporate; acum marchează doar un document care referă fonturi, dar nu încorporează deloc niciun program de font ValidatePdfUaacceptă acum un element de structurăFormulaal cărui text alternativ este furnizat prinActualTextși nu printr-o intrareAlt(ISO 14289-1 §7.7), în acord cu regula existentă pentruFigure
Version 1.48.0
Adăugat
- Selectarea programatică a textului în
TPdfView:SelectTextRange(după pagină și interval de caractere) șiSetSelection(după intervale explicite pe pagină) selectează textul din cod — de exemplu pentru a citi și evidenția un pasaj; ambele redesenează și emitOnSelectionChangecând selecția se schimbă.SelectionRangescitește selecția curentă ca intervale de caractere pe pagină, iarSelectionRectanglesreturnează dreptunghiurile ei în coordonate de pagină pentru evidențiere personalizată sau scroll-to
Version 1.47.0
Adăugat
- Navigarea câmpurilor de formular pentru completare vocală, atât în
TPdf, cât și înTPdfView:FormFieldTabOrder,FocusedFormFieldIndex,FocusFormField,FocusNextFormField,FocusPreviousFormField,ClearFormFieldFocusșiFocusedFormFieldText. Acestea mută un cursor logic al câmpului peste câmpurile widget ale paginii în ordinea tabulației (cu reluare la capete), astfel încât un cititor asistiv poate parcurge formularul, anunța fiecare câmp prinFormFieldInfo[Index].AlternateName(tooltip-ul /TU) și îl poate completa prinFormField[Index] - Evenimentul
TPdfView.OnFormFieldFocusChange, declanșat când cursorul câmpului se mută (transmițând noul index al câmpului sau -1 când este curățat)
Version 1.46.0
Adăugat
- Flux de conținut pentru citire asistată:
TPdf.ReadableContent,TPdf.ReadablePageContent,TPdf.DocumentReadableContentșiTPdfView.ReadableContentreturnează o listă ordonată de elemente semanticeTPdfContentFragment, fiecare cu textul rostit (glife reale sauActualText/Alt pentru figuri), un tip de fragment (titlu cu nivel, paragraf, figură, element de listă, celulă de tabel, link, simplu), limba, pagina numerotată de la 1 și dreptunghiuri de evidențiere pe bloc și pe linie. PDF-urile cu tag-uri sunt linearizate în ordinea logică de citire din arborele de structură; paginile fără tag-uri cad înapoi la ordinea de randare, astfel încât orice document poate fi citit cu voce tare - Evidențiere sincronizată a citirii în
TPdfView:SetReadingHighlight,ClearReadingHighlightși proprietatea publicatăReadingHighlightColorevidențiază blocul care este citit în acel moment, peste suprapunerile de căutare și selecție - Tipuri publice noi
TPdfContentFragment,TPdfContentFragments,TPdfReadableContent,TPdfContentFragmentKindșiTPdfReadingOrderSource, plus noul helperClassifyStructType
Version 1.45.0
Adăugat
ValidatePdfUaparcurge acum și arborele de structură tag-uit activ și raportează trei încălcări ale conținutului cu mare încredere pe care scanarea la nivel de octet nu le poate detecta: un elementFigurefără intrare Alt și fără ActualText (ISO 14289-1, 7.3), un elementFormulafără atribut Alt (7.7) și un elementNotefără ID unic (7.9). Trei valori noiTPdfUaValidationIssueexpun aceste cazuri:pvuaiFigureMissingAlt,pvuaiFormulaMissingAltșipvuaiNoteMissingId. Parcurgerea arborelui este omisă pentru documentele fără tag-uri- Noul helper public
ValidatePdfUaStructureElementsaplică acele reguli ale arborelui de structură unei liste plate de elemente (așa cum este returnată deTPdf.StructureElements), astfel încât verificările pot fi rulate sau testate unitar fără a încărca un document complet
Version 1.44.5
Corectat
- Verificarea de încorporare a fonturilor din
ValidatePdfA(pvaiFontNotEmbedded, ISO 19005-1, 6.3.4) detectează acum și fonturi simple neîncorporate care nu au niciun/FontDescriptor, în special cele 14 fonturi standard Type 1 (Helvetica, Times, Courier și altele) pe care PDF/A le cere încorporate fără nicio excepție. Înainte, un astfel de font trecea neobservat; verificarea numără acum și dicționarele de font simplu (/Type1,/TrueType,/MMType1) față de programele de font încorporate, în oglindă cu corecția PDF/UA din 1.44.3
Version 1.44.4
Corectat
ValidatePdfVTrespinge acum arbori DPart ISO 16612-2 §6.5 malformați în care/DPartseste un tablou plat de referințe în loc de tabloul cerut de tablouri sau în care un DPart frunză repetă pagina/Startca/End, deși intervalul conține o singură paginăValidatePdfVTvalidează acum numele din/NodeNameListca valori XML NMTOKEN după extinderea escapării PDF name#xx, astfel încât numele invalide ale nivelurilor ierarhice sunt raportate prinpvviMissingDPartRootîn loc să fie acceptate ca structură DPart utilizabilă
Version 1.44.3
Corectat
- Verificarea de încorporare a fonturilor din
ValidatePdfUa(pvuaiFontNotEmbedded, ISO 14289-1, 7.21.4) detectează acum și fonturi simple neîncorporate care nu au niciun/FontDescriptor, în special cele 14 fonturi standard Type 1 (Helvetica, Times, Courier și altele) pentru care PDF/UA nu acordă nicio excepție de încorporare. Înainte, un astfel de font trecea neobservat și un document care îl folosea putea fi raportat ca fiind conform; verificarea numără acum și dicționarele de font simplu (/Type1,/TrueType,/MMType1) față de programele de font încorporate
Version 1.44.2
Corectat
ValidatePdfVTlasă acum un markerpdfvtid:GTS_PDFVTVersionprezent dar nerecunoscut capvcUnknownîn loc să-l coboare lapvcNone. Asta păstrează distincte șiruri invalide la nivel de fișier precumPDF/VT-2sfață de documentele care nu au niciun marker PDF/VT; PDF/VT-2s este identificat de antetul fluxului MIME din ISO 16612-2 Anexa A, nu de markerul XMP al unui fișier PDF- Verificarea
/DPartRootvalidează acum mai strict semantica arborelui ISO 16612-2 §6.5:/DPartRootNodeși/NodeNameListtrebuie să descrie adâncimea reală a DPart, legăturile părinte ale DPart trebuie să formeze un arbore,/Startși/DPartsse exclud reciproc, iar fiecare/DPartde pagină trebuie să indice DPart-ul frunză care o acoperă, în aceeași ordine depth-first ca arborele paginii
Version 1.44.1
Corectat
SaveAsPdfVTscrie acum o ierarhie minimă de Document Part Hierarchy ISO 16612-2 §6.5 atunci când PDF-ul sursă nu are un/DPartRootutilizabil. Arborele generat leagă fiecare pagină prin/DPart, păstrează o ierarhie existentă validă și lasă metadatele mai bogate despre destinatar/DPM în grija fluxului care apeleazăValidatePdfVTvalidează acum structura DPart utilizabilă, citește valorile PDF/VT XMP atât din atribute RDF, cât și din textul elementelor, și impune împerecherea exactă PDF/VT cu baza PDF/X: PDF/VT-1 necesită PDF/X-4, iar PDF/VT-2 necesită PDF/X-4p, PDF/X-5g sau PDF/X-5pgTPdfVTSaveOptions.Conformance = pvc2nu mai scrie markere invalide pentru fișier unic PDF/VT-2. Scriitorul pentru fișier unic normalizează ieșirea la PDF/VT-1 deoarece PDF/VT-2 cere semantica de set de fișiere
Version 1.44.0
Adăugat
ValidatePdfUaraportează acum și încălcări verificabile la nivel de conținut ale PDF/UA, pe lângă marker-ele de format de fișier: un program de font care nu este încorporat (ISO 14289-1, 7.21.4), un font care nu are un CMap/ToUnicodecând nu este prezentă o codare de font simplu exceptată (7.21.7) și un document care conține adnotări dar nu declară nicio ordine a tabulatorului pe pagină/Tabs /S(7.18.3)- Trei valori noi
TPdfUaValidationIssue—pvuaiFontNotEmbedded,pvuaiFontMissingToUnicodeșipvuaiMissingTabsOrder— sunt expuse deValidatePdfUași în raportul de preflight. Sunt euristici grosiere, menite ca indicii de preflight mai degrabă decât ca verificare completă ISO 14289-1
Version 1.43.1
Corectat
SaveAsPdfUaimpune acum intrările obligatorii de catalog ISO 14289-1, 7.1/ViewerPreferences/DisplayDocTitle trueși/MarkInfo/Marked true/Suspects falsechiar și atunci când documentul sursă furnizează deja acele dicționare cu valori lipsă sau contradictorii. Înainte, marker-ele erau injectate doar când dicționarele lipseau complet, astfel că o sursă care conținea, de exemplu, un/ViewerPreferencesfărăDisplayDocTitlesau un/MarkInfocu/Marked falsese întorcea într-un fișier neconform- Cheile existente într-un dicționar
/ViewerPreferencessau/MarkInfopreexistent sunt păstrate, iar un dicționar furnizat ca referință indirectă este rezolvat înainte de aplicarea cheilor obligatorii
Version 1.43.0
Adăugat
ValidatePdfAaplică acum regulile PDF/A-2 / PDF/A-3 pentru fișiere încorporate și asociate și pentru textul Level U. Fișierele încorporate rămân respinse pentru PDF/A-1; pentru PDF/A-3, un fișier încorporat care nu are cheia obligatorie/AFRelationship(ISO 19005-3 Anexa E) este semnalat, în timp ce atașamentele PDF/A-2 sunt permise (propria lor conformitate nu este verificată recursiv). O problemă nouăpvaiUnicodeMappingMissingraportează un document PDF/A-2u sau PDF/A-3u ale cărui fonturi nu au nicio mapare/ToUnicode(ISO 19005-2 6.2.11.7). Transparența și conținutul opțional rămân semnalate doar pentru PDF/A-1
Version 1.42.0
Adăugat
- PDF/A-2 (ISO 19005-2) și PDF/A-3 (ISO 19005-3) sunt acum acceptate la toate cele trei niveluri de conformitate — a, b și u — de
SaveAsPdfA,ValidatePdfAși proprietateaPdfAConformance. EnumerareaTPdfAConformanceprimeștepac2a,pac2u,pac3așipac3u(PDF/A-1 nu are Level u). Salvarea scriepdfaid:partpotrivit (2 sau 3) șipdfaid:conformance(A, B sau U), păstrând subtipul OutputIntentGTS_PDFA1pe care ISO 19005-2 îl menține pentru compatibilitate. O cerere de Level A coboară în continuare la Level B-ul potrivit (pentru orice part) când documentul nu are structura tag-uită cerută de acel nivel
Version 1.41.0
Adăugat
ValidatePdfAdetectează acum și încălcări PDF/A la nivel de conținut pe care injectarea de marker-e nu le poate repara, pe lângă marker-ele structurale pe care le raporta deja: JavaScript și alte acțiuni interzise, acțiuni suplimentare (/AA), fișiere încorporate,LZWDecode, transparență (măști de transparență și grupuri de transparență), conținut opțional (/OCProperties), subtipuri de adnotări interzise (FileAttachment, Sound, Movie, 3D, Screen), AcroForm/NeedAppearances trueși/XFA, fonturi ale căror descriptori nu conțin un program de font încorporat și o revendicare Level A făcută fără structura tag-uită cerută de ISO 19005-1 6.8. Verificările pentru transparență, conținut opțional și fișiere încorporate se aplică doar la PDF/A-1 (aceste funcții sunt permise în PDF/A-2 și PDF/A-3). Valori noiTPdfAValidationIssueexpun fiecare caz; valorile existente rămân neschimbate
Version 1.40.3
Corectat
SaveAsPdfAelimină acum orice criptare a documentului sursă înainte de a produce ieșirea PDF/A. ISO 19005-1 6.1.3 interzice cheia/Encryptdin trailer, dar calea de salvare păstra anterior handlerul de securitate al sursei, astfel că salvarea unui document criptat ca PDF/A producea un fișier criptat și neconform. Salvarea PDF/A decriptează acum documentul mai întâi. Documentele necriptate nu sunt afectate
Version 1.40.2
Corectat
SaveAsPdfAnu mai emite o afirmație falsă de conformitate PDF/A Level A. Când este cerut Level A (pac1a) dar documentul sursă nu are marker-ele de structură tag-uită cerute de ISO 19005-1 6.8 — un/StructTreeRootîn catalog și un dicționar/MarkInfocu/Marked true— fișierul salvat este acum identificat ca Level B-ul potrivit (pdfaid:conformance=B) în loc să declare Level A. Ieșirea PDF/A-1b pur vizuală nu este afectată
Version 1.40.1
Corectat
- Validarea conformității versiunii PDF a fost înăsprită astfel încât acțiunea
SetOCGState(set-optional-content-group-state) este recunoscută ca funcție PDF 1.5. Salvarea către o țintă PDF 1.2, 1.3 sau 1.4 care conține o acțiuneSetOCGStateeste acum respinsă pentru a se potrivi cu ISO 32000-1 (Table 198); înainte, o astfel de acțiune putea trece în ieșirea pentru versiuni mai vechi. Acțiunea distinctă, învechită, PDF 1.2SetStateeste încă acceptată începând cu PDF 1.2
Version 1.40.0
Adăugat
- Am legat API-ul upstream
FPDFPageObj_AddExistingMark(), care atașează un marker de conținut existent unui obiect de pagină. Când obiectele de pagină consecutive împart același marker, PDF-ul salvat le comasează într-un singur marker care le acoperă pe toate; obiectele neconsecutive primesc copii separate - Am legat API-ul upstream
FPDFTextObj_SetFontSize()pentru schimbarea dimensiunii în puncte a unui obiect text existent, completând legătura existentăFPDFTextObj_GetFontSize()
Modificat
- Am actualizat DLL-urile runtime PDFium incluse (Win32 și Win64, builduri standard și V8) la snapshot-ul upstream din 2026-06-02
Version 1.39.53
Modificat
- Am schimbat demo-urile Delphi
PDFViewer,SplitViewșiMultiPageViewerpentru a deschide documentele implicit în modulZoom to Page - Randarea inițială încadrează acum întreaga pagină în suprafața vizualizatorului înainte ca utilizatorul să aleagă un nivel de zoom manual
- Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.53
Version 1.39.52
Modificat
- Am îmbunătățit
Demo\Lazarus\CreatePDF, astfel încât exemplul introductiv generează acum un PDF pe două pagini cu căi vectoriale, conținut de tabel, o imagine încorporată, o adnotare de text, text rotit și un ghid mai clar de construire a documentului - Am adăugat pagini
README.htmlfinisate pentru fiecare folder de demo Delphi, C++Builder și Lazarus, înlocuind restul README-urilor text-only cu un ghid lizibil în browser - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.52
Version 1.39.51
- Am îmbunătățit rezumatele batch din
Demo\Delphi\PreflightReportClicu totaluri de stare standard pentru Pass, Action required și Review pentru standardele selectate - Rândurile per fișier includ acum numărul de acțiuni necesare și de revizuire în rezumatele TXT / HTML / JSON / CSV, făcând artefactele CI mai ușor de inspectat fără a deschide fiecare raport generat
- Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.51
Version 1.39.50
- Am îmbunătățit modul batch pe directoare din
Demo\Delphi\PreflightReportCli, astfel încâtbatchdir=foldercolectează căile PDF descoperite, le sortează și apoi generează rapoartele într-o ordine stabilă - Scanările recursive de directoare produc acum o ordine reproductibilă a rapoartelor și rândurilor de rezumat, în timp ce procesarea explicită
batch=list.txtcontinuă să păstreze ordinea din fișierul listă - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.50
Version 1.39.49
- Am îmbunătățit rezumatele batch din
Demo\Delphi\PreflightReportClipentru a înregistra setările de rulare: tipul sursei, calea sursei, starea recursivă, directorul de ieșire, formatul raportului, standardele selectate și modulfailon= - Rezumatele JSON includ acum un obiect
run, rezumatele TXT și HTML afișează o secțiune cu setările de rulare, iar rândurile CSV repetă aceleași coloane de audit pentru foi de calcul și pentru pipeline-urile CI - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.49
Version 1.39.48
- Am îmbunătățit denumirea ieșirilor batch din
Demo\Delphi\PreflightReportCli, astfel încât numele de fișiere de intrare duplicate care împart un singuroutdir=să nu își mai suprascrie rapoartele generate - Rulările batch adaugă acum sufixele
-2,-3și următoarele când o cale de raport generat a fost deja atribuită în aceeași rulare, iar rezumatele înregistrează calea finală sigură la coliziuni a raportului - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.48
Version 1.39.47
- Am îmbunătățit rezumatele batch din
Demo\Delphi\PreflightReportCli, astfel încât ieșirile TXT și JSON includ acum totaluri agregate pentru total fișiere, fișiere procesate, fișiere eșuate, probleme și potrivirifailon= - Rezumatele CSV rămân un tabel pur de rânduri pentru consumatorii existenți, în timp ce rezumatele HTML continuă să afișeze aceleași metrici agregate în antetul dashboard-ului
- Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.47
Version 1.39.46
- Am îmbunătățit
Demo\Delphi\PreflightReportClicusummary=batch.html/.htm, astfel încât rulările batch să poată emite un dashboard lizibil în browser alături de manifeste TXT / CSV / JSON - Rezumatele HTML afișează metricile total, procesate, eșuate, probleme și potriviri
failon=, apoi listează fiecare intrare cu linkuri către raport, stare, număr și textul erorii - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.46
Version 1.39.45
- Am îmbunătățit
Demo\Delphi\PreflightReportClicubatchdir=folderșirecursive, astfel încât scripturile să poată scana directoarele PDF direct, fără să scrie mai întâi un fișier listă - Modul batch pe directoare reutilizează comportamentul
outdir=,summary=,standards=șifailon=din modul batch bazat pe listă, în timp ce scanările non-recursive văd doar folderul selectat, iarrecursiveinclude subfolderele - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.45
Version 1.39.44
- Am îmbunătățit
Demo\Delphi\PreflightReportClicusummary=batch.csv|json|txt, astfel încât rulările batch să poată emite un manifest lizibil de mașină alături de rapoartele per fișier - Rezumatele batch includ fiecare cale de intrare, calea raportului, starea, numărul de standarde, numărul de standarde trecute, numărul de probleme, starea de potrivire
failon=și textul erorii pentru joburile CI și scripturile externe - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.44
Version 1.39.43
- Am îmbunătățit
Demo\Delphi\PreflightReportClicubatch=list.txtșioutdir=reports, astfel încât scripturile să poată genera rapoarte de preflight pentru o listă de fișiere PDF într-o singură rulare - Modul batch sare peste liniile goale și liniile de comentariu
#, derivă fiecare nume de raport.preflight.<ext>din PDF-ul de intrare, continuă după erorile per fișier și rezumă fișierele procesate și eșuate înainte de a reveni - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.43
Version 1.39.42
- Am îmbunătățit
Demo\Delphi\PreflightReportClicufailon=none|issues|action|review, astfel încât joburile CI să poată transforma rezultatele de preflight generate în coduri de ieșire deterministe - CLI-ul returnează acum codul de ieșire 2 când o regulă selectată
failon=se potrivește după ce fișierul raportului și PDF-ul opțional cu raport atașat au fost generate, în timp ce erorile de execuție continuă să returneze codul de ieșire 1 - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.42
Version 1.39.41
- Am îmbunătățit
Demo\Delphi\PreflightReportClicuattach=output.pdf, astfel încât un raport de preflight generat să poată fi încorporat ca atașament la nivel de document într-o copie PDF nouă - CLI-ul păstrează pe disc fișierul raport TXT / HTML / Markdown / JSON / CSV generat și refuză să îl atașeze înapoi în calea PDF-ului de intrare original, reducând riscul de suprascriere accidentală
- Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.41
Version 1.39.40
- Am adăugat
Demo\Delphi\PreflightReportCli, un companion de consolă Delphi pentru generarea scriptabilăFPdfPreflightReportfără a deschide un vizualizator - CLI-ul suportă crearea de eșantioane fără argumente plus argumente de intrare / ieșire, parolă opțională, formate de ieșire
text/html/md/json/csvși filtrarestandards=pentru PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R și PDF/VT - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.40
Version 1.39.39
- Am îmbunătățit
FPdfPreflightReportcuTPdfPreflightReport.ToMarkdownșiSaveMarkdownToFile, astfel încât rapoartele de preflight să poată fi exportate ca Markdown prietenos cu tracker-ele de probleme - Am actualizat demo-urile Delphi, C++Builder și Lazarus
PreflightReportcu comutarea previzualizării Markdown și acțiuni Save MD alături de fluxul existent TXT / HTML / JSON / CSV - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.39
Version 1.39.38
- Am îmbunătățit demo-urile Delphi, C++Builder și Lazarus
SecurityAuditcu exportul raportului de audit în JSON alături de fluxul existent TXT de salvare / copiere - Raportul JSON conține
format,generatedAt,summary,findingCountși rânduri structuratefindingscu câmpurile severity, area și detail - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.38
Version 1.39.37
- Am îmbunătățit
FPdfPreflightReportcuTPdfPreflightReport.ToCsvșiSaveCsvToFile, astfel încât rapoartele de preflight să poată fi exportate ca CSV prietenos cu foile de calcul - Am actualizat demo-urile Delphi, C++Builder și Lazarus
PreflightReportcu comutarea previzualizării CSV și acțiuni Save CSV alături de fluxul existent TXT / HTML / JSON - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.37
Version 1.39.36
- Am îmbunătățit
FPdfPreflightReportcuTPdfPreflightReport.IssueCategoryCountsplus tipurile reutilizabileTPdfPreflightIssueCategoryCountșiTPdfPreflightIssueCategoryCountspentru agregarea problemelor la nivel de marker după categorie - Am actualizat
TPdfPreflightReport.ToText,ToHtmlșiToJson, astfel încât ieșirea PreflightReport generată să includă rezumate ale numărului pe categorii de probleme alături de rândurile per standard și recomandările detaliate de problemă - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.36
Version 1.39.35
- Am redenumit exemplul extins
PrintDialogînPrintPreferencesîn Delphi, C++Builder și Lazarus, astfel încât numele demo-ului să corespundă acum preferințelor de printare ale autorului PDF, tipăririi N-up, filtrării odd / even, grayscale, bordurii celulei și fluxului de mapare duplex - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.35
Version 1.39.34
- Am îmbunătățit
Demo\Delphi\PrintPDFcu încărcare PDF prin drag-and-drop și am documentat fluxul existentDemo\CBuilder\PrintPDFalături de exemplele PrintPDF pentru Delphi și Lazarus - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.34
Version 1.39.33
- Am adăugat
Demo\CBuilder\SplitView, completând matricea de exemple SplitView pentru Delphi, C++Builder și Lazarus - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.33
Version 1.39.32
- Am adăugat
Demo\Lazarus\SplitView, aducând compararea PDF side-by-side în Lazarus cu layout-uri pe două sau trei panouri, navigare în vizualizarea activă, comenzi sincronizate, presetări de zoom și rotire - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.32
Version 1.39.31
- Am adăugat
Demo\Lazarus\PrintPDF, aducând fluxul standard de printare PDF în Lazarus cu navigare în previzualizare, intervale de pagini, copii, modul collate, progres și anulare - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.31
Version 1.39.30
- Am adăugat
Demo\Lazarus\FontProperties, completând matricea de exemple FontProperties pentru Delphi, C++Builder și Lazarus - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.30
Version 1.39.29
- Am adăugat
Demo\CBuilder\FontProperties, aducând inspectarea indexată a caracterelor și a metadatelor fontului în C++Builder alături de exemplul Delphi - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.29
Version 1.39.28
- Am adăugat
Demo\Delphi\ExtractTextPages, completând matricea de exemple de extragere a textului per pagină pentru Delphi, C++Builder și Lazarus - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.28
Version 1.39.27
- Am adăugat
Demo\Lazarus\PrintDialog, completând matricea de exemple PrintDialog pentru Delphi, C++Builder și Lazarus - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.27
Version 1.39.26
- Am adăugat
Demo\CBuilder\PrintDialog, aducând în C++Builder fluxul de tipărire N-up și preferințele de printare ale autorului PDF alături de exemplul Delphi - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.26
Version 1.39.25
- Am adăugat
Demo\CBuilder\ViewerInteractionLab, completând matricea de exemple ViewerInteractionLab pentru Delphi, C++Builder și Lazarus - Am actualizat fluxul de build al bibliotecii și ieșirile pachetului C++Builder Win64, astfel încât metodele de interacțiune cu vizualizatorul din
TPdfViewsă se lege corect în demo-urile Win64 - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.25
Version 1.39.24
- Am adăugat
Demo\Lazarus\ViewerInteractionLab, aducând în Lazarus fluxul focalizat de interacțiune cu vizualizatorul alături de exemplul Delphi - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.24
Version 1.39.23
- Am adăugat
Demo\Lazarus\SearchAndSelect, completând matricea de exemple SearchAndSelect pentru Delphi, C++Builder și Lazarus - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.23
Version 1.39.22
- Am adăugat
Demo\CBuilder\ContentExtractionLabșiDemo\Lazarus\ContentExtractionLab, aducând fluxul de extragere a conținutului pe mai multe categorii în toate IDE-urile demo suportate - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.22
Version 1.39.21
- Am îmbunătățit
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportșiDemo\CBuilder\PreflightReportcu un selector de format pentru previzualizare, astfel încât utilizatorii să poată inspecta ieșirea text sau JSON înainte de a salva rapoartele - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.21
Version 1.39.20
- Am adăugat export JSON în
FPdfPreflightReportprinTPdfPreflightReport.ToJsonșiSaveJsonToFile, producând rezumate lizibile de mașină, stare / prioritate per standard, următoarele acțiuni și detalii despre problemă - Am actualizat
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportșiDemo\CBuilder\PreflightReportcu acțiuni Save JSON alături de exportul TXT / HTML - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.20
Version 1.39.19
- Am îmbunătățit
FPdfPreflightReportcuTPdfPreflightStatus, categorii de probleme, prioritate per standard și ghidaj pentru următoarea acțiune în rapoartele TXT / HTML - Am actualizat
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportșiDemo\CBuilder\PreflightReportpentru a afișa starea, prioritatea, numărul de probleme și următoarea acțiune în grila de rezumat - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.19
Version 1.39.18
- Am adăugat
Demo\Lazarus\SecurityAudit, completând matricea de demo-uri Delphi, C++Builder și Lazarus pentru fluxul de audit al suprafeței de risc PDF în regim read-only - Exemplul Lazarus enumeră permisiunile, atașamentele, acțiunile JavaScript, adnotările URI / Launch link, web linkurile, semnăturile, starea XFA, disponibilitatea helper-elor V8 / XFA și callback-urile pentru funcții neacceptate, apoi salvează sau copiază lista de constatări ca raport TXT
- Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.18
Version 1.39.17
- Am adăugat
Demo\CBuilder\SecurityAudit, aducând fluxul de audit al suprafeței de risc PDF read-only în C++Builder alături de exemplul Delphi existent - Exemplul C++Builder enumeră permisiunile, atașamentele, acțiunile JavaScript, adnotările URI / Launch link, web linkurile, semnăturile, starea XFA, disponibilitatea helper-elor V8 / XFA și callback-urile pentru funcții neacceptate, apoi salvează sau copiază lista de constatări ca raport TXT
- Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.17
Version 1.39.16
- Am adăugat
Demo\CBuilder\SearchAndSelect, aducând fluxul standalone SearchAndSelect al vizualizatorului în C++Builder alături de exemplul Delphi existent - Exemplul C++Builder creează sau deschide PDF-uri, listează potrivirile pe toate paginile cu previzualizări de pagină / index de caracter, suportă navigarea Previous / Next și prin dublu clic și evidențiază potrivirile din pagina curentă cu
HighlightSearchText - Expune și opțiunile
AllowUserTextSelection,SelectedText,SelectAll,CopySelectionToClipboard,ClearSelection,OnSelectionChangeșiDisplayModepentru spread; metadatele versiunii raportează acum 1.39.16
Version 1.39.15
- Am adăugat
Demo\CBuilder\WatermarkStamp, completând matricea de demo-uri Delphi, Lazarus și C++Builder pentru fluxurile reutilizabile de watermark și stamp Form XObject - Exemplul C++Builder creează PDF-uri țintă și stamp, reutilizează pagina stamp prin
CreateXObjectFromPage, aplică transformăriTPdfMatrixși salvează watermark-uri centrate, stamp-uri în colț și etichete cu numărul paginii - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.15
Version 1.39.14
- Am adăugat
Demo\Lazarus\WatermarkStamp, aducând în Lazarus fluxul reutilizabil de watermark și stamp Form XObject - Exemplul Lazarus creează PDF-uri țintă și stamp, reutilizează pagina stamp prin
CreateXObjectFromPage, aplică transformăriTPdfMatrixși salvează watermark-uri centrate, stamp-uri în colț și etichete cu numărul paginii - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.14
Version 1.39.13
- Am adăugat
Demo\CBuilder\PreflightReport, completând matricea de demo-uri Delphi, Lazarus și C++Builder pentru fluxul reutilizabilFPdfPreflightReport - Exemplul C++Builder folosește
FPdfPreflightReport.hpppentru a genera rezumate standard, previzualizări TXT ale raportului, fișiere de raport TXT / HTML și comportamentul Open Last Report - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.13
Version 1.39.12
- Am adăugat
Demo\Lazarus\PreflightReport, aducând fluxul de raport de preflight PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R și PDF/VT în Lazarus - Exemplul Lazarus poate deschide sau crea un PDF, selecta standardele țintă, previzualiza rândurile de rezumat și ieșirea TXT a raportului, salva rapoarte TXT / HTML și deschide cel mai recent raport salvat
- Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.12
Version 1.39.11
- Am îmbunătățit
Demo\Delphi\SearchAndSelectcu o listă de rezultate de căutare pe toate paginile care înregistrează numărul paginii, indexul caracterului și textul de previzualizare - Am adăugat navigarea Previous / Next a potrivirilor și saltul la rezultat prin dublu clic, păstrând în același timp comportamentul
HighlightSearchTextal paginii curente - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.11
Version 1.39.10
- Am îmbunătățit
Demo\Delphi\SecurityAuditcu acțiunile Save Report și Copy Report, care exportă rezumatul curent și rândurile cu constatări ca raport de audit TXT - Demo-ul curăță acum starea de export a raportului când panoul de audit este resetat, menținând rapoartele copiate sau salvate aliniate cu constatările vizibile
- Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.10
Version 1.39.9
- Am îmbunătățit
Demo\Delphi\ContentExtractionLabcu salvarea PDF-ului sursă, copierea raportului în clipboard și acțiuni de selecție all / none pentru categorii - Demo-ul invalidează acum raportul curent când se schimbă selecțiile de categorii, astfel încât exporturile TXT / JSON să reflecte sfera vizibilă a extragerii
- Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.9
Version 1.39.8
- Am adăugat
Demo\Delphi\ContentExtractionLab, un exemplu unificat de flux de extragere a conținutului pentru metadatele documentului, textul paginii, obiectele paginii, imagini, atașamente, linkuri, adnotări, marcaje și metrici de font / caracter - Exemplul poate deschide un PDF existent sau poate crea un PDF sintetic cu conținut de text, imagine, atașament și adnotare, apoi generează rânduri de rezumat și rapoarte detaliate TXT / JSON
- Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.8
Version 1.39.7
- Am adăugat
Lib\FPdfPreflightReport.pas, un helper reutilizabil de raport care înveleșteValidatePdfA,ValidatePdfUa,ValidatePdfE,ValidatePdfX,ValidatePdfRșiValidatePdfVTîntr-un singur obiectTPdfPreflightReport - Am adăugat
Demo\Delphi\PreflightReport, un exemplu de flux care deschide sau creează un PDF, selectează standardele țintă, previzualizează rândurile de rezumat și recomandările de probleme și salvează rapoarte TXT sau HTML - Rapoartele generate descriu explicit limita de validare încorporată la nivel de marker, astfel încât aplicațiile să le poată combina cu instrumente dedicate de preflight la nivel de conținut când este nevoie
- Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus, listele proiectelor pachetului și metadatele versiunii din installer pentru a raporta 1.39.7
Version 1.39.6
- Am adăugat
Demo\Delphi\SearchAndSelect, un exemplu concentrat de flux al vizualizatorului pentru evidențierea căutării, selecția de text, previzualizarea textului selectat, copiere, golire și moduri de afișare în spread - Exemplul demonstrează
HighlightSearchText, opțiunile de căutare match-case / whole-word,AllowUserTextSelection,SelectedText,SelectAll,CopySelectionToClipboardșiClearSelectionfără a adăuga API nou în bibliotecă - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.6
Version 1.39.5
- Am extins
Demo\Delphi\ViewerInteractionLabîntr-un exemplu UX de vizualizator în stil SearchAndSelect, cuHighlightSearchText, opțiuni match-case / whole-word, previzualizare a textului selectat și controale existente de selecție / clipboard - Am extins
Demo\Delphi\PrintDialogpentru a inspecta preferințele de printare ale autorului PDF:PrintCopies,PrintPageRanges,PrintScaling,PrintPaperHandlingși maparea duplex vizibilăSetPdfPrintPaperHandlingDevMode - Am adăugat
Demo\Delphi\SecurityAudit, un exemplu read-only de suprafață de risc care listează permisiuni, atașamente, JavaScript de document, linkuri URI / Launch, web linkuri, semnături, starea XFA și disponibilitatea helper-elor V8 / XFA - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.5
Version 1.39.4
- Am adăugat
Demo\CBuilder\ImageToPDFșiDemo\Lazarus\ImageToPDF, completând matricea de exemple ImageToPDF pentru Delphi, C++Builder și Lazarus - Noile exemple demonstrează selecție multi-imagine, previzualizare a imaginii selectate, o pagină PDF per imagine, dimensionare A4 portrait / landscape, scalare centrată a imaginii, progres per imagine și deschiderea PDF-ului generat după salvare
- Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.4
Version 1.39.3
- Am adăugat
Demo\CBuilder\BatchExport, aducând în C++Builder fluxul de export PDF în JPG pentru mai multe fișiere alături de exemplele Delphi și Lazarus existente - Exemplul demonstrează
LoadCustomDocument,IPdfCancellationTokenSource, intrareTFileStreamîn streaming, progres per fișier și per pagină, tratarea anulării, intrările DPI / quality / password și deschiderea folderului de ieșire după finalizare - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.3
Version 1.39.2
- Am adăugat
Demo\Delphi\WatermarkStamp, un exemplu rulabil de flux Form XObject care creează un PDF țintă și un PDF stamp reutilizabil, apoi aplică watermark-uri centrate, stamp-uri în dreapta sus și etichete cu numărul paginii pe fiecare pagină - Exemplul demonstrează
CreateXObjectFromPage,InsertFormObjectFromXObject,TPdfMatrixșiFPDFPageObj_SetMatrixfără a adăuga API nou în bibliotecă - Am actualizat
Docs\en-us\Examples.htmlpentru a folosi modelul curentTPdfMatrix.Handlecând transmite matrici cătreFPDFPageObj_SetMatrix - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.2
Version 1.39.1
- Am adăugat
Demo\Delphi\ViewerInteractionLab, un exemplu concentrat deTPdfViewpentru moduri de afișare, moduri fit, culori de pagină, rotire, selecția textului de către utilizator, acțiuni clipboard și feedback de coordonateDeviceToPage - Am adăugat
Demo\CBuilder\StandardsLab/Demo\Lazarus\StandardsLab, astfel încât utilizatorii Lazarus să poată rula fluxul de validare și output de markeri PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R și PDF/VT - Am listat unitățile de standarde în
Lib\37.0\PDFiumPas.dprojșiLib\FPC\PDFiumLaz.lpkși am reparat build-ul demo-ului DelphiSplitViewprin eliminarea unui import duplicatWinapi.ShellAPI - Am reparat blocajele de batch-build ale demo-urilor Delphi din
BatchExport,PDFViewer,MultiPageViewerșiSplitViewfără a le schimba comportamentul la rulare - Am reparat compatibilitatea batch-build a demo-urilor C++Builder în
PDFViewerșiMultiPageViewerprin înlocuireanullptrcuNULLpentru modul curent al proiectului - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.1
Version 1.39.0
- Am adăugat
Demo\Delphi\StandardsLab, un exemplu rulabil de flux de standarde care încarcă sau creează un PDF, ruleazăValidatePdfA,ValidatePdfUa,ValidatePdfE,ValidatePdfX,ValidatePdfRșiValidatePdfVTși afișează conformitatea detectată, starea pass/fail și numărul de probleme într-o singură grilă - Butoanele de salvare din StandardsLab apelează
SaveAsPdfA,SaveAsPdfUa,SaveAsPdfE,SaveAsPdfX,SaveAsPdfRșiSaveAsPdfVT, făcând vizibil outputul de markeri PDF standards fără a scrie un harness personalizat - Am actualizat
TPdf.AboutInfo, metadatele pachetului Lazarus și metadatele versiunii din installer pentru a raporta 1.39.0
Version 1.38.0
- Suprapunerile de căutare și selecție de text din
TPdfViewfolosesc acum alpha blending real în loc de desenare cu mască logică, păstrând conținutul paginii sub evidențieri - Am adăugat
SetPdfPrintPaperHandlingDevModepentru a mapaTPrintPaperHandlingîn valorile WindowsDEVMODE.dmDuplex:DMDUP_SIMPLEX,DMDUP_HORIZONTALșiDMDUP_VERTICAL TPdfView.SmoothScrollanimează acum comenzile scrollbar pentru linie / pagină în segmente conduse de timer; urmărirea thumb-ului rămâne imediată- Am actualizat
TPdf.AboutInfoși metadatele versiunii din installer pentru a raporta 1.38.0
Version 1.37.0
TPdfdeține acum un lock de randare per instanță care serializează căileRenderPage,RenderTile,RenderPageProgressive, reîncărcarea paginii și descărcarea documentului. Randarea condusă de worker printr-o componentă partajată este acum practică, în timp ce aplicațiile coordonează în continuare modificarea documentului și durata de viață- Am reparat wrapperul bitmap zero-copy astfel încât să respingă layout-urile DIB bottom-up ale
TBitmapși să revină la un buffer deținut de PDFium înainte de copiere, eliminând eșecurile de corupere a stride-ului / violare de acces din testele de randare VCL - Am înăsprit comportamentul de selecție din
TPdfView:AllowUserTextSelectioncontrolează doar intrarea utilizatorului, API-urile de selecție la nivel de cod continuă să deseneze, iarSelectAllurmează spread-ul vizibil real, astfel încât pagina de copertă să nu mai selecteze pagina 2. Testele Delphi, Lazarus și C++Builder au fost extinse în consecință - Am actualizat
TPdf.AboutInfoși metadatele versiunii din installer pentru a raporta 1.37.0
Version 1.36.0
- A fost activată selecția de text pentru utilizatorul final în
TPdfView— proprietateaAllowUserTextSelectionrezervată în v1.17.0 controlează acum un flux complet de selectare prin tragere. Un clic stânga pe un caracter de text intră în modul de selecție (hit-test auto); un clic stânga pe o zonă goală continuă panoramarea ca înainte. Widgetul de form-fill păstrează prioritatea, astfel că un clic pe un câmp de formular îl focalizează în continuare, în loc să pornească o selecție - Dubla apăsare selectează cuvântul, tripla apăsare selectează linia,
Ctrl+Aselectează pagina curentă (ambele pagini în modurile de afișare cu două pagini), iarCtrl+Ccopiază selecția în clipboardul Windows caCF_UNICODETEXT Shift+Left/Shift+Rightextinde selecția câte un caracter pe rând (trecând pe pagina adiacentă în modul spread);Shift+Home/Shift+Endextinde până la marginea vizuală a liniei, folosind înălțimea casetei caracterului de pornire drept toleranță pentru gruparea pe linie, astfel încât liniile cu dimensiuni diferite ale fontului să rămână grupate corect- Trecerea cu cursorul peste text schimbă cursorul în
crIBeam; ieșirea de pe text restabilește cursorul implicit. În timp ce o tragere de selecție de text este în curs, deplasarea în zona moartă de 20 de pixeli de la orice margine a vizualizatorului derulează automat pagina (tact la 50 ms, 16 px / tact, limitat la aceleași margini folosite de traseul de panare) astfel încât selecția să poată trece dincolo de viewportul curent fără a elibera mai întâi mouse-ul - Selecția pe mai multe pagini funcționează în modurile de afișare cu pagini alăturate (
dmTwoPageContinuous,dmTwoPageContinuousWithCover): o tragere începută pe pagina din stânga și terminată pe pagina din dreapta selectează intervalul contiguu care le cuprinde pe ambele.SelectedTextunește fragmentele de pe fiecare pagină cu CR/LF, astfel încât textul rezultat să se citească precum conținutul normal pe mai multe linii - Noua proprietate publicată
SelectionColor(implicitclHighlight, culoarea de selecție a sistemului Windows) — independentă deHighlightColor, care colorează rezultatele căutării în galben. Evidențierile de căutare și o selecție activă prin tragere pot fi afișate simultan pe ecran fără conflict de culori - Noul eveniment publicat
OnSelectionChangese declanșează ori de câte ori intervalele materializate ale selecției chiar se modifică — niciodată la reaplicări identice, astfel încât aplicațiile gazdă îl pot lega direct la textul din bara de stare sau la starea de activare a butoanelor, fără debounce - Noul API public din
TPdfView:HasSelection,SelectionCharCount,SelectedText,ClearSelection,SelectAll,CopySelectionToClipboard. Acestea sunt puncte de intrare la nivel de cod și funcționează întotdeauna indiferent deAllowUserTextSelection— indicatorul limitează doar intrarea utilizatorului (mouse, Ctrl+C, Ctrl+A, Shift+arrows), astfel încât gazdele kiosk pot dezactiva selecția inițiată de utilizator și totuși să construiască butoane de bară de instrumente "Select All / Copy" care apelează aceleași puncte de intrare API - Un meniu contextual implicit
Copy/复制este atașat automat atunci când gazda nu și-a atribuit propriulPopupMenu— scenariul standard „selectează textul, clic dreapta, copiază” funcționează imediat. Legenda este aleasă între engleză și chineză deSysLocale.PriLangID; gazdele care au nevoie de localizare completă (sau de un meniu mai bogat) își atribuie pur și simplu propriulPopupMenu, iar meniul implicit este suprimat - Selecția este ștearsă automat la tranzițiile
SetPdf,SetPageNumber,SetActive(False)șiDisplayMode, iarOnSelectionChangese declanșează exact o dată când selecția anterioară nu era goală. Subsistemul form-fill păstrează prioritatea — cât timp un câmp de formular este editat, toate scurtăturile de tastatură pentru selecție se amână, astfel încât câmpul să primeascăCtrl+C/Ctrl+A/Shift+arrowspentru propria selecție - S-au extins suitele de regresie Delphi și Lazarus la câte 202 cazuri, iar suita C++Builder la 159 de cazuri, acoperind valorile implicite, round-trip, comportamentul API public, golirea la schimbarea stării, tragerea cu mouse-ul (hit-text / hit-blank), click versus drag, comutarea cursorului IBeam, cuvântul la dublu clic, linia la triplu clic, scurtăturile de tastatură, atașarea / amânarea / legenda meniului contextual implicit și selecția pe mai multe pagini în mod spread — inclusiv o verificare de round-trip CR/LF pentru clipboard
Version 1.35.0
- A fost adăugat suportul de injectare a markerelor PDF/VT (ISO 16612-2:2010): TPdf.SaveAsPdfVT promovează documentul curent la un fișier conform PDF/VT-1 sau PDF/VT-2 (subsetul PDF pentru imprimare variabilă și tranzacțională). PDF/VT este construit peste PDF/X-4 — ISO 16612-2 §6.2.1 cere ca fiecare fișier PDF/VT-1 să respecte și PDF/X-4 — astfel încât injectorul scrie întregul set de markere PDF/X-4 (XMP
pdfxid:GTS_PDFXVersion = "PDF/X-4", Info/GTS_PDFXVersion (PDF/X-4)și/Trapped, catalog/OutputIntentscare referă un dicționar OutputIntent cu profil ICC încorporat) alături de proprietățile specifice PDF/VT - Injectarea specifică PDF/VT acoperă XMP
pdfvtid:GTS_PDFVTVersion(= "PDF/VT-1" sau "PDF/VT-2" conform §6.3 Table 2) șipdfvtid:GTS_PDFVTModDate(păstrat în sincron cuxmp:ModifyDateconform §6.3 NOTE 1), plus o descriere pdfaExtension:schemas care declară atât namespace-urile pdfxid, cât și pdfvtid (URI-urile NPEShttp://www.npes.org/pdfx/ns/id/șihttp://www.npes.org/pdfvt/ns/id/). Trailerul poartă un array/ID - A fost adăugat TPdf.SaveAsPdfVTToStream pentru ieșire PDF/VT în memorie, iar prescurtarea pentru opțiunile implicite
TPdf.SaveAsPdfVT(FileName)produce PDF/VT-1 cu OutputIntent-ul sRGB IEC61966-2.1 inclus (3144 bytes, același profil ca SaveAsPdfA / SaveAsPdfX) și/Trapped /False - A fost adăugat TPdf.ValidatePdfVT: verifică un PDF deschis pentru marker-ele de conformitate PDF/VT (prezența XMP
pdfvtid:GTS_PDFVTVersionșiGTS_PDFVTModDate, egalitatea dintrepdfvtid:GTS_PDFVTModDateșixmp:ModifyDate, prezența identificatorului de bazăpdfxid:GTS_PDFXVersion, prezența/DPartRootîn catalog conform §6.5,/OutputIntentscu/DestOutputProfile, trailer /ID, starea criptării, prezențaxmp:CreateDate/ModifyDate) și returnează TPdfVTValidationResult cu nivelul de conformitate detectat și setul de probleme găsite - A fost adăugată proprietatea TPdf.PdfVTConformance: returnează nivelul de conformitate al documentului deschis curent (pvc1, pvc2, pvcNone sau pvcUnknown) fără a fi nevoie să apelați explicit ValidatePdfVT
- Noile tipuri exportate în unitatea nouă FPdfPdfvt: TPdfVTConformance (pvcUnknown/None/1/2), TPdfVTTrappedState (ptvUnspecified/True/False/Unknown), TPdfVTValidationResult, TPdfVTValidationIssue, TPdfVTSaveOptions
- Document Part Hierarchy (
DPartRoot/ arboreleDPartconform §6.5) este o structură la nivel de aplicație care depinde de maparea destinatarilor / intervalelor de pagini din fluxul de imprimare cu date variabile. SaveAsPdfVT NU sintetizează un arbore DPart — ValidatePdfVT expune lipsa unui/DPartRootcapvviMissingDPartRoot, astfel încât apelanții pot direcționa fișierele PDF/VT printr-un pas separat de construire DPart. Cerințele PDF/X-4 la nivel de conținut (încorporarea fonturilor, transparență, culoare gestionată ICC, interdicțiile OPI / JavaScript / Reference XObject etc.) rămân responsabilitatea autorului documentului și a pipeline-ului de randare PDFium - Actualizat șirul TPdf.AboutInfo pentru a raporta versiunea curentă a produsului
Version 1.34.0
- A fost adăugat suportul de injectare a markerelor PDF/R-1 (ISO 23504-1:2020): TPdf.SaveAsPdfR promovează documentul curent la un fișier conform PDF/R-1 (subsetul PDF de transport al imaginilor raster folosit pentru documente scanate). Injectarea acoperă cerințele de nivel de format de fișier care pot fi adăugate prin post-procesare — comentariul unic de identificare a versiunii
%PDF-raster-1.0scris între dicționarul trailer și cuvântul startxref (§5), dicționarul catalog redus la whitelist-ul din §6.3 (supraviețuiesc doar Version / ViewerPreferences / PageLayout / PageMode / AcroForm / Metadata), Document Information Dictionary redus la whitelist-ul din §6.4.3 (doar Creator / Producer / CreationDate / ModDate), un flux XMP din catalog /Metadata care conține cele patru intrări din Table 1 §6.4.4 (xmp:CreatorTool / pdf:Producer / xmp:CreateDate / xmp:ModifyDate) și un array trailer /ID - A fost adăugat TPdf.SaveAsPdfRToStream pentru ieșire PDF/R în memorie, iar prescurtarea pentru opțiunile implicite
TPdf.SaveAsPdfR(FileName)acoperă cazul obișnuit - A fost adăugat TPdf.ValidatePdfR: verifică un PDF deschis pentru marker-ele de conformitate PDF/R-1 (comentariul de subsol
%PDF-raster-x.y, versiunea din header, absența /Type /ObjStm, conformitatea whitelist-ului din catalog, conformitatea whitelist-ului din dicționarul Info, prezența fluxului XMP de metadate, trailer /ID) și returnează TPdfRValidationResult cu nivelul de conformitate detectat și setul de probleme găsite - A fost adăugată proprietatea TPdf.PdfRConformance: returnează nivelul de conformitate al documentului deschis curent (prc1, prcNone sau prcUnknown) fără a fi nevoie să apelați explicit ValidatePdfR
- Noile tipuri exportate în unitatea nouă FPdfPdfr: TPdfRConformance, TPdfRValidationResult, TPdfRValidationIssue, TPdfRSaveOptions.
TPdfRSaveOptions.Defaultsetează StripInfoOptionalEntries și StripCatalogOptionalEntries la True, astfel încât injectorul produce implicit un catalog și un dicționar Info conform §6.3 / §6.4.3; apelanții le pot seta la False pentru a păstra intrările sursă (ieșirea nu va satisface atunci acele clauze PDF/R, dar celelalte markere rămân atașate) - Cerințele la nivel de conținut rămân responsabilitatea PDF-ului sursă: structura Contents pe pagină (§6.5.1), forma MediaBox
[0 0 w h](§6.5.3), restricțiile de filtrare (§6.2.2 — doar FlateDecode, CCITTFaxDecode bitonal, DCTDecode 8-bit gray/RGB), absența object streams (§6.2.4) și strip layout conform §6.6. Acestea nu pot fi impuse prin post-procesare — PDF/R este structural un subset mult mai strict decât celelalte standarde PDF/x și necesită generarea corectă a octeților sursă. ValidatePdfR expune problemele de format de fișier pe care această unitate le poate detecta; combinați-l cu un validator PDF/R al TWAIN Working Group pentru verificări complete la nivel de conținut - Actualizat șirul TPdf.AboutInfo pentru a raporta versiunea curentă a produsului
Version 1.33.0
- A fost adăugat suportul pentru injectarea markerilor PDF/X (familia ISO 15930): TPdf.SaveAsPdfX promovează documentul curent la un fișier conform PDF/X-1a:2001, PDF/X-3:2002 sau PDF/X-4 prin post-procesarea PDF-ului de bază cu o actualizare incrementală. Injectarea acoperă cerințele de la nivel de format de fișier care pot fi atașate prin post-procesare — stream-ul de metadata XMP care poartă
pdfxid:GTS_PDFXVersion(șipdfxid:GTS_PDFXConformancepentru PDF/X-1a / PDF/X-3), plus descrierea corespunzătoare din pdfaExtension:schemas, un Document Information Dictionary rescris cu intrările/GTS_PDFXVersion,/GTS_PDFXConformanceși/Trapped, un catalog actualizat cu/OutputIntents [N 0 R]care referențiază un dicționar OutputIntent cu/S /GTS_PDFXși un profil ICC încorporat, precum și un array/IDîn trailer - A fost adăugat TPdf.SaveAsPdfXToStream pentru ieșire PDF/X în memorie și o prescurtare cu opțiuni implicite,
TPdf.SaveAsPdfX(FileName), care produce PDF/X-4 cu OutputIntent-ul sRGB IEC61966-2.1 integrat (3144 bytes, identic cu profilul folosit de SaveAsPdfA) - A fost adăugat TPdf.ValidatePdfX: verifică un PDF deschis pentru markerii de conformitate PDF/X (identificatorul XMP pdfxid și egalitatea lui cu valoarea din Info dictionary, descrierea schemei de extensie pdfxid, array-ul /OutputIntents cu /DestOutputProfile, prezența Title, trailer-ul /ID, starea criptării, prezența xmp:CreateDate / xmp:ModifyDate) și returnează TPdfXValidationResult cu nivelul detectat și setul de probleme găsite
- A fost adăugată proprietatea TPdf.PdfXConformance: returnează nivelul de conformitate al documentului deschis în prezent (pxc1a, pxc3, pxc4, pxcNone sau pxcUnknown) fără a fi nevoie să fie apelat explicit ValidatePdfX. Șirul de versiune XMP este analizat pentru a diferenția cele trei niveluri de conformitate
- Noi tipuri sunt exportate în noua unitate FPdfPdfx: TPdfXConformance (pxcUnknown/None/1a/3/4), TPdfXTrappedState (ptUnspecified/True/False/Unknown), TPdfXValidationResult, TPdfXValidationIssue, TPdfXSaveOptions.
TPdfXSaveOptions.Defaultvizează PDF/X-4 cu OutputIntent sRGB și/Trapped /False; apelanții pot suprascrieConformance, pot furniza un blob CMYKIccProfileDatapentru fluxuri comerciale de tipar sau pot schimbaOutputCondition/OutputConditionIdentifier/RegistryNamepentru a indica o intrare specifică din registrul de caracterizare ICC (de exemplu FOGRA39, GRACoL2006_Coated1v2) - Cerințele de la nivel de conținut (toate fonturile încorporate, fără JavaScript, fără adnotări vizibile, interdicția OPI, regulile de transparență pentru PDF/X-1a / PDF/X-3 etc.) rămân responsabilitatea autorului documentului și a pipeline-ului de randare PDFium. Asociați ValidatePdfX cu un instrument de preflight precum callas pdfaPilot sau Ghent PDF Workgroup Output Suite pentru verificarea completă a conformității
- Șirul TPdf.AboutInfo a fost actualizat pentru a raporta versiunea curentă a produsului
Version 1.32.0
- A fost adăugat suportul pentru injectarea markerilor PDF/E-1 (ISO 24517-1:2008): TPdf.SaveAsPdfE promovează documentul curent la un fișier conform PDF/E-1 prin post-procesarea PDF-ului de bază cu o actualizare incrementală. Injectarea acoperă cerințele de la nivel de format de fișier care pot fi atașate prin post-procesare — un stream de metadata XMP care poartă
pdfe:ISO_PDFEVersion = "PDF/E-1", plus descrierea corespunzătoare din pdfaExtension:schemas, un Document Information Dictionary rescris cu intrarea obligatorie/ISO_PDFEVersion (PDF/E-1)cerută de §5, blocurile de punte Info-XMP moștenite din ISO 19005-1 §6.7 prin §13.1 (dc:title / dc:creator / dc:description / pdf:Producer / pdf:Keywords / xmp:CreateDate / xmp:ModifyDate / xmp:MetadataDate / xmp:CreatorTool) și un array/IDîn trailer cerut de §6.2 - A fost adăugat TPdf.SaveAsPdfEToStream pentru ieșire PDF/E în memorie și o prescurtare cu opțiuni implicite,
TPdf.SaveAsPdfE(FileName), pentru cazul uzual - A fost adăugat TPdf.ValidatePdfE: verifică un PDF deschis pentru markerii de conformitate PDF/E-1 (prezența XMP pdfe:ISO_PDFEVersion și egalitatea cu valoarea din Info dictionary, descrierea schemei de extensie pdfe, intrarea /ISO_PDFEVersion din Info dictionary, trailer-ul /ID, prezența xmp:CreateDate / xmp:ModifyDate) și returnează un rezultat structurat cu nivelul de conformitate detectat și setul de probleme găsite
- A fost adăugată proprietatea TPdf.PdfEConformance: returnează nivelul de conformitate al documentului deschis în prezent (pec1, pecNone sau pecUnknown) fără a fi nevoie să fie apelat explicit ValidatePdfE
- Noi tipuri sunt exportate în noua unitate FPdfPdfe: TPdfEConformance, TPdfEValidationResult, TPdfEValidationIssue, TPdfESaveOptions
- Rescrierea Info dictionary este o premieră pentru calea PDF/x de post-procesare din PDFiumPas — ea rescrie obiectul Info existent cu același număr de obiect (astfel încât subsecțiunea xref / referința /Info din trailer rămân valide) și sintetizează un Info dictionary nou atunci când trailer-ul sursă nu are o intrare /Info. PDFium însuși emite un Info dictionary în fiecare ieșire SaveAs, așa că acesta este cazul uzual
- Cerințele de la nivel de conținut (încorporarea fonturilor, ToUnicode CMaps, XObjects / chei ExtGState / formulare XFA interzise etc.) rămân responsabilitatea autorului documentului — SaveAsPdfE atașează markerii de format de fișier, dar nu modifică conținutul paginii și nu elimină funcționalitățile interzise
- Șirul TPdf.AboutInfo a fost actualizat pentru a raporta versiunea curentă a produsului
Version 1.31.0
- A fost adăugat suportul pentru injectarea markerilor PDF/UA-1 (ISO 14289-1:2014): TPdf.SaveAsPdfUa promovează documentul curent la un fișier conform PDF/UA-1 prin post-procesarea PDF-ului de bază cu o actualizare incrementală. Injectarea acoperă cerințele de la nivel de format de fișier care pot fi impuse prin post-procesare — un stream de metadata XMP care poartă
pdfuaid:part = 1, plus descrierea corespunzătoare din pdfaExtension:schemas,dc:titleobligatoriu, catalogul/MarkInfo << /Marked true /Suspects false >>și/ViewerPreferences << /DisplayDocTitle true >>(doar când sursa nu are deja acestea), catalogul/Lang(când apelantul furnizează un tag BCP 47) și un array/IDîn trailer - A fost adăugat TPdf.SaveAsPdfUaToStream pentru ieșire PDF/UA în memorie și o prescurtare cu opțiuni implicite,
TPdf.SaveAsPdfUa(FileName), pentru cazul uzual - A fost adăugat TPdf.ValidatePdfUa: verifică un PDF deschis pentru markerii de conformitate PDF/UA-1 (existența StructTreeRoot, /Lang, /MarkInfo /Marked true cu /Suspects = false, /ViewerPreferences /DisplayDocTitle true, identificatorul XMP pdfuaid:part, prezența dc:title, trailer-ul /ID, starea criptării) și returnează un rezultat structurat cu nivelul de conformitate detectat și setul de probleme găsite
- A fost adăugată proprietatea TPdf.PdfUaConformance: returnează nivelul de conformitate al documentului deschis în prezent (puc1, pucNone sau pucUnknown) fără a fi nevoie să fie apelat explicit ValidatePdfUa
- Noi tipuri sunt exportate în noua unitate FPdfPdfua: TPdfUaConformance, TPdfUaValidationResult, TPdfUaValidationIssue, TPdfUaSaveOptions
- Câmpurile Title / Author / Subject / Keywords / Creator / Producer / CreationDate / ModDate / DocumentId / InstanceId / Language lăsate goale în TPdfUaSaveOptions sunt completate automat din FPDF_GetMetaText / FPDF_GetFileIdentifier / FPDFCatalog_GetLanguage, astfel încât apelanții existenți pot salva cu o singură linie
- Cerințele de la nivel de conținut (completitudinea etichetării StructTreeRoot, textul Alt pentru Figure, ToUnicode CMaps, încorporarea fonturilor etc.) rămân responsabilitatea autorului documentului — SaveAsPdfUa atașează markerii de format de fișier, dar nu modifică conținutul paginii și nu inventează tag-uri. ValidatePdfUa expune absența StructTreeRoot ca
pvuaiMissingStructTreeRoot, astfel încât apelanții pot direcționa documentele neetichetate printr-un pipeline separat de etichetare - Șirul TPdf.AboutInfo a fost actualizat pentru a raporta versiunea curentă a produsului
Version 1.30.0
- Ieșirea PDF/A-1b respectă acum cerințele ISO 19005-1 (cu Cor.1:2007) pentru echivalența Document Information Dictionary / XMP: fiecare intrare din Info dictionary pe care PDFium o scrie în PDF-ul de bază este reflectată în pachetul XMP, inclusiv Title (dc:title), Author (dc:creator), Subject (dc:description conform Cor.1), Keywords (pdf:Keywords), Creator (xmp:CreatorTool), Producer (pdf:Producer), CreationDate (xmp:CreateDate) și ModDate (xmp:ModifyDate). Este emis și xmp:MetadataDate
- Trailer-ul unui document PDF/A conține acum întotdeauna un array /ID (cerință strictă ISO 19005-1 6.1.3). Când TPdf.SaveAsPdfA procesează un document a cărui sursă are deja un file identifier, ID-urile permanente și schimbătoare existente, de 16 bytes, sunt refolosite; în caz contrar, din bytes-ii sursă este derivat un ID de rezervă determinist, de 16 bytes
- XMP-ul injectat încorporează acum descrierea schemei de extensie pdfaid cerută de ISO 19005-1 6.7.8 (înlocuită de Cor.1) — pdfaid este tratat ca o schemă de extensie relativă la XMP Specification 2004, astfel încât toate fișierele conforme trebuie să îi declare numele proprietăților, tipurile de valori și categoriile în containerul pdfaExtension:schemas
- TPdfASaveOptions a primit cinci câmpuri opționale noi: Producer, CreationDate, ModDate (șiruri de dată PDF în formatul “D:YYYYMMDDHHmmSSOHH'mm'”), DocumentId și InstanceId (șiruri de bytes de 16 bytes pentru array-ul /ID din trailer). TPdf.SaveAsPdfA / SaveAsPdfAToStream completează automat câmpurile lipsă din FPDF_GetMetaText și FPDF_GetFileIdentifier, astfel încât apelanții existenți continuă să funcționeze fără modificări
- TPdf.ValidatePdfA / TPdf.PdfAConformance raportează acum încă trei probleme: pvaiMissingTrailerId (fără /ID în trailer), pvaiMissingXmpDates (lipsește xmp:CreateDate sau xmp:ModifyDate) și pvaiMissingExtensionSchema (lipsește descrierea schemei de extensie pdfaid)
- Caracterele non-ASCII din Title, Author, Subject, Keywords, Creator și Producer sunt acum codificate ca UTF-8 în pachetul XMP (XMP Specification cere UTF-8), păstrând round-trip-ul metadatelor multilingve prin SaveAsPdfA
- Șirul TPdf.AboutInfo a fost actualizat pentru a raporta versiunea curentă a produsului
Version 1.29.0
- DLL-urile PDFium incluse (Win32 și Win64, atât buildurile standard, cât și cele V8) au fost actualizate la snapshot-ul upstream din 2026-05-22, preluând corecțiile upstream pentru traseele de crash FPDFText_SetText / FPDFText_SetCharcodes și diverse întăriri interne din proiectul PDFium
- Noul flag de salvare FPDF_SUBSET_NEW_FONTS din PDFium a fost expus în FPdfPageOps.pas, permițând apelanților FPDF_SaveAsCopy să ceară subsetarea automată a fișierelor de font încorporate pentru obiectele text nou adăugate. Constantele existente FPDF_INCREMENTAL, FPDF_NO_INCREMENTAL și FPDF_REMOVE_SECURITY sunt acum definite folosind forma upstream cu bit shift (valoarea numerică veche 3 este păstrată ca FPDF_REMOVE_SECURITY_DEPRECATED pentru compatibilitate binară)
- A fost adăugat enum-ul FPDF_FONT_BACKEND_TYPE (FREETYPE / FONTATIONS) și câmpul corespunzător m_FontLibraryType din FPDF_LIBRARY_CONFIG în FPdfView.pas, astfel încât aplicațiile care inițializează PDFium cu randorul Skia să poată alege backend-ul de fonturi la pornire
- Semnătura TFPDFPage_InsertObject a fost actualizată pentru a corespunde upstream-ului: funcția C returnează acum FPDF_BOOL (TRUE la succes, FALSE dacă page_object este NULL sau transferul de proprietate eșuează) în loc de void. Apelanții existenți din PDFiumPas continuă să se compileze fără modificări, deoarece Delphi / FPC permit ignorarea valorii returnate de o funcție
- Șirul TPdf.AboutInfo a fost corectat pentru a raporta versiunea curentă a produsului (rămăsese blocat la v1.27.0 după lansarea v1.28.0, care a fost doar de documentație)
Version 1.28.0
- Documentația din pagini a fost extinsă substanțial în întreaga referință API: fiecare proprietate, metodă, eveniment și funcție globală include acum o Description în 3 paragrafe, o listă Remarks, un exemplu Delphi pe mai multe linii și un bloc See Also mai bogat — acoperind peste 200 de pagini anterior sumare, inclusiv toți contorii TPdf, getter-ele de metadata, accesoriile pentru fonturi și caractere, proprietățile la nivel de pagină, recordurile indexate, metodele la nivel de document și întreaga suprafață de stare / afișare / evenimente a TPdfView
- Aspectul help-ului a fost ajustat fin pentru a se potrivi cu baza vizuală losLab folosită în referința HotXLS: au fost aliniate dimensiunile h1/h2, stilurile grilei de navigare API au fost consolidate în StyleSheet-ul comun, iar suprascrierile CSS inline per pagină au fost eliminate din Navigation.html
- Documentația include acum un script ajutător (Docs\Build-Expand-Entries.ps1) care regenerează îmbogățirea paginilor de intrare dintr-un singur tabel de date pentru mentenanță repetabilă
Version 1.27.0
- A fost adăugat suportul pentru crearea PDF/A-1b: TPdf.SaveAsPdfA salvează orice document deschis ca fișier conform PDF/A-1b prin post-procesarea PDF-ului de bază cu o actualizare incrementală care injectează un stream de metadata XMP, un sRGB ICC OutputIntent și un catalog de document actualizat — totul fără a cere API-uri DLL suplimentare. Funcționează pe orice platformă suportată de PDFiumPas
- A fost adăugat TPdf.SaveAsPdfAToStream pentru ieșire PDF/A în memorie
- A fost adăugat TPdf.ValidatePdfA: verifică un PDF deschis pentru conformitatea PDF/A (markeri XMP pdfaid, OutputIntent cu profil ICC încorporat, criptare) și returnează un rezultat structurat cu nivelul de conformitate detectat și un set de probleme specifice găsite
- A fost adăugată proprietatea TPdf.PdfAConformance: returnează nivelul de conformitate al documentului deschis în prezent (pac1b, pac1a, pac2b, pac3b, pacNone sau pacUnknown) fără a fi nevoie să fie apelat explicit ValidatePdfA
- Au fost exportate tipuri noi: TPdfAConformance, TPdfAValidationResult, TPdfAValidationIssue, TPdfASaveOptions (în noua unitate FPdfPdfa.pas)
- SaveAsPdfA suportă un profil ICC personalizat prin TPdfASaveOptions.IccProfileData; când acesta rămâne gol, profilul sRGB IEC61966-2.1 integrat (HP/Microsoft, 3144 bytes) este folosit automat
- Referința HTML monolitică a fost înlocuită cu un sistem web help restructurat: 302 pagini individuale de intrare API (câte una pentru fiecare proprietate, metodă, eveniment și funcție globală) care acoperă TPdf și TPdfView, fiecare cu descriere completă, tabel de parametri, exemplu Delphi și linkuri See Also
- A fost adăugat Navigation.html: un index cuprinzător de navigare API pe o singură pagină, organizat în șase secțiuni (proprietăți/metode/evenimente TPdf, proprietăți/metode/evenimente TPdfView, funcții globale) cu o grilă flex pe 5 coloane pentru scanare rapidă
- TPdf.html și TPdfView.html au fost reconstruite ca pagini compacte de prezentare a componentelor, păstrând secțiunile de referință pentru tipuri (Types, Constants, Global Variables) și legând către paginile individuale de intrare pentru toți membrii
- A fost adăugată căutare full-text bazată pe Search.js, cu potrivire incrementală în client pe toate cele 312 pagini indexate
- Toate barele de navigare din întregul site au fost actualizate pentru a indica spre Navigation.html
Version 1.26.0
- A fost adăugat Demo/Lazarus/BatchExport, portarea LCL a demo-ului Delphi BatchExport din v1.14.0. Același set de funcționalități: export multi-fișier PDF -> JPG cu progres general per fișier, progres curent per pagină, intrări DPI / quality / password și un lot anulabil cooperativ bazat pe IPdfCancellationToken. Folderul de ieșire este deschis în managerul de fișiere al platformei când extragerea se încheie cu succes
Version 1.25.0
- A fost adăugată în TPdf reutilizarea paginilor Form XObject, care permite fluxuri de watermark, suprapuneri de template și “ștampilarea unei pagini peste multe altele”: CreateXObjectFromPage fabrică un handle reutilizabil din orice pagină a altui document; InsertFormObjectFromXObject inserează O copie a paginii împachetate în pagina curentă. Returnează FPDF_PAGEOBJECT-ul inserat, astfel încât apelantul să îl poată poziționa / scala / roti cu FPDFPageObj_SetMatrix și helper-ele TPdfMatrix din v1.9.0
- Noua clasă Pascal TPdfXObject învelește handle-ul FPDF_XOBJECT din PDFium și îl închide automat în destructorul său, eliminând ceremonia manuală FPDF_CloseXObject
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 147 de cazuri fiecare, iar suita C++Builder la 123 de cazuri, acoperind contractele de creare a handle-urilor și de inserare a obiectelor de pagină
Version 1.24.0
- A fost adăugat TPdf.RenderPageProgressive — o variantă anulabilă a RenderPage care conduce bucla de randare progresivă a PDFium și interoghează un IPdfCancellationToken din v1.7.0 între iterații, astfel încât randările lungi la DPI ridicat să poată fi întrerupte la mijlocul paginii în loc să blocheze apelantul până la finalizare
- Returnează o valoare TPdfProgressiveStatus: prsDone, prsCancelled sau prsFailed. Transmiteți AToken = nil pentru a randare până la capăt fără vreo pauză (fără posibilitatea de prsCancelled)
- Folosește aceeași cale rapidă zero-copy introdusă în v1.21.0 — PDFium randează direct în DIB-ul TBitmap-ului de destinație. Aceeași cale legacy de rezervă se aplică atunci când DIB-ul nu poate fi împachetat
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 145 de cazuri fiecare, iar suita C++Builder la 121 de cazuri, acoperind nil-token (se finalizează), token pre-anulat (prsCancelled) și echivalența la nivel de pixeli cu RenderPage sincron pe un token activ
Version 1.23.0
- Au fost adăugate șase metode noi TPdfView care expun către aplicații selecția de text din widget-urile de formular și Undo/Redo din PDFium: GetSelectedFormText returnează textul selectat în prezent în widget-ul de formular focalizat; SelectAllFormText selectează fiecare caracter; FormUndo / FormRedo / FormCanUndo / FormCanRedo controlează istoricul de editare al widget-ului focalizat. API-urile PDFium de dedesubt erau deja legate, dar nu aveau un punct de intrare high-level. Toate cele șase ies sigur prin short-circuit când vizualizatorul este inactiv sau documentul nu are un widget AcroForm focalizat
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 142 de cazuri fiecare, iar suita C++Builder la 119 cazuri, acoperind contractul no-form-no-focus pentru fiecare metodă nouă
Version 1.22.0
- Au fost adăugate în TPdf wrapper-e pentru compoziția paginilor: ImportPagesByIndex primește un array de indici bazați pe zero pentru a copia pagini specifice dintr-un document sursă; ImportNPagesToOne returnează un TPdf complet nou ale cărui pagini sunt compoziții N-up ale acestui document; MovePages reordonează paginile in place. API-urile PDFium de dedesubt erau deja legate, dar nu aveau un punct de intrare prietenos cu Pascal
- ImportPagesByIndex acceptă un array gol pentru a importa fiecare pagină sursă (echivalent cu transmiterea lui nil la nivelul ABI C)
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 136 de cazuri fiecare, iar suita C++Builder la 115 cazuri, acoperind importul de subset, importul întregului document, reordonarea paginilor și compoziția N-up
Version 1.21.0
- Performanța de randare a fost îmbunătățită prin trecerea TPdf.RenderPage / TPdf.RenderTile (și a helper-elor TPdfView corespunzătoare) la o cale de ieșire zero-copy. PDFium scrie acum direct în bufferul DIB al TBitmap-ului de destinație în loc să scrie într-un buffer intern care era apoi copiat rând cu rând, economisind o copiere de memorie de width x height x 4 bytes pentru fiecare randare. Îmbunătățirea este cel mai vizibilă la DPI ridicat (panouri de miniaturi, export la calitate de tipar, batch export)
- Calea legacy per scanline este păstrată ca fallback de siguranță pentru cazul improbabil în care DIB-ul de destinație nu poate fi împachetat (dimensiuni extreme, stride neobișnuit, OOM). Comportamentul este identic la nivel de bytes între cele două căi, doar mai lent pe fallback
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 132 de cazuri fiecare, iar suita C++Builder la 112 cazuri, acoperind promovarea pf32bit a bitmap-ului apelantului, round-trip-ul dimensiunilor și un test de consistență pentru stride pe bitmapuri mari
Version 1.20.0
- A fost adăugată evidențierea rezultatelor de căutare în TPdfView: HighlightSearchText(Text, MatchCase, MatchWholeWord) scanează pagina curentă din vizualizator și returnează numărul de potriviri găsite, desenând o mască HighlightColor peste fiecare potrivire la fiecare redesenare. ClearHighlight elimină evidențierile; comutarea vizualizatorului pe altă pagină le curăță automat, deoarece potrivirile sunt specifice paginii
- HighlightColor are implicit clYellow și este publicată, astfel încât aplicațiile să poată tematiza evidențierea pentru a se potrivi paletei lor UI
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 129 de cazuri fiecare, iar suita C++Builder la 109 cazuri, acoperind culoarea implicită, round-trip-ul culorii, contractul “real fixture word matches” pe șirul din sample.pdf și contractul “missing word returns zero matches”
Version 1.19.0
- A fost adăugată proprietatea FitMode în TPdfView, cu patru valori: pfmNone (zoom manual), pfmActualSize (100%), pfmFitPage (întreaga pagină încape în viewport) și pfmFitWidth (lățimea paginii se potrivește cu lățimea viewport-ului). Modul activ de potrivire este reaplicat automat la Resize și când pagina curentă se schimbă, astfel încât documentele lungi cu dimensiuni mixte ale paginilor rămân perfect încadrate
- Setarea directă a Zoom anulează modul activ de potrivire (FitMode revine la pfmNone), urmând convenția standard a vizualizatoarelor PDF în care introducerea unei valori de zoom iese din Fit Page / Fit Width
- Valoarea implicită este pfmNone, astfel încât aplicațiile existente își păstrează comportamentul explicit de zoom
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 124 de cazuri fiecare, iar suita C++Builder la 106 cazuri, acoperind valoarea implicită, round-trip-ul modului, fit-page care produce un zoom real pe un document încărcat și cazul manual-zoom-cancels-fit-mode
Version 1.18.0
- A fost adăugată proprietatea PageColor în TPdfView, decuplând fundalul paginii PDF randate de Color-ul controlului înconjurător. Valoarea implicită este clWhite, astfel încât paginile PDF sunt acum randate alb-hârtie indiferent de tema aplicației gazdă. Vizualizatoarele în dark mode pot păstra acum zona de derulare întunecată, lăsând în același timp pagina PDF propriu-zisă albă (sau în orice culoare aleasă de aplicație)
- Schimbare de comportament: aplicațiile care obișnuiau să seteze TPdfView.Color pentru a recolora pagina PDF ar trebui să seteze în schimb PageColor. Experiența implicită se îmbunătățește pentru cazul uzual (pagini albe pe fundaluri tematizate ale controlului) fără nicio modificare de cod
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 120 de cazuri fiecare, iar suita C++Builder la 103 cazuri, acoperind valoarea implicită și round-trip-ul culorii
Version 1.17.0
- Au fost adăugate comutatoare de blocare a inputului utilizatorului în TPdfView, astfel încât aplicațiile care încorporează vizualizatorul în kioscuri, panouri de previzualizare sau contexte doar-citire să poată dezactiva gesturile de navigare fără subclassing: AllowUserPageChange controlează noile scurtături de tastatură PgUp / PgDn / Ctrl+Home / Ctrl+End; ChangePageOnMouseScrolling controlează noile salturi de pagină la wheel-up / wheel-down; AllowUserTextSelection este rezervată pentru viitoarea cale de selecție de text prin mouse-drag. Toate trei au implicit True, astfel încât aplicațiile existente se actualizează fără schimbare de comportament
- Navigarea între pagini cu rotița mouse-ului ignoră Ctrl+wheel, astfel încât aplicațiile să poată păstra Ctrl+wheel rezervat pentru zoom
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 118 cazuri fiecare, iar suita C++Builder la 101 cazuri, acoperind valorile implicite și round-trip-ul comutatoarelor
Version 1.16.2
- A fost extinsă acoperirea de regresie TPdfView pentru clicurile pe linkuri de adnotare atunci când pagina din vizualizator diferă de pagina TPdf asociată, folosind o cale reală de clic de mouse headless în Delphi, Lazarus și C++Builder
- Suitele Delphi și Lazarus rulează acum câte 114 cazuri fiecare, iar C++Builder rulează acum 99 de cazuri
Version 1.16.1
- A fost corectată tratarea clicurilor pe linkuri în TPdfView, astfel încât acțiunile automate pentru adnotări și web-linkuri să folosească pagina afișată în prezent de vizualizator, chiar și atunci când componenta TPdf asociată este parcată pe altă pagină
- TPdfThumbnailView a fost întărit împotriva referințelor Pdf dangling atunci când componenta TPdf legată este distrusă
- A fost adăugată acoperire de regresie pentru durata de viață a referinței miniaturilor; suitele Delphi și Lazarus rulează acum câte 113 cazuri fiecare, iar C++Builder rulează acum 98 de cazuri
- README, documentația de test, conținutul de căutare/index din HTML Help și ieșirile generate pentru pachetele C++ au fost sincronizate cu actualizările de integrare din v1.7.0 până la v1.16.0
Version 1.16.0
- A fost adăugat un nou demo Delphi PrintDialog (Demo/Delphi/PrintDialog) concentrat pe imprimarea N-up (1 / 2 / 4 / 9 pagini pe coală), cu filtrare pentru pagini impare / pare, randare în grayscale și borduri opționale de 1 pixel pentru celule. Este un companion deliberat compact pentru demo-ul existent PrintPDF, care acoperă deja previzualizarea, fișierele recente, zoom-ul și scalarea
Version 1.15.0
- A fost adăugată o nouă componentă TPdfThumbnailView (unitatea FPdfThumbnail) care randează câte o miniatură de pagină pe rând într-un panou lateral derulabil, cu evidențiere la hover și selecție, plus navigare click-to-go. Este concepută să stea lângă un TPdfView, astfel încât utilizatorii finali să poată răsfoi un document lung pagină cu pagină
- Componenta este înregistrată pe tab-ul de paletă losLab alături de TPdf și TPdfView; proprietăți cheie: Pdf, CurrentPageIndex, ThumbnailWidth, ThumbnailHeight, TextColor, HoverColor, SelectionColor, BorderColor și evenimentul OnPageClick
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 112 cazuri fiecare, iar suita C++Builder la 97 de cazuri, acoperind valorile implicite, round-trip-ul dimensiunii miniaturii, clamparea valorilor extreme, round-trip-ul culorilor și atribuirea handler-elor de eveniment
Version 1.14.0
- A fost adăugat un nou demo Delphi BatchExport (Demo/Delphi/BatchExport) care arată cum să convertești multe fișiere PDF în JPG dintr-o singură trecere, folosind TPdf.LoadCustomDocument pentru încărcare în flux, IPdfCancellationToken pentru anulare cooperativă și bare de progres general per fișier + progres per pagină. Demo-ul folosește o instanță TPdf pentru fiecare fișier (PDFium însuși nu este thread safe) și deschide folderul de ieșire în Explorer când extragerea se încheie cu succes
Version 1.13.0
- A fost adăugat un overlay UI pentru randare asincronă în TPdfView prin trei proprietăți noi: AsyncRendering, LoadingText și LoadingColor. Când AsyncRendering este True, calea de desenare pentru o singură pagină afișează un mic indicator “Loading...” peste pagina randată, astfel încât aplicațiile care își folosesc propriul worker pentru randări lungi să împărtășească același indiciu vizual
- Valorile implicite păstrează comportamentul existent: AsyncRendering este False, astfel încât aplicațiile care nu optează explicit nu văd nicio schimbare vizuală
- Documentația clarifică faptul că PDFium însuși nu este thread safe — mutarea efectivă a randării într-un worker cere apelantului să păstreze un TPdf pentru fiecare worker; viitorul demo batch-export arată acest model
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 106 cazuri fiecare, iar suita C++Builder la 93 de cazuri, acoperind valorile implicite și round-trip-ul celor trei proprietăți
Version 1.12.0
- A fost adăugată tratarea linkurilor în TPdfView bazată pe clic. Noua proprietate LinkOptions controlează comportamentul automat pentru cele patru tipuri de acțiuni ale linkurilor PDF: goto (salt de pagină), URI (ShellExecute), launch (ShellExecute) și GotoR încorporat (rezervat). Valorile implicite activează loAutoGoto și loAutoOpenURI; loAutoLaunch și loAutoEmbeddedGoto rămân dezactivate, astfel încât un clic rătăcit să nu poată porni un program arbitrar
- Au fost adăugate evenimentele OnAnnotationLinkClick și OnWebLinkClick, care se declanșează înaintea oricărei acțiuni automate și permit aplicațiilor să inspecteze linkul, să îl marcheze Handled sau să îl redirecționeze (de exemplu către un prompt de securitate)
- Detectarea clicurilor pe link rulează doar când gestul este un clic și nu un drag, folosind un nou punct de ancorare MouseDown, astfel încât gesturile de panning să continue să treacă neschimbate prin calea de derulare existentă
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 102 cazuri fiecare, iar suita C++Builder la 91 de cazuri, acoperind LinkOptions implicit, round-trip-ul setului și atribuirea handler-elor de eveniment
Version 1.11.0
- A fost adăugat polish vizual în TPdfView: proprietățile PageShadowSize, PageShadowColor și PageBorderColor desenează o umbră opțională sub dreptunghiul paginii și o bordură de un pixel în jurul lui. Valorile implicite păstrează aspectul anterior plat (PageShadowSize = 0; bordura este desenată în clBlack implicit, dar se amestecă în fundalul alb implicit până când apelanții schimbă culorile)
- A fost adăugată proprietatea SmoothScroll ca flag opt-in pentru o viitoare animație incrementală de scroll; proprietatea face round-trip astăzi și este deja legată astfel încât aplicațiile să poată persista preferința, în timp ce partea de randare folosește încă comportamentul existent de scroll imediat
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 98 de cazuri fiecare, iar suita C++Builder la 89 de cazuri, acoperind valorile implicite, round-trip-ul proprietăților și clamparea dimensiunii negative a umbrei
Version 1.10.0
- A fost adăugată inserarea directă de imagini prin noile overload-uri TPdf.AddImage și TPdfView.AddImage care primesc fie o cale de fișier, fie un TBitmap, pe lângă AddPicture-ul existent bazat pe TPicture. AddImage(FileName) recunoaște orice format înregistrat în unitățile grafice VCL sau LCL (BMP, PNG prin unitatea PngImage, JPG etc.) și trece prin același pipeline ca AddPicture, astfel încât comportamentul este identic
- AddImage(TBitmap) sare peste intermediarul TPicture, ceea ce simplifică apelanții care dețin deja un TBitmap obținut din randare sau din fluxuri de generare batch
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 92 de cazuri fiecare, iar suita C++Builder la 84 de cazuri, acoperind inserarea de bitmapuri, limitele obiectelor de pagină, respingerea bitmapurilor nil și încărcarea fișierelor BMP
Version 1.9.0
- A fost adăugat suport high-level pentru matrici de transformare prin noua clasă TPdfMatrix din unitatea FPdfMatrix. TPdfMatrix învelește FS_MATRIX din PDFium cu un API OO pentru Translate, Scale, Rotate, HorizontalFlip, VerticalFlip, CentralFlip, Skew și Multiply, potrivit pentru compunerea transformărilor înainte de a le transmite către FPDFPageObj_SetMatrix și API-uri PDFium similare
- TPdfMatrix.Multiply face corect un snapshot al celor șase elemente ale matricei înainte de a calcula noile valori de rând, reparând o problemă latentă în care implementările Pascal alternative suprascriau elemente anterioare în timpul aceluiași apel și produceau rezultate incorecte pentru orice compoziție dincolo de translatarea pură
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 88 de cazuri fiecare, iar suita C++Builder la 81 de cazuri, acoperind identitatea, resetarea, translate / scale / flip, ordinea compoziției post-multiplicative și cazul de regresie Multiply
Version 1.8.0
- A fost adăugată încărcarea la cerere a stream-urilor prin noua metodă TPdf.LoadCustomDocument(AStream, AOwnsStream) și clasa ajutătoare TPdfStreamAdapter, bazate pe FPDF_LoadCustomDocument din PDFium. PDFium citește acum blocuri din TStream-ul furnizat doar când este nevoie, astfel încât PDF-urile foarte mari sau remote nu mai cer o copie inițială în memorie
- A fost adăugată proprietatea opțională a stream-ului: transmiterea lui AOwnsStream = True predă durata de viață a TStream-ului către TPdf, care îl eliberează când rulează UnloadDocument
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 79 de cazuri fiecare, iar suita C++Builder la 75 de cazuri, acoperind încărcarea în flux prin TFileStream, curățarea stream-urilor deținute și contractul externally-owned-stream survives-unload
Version 1.7.0
- Au fost adăugate primitive de anulare asincronă cooperativă în noua unitate FPdfAsync, expunând IPdfCancellationToken / IPdfCancellationTokenSource și un singleton reutilizabil PdfNoCancellationToken, astfel încât fluxurile lungi de randare și export să poată suporta o semantică curată de anulare din UI
- A fost adăugat un helper ușor TPdfFuture<T> care rulează un worker pe un thread de fundal și postează înapoi pe thread-ul principal plicul TPdfFutureResult<T>, distingând între succes, anulare și eșec
- Suitele de regresie Delphi și Lazarus au fost extinse la câte 76 de cazuri fiecare, iar suita C++Builder la 73 de cazuri, cu acoperire comună pentru starea anulării, anulare idempotentă, fan-out-ul callback-urilor și înregistrarea post-anulare
Version 1.6.10
- A fost adăugat acces high-level prin TPdf.PrintPageRanges la intervalul de pagini pentru tipărire din preferințele vizualizatorului PDF, returnând intervale de pagini bazate pe unu pentru codul aplicației
- Au fost adăugate TPdf.SetFormFieldFlags / SetFormFieldFlagsAt și helper-ele TPdfView corespunzătoare, astfel încât aplicațiile să poată actualiza flag-urile câmpurilor AcroForm prin API-ul public, inclusiv pentru câmpuri de tip parolă și multi-select
- A fost întărită acoperirea ABI a legăturilor PDFium pentru FPDF_DWORD dimensionat pentru Windows, callback-urile FPDF_FILEACCESS și câmpurile slot ale embedder-ului V8
Version 1.6.9
- Au fost adăugate bindinguri low-level pentru randarea Skia, pentru API-urile nou exportate FPDF_RenderPageSkia și FPDF_FFLDrawSkia din DLL-urile PDFium standard și V8 incluse
- Verificările de acoperire pentru bindingurile publice au fost extinse, astfel încât încărcarea DLL-urilor standard și V8 verifică acum punctele de intrare pentru randarea Skia alături de probele existente pentru capabilitățile V8/XFA
Version 1.6.8
- Au fost adăugate TPdf.SetTextPositions și TPdfSingleArray pentru a seta pozițiile per caracter pe obiectele text existente prin API-ul nou exportat FPDFText_SetPositions
- FPDFText_SetPositions a fost promovat la binding obligatoriu pentru DLL-urile PDFium incluse în prezent, confirmând în același timp că punctele de intrare pentru randarea Skia rămân indisponibile deoarece DLL-urile încă nu le exportă
- Suitele de regresie Delphi, C++Builder și Lazarus au fost extinse la câte 65 de cazuri fiecare, cu acoperire pentru pozițiile textului
Version 1.6.7
- A fost adăugat acces high-level prin TPdf la acțiunile JavaScript din name-tree-ul documentului, returnând numele acțiunilor și scripturile prin JavaScriptAction și JavaScriptActions
- A fost adăugat TPdf.FileIdentifier pentru a citi ID-urile permanente și schimbătoare din trailer ca TBytes binar, fără byte-ul terminator PDFium
- Au fost adăugate TPdf.PageBox, GetPageBox și SetPageBox pentru MediaBox, CropBox, BleedBox, TrimBox și ArtBox pe pagina curentă
- S-a confirmat că DLL-urile PDFium incluse în prezent lasă indisponibile la rulare doar punctele de intrare pentru randarea Skia, deoarece aceste exporturi nu sunt prezente
- Suitele de regresie Delphi, C++Builder și Lazarus au fost extinse la câte 64 de cazuri fiecare, cu acoperire pentru JavaScript la nivel de document, ID-ul din trailer și page-box
Version 1.6.6
- A fost adăugat suport la rulare pentru DLL-ul PDFium inclus cu V8 activat. Setarea EnableV8Engine înainte de încărcare selectează acum pdfium.v8.dll din arborele DLLs\Win32 sau DLLs\Win64 și expune bindingurile doar pentru V8/XFA atunci când DLL-ul încărcat le oferă
- Au fost adăugate V8FeaturesAvailable, XfaBStrHelpersAvailable, GetRecommendedV8Flags și bindinguri low-level opționale pentru FPDF_BStr_*, FPDF_GetRecommendedV8Flags și FPDF_GetArrayBufferAllocatorSharedInstance
- FPDFText_SetPositions a fost făcut opțional, astfel încât PDFiumPas să continue să se încarce cu DLL-uri PDFium care nu exportă acel setter experimental pentru pozițiile textului
- Suitele de regresie Delphi, C++Builder și Lazarus au fost extinse la câte 61 de cazuri fiecare, cu acoperire pentru capabilitățile DLL-ului standard și ale DLL-ului V8
Version 1.6.5
- A fost adăugată inspectarea tagged PDF structure-tree prin TPdf.StructureElements și TPdfView.StructureElements, incluzând tipul elementului, titlul, textul alternativ, textul actual, textul de extindere, limba, ID-urile marked-content, numărul de copii și numărul de atribute
- A fost adăugată selectarea modului de tipărire Windows PDFium prin TPdfPrintMode și SetPdfPrintMode, acoperind modurile EMF, text-only, PostScript, pass-through, image-mask și Type 42
- Au fost adăugate bindinguri low-level pentru exporturile publice PDFium rămase din DLL-ul standard, acoperind acțiuni JavaScript, flag-uri de formular pentru adnotări/culoarea fontului, starea activă a obiectelor de pagină, inserare indexată, valori float pentru content-mark, datele profilului ICC al imaginilor, eliminarea obiectelor de formular și pozițiile textului
- Suitele de regresie Delphi, C++Builder și Lazarus au fost extinse la câte 59 de cazuri fiecare, cu acoperire pentru tagged PDF structure-tree, modul de tipărire și bindingurile pentru exporturile publice
Version 1.6.4
- Demo-urile Delphi, C++Builder și Lazarus au fost actualizate pentru a deschide automat PDF-urile generate, textele/imaginile exportate și folderele de ieșire batch după creare reușită
Version 1.6.3
- Suitele de regresie aliniate pentru Delphi, C++Builder și Lazarus au fost extinse la câte 56 de cazuri fiecare, cu acoperire GUI TPdfView pentru helper-ele de fit-zoom, round-trip-urile coordonatelor device/page, hit-testing pe caractere și panning cu mouse-ul prin controale de vizualizator în fereastră ascunsă
- Fixture-urile TPdfView folosesc acum o dimensiune explicită a vizualizatorului și subclase numai pentru test care exercită handler-ele protected ale mouse-ului, păstrând în același timp suitele complet headless
Version 1.6.2
- A fost corectat TPdf.AddPage(0, ...), astfel încât prima pagină inserată să devină imediat pagina activă. Codul existent din exemple continuă să funcționeze, iar PageNumber raportează acum o pagină validă bazată pe unu după inserare
- Versiunea pachetului Lazarus a fost sincronizată, iar suitele de regresie aliniate pentru Delphi, C++Builder și Lazarus au fost extinse la câte 52 de cazuri fiecare
Version 1.6.1
- A fost corectată o cerință greșită privind versiunea minimă în validatorul de conformitate pentru versiunea PDF din v1.6.0: acțiunea SetState a fost reclasificată din PDF 1.5 înapoi la PDF 1.2, pentru a corespunde PDF 1.2 Reference 6.9.9. Țintele SaveAs PDF 1.3 / 1.4 care conțin acțiuni SetState se salvează acum corect în loc să fie respinse
- Au fost adăugate verificări lexicale PDF 1.2 corespunzătoare, conform aceleiași secțiuni din specificație: acțiunile Sound, Movie și NOP, plus spațiul de culoare Separation, sunt acum blocate atunci când versiunea țintă aleasă este mai veche decât PDF 1.2
- Suitele de regresie Delphi, C++Builder și Lazarus au fost extinse la câte 50 de cazuri fiecare prin adăugarea unui test pozitiv de acceptare pentru SetState în PDF 1.4, care fixează limita corectată
Version 1.6.0
- Țintele explicite SaveAs pentru PDF 1.0 până la PDF 1.7 au fost întărite cu un validator complet pentru funcționalități în funcție de versiune, care acoperă întreaga cronologie a funcționalităților PDF 1.1 până la ISO 32000-1. Validatorul blochează acum salvările care conțin intrări de dicționar, nume de filtre, subtipuri de adnotări, tipuri de acțiuni, fonturi, spații de culoare sau parametri de criptare introduși după versiunea țintă aleasă. Exemple: JBIG2Decode (1.4+), MarkInfo / Tagged PDF (1.4+), OutputIntents (1.4+), ICCBased / DeviceN / BleedBox / TrimBox / ArtBox / StructTreeRoot (1.3+), adnotările Polygon / PolyLine / Caret / Screen / Watermark / Redact, criptarea AES și AES-256 (CFM AESV2 / AESV3), intrările de catalog Perms / Legal / Requirements / NeedsRendering și acțiunile limitate de versiune precum JavaScript, Trans, SetState, Rendition, GoToE, GoTo3DView sunt toate respinse atunci când versiunea PDF țintă nu le poate reprezenta
Version 1.5.13
- Suitele de regresie Delphi, C++Builder și Lazarus au fost extinse la câte 49 de cazuri fiecare, adăugând acoperire directă pentru respingerea spațiilor de culoare ICCBased, Tagged PDF MarkInfo, adnotărilor Polygon, criptării AES (V2) și adnotărilor Redact față de țintele PDF 1.2 / 1.3 / 1.4 / 1.5 / 1.6, respectiv
Version 1.5.12
- A fost corectată post-procesarea SaveAs pentru rescrierile incrementale ale catalogului. PDFiumPas validează acum cel mai recent obiect indirect repetat, astfel încât suprascrierile existente ale /Version din catalog să fie înlocuite corect la salvarea într-o versiune PDF țintă explicit mai veche
- Suitele de regresie Delphi, C++Builder și Lazarus au fost extinse la câte 44 de cazuri fiecare, adăugând acoperire directă pentru înlocuirea unui /Version vechi din catalog, normalizarea versiunii de catalog PDF 1.4 și respingerea funcționalităților de transparență și portable-collection atunci când versiunea PDF țintă selectată nu le poate reprezenta
Version 1.5.11
- Ieșirea SaveAs cu versiune explicită pentru țintele PDF 1.3, 1.4, 1.5, 1.6 și 1.7 a fost întărită. PDFiumPas normalizează acum markerii de versiune din catalog, păstrează OpenAction-ul implicit Fit Height sigur din punctul de vedere al versiunii și respinge funcționalitățile PDF mai noi atunci când versiunea țintă selectată nu le poate reprezenta
- A fost adăugată acoperire de regresie pentru Delphi, C++Builder și Lazarus care salvează și reîncarcă fișiere explicite PDF 1.3 până la PDF 1.7, verificând antetul final, OpenAction-ul implicit Fit Height și versiunea PDF raportată
Version 1.5.10
- S-a trecut de la opțiunea B din specificație la opțiunea C prin adăugarea de teste smoke pentru TPdfView în toate cele trei suite IDE (Tests.PdfView). Fiecare suită construiește un TForm părinte ascuns (prin TForm.CreateNew pe laturile Pascal și
new TForm(NULL, 0)pe latura C++Builder), reatașează un TPdfView, setează Active := True și apoi verifică suprafața de round-trip pentru PageCount, valoarea implicită a PageNumber, Zoom, Rotation, DisplayMode și faptul că View.Text se potrivește cu TPdf.Text-ul de dedesubt. Fiecare suită IDE rulează acum 39 de cazuri
Version 1.5.9
- S-a trecut de la opțiunea A din specificație la opțiunea B prin adăugarea de teste smoke pentru randare în toate cele trei suite IDE. Fiecare suită Tests.Render apelează TPdf.RenderPage pe sample.pdf și verifică trei semnale robuste în loc de checksum-uri byte cu byte: bitmapul returnat se potrivește exact cu dimensiunea în pixeli cerută; dimensiuni diferite cerute (200x100, 64x256) produc bitmapuri corespunzătoare; iar pagina randată are cel puțin 95% fundal alb, cu minimum 50 (Lazarus: 20) pixeli non-albi care marchează textul anti-aliased. Fiecare suită IDE rulează acum 33 de cazuri
Version 1.5.8
- Grupurile originale A(2) din planul de test au fost închise prin adăugarea a încă șapte regresii pentru fiecare IDE: TPdf.CreateAnnotation construiește o adnotare anHighlight plus un round-trip SaveAs/LoadDocument, calea de citire AcroForm pe Demo/Delphi/FormFill/cmp_fill_out_and_merge_forms.pdf (FormType este ftAcroForm, FormFieldCount > 0, FlattenAllPages reduce câmpurile la zero) și acoperire discretă a căii de citire pentru Bookmarks, LinkAnnotationCount și WebLinkCount pe un document care nu are niciuna dintre aceste funcționalități. Fiecare suită IDE rulează acum 30 de cazuri
Version 1.5.7
- Suitele Delphi (DUnitX), Lazarus (FPCUnit) și C++Builder (GoogleTest) au fost extinse cu șapte regresii noi per IDE: PdfVersion, PageRotation, căutarea de subșiruri TPdf.FindFirst / FindNext, concordanța CharacterOrigin / CharacterRectangle față de originea AddText, înregistrarea CreateAttachment plus un round-trip SaveAs/LoadDocument și un round-trip AddText cu text accentuat care verifică faptul că calea de încorporare European TrueType din v1.3.0 păstrează intacte punctele de cod suplimentare Latin-1
Version 1.5.6
- PDF-urile salvate primesc acum o acțiune implicită de deschidere Fit Height pe prima pagină atunci când nu există un OpenAction existent, astfel încât cititoarele PDF să afișeze inițial documentele generate la zoom pe înălțimea paginii
- A fost adăugată acoperire de regresie în Delphi, Lazarus și C++Builder pentru OpenAction-ul generat și setarea Fit Height
Version 1.5.5
- Au fost adăugate teste de regresie în suitele Delphi (DUnitX), Lazarus (FPCUnit) și C++Builder (GoogleTest) pentru suprafața API de inspecție indexată a caracterelor și fonturilor (TPdf.FontBaseName, FontFamilyName, FontWeight, FontItalicAngle, FontData, FontIsEmbedded, CharacterFontWeight, CharacterAngle). Suita Lazarus sare intenționat peste FontData, care în prezent produce access violation în interiorul FPDFFont_GetFontData sub FPC
Version 1.5.4
- A fost adăugat un demo C++Builder Attachment portat din exemplul Delphi, care acoperă crearea de PDF-uri, adăugarea, listarea, extragerea, ștergerea și salvarea atașamentelor de fișiere încorporate, cu afișarea subtipului MIME
Version 1.5.3
- Calculul spread-page care stă la baza modurilor cu două pagini din TPdfView a fost expus ca helper la nivel de unitate, ComputeSpreadPages(DisplayMode, PageNumber, PageCount, out LeftPageNo, out RightPageNo). Comportamentul rămâne neschimbat; helper-ul face regula cover-aware testabilă independent, fără a instanția un vizualizator
- Au fost adăugate cinci teste de regresie în suitele Delphi (DUnitX), Lazarus (FPCUnit) și C++Builder (GoogleTest), acoperind documentele goale, împerecherea standard pe două pagini, pagina de copertă care stă singură în dmTwoPageContinuousWithCover, perechile de după copertă și comportamentul de clampare pentru ultima pagină / valori în afara intervalului
Version 1.5.2
- A fost adăugat suport pentru limba documentului prin TPdf.Language, mapat la intrarea /Lang din catalogul PDF
- A fost adăugat acces la subtipul MIME al atașamentelor prin TPdf.AttachmentType
- A fost adăugat anRedact în TPdfAnnotationSubtype și au fost adăugate helper-e de eliminare a obiectelor de pagină pentru TPdf și TPdfView
- Demo-urile pentru vizualizator și atașamente au fost actualizate pentru a afișa noile informații despre limba documentului și tipul atașamentului atunci când sunt disponibile
Version 1.5.1
- A fost adăugat dmTwoPageContinuousWithCover pentru TPdfView, astfel încât layout-urile vizualizatorului să poată afișa prima pagină singură și apoi să continue cu spread-uri pe două pagini
- Demo-urile MultiPageViewer pentru Delphi, C++Builder și Lazarus au fost actualizate pentru a expune modul de afișare pe două pagini cu suport pentru copertă
Version 1.5.0
- Au fost adăugate suite automate de test la nivel smoke pentru Delphi (DUnitX), Lazarus (FPCUnit) și C++Builder (GoogleTest). Cele trei suite partajează un singur fixture PDF în Tests\TestData și rulează aceleași șapte cazuri fiecare, acoperind încărcarea documentelor, informațiile despre pagină, extragerea textului, metadatele, round-trip-ul la salvare, validarea antetului PDF și proprietatea Compressed
Version 1.4.3
- Demo-ul FontProperties a fost îmbunătățit pentru a afișa atât API-urile de metadata ale fonturilor din TPdfView, cât și pe cele din TPdf, inclusiv handle-urile fonturilor, dimensiunea datelor de font și metricele caracterelor
- Au fost adăugate proprietăți indexate de inspecție a caracterelor și fonturilor în TPdfView, iar demo-ul FontProperties a fost actualizat pentru a interoga metadata fonturilor din obiectele text
Version 1.4.2
- Au fost adăugate în TPdf proprietăți indexate de inspecție a caracterelor și fonturilor pentru analiza textului fără a cere un vizualizator. Proprietățile indexate după caracter (CharacterAngle, CharacterFontSize, CharacterFontWeight) interoghează metrice per caracter din stream-ul de text al paginii curente. Proprietățile indexate după obiect de pagină (FontAscent, FontBaseName, FontData, FontDescent, FontFamilyName, FontHandle, FontIsEmbedded, FontItalicAngle, FontWeight) interoghează metadatele fontului pentru orice obiect text de pe pagina curentă
- Obiectele de pagină non-text returnează valori zero sau goale sigure pentru toate proprietățile Font* în loc să ridice o eroare, ceea ce face simplă iterarea tuturor obiectelor de pagină și inspectarea doar a celor de text
- FontBaseName citește direct numele de font de bază PostScript în loc să revină la numele familiei de font, oferind un identificator mai precis pentru fonturile încorporate
Version 1.4.1
- Au fost adăugate versiuni C++Builder și Lazarus ale demo-ului EuropeanText, astfel încât toate familiile de IDE suportate să poată verifica generarea de text european accentuat cu fonturi TrueType de sistem
- Au fost adăugate versiuni C++Builder și Lazarus ale demo-ului FormFill, incluzând PDF-uri de formular exemplu, editarea câmpurilor, regenerarea aspectului, salvarea formularelor completate și fluxurile de salvare flatten
Version 1.4.0
- A fost adăugat suport pentru Lazarus / Free Pascal: noul pachet PDFiumLaz oferă aceleași componente TPdf, TPdfView și cele înrudite sub setul de widget-uri LCL, extinzând biblioteca către IDE-ul Lazarus și compilatorul Free Pascal alături de pachetele existente pentru Delphi și C++Builder
- Au fost adăugate versiuni Lazarus ale demo-urilor, astfel încât dezvoltatorii Lazarus să poată explora fiecare funcționalitate cu exemple rulabile
- A fost corectată o problemă de compilare în Lazarus, în care directivele condiționale Free Pascal erau evaluate împreună cu verificările de versiune ale compilatorului Delphi, ceea ce făcea buildurile FPC să încerce să rezolve nume de unități specifice Delphi și să eșueze
Version 1.3.1
- Fluxul de flatten pentru formulare a fost documentat în setul de help: GenerateFormAppearances, FlattenPage, FlattenAllPages și constantele înrudite FLAT_* / FLATTEN_* sunt acum acoperite în TPdf, TPdfView, referința API, matricea de funcționalități și exemplele de programare
- A fost corectat tabelul de arhitectură din pagina de ansamblu, astfel încât să listeze unitățile de binding reale livrate în folderul Lib
Version 1.3.0
- Suportul pentru caractere europene a fost îmbunătățit la crearea PDF-urilor. TPdf.AddText încarcă și pune acum în cache fontul TrueType de sistem potrivit înainte de a crea un obiect text, păstrând caracterele accentuate din cehă, franceză, germană, spaniolă, portugheză, poloneză și turcă pe care fonturile standard integrate din PDFium nu le pot reprezenta
- Aplicațiile care produceau anterior semne de întrebare sau glyph-uri de înlocuire pentru text latin non-ASCII vor randă acum corect fără nicio schimbare de cod. A fost adăugat demo-ul EuropeanText pentru a ilustra funcționalitatea
Version 1.2.0
- A fost adăugată în TPdf reîmprospătarea aspectului AcroForm: apelarea GenerateFormAppearances după modificarea valorilor FormField[] actualizează aspectul widget-ului astfel încât valorile completate să fie vizibile în cititoarele PDF standard fără a cere o sesiune de editare interactivă
- Au fost adăugate helper-e pentru flatten-ul formularelor în TPdf (FlattenPage / FlattenAllPages) și TPdfView (FlattenPage pentru pagina curentă din vizualizator). Flattening încorporează permanent valorile câmpurilor completate ca conținut obișnuit de pagină și elimină stratul interactiv al formularului, producând un document static care se randează consecvent în toate vizualizatoarele
- A fost adăugat Demo\Delphi\FormFill pentru a demonstra fluxurile fill-and-save și fill-and-flatten cu un PDF AcroForm exemplu
Version 1.1.2
- A fost adăugată comprimarea stream-urilor PDF la salvare. Noua proprietate TPdf.Compressed (activată implicit) rescrie stream-urile de conținut necomprimate ca stream-uri comprimate FlateDecode la salvare, reducând semnificativ dimensiunea fișierului pentru PDF-urile generate programatic. Aplicațiile care au nevoie de ieșire simplă necomprimată pot seta Compressed la False înainte de a apela SaveAs
Version 1.1.1
- Buildurile pachetelor Win64 nu mai includ unități de înregistrare design-time, prevenind eșecurile la build atunci când pachetul Win64 este distribuit într-un context doar runtime
- Încărcătorul DLL PDFium caută acum mai întâi în subdirectorul aplicației Win32 sau Win64, folosind numele standard pdfium.dll și pdfium.v8.dll, și revine apoi la directorul plat al aplicației și la directorul de sistem Windows. Acest lucru se potrivește cu layout-ul DLL livrat împreună cu pachetul de componente, făcând instalarea directă
Version 1.1.0
- A fost corectat un defect vizual de clipping în modul cu două pagini din TPdfView: conținutul paginii se scurgea peste gutter deoarece tile-urile paginii stânga și dreapta împărțeau același dreptunghi de clipping. Fiecare tile face acum clipping independent, astfel încât conținutul să rămână în limitele paginii sale
- Mesajul de eroare din demo-ul Delphi a fost îmbunătățit pentru cazul în care DLL-ul PDFium nu poate fi găsit, oferind un prompt mai clar cu numele și locația așteptate pentru DLL