PDFiumPas Versionshinweise
Versionshistorie für benutzerrelevante PDFiumPas-Funktionen, Korrekturen, Viewer-Verbesserungen, Dokumenterzeugung, PDF/A-Ausgabe, Rendering und Dokumentationsaktualisierungen
Letztes Release
- Aktuelle Version: 2.27.0; Veröffentlichungsdatum:
Version 2.27.0
Geändert (Changed)
- Die Delphi-, C++Builder- und Lazarus-Demos
PDFViewerundMultiPageViewerkapseln Dokumentensuchen nun einmalig, akzeptierenEnterundF3für das nächste Ergebnis, setzen den Suchkontext bei geänderten Trefferoptionen zurück und reservierenEsczum Abbrechen einer aktiven Suche oder eines Druckauftrags - Der Viewer-Druck folgt nun der aktuellen Viewerdrehung und wählt entsprechend Hoch- oder Querformat, sodass die Symbolleistendrehung in den gedruckten Seiten berücksichtigt wird
- Alle drei
ViewerInteractionLab-Demos unterstützen nunCtrl+A,Ctrl+C,Enter,F3undEsc, ohne die nativen Auswahl- und Kopierbefehle der Bearbeitungssteuerelemente abzufangen
Behoben (Fixed)
- Der Abbruch des Viewer-Drucks in C++Builder und Lazarus bricht nun den Druckerauftrag ab, statt die vor dem Abbruch gerenderten Seiten zu übermitteln, und Lazarus verlässt ausdrücklich jede verschachtelte Kopier-, Seiten- und Sortierschleife
- Die Delphi-Schaltfläche Cancel von
MultiPageViewerist nun mit ihrem Handler verbunden, und die Suchfelder von C++Builder/LazarusMultiPageViewerbehalten die native Bearbeitung mit Pfeil-, Home- und End-Tasten
Version 2.26.0
Geändert (Changed)
TPdf.GetObjectBitmap,TPdf.GetBitmap,TPdf.GetThumbnailund ihre Gegenstücke inTPdfViewerwerben nun die Render-Sperre umFPDFImageObj_GetBitmap/FPDFPage_GetThumbnailAsBitmap, entsprechendRenderPage/RenderTile. Diese PDFium-Rendering-Aufrufe liefen zuvor ohne Sperre und konnten mit einem gleichzeitigenUnloadPage/ReloadPageam selben Dokument konkurrierenTPdf.RenderPageThumbnailberücksichtigt nun den Seiteneintrag/Rotate: Für Seiten mit/Rotate 90oder270wird die Anpassung aus den gedrehten Abmessungen neu berechnet, sodass das Seitenverhältnis der Miniaturansicht dem Viewer entspricht, statt die intrinsischen (ungedrehten) Werte vonFPDF_GetPageSizeByIndexzu verwenden
Behoben (Fixed)
TPdfView.GetCharacterRectangleignorierte den Rückgabewert vonFPDFText_GetCharBoxund übergab bei einem PDFium-Fehler ein nicht initialisiertesTPdfRectangleanPageToDevice. Das Rechteck wird nun mit null initialisiert und ein fehlgeschlagenesGetCharBoxgibtRect(0,0,0,0)zurück- Die Pufferlänge für URI- und Dateipfade von
GetLinkAnnotationswar um eins zu groß: Der zweite Aufruf vonFPDFAction_GetURIPath/GetFilePathübergabsizeeinschließlich des abschließenden NUL an einen Puffer der Größesize-1. Der Aufruf übergibt nunsize-1und kann bei einem PDFium-Build ohne eigene Begrenzung nicht hinter die Zuweisung schreiben
Version 2.25.0
Geändert (Changed)
TPdf.AddText,SetText,AddPathundInsertFormObjectFromXObjectmachen nun die zwischengespeicherte Textseite und Linkanmerkungen ungültig, bevor sie den Seiteninhalt neu erzeugen, entsprechendSetTextPositionsundRemoveObject. Zuvor lieferteGetText/GetWebLinks/FindFirstnach einer Seitenbearbeitung veraltete Daten, und das beibehalteneFPDF_TEXTPAGE-Handle wurde danach mit undefiniertem Verhalten verwendetTPdfView.RenderPage(HDC, ...)erwirbt nun die Render-Sperre und maskiert FPU/SSE-Ausnahmen umFPDF_RenderPage, entsprechend allen anderen Rendering-Einstiegspunkten. Die direkte DC-Überladung konnte zuvor mitUnloadPage/ReloadPagekonkurrieren und ließ FPU-Ausnahmen bei Compilern vor D12 unmaskiert- Die Delphi-Demo
PrintPDFruft bei Abbruch nunPrinter.Abortauf, stattPrinter.EndDoczu erreichen und die bereits gerenderten Seiten zu übermitteln. Die Lazarus-Demo behandelte dies bereits korrekt
Behoben (Fixed)
TPdf.GetCharacter,TPdf.GetCharcodeund ihre Gegenstücke inTPdfViewkürzten vonFPDFText_GetUnicodegelieferte Codepunkte der Astralebene (Emoji, CJK Extension B) überWideChar()auf die unteren 16 Bit und erzeugten ein einzelnes Ersatzzeichen. Zeichen über U+FFFF geben nun U+FFFD zurück; verwenden SieGetTextfür die vollständige UTF-16-CodierungGetWebLinksriefSetLength(Rectangles, FPDFLink_CountRects(...))ohne Absicherung eines Rückgabewerts von-1auf, was auf einer fehlerhaften SeiteEOutOfMemoryauslöste. Eine negative Anzahl wird nun auf null begrenztTPdf.Destroyentfernt nunPasswordüberUniqueString+FillCharaus dem Speicher, bevor der referenzgezählte Puffer freigegeben wird
Version 2.24.0
Hinzugefügt (Added)
TPdf.DeletePage,GetAttachment,GetAttachmentName,GetAttachmentType,SetAttachmentundDeleteAttachmentvalidieren nun Seiten- und Anlagenindex und lösen bei ungültigen WertenEPdfErroraus, entsprechend dem bestehenden Verhalten der Anmerkungszugriffe. Zuvor wurde ein ungültiger Index direkt an PDFium übergeben und führte zu einem stillen No-op oder undefiniertem Verhalten
Behoben (Fixed)
- Seitenobjekt-Handle-Lecks bei Fehlern in
TPdf.AddText,AddBitmapundAddJpegImagesind behoben: Wenn einer der AufrufeFPDFText_SetText,FPDFImageObj_SetBitmap,FPDFImageObj_SetMatrixoderFPDFImageObj_LoadJpegFileInlinevorFPDFPage_InsertObjectfehlschlug, zerstört jeder Pfad das nativeFPDF_PAGEOBJECT-Handle nun vor dem erneuten Auslösen TPdf.UnloadPagezerstört ein laufendesFPath-Handle nun überFPDFPageObj_Destroy, statt es bei einem Seitenwechsel oder aufgegebenen Pfad nur aufnilzu setzenTPdf.InsertFormObjectFromXObjectruft nun nach der EinfügungUpdatePage(FPDFPage_GenerateContent) auf, sodass ein eingefügtes Form-XObject beim Neuladen oder Speichern nicht mehr verschwindet
Version 2.23.0
Behoben (Fixed)
- Die Validierung von optionalem Inhalt akzeptiert bei
/BaseStatenun zusätzlich zu/ONauch/OFF(ISO 32000-1 Table 8.70 erlaubt beide) - Die Validierung von optionalem Inhalt akzeptiert bei
/Intentnun/Designund Arrays wie[/View /Design], nicht nur/View, entsprechend ISO 32000-1 Table 8.70 - Die Erkennung des Geospatial-Measure-Wörterbuchs für die PDF-1.7-Schranke
/Extensions /ADBEExtensionLevel 3 erfordert nicht mehr/Type /Measure, das ISO 32000-1 Table 254 als optional kennzeichnet; der Detektor gleicht nun allein/Subtype /GEOab
Version 2.22.0
Geändert (Changed)
- Die Fit-Zoom-Berechnungen von
TPdfView(GetPageZoom,GetPageWidthZoom,GetPageHeightZoom) verwenden nunClientWidth/ClientHeightstattWidth/Heightdes Fensters, sodasspfmFitPage/pfmFitWidth/pfmFitHeightdie Seite an den sichtbaren Viewport statt an den Außenrahmen mit Bildlaufleisten und Rändern anpassen AddSignatureTimestampToCmslöst nun eine expliziteExceptionaus, die das unlesbare CMS-SignerInfo-Feld (version / sid / digestAlgorithm / signedAttrs / signatureAlgorithm) benennt, statt stillschweigendExitauszuführen; außerdem ist der fehlendebegin/end-Block um den optionalen ZweigsignedAttrs [0]korrigiert, derR.Positionunverändert ließ
Behoben (Fixed)
- Das CNG-Privatschlüssel-Handle in
ResolveWinSignerwird bei Fehlern nachCryptAcquireCertificatePrivateKeynun überNCryptFreeObjectfreigegeben, bevor die Besitzübertragung anTWinCmsSigner.Createerfolgt EcDsaP1363ToDerweist nun eine vollständig nullwertiger- oders-Hälfte zurück, stattINTEGER 0auszugeben; ECDSA-Signaturen mitr = 0oders = 0sind ungültig (RFC 4754 §6 / FIPS 186-4 §6 verlangen1 ≤ r, s ≤ n-1)
Version 2.21.12
Behoben (Fixed)
- Explizite PDF-1.5-bis-PDF-1.7-Speichervorgänge lehnen nun fehlerhafte Katalog-
/OCProperties-Strukturen ab, einschließlich fehlender erforderlicher/OCGs- oder/D-Einträge, ungültiger Standard-Konfigurationswerte und Nicht-Array-Statuseinträge
Version 2.21.11
Behoben (Fixed)
- Explizite PDF-Versions-Speichervorgänge lehnen nun direkte oder indirekte Seiten-
/Annots-Einträge ab, deren Anmerkungswörterbücher den erforderlichen/Subtype- oder/Rect-Eintrag weglassen
Version 2.21.10
Behoben (Fixed)
- Explizite PDF-1.7-Speichervorgänge erfordern nun, dass geospatiale
/Type /Measure /Subtype /GEO-Wörterbücher und Projection-Anmerkungen/Extensions /ADBEmit/BaseVersion /1.7und/ExtensionLevel 3oder neuer deklarieren
Version 2.21.9
Behoben (Fixed)
- Explizite PDF-1.7-Speichervorgänge erfordern nun, dass RichMedia-Anmerkungen und
RichMediaExecute-Aktionen/Extensions /ADBEmit/BaseVersion /1.7und/ExtensionLevel 3oder neuer deklarieren
Version 2.21.8
Behoben (Fixed)
- Explizite PDF-1.7-Speichervorgänge erfordern nun, dass PRC-3D-Streams
/Extensions /ADBEmit/BaseVersion /1.7und/ExtensionLevel 1oder neuer deklarieren, anstatt PRC als Kern-PDF-1.7-Funktion zu behandeln
Version 2.21.7
Behoben (Fixed)
- Explizite PDF-1.4-und-ältere-Speichervorgänge lehnen nun Bild-XObject-
/SMaskInData-Einträge ab, einschließlich eines expliziten Werts von0, da eingebettete JPEG-2000-Softmaske-Kanäle PDF 1.5 oder neuer erfordern
Version 2.21.6
Behoben (Fixed)
- Explizite PDF-1.4-und-ältere-Speichervorgänge lehnen nun 16-Bit-Bild-XObjects ab, die PDF 1.5 oder neuer erfordern, während PDF 1.5 bis PDF 1.7-Ziele ihre
/BitsPerComponent 16-Bilddaten beibehalten
Version 2.21.5
Behoben (Fixed)
- Explizite PDF-1.4-und-ältere-Speichervorgänge lehnen nun Dokument-Katalog-
/PageLayout /TwoPageLeft- und/TwoPageRight-Werte ab, die PDF 1.5 oder neuer erfordern, während PDF 1.5 bis PDF 1.7-Ziele das angeforderte Zweiseitenlayout beibehalten
Version 2.21.4
Behoben (Fixed)
- Explizite PDF-1.3-Speichervorgänge lehnen nun Dokument-Katalog-
/Lang-Einträge ab, die PDF 1.4 oder neuer erfordern, während PDF 1.4 bis PDF 1.7-Ziele den Sprachbezeichner beibehalten
Version 2.21.3
Behoben (Fixed)
- Explizite PDF-1.3-Speichervorgänge lehnen nun Dokument-
/EmbeddedFiles-Namensträume ab, die PDF 1.4 oder neuer erfordern, ohne eingebettete Dateiströme abzulehnen, die über ältere Dateispezifikationen referenziert werden
Version 2.21.2
Behoben (Fixed)
- Aktuelle Version: 2.21.2; Veröffentlichungsdatum:
Version 2.21.1
Behoben (Fixed)
- Die Hybrid-Referenz-Validierung wendet nun zusätzliche
/XRefStm-Einträge vor klassischen xref-Platzhaltern derselben Revision an, sodass komprimierte Annotationen und andere versionsgeschlossene Objekte nicht mehr übersehen werden, wenn die Kompatibilitätstabelle sie als frei markiert
Version 2.21.0
Geändert (Changed)
- Alle Delphi-, C++Builder- und Lazarus-Viewer-Beispiele können nun eine PDF öffnen, die als erstes Befehlszeilenargument übergeben wird, und die C++Builder- und Lazarus-
MultiPageViewer-Beispiele bieten explizite Alles auswählen- und Kopieren-Tastenkombinationen
Behoben (Fixed)
- Aktuelle Version: 2.21.3; Veröffentlichungsdatum:
Version 2.20.0
Geändert (Changed)
- Alle Delphi-, C++Builder- und Lazarus-Viewer-Beispiele bieten nun konsistente Tastenkombinationen für Öffnen, Suchen, Speichern, Drucken, Zoomen und Seitennavigation, während jede
ViewerInteractionLab-Variante auch Seitensprünge, validierten manuellen Zoom von 10–600 %, persistente Interaktionsprotokolle und Klickkoordinaten-Hin-und-Rück-Prüfungen unterstützt
Version 2.19.1
Behoben (Fixed)
- Aktuelle Version: 2.21.4; Veröffentlichungsdatum:
Version 2.19.0
Geändert (Changed)
- Aktuelle Version: 2.19.1; Veröffentlichungsdatum:
Behoben (Fixed)
- Das C++Builder-Beispiel
CJKTextLabmisst Text nun über die exportierten PDFium-Bearbeitungsfunktionen, undMergePDFvermeidet eine mehrdeutige VCL-Nachrichtenüberladung, wodurch saubere RAD Studio 37-Builds wiederhergestellt werden
Version 2.18.3
Behoben (Fixed)
- Der PAdES B-LTA Document Time-stamp wird nun als auffindbares Signaturfeld registriert — ein unsichtbares Widget, das über das erste-Seite-
/Annotsund das AcroForm-/Fields(ETSI EN 319 142-1 §5.4.3) erreichbar ist — statt als unerreichbares verwaistes Objekt, das signaturfeldenumerierende Validatoren nicht finden konnten; bestehende Annotationen und Felder bleiben erhalten
Version 2.18.2
Behoben (Fixed)
- PAdES-Signierung und klassisches Querverweisschreiben lösen nun einen klaren Fehler aus, wenn ein Byte-Offset die feste 10-stellige Feldbreite (~9,3 GB) überschreitet, anstatt den
/ByteRange-Platzhalter stillschweigend ungeschrieben zu lassen (was eine ungültige Signatur erzeugt) oder die 20-Byte-xref-Zeile zu überschreiten (ISO 32000-1 §7.5.4); die Ausgabe von Querverweisströmen verwendet 8-Byte-Binärfelder und ist nicht betroffen
Version 2.18.1
Behoben (Fixed)
- PAdES-Signierung löst nun indirekte erste-Seite-
/Annots-,/AcroForm- und/Fields-Referenzen durch den vollständigen Objekt-Header (ISO 32000-1 §7.5.3) und durch die tatsächliche Generierungsnummer der Referenz auf; eine bloße Teilstring-Suche stimmte zuvor mit einer Objektnummer innerhalb einer längeren überein (löste5 0 Rauf15 0 objauf) und eine fest codierte Generation verfehltegen>0-Objekte, was die Signaturfeld-Arrays korrumpierte oder gültige Dokumente ablehnte - Wenn Katalog, erste Seite,
/Annots,/AcroFormoder/Fieldsin einem Objektstrom liegt, versucht die Signierung nun auf einer erweiterten Kopie erneut, bevor sie fehlschlägt, anstatt das Dokument direkt abzulehnen
Version 2.18.0
Hinzugefügt (Added)
ReadPdfVersionInfomeldet die Header-Version, die effektive Kernversion, die Katalog-Override und das Adobe-Entwicklererweiterungslevel aus einem PDF-Stream
Geändert (Changed)
- Aktuelle Version: 2.21.12; Veröffentlichungsdatum:
- Dateipfad-Speicherungen schreiben nun in eine benachbarte temporäre Datei und ersetzen das Ziel erst, nachdem alle Komprimierungs-, Normalisierungs- und Versionsprüfungen erfolgreich abgeschlossen sind
Behoben (Fixed)
- Die PDF 1.3-Ausgabe enthält nun die erforderliche vollständige
/ProcSet-Ressource und entfernt PDF 1.4-Transparenzschlüssel, wenn diese nur die initialen Grafikzustandswerte von PDF 1.3 wiederholen - Hybrid-Referenz-, Xref-Stream- und Objektstrom-Dateien werden nicht mehr durch den klassischen Xref-Kompressor neu geschrieben, wodurch verhindert wird, dass komprimierte Objekteinträge verworfen werden
- Namen, die Transparenz- oder Katalogfunktionsschlüssel in Strings, Kommentaren oder nicht verwandten Ressourcenmaps ähneln, verursachen keine falschen Zielversions-Fehler mehr
Version 2.17.0
Hinzugefügt (Added)
- PAdES-Signaturen werden nun als unsichtbare Widget-Annotationen im ersten-Seite-
/Annots-Array und im AcroForm-/Fields-Array registriert, wobei bestehende Annotationen und Formularfelder erhalten bleiben
Geändert (Changed)
- Inkrementelle PDF/A-, PDF/X-, PDF/E-, PDF/R-, PDF/UA-, PDF/VT- und PAdES-Updates bewahren nun die Querverweisdarstellung des Quelldokuments: Xref-Stream-Dokumente erhalten ein Xref-Stream-Update, wie von ISO 32000-1 §7.5.8.1 gefordert, während klassische Dokumente weiterhin eine Xref-Tabelle erhalten
- Querverwei-Offsets,
startxref,/Prev, PAdES-ByteRange-Werte und SHA-256-Bereichsverarbeitung verwenden nun 64-Bit-Positionen mit segmentiertem Hashing, was Dateien größer als 2 GB in 64-Bit-Builds ermöglicht - Generierte beschreibbare XMP-Pakete reservieren nun 2048 Bytes Auffüllung vor der schließenden Paketanweisung
Version 2.16.10
Behoben (Fixed)
- Die Erweiterung von Objektströmen wiederbelebt keine veralteten Kopien von Objekten mehr, die ein inkrementelles Update aus dem Objektstrom in eine einfache Definition migriert hat (ISO 32000-1 §7.5.7); Konformitätsprüfungen und Marker-Injektion lösten zuvor den veralteten Katalog oder das Metadaten-Wörterbuch bei solchen Dateien auf
Version 2.16.9
Behoben (Fixed)
- Auf Free Pascal werden Textstrings, deren Eingabe kein gültiges UTF-8 ist, byteweise als Latin-1 erweitert und als UTF-16BE-Hex-Strings geschrieben; die rohen hohen Bytes flossen zuvor in einen Literal-String, was keine legale PDF 1.7-Textstringkodierung ist
- Stream-Dekodierung erkennt nun rohe Deflate-Daten ohne RFC 1950 zlib-Wrapper (ein häufiger Defekt fehlerhafter Writer) und dekomprimiert sie im Roh-Modus, sodass Konformitätsprüfungen bei solchen Streams nicht mehr still blind werden
Version 2.16.8
Behoben (Fixed)
- Inkrementelle Updates, die durch den Speicher-Post-Processing-Pfad geschrieben werden, aktualisieren nun das zweite (ändernde) Trailer-
/ID-Element wie von ISO 32000-1 §14.4 gefordert; beide Elemente wurden zuvor verbatim kopiert, sodass Caching- und Synchronisations-Tools nach jedem Update einen unveränderten Identifier sahen
Version 2.16.7
Behoben (Fixed)
- Die Stream-Body-Ausblendung, die von Konformitätsprüfungen verwendet wird, erfordert nun, dass das
stream-Schlüsselwort von einem Zeilenende gefolgt wird (ISO 32000-1 §7.3.8.1); das Wort in einem Literal-String wie(downstream)blendete zuvor alle folgende Struktur bis zum nächstenendstreamaus und verbarg echte Verletzungen vor den Byte-Level-Prüfungen - Die PDF/X- und PDF/E-Verbotsmerkmal-Scans blenden zusätzlich Literal-Strings und Kommentare (§7.2.2) aus, sodass ein Wert wie
/Title (see /JavaScript docs)oder ein kommentiertes Token kein falschesJavaScript-,AcroForm- oderLZWDecode-Ergebnis mehr erzeugt
Version 2.16.6
Behoben (Fixed)
- PDF/VT DPM-Einträge werden nun beim Schreiben wie dokumentiert validiert: Schlüsselnamen, die die NMTOKEN-Regel von ISO 16612-2 §6.6 oder die Registrant-Präfix-Regel in Anhang E verletzen, sowie doppelte Namen werden abgelehnt, anstatt in das DPart-Wörterbuch geschrieben zu werden — ein Name mit Leerzeichen wurde zuvor in ein gefälschtes Schlüssel/Wert-Paar aufgeteilt und korrumpierte das Wörterbuch
Version 2.16.5
Behoben (Fixed)
- Das Entfernen eines Wörterbucheintrags, dessen Wert ein Hex-String ist (wie
/Check <...>), entfernt nun den gesamten Eintrag; die Injektoren hinterließen zuvor einen verwaisten Hex-Wert und erzeugten ein syntaktisch defektes Wörterbuch - Das Entfernen eines Eintrags, dessen indirekte Referenz Zeilenumbrüche zwischen den Tokens verwendet (ISO 32000-1 §7.3.10 erlaubt beliebige Leerzeichen), hinterlässt keine Generierungsnummer und kein
R-Schlüsselwort mehr
Version 2.16.4
Behoben (Fixed)
- Der Maximum-Objektnummer-Scan erfordert nicht mehr, dass Objekt-Header eine Zeile beginnen (ISO 32000-1 §7.5.3 erlaubt beliebige Leerzeichen oder Trennzeichen davor), sodass Injektoren keine Objektnummer mehr zuweisen können, die mit einem Inline-
N G obj-Header kollidiert und die Datei still korrumpiert; Objektnummern sind durch die Anhang-C-Obergrenze begrenzt - Streams, deren
/Lengtheine indirekte Referenz ist, lösen nun das referenzierte Integer-Objekt auf und verwenden seinen Wert, wenn er mit dem schließendenendstreamübereinstimmt; solche Streams wurden zuvor durch eine Muster-Suche begrenzt, die Bodies, die dieendstream-Bytesequenz legal enthielten, abschnitt — typisch für eingebettete PDF-Anhänge
Version 2.16.3
Behoben (Fixed)
- Stream-Komprimierungsdurchläufe übergeben Querverweisstream-Dokumente (PDF 1.5+-Dateien ohne klassisches
trailer-Schlüsselwort) unverändert; der Rebuild-Pfad parstestartxrefzuvor fälschlicherweise als Tabellenposition und synthetisierte einen gerateenen Trailer, was eine nicht öffenbare Datei erzeugen konnte - Der Kompressor überspringt XMP-Metadatenstreams, damit ein PDF/A-Dokument seinen obligatorisch ungefilterten Metadatenstream behält (ISO 19005-1 §6.7.2), und lässt externe Datei-Streams (
/Fmit/FFilter) unberührt - Die neu aufgebaute Querverweistabelle scannt eine stream-bereintigte Kopie des Dokuments, sodass binärer Stream-Inhalt keine Objekt-Header mehr fälschen oder die Tabelle aufblähen kann; das
/Sizedes neu aufgebauten Trailers spiegelt nun die tatsächliche Tabelle wider und Objektnummern sind auf die Anhang-C-Obergrenze begrenzt - Das Auffinden der ursprünglichen Querverweistabelle akzeptiert CR-only-Zeilenenden (ISO 32000-1 §7.5.1) und kann die
xref-Buchstaben instartxrefnicht mehr abgleichen; das Stream-Schlüsselwort-Scannen erhielt den gleichenendstream-Tail-Guard und rückt nun nach übersprungenen Stream-Bodies vor
Version 2.16.2
Behoben (Fixed)
- Integer-Parsing in den Byte-Level-PDF-Readern akzeptiert nun das explizite
+-Vorzeichen, das von ISO 32000-1 §7.3.3 erlaubt wird, und lehnt Ziffernfolgen ab, die überlaufen würden, sodass feindliche oder korrumpierte Dokumente geparste Längen und Offsets nicht mehr in irreführende Werte umbrechen können
Version 2.16.1
Behoben (Fixed)
- Der PDF/UA-Injektor schreibt den Katalog-
/Lang-Wert als ordnungsgemäßen PDF-Text-String; er führte den Wert zuvor durch den XML-Escaper, sodass ein Sprach-Tag mit&oder Klammern einen korrumpierten Eintrag erzeugte und Nicht-ASCII-Eingaben als rohes UTF-8 geschrieben wurden - Der PDF/E-
/ISO_PDFEVersion-Info-Eintrag verwendet den gemeinsamen Text-String-Encoder und hält Nicht-ASCII-Werte in PDF 1.7 legal - XML-Escaping für XMP-Pakete verwirft Steuerzeichen, die in XML 1.0 illegal sind, sodass Metadaten, die aus einem beschädigten Quelldokument kopiert wurden, den gesamten Metadatenstream nicht mehr wohlgeformt ungültig machen können
- PDF-zu-XMP-Datumskonvertierung validiert, dass Datumsfelder numerisch sind und füllt ein fehlendes Minutenfeld auf, verhindert fehlerhafte ISO 8601-Daten im generierten XMP; auf Nicht-Windows-Plattformen enthält der Fallback-Zeitstempel nun auch die Tageszeit statt nur des Datums
Version 2.16.0
Hinzugefügt (Added)
- Stream-Dekodierung rekonstruiert nun
/DecodeParms-Prädiktoren (PNG-Prädiktoren 10–15 und TIFF-Prädiktor 2, ISO 32000-1 §7.4.4.4) nach FlateDecode unter Berücksichtigung von/Colors,/BitsPerComponentund/Columns; mit einem Prädiktor komprimierte Objektströme — eine häufige PDF 1.5+-Writer-Wahl — zeigten zuvor differenzierte Bytes, sodass die von ihnen getragenen Objekte für Konformitätsprüfungen und Marker-Injektion still unsichtbar waren
Behoben (Fixed)
- Die FlateDecode-Erkennung parst den
/Filter-Wert nun als Namen oder Array statt als Teilstring-Abgleich, sodass kaskadierte Filter-Chains und Vorkommen des Wortes in nicht verwandten Werten kein falsches Inflate mehr auslösen; nicht unterstützte Filter-Chains fallen wie bisher auf die rohen Bytes zurück
Version 2.15.1
Behoben (Fixed)
- Der Wörterbuch-Scanner überspringt nun Literal-Strings, Hex-Strings und Kommentare beim Ausbalancieren von
<</>>(ISO 32000-1 §7.2.2), sodass Wörterbücher mit Werten wie(A >> B)oder einem Hex-String, der an den schließenden Delimiter angrenzt, beim Parsen von Trailer, Katalog und Konformitätsprüfungen nicht mehr abgeschnitten werden - Literal-String-Extraktion dekodiert nun den vollständigen §7.3.4.2 Tabelle 3 Escape-Satz —
\n \r \t \b \f, oktal\ddd, Zeilenfortsetzungen und nicht escaped EOL-Normalisierung — anstatt den Escape-Buchstaben verbatim zu kopieren, was korrekte/Producer-,/GTS_PDFXVersion- und/ISO_PDFEVersion-Vergleiche für Writer wiederherstellt, die oktale Escapes verwenden - Literal-Strings, die von Marker-Injektoren geschrieben werden, escapen nun CR, LF und andere Steuerzeichen, damit Werte die reader-seitige Zeilenenden-Normalisierung Byte für Byte überstehen
Version 2.15.0
Behoben (Fixed)
- Inkrementelle Updates, die von PDF/A-, PDF/X-, PDF/E-, PDF/R-, PDF/UA- und PDF/VT-Marker-Injektoren sowie von PAdES-Signierungs- und DSS-Pfaden geschrieben werden, bewahren nun den permanenten Dateiidentifier des Quelldokuments: das erste Trailer-
/ID-Element wird verbatim wie von ISO 32000-1 §14.4 gefordert übernommen und nur das zweite (ändernde) Element wird aktualisiert; zuvor wurden beide Elemente regeneriert, sodass externe Referenzen und Langzeitvalidierungs-Workflows nach jedem Speichern eine andere Dokumentidentität sahen - PAdES-Signaturen, DSS-Injektion und B-LTA Document Time-stamps tragen nun die
/Info-Referenz des Quell-Trailers (ISO 32000-1 §7.5.6) weiter, sodass Dokumenteigenschaften nach dem Signieren nicht mehr aus Reader-Panels verschwinden; der Document Time-stamp-Trailer gewinnt auch das/ID-Array - Das Trailer-
/Info-Fallback für Querverweisstream-Dokumente lokalisiert nun das XRef-Stream-Wörterbuch korrekt und bewahrt die Generierungsnummer der Referenz; es stimmte zuvor nie auf konformen PDF 1.5+-Dateien überein und verwarf/Infostill
Version 2.14.4
Behoben (Fixed)
- Das Signatur-Wörterbuch-
/M-Datum, das vonTPdf.SignPadesundSignPadesBytesgeschrieben wird, trägt nun das obligatorischeD:-Präfix und denZ-UTC-Offset-Marker, der von ISO 32000-1 §7.9.4 verlangt wird; strenge Validatoren lehnten die Signierdatum-Zeichenfolge zuvor als fehlerhafte Datumszeichenfolge ab
Version 2.14.3
Behoben (Fixed)
- Wörterbuchschlüssel-Lookups im gemeinsamen PDF-Reader stimmen nun mit ganzen Namens-Tokens überein (ISO 32000-1 §7.3.5); zuvor wurde ein Stream, dessen Wörterbuch
/Length1vor/Lengthauflistete (typisch für FontFile-Streams), auf die falsche Byteanzahl abgeschnitten, was Konformitätsprüfungen für PDF/A, PDF/UA und andere, die Schriften-, CMap- oder Metadaten-Streams lesen, still blendete - Trailer-Lookups für
/Encrypt,/Root,/Sizeund/Infostimmen nicht mehr mit längeren Schlüsseln überein, die dasselbe Präfix teilen (wie/EncryptMetadata) - Die Erweiterung von Objektströmen vertraut keinem korrumpierten oder feindlichen
/N-Wert mehr: Nicht-Integer-Werte ergeben nun 0 statt einer nicht initialisierten Zahl, und eine aus/Firstabgeleitete Obergrenze verhindert überdimensionierte Allocations beim Scannen fehlerhafter Dokumente
Version 2.14.2
Behoben (Fixed)
- Die PDF/X-, PDF/VT-, PDF/UA-, PDF/E- und PDF/R-Marker-Injektoren kopieren verschlüsselte Quelldokumente nun unverändert durch, anstatt Klartext-Update-Abschnitte anzuhängen; das frühere Verhalten erzeugte Dateien, deren neuester Trailer den
/Encrypt-Eintrag verlor (ISO 32000-1 §7.5.6), sodass konforme Reader den verschlüsselten Body fälschlicherweise als Klartext lasen TPdf.SignPades,SignPadesBytesundInjectPadesDssMarkerslösen nunEPadesCryptoaus, wenn das Quelldokument verschlüsselt ist, anstatt still eine korrumpierte oder nicht verifizierbare Datei zu emittieren; entfernen Sie die Verschlüsselung vor dem Signieren oder Einbetten von DSS-Material
Version 2.14.1
Behoben (Fixed)
TPdf.SignPadesundSignPadesBytesfüllen nun alle vier/ByteRange-Felder des Signatur-Wörterbuchs rückwirkend aus; zuvor blieben die letzten drei Felder bei ihren Null-Platzhaltern, sodass erzeugte Signaturen einen leeren Byte-Bereich deklarierten und die Verifizierung in konformen Validatoren scheiterte- PAdES B-LTA Document Time-stamp-Wörterbücher erhalten dieselbe
/ByteRange-Rückwärtsfüllkorrektur ValidatePadesComplianceakzeptiert nun das Standard-Signaturlayout, bei dem die Byte-Bereichslücke den Hex-/Contents-Wert enthält, und prüft, dass das zweite Bereichssegment genau am Dateiende endet; zuvor bestanden nur lückenlose Bereiche die Abdeckungsprüfung
Version 2.14.0
Hinzugefügt (Added)
TPdf.ExportXFDFserialisiert jeden Formularfeldwert und jede Annotation über alle Seiten in ein XFDF-Dokument (ISO 19444-1) und emittiert<fields>für hierarchische Formularwerte und<annots>für alle unterstützten Annotationssubtypen (text, highlight, underline, strikeout, squiggly, line, circle, square, caret, polygon, polyline, stamp, ink, freetext, fileattachment, sound, link, redact)TPdf.ImportXFDFliest ein XFDF-Dokument in das geladene PDF zurück, erstellt Annotationen auf den übereinstimmenden Seiten neu und wendet Feldwerte auf ihre Widget-Annotationen an- Der
TPdfAnnotation-Record erhieltName(NM),Subject,ModificationDate(M),CreationDate,Icon,Opacity(CA), Linienendpunkte, Polygon/Polylinie-Eckpunkte und Ink-List-Gesture-Felder, damit XFDF-Rundreisen die vollständigen Annotationsmetadaten erhalten - Neues
XfdfLab-Beispiel in den Delphi-, C++Builder- und Lazarus-Demo-Sets demonstriert den Export/Import-Rundreise
Version 2.13.6
Behoben (Fixed)
ValidatePdfAbehandelt nun Katalog-/Metadata-Streams ohne/Type /Metadataoder/Subtype /XMLals fehlende XMP-Metadaten überpvaiMissingXmpMetadata- PDF/A-Preflight-Berichte klassifizieren
pvaiMissingXmpMetadatanun als Metadaten und empfehlen einen Katalog-/Metadata-Stream mit/Type /Metadata,/Subtype /XML, ungefilterten XMP undpdfaid-Markern
Version 2.13.5
Behoben (Fixed)
ValidatePdfAmeldet nun Widget-Annotationen ohne Erscheinungsbild-Wörterbuch und PDF/A-2-/PDF/A-3-Annotationen, die/APbenötigen, aber nicht haben, überpvaiAnnotationApDictViolation- PDF/A-Preflight-Berichte kategorisieren
pvaiAnnotationApDictViolationnun als Inhalt, den die Marker-Injektion nicht reparieren kann
Version 2.13.4
Behoben (Fixed)
ValidatePdfAmeldet nun PDF/A-2- und PDF/A-3-Inline-Bilder, deren/I- oder/Interpolate-Werttrueist, überpvaiImageDictionaryViolation, was der bestehenden Image-XObject-Wörterbuch-Abdeckung entspricht- PDF/A-Preflight-Berichte kategorisieren
pvaiImageDictionaryViolationnun als Inhalt, den die Marker-Injektion nicht reparieren kann
Version 2.13.3
Behoben (Fixed)
ValidatePdfAmeldet nun PDF/A-1-Inline-Bilder, die/LZWDecode- oder abgekürzte/LZW-Filter in Content-Streams verwenden, überpvaiInlineImageLzwForbidden, was der bestehenden PDF/A-2- und PDF/A-3-Inline-Bild-Abdeckung entspricht- Der Inline-Bild-Filter-Scanner rückt nun an führenden Ressourcennamen wie
/GS1vorbei und vermeidet so Blockierungen beim Scannen breiterer PDF/A-1-Content-Streams
Version 2.13.2
Hinzugefügt (Added)
TPdf.SetFocusedFormFieldTextschreibt Text in den Bearbeitungspuffer des aktuell fokussierten Formularfelds überFORM_ReplaceSelection, symmetrisch zuFocusedFormFieldText. Für AcroForm-Text-/Combo-Felder wird der Wert beim Fokusverlust in/Vübertragen und bleibt bestehen; für XFA-Textfelder landet der Schreibvorgang nur im In-Memory-Puffer (PDFium stellt keine öffentliche API zur Verfügung, um XFA-Werte zurück in das Datensatzpaket zu übertragen, daher bleibt er nach dem Speichern nicht bestehen)- Die JavaScript-Host-Plattform wird nun immer angehängt, wenn die V8-Engine verfügbar ist, unabhängig davon, ob das Dokument XFA ist — sodass eingebettetes AcroForm-JavaScript (Dokumentskripte, Feldberechnungen,
app.alert) ebenfalls ausgeführt werden kann. Zuvor warm_pJsPlatformnur für XFA-Dokumente verdrahtet, wodurch AcroForm-JS still deaktiviert blieb
Geändert (Changed)
- Das Anhängen der JavaScript-Plattform ist nun von der XFA-Entscheidung in
InitializeFormFillunabhängig — diem_pJsPlatform-Tabelle wird erstellt, wennV8FeaturesAvailablewahr ist, und nach der XFA-Version-/Callback-Verdrahtung angewendet, anstatt darin verschachtelt zu sein
Version 2.13.1
Hinzugefügt (Added)
- Neue Host-Events legen Informationen offen, die die v2.13.0-Formularfüll-Callbacks zuvor verschluckten:
OnXfaUriAction,OnXfaPageCountChanged,OnXfaFocusChange,OnXfaEmail,OnXfaHttpRequest,OnXfaOpenFile,OnJavaScriptBeep,OnJavaScriptPrint,OnJavaScriptMail,OnJavaScriptSubmitForm. Jedes Event ist standardmäßig das bestehende No-Op-Verhalten, wenn nicht zugewiesen, sodass bestehende Hosts nicht betroffen sind - Die schreibgeschützte Eigenschaft
TPdf.XfaFormPacketsgibt einen einmaligen Snapshot aller XFA-Pakete (TXfaPacketList) zurück und erfüllt die zuvor deklarierten, aber ungenutztenTXfaPacket-/TXfaPacketList-Typen - XFA-spezifische PDFium-Fehlercodes
FPDF_ERR_XFALOAD/FPDF_ERR_XFALAYOUTsind nun gebunden und überLastPdfErrorzugänglich und ersetzen den generischen "Unknown error" bei XFA-Lade-/Layout-Fehlern
Geändert (Changed)
FFI_DoURIActionWithKeyboardModifierkonsultiert nunOnXfaUriAction, bevor eine URI aus einem XFA-Feld per Shell ausgeführt wird, und gibt dem Host ein Vetorecht (Sicherheit: ein bösartiges XFA-Feld konnte zuvor bedingungslos beliebige URLs starten). Nicht zugewiesene Handler behalten den vorherigenShellExecuteW-Standard beiDecodeFormFieldTypeleitet XFA-Feldtypen nun überIsXfaFormFieldstatt über einen expliziten 8-Branch-Case, wodurch das Enum durch ordinalen Versatz mitFPDF_FORMFIELD_XFA_*ausgerichtet bleibt
Behoben (Fixed)
ValidatePdfAmeldet nun PDF/A-1-Ansprüche, die PDF 1.5-Querverweisströme oder Objektströme verwenden, mit dem neuenpvaiPdfA1Pdf15Structure-Problem, während Objektströme für PDF/A-2 und PDF/A-3 weiterhin erlaubt bleiben
Version 2.13.0
Hinzugefügt (Added)
- Vollständige XFA (XML Forms Architecture) Runtime-Unterstützung:
TPdf.InitializeFormFillverdrahtet nun alle 14 Version-2-FPDF_FORMFILLINFO-Callbacks (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) und hängt eineIPDF_JsPlatforman, damit eine XFA-fähigepdfium.dlldynamische XFA-Formulare rendern und skripten kann - Neue
Lib\FPdfXfa.pas-Unit, die die XFA-Konstanten (FXFA_PAGEVIEWEVENT_*,FXFA_MENU_*,FXFA_SAVEAS_*,FPDF_FORMFIELD_XFA_*) und dieTXfaPacket-/TXfaSaveFormat-Typen deklariert, die zuvor nur in Kommentaren referenziert wurden - Statischer XFA-Paket-Reader auf
TPdf:GetXfaPacketCount/GetXfaPacketName/GetXfaPacketContent/GetXfaPacketByNameplusGetXfaTemplate/GetXfaDatasets/GetXfaConfigextrahieren die XFA-template-,datasets- undconfig-Pakete als rohe XML ohne XFA-fähige Runtime — nützlich für Compliance-Auditing und Datenmigration - Fähigkeitssonden: globales
XfaFeaturesAvailableund pro DokumentTPdf.XfaRuntimeAvailable(obFPDF_LoadXFAtatsächlich erfolgreich war) undTPdf.XfaStaticReadable(ob die Paket-Reader-Exports auflösen) TPdfFormFieldTypeerweitert mitfiXfa,fiXfaCheckBox,fiXfaComboBox,fiXfaImageField,fiXfaListBox,fiXfaPushButton,fiXfaSignature,fiXfaTextField, mitDecodeFormFieldType, das die neuenFPDF_FORMFIELD_XFA_*-Werte abbildet- JavaScript-Host-Events auf
TPdf:OnJavaScriptAlert,OnJavaScriptResponse,OnXfaGotoUrlundOnXfaRuntimeMissingermöglichen dem Host, JS-Dialoge und XFA-Navigation anzupassen oder zu reagieren, wenn ein XFA-Dokument die Engine nicht starten kann - Neues
XfaLab-Delphi-Beispiel demonstriert XFA-Erkennung, Paketextraktion, Fähigkeitssondierung und den Runtime-fehlenden Fallback-Pfad
Geändert (Changed)
TPdf.LoadDocumentscannt die Eingabe nun vorab auf XFA-Marker (/XFAim AcroForm-Wörterbuch oder Katalog-/NeedsRendering) und wählt, wenn gefunden, automatischpdfium.v8.dllaus, indemEnableV8Engine := Truegesetzt wird, bevor die Singleton-Bibliothek erstmals geladen wird; sobald eine einfachepdfium.dllgeladen ist, kann der Prozess nicht wechseln, sodassOnXfaRuntimeMissingdiesen Fall signalisiertTPdf.GetPageCountspiegelt nun die Seitenanzahl wider, die die XFA-Engine überFFI_PageEventnach dynamischer Neupaginierung meldet, anstatt nur dem statischen PDF-Seitenbaum- Wenn ein XFA-Dokument geöffnet wird, aber die Runtime nicht verfügbar ist, setzt
InitializeFormFillnunversion=1undxfa_disabled=1, anstatt Version 2 mit nicht zugewiesenen Callbacks anzufordern, was zuvor das Risiko einer ungültigen Callback-Zeiger-Dereferenzierung barg
Version 2.12.2
Behoben (Fixed)
ValidatePdfACompliancemeldet nun verwendete benutzerdefinierte XMP-Namespaces ohnepdfaExtension:schemas, akzeptiert aber weiterhin Standard-pdfaid-Metadaten ohne Erweiterungsdeklarationen- Die PDF/A-3-eingebettete Dateivalidierung erfordert nun sowohl
/F- als auch/UF-Einträge auf oberster Ebene in Dateispec-Wörterbüchern und ignoriert verschachtelte/EF-Stream-Schlüssel beim Prüfen dieser Namen
Version 2.12.1
Behoben (Fixed)
ValidatePdfACompliancedekodiert nun escaped PDF-Namens-Tokens vor dem Abgleich mit JavaScript, LZWDecode, Type1 und verwandten verbotenen Namen, sodass obfuskierte, aber semantisch identische Namen korrekt gemeldet werden- PDF/A-Inline-Bild-Prüfungen lehnen nun
/Filter- und/F-Werte ab, die/LZWDecode, abgekürztes/LZWoder/Cryptverwenden, einschließlich Array- und escaped-Namens-Formen - PDF/A-Validierung meldet nun Metadaten-Streams mit verbotenen Stream-Filtern, OutputIntent-ICC-Profile, deren
/N-Komponentenanzahl fehlt oder inkonsistent ist, und PDF/A-3-eingebettete Datei-Specs mit fehlendem oder ungültigem/AFRelationship
Version 2.12.0
Hinzugefügt (Added)
- TSA-HTTP-Anfragen setzen nun explizite 30-s-Timeouts für jede Phase (Auflösung/Verbindung/Senden/Empfangen) über
WinHttpSetTimeouts, sodass eine langsame oder nicht erreichbare Zeitstempel-Behörde den Signier-Thread nicht auf unbestimmte Zeit blockieren kann, anstatt auf WinHttp's implizite Standardwerte zu vertrauen - Nonce-Ableitung pro Anfrage für PAdES B-T/B-LTA-Zeitstempel-Anfragen, wenn der Aufrufer
TPadesSignOptions.Nonceweglässt: ein SHA-256-Fold aus monotonem Zähler + Wanduhr +GetTickCount64+ Prozess-ID ersetzt den früheren festen$100000000-Fallback, sodass zwei in derselben Millisekunde ausgestellte Anfragen denselben Anti-Replay-Nonce nicht mehr wiederverwenden PdfInflatebegrenzt die dekomprimierte Ausgabe nun auf 256 MiB, um zu verhindern, dass ein zlib-komprimierter Stream bei feindlicher oder korrumpierter Eingabe den Speicher erschöpft (eine "zlib-Bombe"); das Limit ist für jeden realen PDF-Stream großzügig
Geändert (Changed)
TPdfView-Überblendung (Suchhervorhebung, Textauswahl, Lesewort, Spread-Auswahl) verwendet keine Pixel-für-Pixel-GetPixel/SetPixelVmehr; das Rechteck wird nun durch ein 32-bpp-Off-Screen-TBitmapundScanLinein einem einzigen Durchlauf überblendet, was Tausende von GDI-Kernel-Übergängen pro Paint eliminiert und große Auswahlen reaktionsfähig machtFPdfAsn1.TDerReader.ReadIntegerlehnt nun INTEGER-Felder ab, die länger als 8 Bytes sind (und 8-Byte-Negative, deren Vorzeichenbitshl >= 64erfordern würde), und gibt 0 zurück, anstatt einen falschen Wert durch undefiniertes Verschiebungsverhalten bei CMS/PAdES-ASN.1-Eingaben zu berechnenParseTimeStampRespspiegelt den Anfrage-Nonce nicht mehr alsTPadesTimestamp.Noncezurück; bis der TSTInfo-Walker, der den zurückgegebenen Nonce verifiziert, verfügbar ist, bleibt das Feld 0, um "nicht verifiziert" zu signalisieren, anstatt Aufrufern falsches Vertrauen zu geben, dass die Zeitstempel-Antwort frisch ist
Behoben (Fixed)
PointsToPixelsgab seine Eingabe für jeden DPI unverändert zurück: der Divisor warPointsPerInch(die 72-Konstante) statt dem Literal 72, was die Formel aufResult := Pointsreduzierte. Jeder externe Aufrufer, der Punkte→Gerätepixel-Größen über diesen Helfer durchführt, erhält nun das korrektePoints × PixelsPerInch / 72PdfMaxObjNumunterzählte auf Dokumenten, die Objektströme verwenden (PDF 1.5+ ObjStm): Objekte, die in einem/ObjStmkomprimiert sind, tragen keinenN 0 obj-Marker, sodass der rohe Byte-Scan sie verfehlte, und Injektoren, dieMaxObj+1für neue Objekte allokieren, würden mit versteckten ObjStm-Mitgliedern kollidieren und die Datei still korrumpieren. Der Scan erweitert nun zuerst Objektströme, damit jede Objektnummer sichtbar istInjectPdfAMarkersfälscht keinen PDF/A-Konformitätsanspruch mehr auf einem verschlüsselten Dokument: PDF/A (ISO 19005-1 §7.1) verbietet Verschlüsselung, und der Injektor kopierte die Quelle zuvor mit den Markern durch, auch wenn die nächste Validierung sie ablehnen würde. WennHasEncryptgesetzt ist, wird die Quelle nun unverändert durchgeleitet. Der normaleTPdf.SaveAsPdfA-Pfad entfernt bereits Verschlüsselung (saRemoveSecurity) vor der Injektion, daher betrifft dies nur direkte AufruferPdfReadStreamByteslehnt nun ein/Lengthab, das größer ist als die gesamte Datei, bevor der Ergebnispuffer allokiert wird, und schließt einen frühen Allokationspfad bei einer korrumpierten oder feindlichen indirekten Länge
Version 2.11.0
Hinzugefügt (Added)
- Der PDFium-
FPDF_FILEHANDLER-Record deklariert nun seine sechs Callbacks (Release,GetSize,ReadBlock,WriteBlock,Flush,Truncate) als echte Felder statt Kommentare und entspricht dem C-Header-Layout. Die XFA-FFI-Dateiübertragungs-Callbacks (FFI_OpenFile/FFI_EmailTo/FFI_UploadTo/FFI_DownloadFromURL), diePFPDF_FILEHANDLERzurückgeben oder verbrauchen, bleiben in der Pascal-Formularfüll-Schicht unimplementiert, aber der Typ ist nun für jeden zukünftigen XFA-Submit/Upload-Pfad strukturell korrekt - PDFium-Bibliotheksladen und -entladen (
LoadLibrary/UnloadLibrary) werden nun durch einen prozessglobalen kritischen Abschnitt serialisiert, sodass zweiTPdfFuture<T>-Worker-Threads (oder ein Worker, der mit dem Hauptthread konkurriert) nicht beidePDFiumLibrary=0beobachten und doppelt binden können, oder die DLL freigeben können, während ein anderer Thread mitten im Binden ist - Ein
initialization/finalization-Abschnitt ruft nunUnloadLibrarybeim Unit-Entladen auf und stellt sicher, dassFPDF_DestroyLibraryausgeführt wird (Worker-Thread-Join, V8-Isolate-Entsorgung, Font/Cache-Abbau), anstatt sich auf das OS zum Zurückfordern der DLL zu verlassen
Geändert (Changed)
TPdf.SetActiveschluckt nun jede Ausnahme während des Ladens (zuvor nurEPdfError), sodass ein Stream-Fehler oder eine Zugriffsverletzung während des Formular-/SeitenaufbausActive=Falsehinterlässt statt einer teilweise geladenen Komponente mit unbestimmtem Zustand- Konsistente Zeichenkodierung für PDFium-Metadatenschlüsselargumente:
TPdf.GetMetaTextverwendet nun dieselbe FPC-AnsiString/Delphi-UTF8Encode-Aufteilung wieGetViewerPreferenceund die Ladepfade, anstatt eines rohenAnsiString(Tag)-Casts - Deduplizierung der
BytesToAnsi-,AnsiToBytes-,WriteBytes- undWriteStr-Helfer:FPdfCompressimportiert diese nun ausFPdfPdfCommon(seineWriteBytesToStream/WriteAnsiToStream-Aliases werden pensioniert) und die redundante Drei-Argument-BytesToAnsi-Überladung inFPdfPdfawird entfernt.FPdfAsn1behält seine lokale Kopie aus Designgründen, um die Kryptographie-Schicht frei von der Konformitätsschicht-Unit zu halten
Behoben (Fixed)
- Ressourcenleck in
TPdf.LoadDocument(Datei, Speicher,TBytes,TMemoryStream, benutzerdefinierter Stream) undTPdf.CreateDocument: wennInitializeFormFilloderReloadPagenach erfolgreichemFPDF_LoadDocument/FPDF_CreateNewDocumenteine Exception auslöste, wurde das nativeFPDF_DOCUMENT-Handle geleakt, weilFActivezu diesem Zeitpunkt noch False war. Jeder Pfad umhüllt nun das Post-Load-Setup intry/exceptund schließt das Dokument bei Fehler, sodass die Komponente sauber inaktiv bleibt - Benutzerfreundlichere PDFium-DLL-Ladediagnostik:
CheckLoadLibraryerkenntERROR_BAD_EXE_FORMAT(193) und meldet eine 32/64-Bit-Architektur-Diskrepanz, die auf den passendenDLLs/Win32- oderDLLs/Win64-Build hinweist, anstatt nur den generischen OS-Fehler weiterzuleiten.CheckGetProcAddressgibt nun an, dass die bereitgestelltepdfium.dllälter als die Bindung ist, wenn ein erforderlicher Export fehlt, anstatt des rohen OS-"procedure not found"-Texts
Version 2.10.1
Behoben (Fixed)
- PAdES SignerInfo sid Standardisierung: Die Signer-Kennung verwendet nun die RFC 5652 §5.3-Form
issuerAndSerialNumber(issuer Name + serialNumber, beide unverändert aus dem Signer-Zertifikat-DER extrahiert) und ersetzt die bisherige nicht standardgemäßesubjectKeyIdentifier+ full-cert SHA-256-Platzhalterform, die Adobe Acrobat und andere konforme Validatoren abgelehnt haben. Ein neuer TbsCertificate-DER-Walker (ExtractIssuerAndSerial) liest die issuer-SEQUENCE und die serial-INTEGER als rohe TLV-Bytes — Serials überschreiten häufig denInt64-Bereich, daher ist das rohe TLV zwingend erforderlich. DiesubjectKeyIdentifier-Form bleibt lediglich als Fallback, wenn das Parsing des Zertifikat-DER fehlschlägt
Geändert (Changed)
TCmsSignerId.SerialNumber: Int64wurde durchSerialDer: TBytesersetzt (das rohe serialNumber-TLV). Der CMS-Builder bettet das zugeschnittene TLV unverändert inIssuerAndSerialNumberein und vermeidet so einenInt64-Überlauf bei 20-Byte-CA-Serials (Obergrenze nach RFC 5280 §4.1.2.2)
Version 2.10.0
Hinzugefügt (Added)
- PAdES B-LT Langzeitvalidierung: Wenn
TPadesSignOptions.Level >= plB_LT, hängtSignPadesBytesein inkrementelles Update an, das ein/DSS-Wörterbuch mit dem Signer-Zertifikat und der vollständigen Intermediate-Chain trägt (das selbstsignierte Root wird gemäß RFC 5652 §10.2.3 ausgeschlossen), zuzüglich des/Extensions /ESICLevel-1-Markers (EN 319 142-1 §5.4.2) - PAdES B-LTA Archiv-Zeitstempel: Wenn
Level >= plB_LTAundTsaUrlgesetzt ist, wird ein Document Time-stamp-Signaturwörterbuch (/SubFilter /ETSI.RFC3161) angehängt, dessen/ByteRangedie gesamte Datei abdeckt; der ESIC-Marker wird zu Level 2 hochgestuft. Damit sind die vier PAdES-Baseline-Level vollständig (B-B, B-T, B-LT, B-LTA) - Erhebung der Zertifikatskette:
ResolveWinSignerruft nunCertGetCertificateChainauf und fülltTPadesResolvedSigner.ChainCertDermit den Intermediate-CA-Zertifikaten, sodass B-LT/DSS /Certsjedes zum Validieren der Signatur erforderliche Zertifikat enthält, ohne externe Lookups.CertFreeCertificateContextist nun gebunden und schließt das in v2.8.0 vermerkte Speicherleck von einem Kontext pro Sign - PDF/A-Integrations-Workflow:
TPdf.SignPadesWithPdfAkonvertiert das Dokument zunächst nach PDF/A (höchster Level, den die Bibliothek heute ausgibt) und wendet dann die angeforderte PAdES-Signatur an — das Langzeitarchiv-Container-Muster, das EN 319 142-1 Anhang A.7 empfiehlt
Version 2.9.0
Hinzugefügt (Added)
- PAdES B-T vertrauenswürdiger Zeitstempel:
TPadesSignOptionserhält die FelderLevel,TsaUrlundNonce. WennLevel >= plB_TundTsaUrlgesetzt ist, extrahiertSignPadesBytesden Signaturwert aus dem erstellten CMS, fordert einen RFC 3161-Zeitstempel darüber an und bettet das zurückgegebene TimeStampToken als SignerInfo-unsigned-Attributsignature-time-stampein — der B-T-Schritt mit vertrauenswürdiger Zeit (EN 319 142-1 §6.3 Anforderung o) FPdfTsa: plattformübergreifender RFC 3161-Client —BuildTimeStampReq(Version 1, SHA-256-messageImprint über dem Signaturwert, Nonce, certReq=true),ParseTimeStampResp(akzeptiert PKIStatus 0/1, lehnt 2+ ab, extrahiert das TimeStampToken-ContentInfo unverändert) undRequestTimestamp(Einmal-Ablauf aus Build+POST+Parse).PadesTsaAvailablesteuert die Funktion auf Plattformen ohne HTTP-BackendFPdfTsaWin: Windows-WinHttp-Backend, dynamisch aus winhttp.dll gebunden (keine neue Compile-Time-Abhängigkeit; HTTPS wird vom Windows-Zertifikatsspeicher ausgehandelt). Es spiegelt das dynamische Bindungsmuster vonFPdfCryptoWinwiderFPdfCms:ExtractSignatureValuedurchläuft ein erstelltes CMS, um die rohen Signatur-Oktetts zu recovered (die TSA-Hash-Eingabe), undAddSignatureTimestampToCmsbaut das ContentInfo mit einem neuenunsignedAttrs [1](0xA1) neu auf, der das Zeitstempel-Attribut trägt. Der Stage-1-Validator erkennt das Ergebnis als B-T-Signatur
Version 2.8.0
Hinzugefügt (Added)
- PAdES B-B-Signatur-Stack: Vier neue, reine Pascal-/plattformübergreifende Bausteine (
FPdfSha256,FPdfAsn1,FPdfCms,FPdfCrypto) plus ein Windows-CNG-Backend (FPdfCryptoWin) ermöglichen esTPdf.SignPades/SignPadesToStream, eine PAdES B-B-Signatur vollständig zu erzeugen. Das Signer-Zertifikat wird über den SHA-1-Fingerabdruck aus dem Current-User-“MY”-Speicher aufgelöst; RSA-PSS (empfohlen), RSA PKCS#1 v1.5 und ECDSA werden überNCryptSignHashunterstützt FPdfSha256: eigenständige FIPS 180-4 SHA-256-Implementierung (Init/Update/Final + Einmal-Helfer). FPC 3.2.2 liefert keine SHA-2-Unit, daher besitzt die Bibliothek eine eigene, um jeden CMS-Codepfad auf einen einzigenTSHA256Digest-Typ zu halten, ohne RTL-VerzweigungenFPdfAsn1: DER-Encoder (TDerWriter) und -Reader (TDerReader) für SEQUENCE/SET/OID/INTEGER/OCTET STRING/UTCTime/GeneralizedTime/context-spezifische Tags, mit der definite-length-Kodierung und der IMPLICIT-Tag-Behandlung, die CMS erfordertFPdfCms: CAdES-SignedData-Builder (BuildSignedData), der die von PAdES-Baseline geforderten signed-Attribute content-type, message-digest und signing-certificate-v2 ausgibt, mit optionalem signing-time und commitment-type-indication. Der signedAttrs-Digest wird über die SET-getaggte (0x31)-Form berechnet und mit dem IMPLICIT-[0]-(0xA0)-Tag gemäß RFC 5652 §5.4 neu ausgegebenFPdfCrypto+FPdfCryptoWin: Krypto-Backend-Abstraktion mitPadesCryptoAvailable/ResolvePadesSignerund der Windows-Implementierung, die crypt32.dll / ncrypt.dll dynamisch bindet (keine neue Compile-Time-DLL-Abhängigkeit). ECDSA-Signaturen werden von der Windows IEEE P1363 r¦s-Form in die vom CMS geforderte DER-ECDSA-Sig-Value-Form umkodiertSignPadesBytes: Signatur-Injektion auf Byte-Ebene — reserviert einen festbreiten/Contents-Hex-Slot, berechnet die abdecknde/ByteRange, hasht das Dokument, erstellt und bettet das CMS ein und hängt das inkrementelle Update an. Der Validator (v2.7.0) erkennt die Ausgabe als PAdES B-B-Signatur
Version 2.7.0
Hinzugefügt (Added)
- PAdES-Strukturvalidator (ETSI EN 319 142-1 V1.2.1): Die neue Unit
FPdfPadesund die MethodeTPdf.ValidatePadesinspizieren über/ByteRangeerreichbare Signaturwert-Wörterbücher, durchlaufen die CMS-SignedDatainnerhalb von/Contentsweit genug, um die CAdES-detached-Form zu bestätigen, und erkennen die vier Baseline-Level (B-B, B-T, B-LT, B-LTA) sowie Document Time-stamp-Wörterbücher (/SubFilter /ETSI.RFC3161) - PAdES-Problemmenge auf Klausel-Ebene: 26
ppei*-Enums decken die Akzeptanz von/SubFilterab (adbe.pkcs7.sha1undadbe.x509.rsa_sha1als verboten markiert), die Dateiabdeckung von/ByteRange, das Verbot von/Cert, die CMS-SignedData-Form (einzelner Signer, detached eContent, Versionsbereich), die erforderlichen signed-Attribute (content-type,message-digest,signing-certificate/v2), verbotene Digests (MD5, SHA-1), die gegenseitige Ausschließlichkeit von/Reasonvscommitment-type-indication(Anforderung d), die B-T-Anforderung einer vertrauenswürdigen Zeit, das B-LT/DSS+/Certs+ ESIC-Level-1-Marker sowie den B-LTA Document Time-stamp + ESIC-Level-2-Marker - DSS-Injektor:
TPdf.SaveAsPadesDss/SaveAsPadesDssToStreamhängen an eine Kopie des Dokuments ein inkrementelles Update an, das ein/DSS-Wörterbuch (mit/Certs-,/OCSPs-,/CRLs-Stream-Arrays) und den/Extensions /ESIC-Marker (Level 1 oder 2) trägt, wobei die ursprünglichen Bytes erhalten bleiben — der B-LT/B-LTA-Einbettungsschritt für Validierungsmaterial (Klausel 5.4.2) - Plattformübergreifende, abhängigkeitsfreie Phase: Validator und Injektor sind reines Pascal und funktionieren auf jeder unterstützten IDE (Delphi, Lazarus, FPC, C++Builder); für dieses Release wird kein kryptografisches Backend benötigt und es wird keine neue DLL-Abhängigkeit eingeführt
Version 2.6.0
Geändert (Changed)
- Standardübergreifende Deduplizierung: Sieben weitere duplizierte Helferfunktionen (PdfEnclosingObjNum, PdfDictRefNum, PdfExpandObjectStreams, PdfTextStr, ExtractLiteralString, ExtractXmpAttr) wurden aus den einzelnen Standard-Units entfernt und in
FPdfPdfCommonkonsolidiert, was den Copy-Paste-Wartungsaufwand um etwa 300 Zeilen verringert - PreflightReport-Qualität: PDF/X- und PDF/E-Inhaltsklassen-Probleme, die zuvor in die generische “fehlender Marker”-Kategorie landeten, tragen nun genaue Content-/Metadata-/Security-Kategorien und klauselspezifische Empfehlungen (~15 Enums über beide Standards hinweg)
- PDF/E- und PDF/R-Testabdeckung: Sechs weitere Enums mit zuvor null Abdeckung erhielten positive Tests (
pveiLzwForbidden,pveiJavaScriptForbidden,pveiFormFieldsForbidden,pveiEmbeddedFilesForbidden,pvriBadHeader,pvriProhibitedInfoEntry) - Lazarus-Build-Korrektur:
Tests.PdfVT(eine Delphi-exklusive DUnitX-Unit, hinzugefügt in v2.5.x) wird nun aus dem Lazarus-Projekt ausgeschlossen, um die Kompilierung wiederherzustellen
Version 2.5.3
Hinzugefügt (Added)
- OutputIntent-Vollständigkeit (PDF/X-4 §6.2.4):
pvviOutputIntentSchememarkiert einen OutputIntent, dessen/Snicht/GTS_PDFXist;pvviOutputIntentMissingIdentifiermarkiert ein fehlendes/OutputConditionIdentifier - PDF/VT-2 Reference-XObject-Ausnahme (§6.2.2):
pvviReferenceXObjectForbiddenwird für einePDF/VT-2-Datei nicht mehr ausgelöst, die legal Reference-XObjects auf einer X-5g/5pg-Basis verwenden darf - MIME-Boundary-Zeichenvalidierung (RFC 2046 §5.1.1):
vtmviBoundaryInvalidCharmarkiert eine Boundary, deren Zeichen außerhalb des bchars-Sets liegen oder deren Länge 70 überschreitet
Behoben (Fixed)
InjectPdfVTMarkersschreibt nun Info/CreationDateund/ModDateaus den Speicheroptionen, sodass die erzeugte DateiValidatePdfVTComplianceohne ein falschespvviInfoModDateMismatchdurchläuft (der Injektor hatte zuvor die XMP-Daten neu geschrieben, die Info-Wörterbuch-Daten aber veraltet belassen)
Version 2.5.2
Hinzugefügt (Added)
- Info-
/ModDate-Konsistenz (§6.3 NOTE 2, PDF/X-4-Basis):pvviInfoModDateMismatchmarkiert ein Info-Wörterbuch-/ModDate, das nach der Normalisierung von PDF-Datum zu XMP-Datum nichtxmp:ModifyDateentspricht - PDF/VT-2s Inline-Chunk-Konformität (Anhang A.2): Der MIME-Validator führt nun
ValidatePdfVTCompliancefür jeden Inline-application/pdf-Teil aus und markiert einen Nicht-PDF/VT-Body übervtmviInlinePdfNotPdfVT
Version 2.5.1
Hinzugefügt (Added)
- DParts-Chunking-Validierung (ISO 16612-2 §6.5 Tabelle 4):
pvviDPartsBadChunkingmarkiert ein/DParts-Array, dessen nicht-finale Sub-Arrays nicht exakt 8192 Einträge haben oder dessen letztes Sub-Array außerhalb von 1..8192 liegt - RecordLevel-Konsistenz über Streams hinweg (Anhang A.2): Der PDF/VT-2s-MIME-Validator extrahiert nun
/RecordLeveljedes Inline-PDFs und markiert Uneinigkeit übervtmviRecordLevelMismatch, was die bestehende NodeNameList-Prüfung ergänzt - Hinweise auf wiederkehrende grafische Objekte (§6.7):
pvviGtsScopeInvalidValuemarkiert ein/GTS_Scopeaußerhalb von {SingleUse, Record, File, Stream, Global, Unknown};pvviGtsScopeRecordWithoutRecordLevelmarkiert/Recordohne ein/RecordLevel;pvviGtsXidNotUuidmarkiert ein/GTS_XID, das keine RFC 4122 uuid:-URI ist;pvviGtsEnvMissingmarkiert ein fehlendes/GTS_Env, wenn/GTS_ScopeStream oder Global ist (§6.7.4) - MIME-Vorwärtsreferenz-Erkennung (Anhang A.2):
vtmviForwardReferencemarkiert ein Inline-PDF, das einen Dateinamen (über/EF /F) zitiert, der nicht durch einen früheren Anhangsteil im Stream eingeführt wurde
Behoben (Fixed)
ExtractNodeNameListFromPdfundExtractRecordLevelFromPdfinFPdfPdfvtMimelösten einen wiederkehrenden Off-by-one-Fehler, bei dem der vonAnsiFindKeyzurückgegebene 1-basierte Offset als absoluter Byte-Offset in das expandierte PDF behandelt wurde
Version 2.5.0
Hinzugefügt (Added)
- PDF/VT Document Part Metadata (DPM, ISO 16612-2 §6.6):
TPdfVTSaveOptionserhieltDpmEntriesundDpmTarget, sodass ein Writer ein/DPM-Wörterbuch an den synthetisierten DPart-Knoten anhängen kann, mit Schlüsselnamen-Validierung gegen die Annex-E-Second-Class-Prefix-Regel und den §6.6-NMTOKEN-/Eindeutigkeits-/GTS_Managed-Form-Regeln auf der Validator-Seite - PDF/VT-2s-Streaming-Austausch (Anhang A): Die neue Unit
FPdfPdfvtMimestelltBuildPdfVT2sStreamundValidatePdfVT2sStreamfür denmultipart/mixed-MIME-Umschlag bereit, der Inline-PDF/VT-Chunks plus Anhangs-ICC-Profile trägt, mit derX-PDFVT-Stream-version: 1-Header-Reihenfolgen-Regel und derNodeNameList-Konsistenzprüfung über Streams hinweg TPdf.ValidatePdfVTführt nun eine autoritative JavaScript-Action-Zählung überFPDFDoc_GetJavaScriptActionCountdurch, was den Byte-Level-/JavaScript-Namen-Scan ergänzt
Behoben (Fixed)
- PDF/VT-
Trapped-Korrektheit auf der PDF/X-4-Basis: Der Enum-WertptvUnknownwird entfernt (PDF/X-4 verbietet/Unknown),ptvUnspecifiedwird beim Schreiben zu/Falsenormalisiert (ein fehlendes/Trappedist ebenfalls verboten), und ein neuespvviTrappedInvalid-Problem markiert einen fehlenden oderUnknown-Wert ValidatePdfVTComplianceexpandiert nun Objekt-Streams (PdfExpandObjectStreams) vor dem Scannen, sodass ein Katalog-, OutputIntent- oder Metadata-Wörterbuch innerhalb eines komprimierten ObjStm (PDF 1.5+, typisch für PDF/X-4-Produzenten) von den Byte-Level-Lookups erreichbar ist
Geändert (Changed)
- PDF/VT-1 erbt nun die vollständigen PDF/X-4-Inhaltsverbote:
pvviAcroFormForbidden(/AcroFormoder/XFA),pvviAdditionalActionsForbidden(Katalog/AA),pvviMissingTrimBoxundpvviReferenceXObjectForbidden(Reference XObject, nur X-5g/5pg) - Standardübergreifende Deduplizierung:
BuildDictObj,IccComponentCount, das eingebaute sRGB-ICC-Profil (GetSrgbIccProfile),PdfTextStr,PdfEnclosingObjNum,PdfDictRefNumundPdfExpandObjectStreamswurden von dreifach duplizierten lokalen Kopien inFPdfPdfa/FPdfPdfx/FPdfPdfvtzu einer einzigen kanonischen Heimat inFPdfPdfCommonbefördert; das 3144-Byte-ICC-Literal existiert nun genau einmal in der Codebasis
Version 2.4.0
Behoben (Fixed)
InjectPdfUaMarkersverwirft nicht mehr die/Info-Referenz des Trailers auf einer cross-reference-stream-Basis: Die lokale FunktionSourceTrailerInfoRef(der das xref-stream-Fallback fehlte) wurde durch die gemeinsame FunktionPdfSourceTrailerInfoRefersetzt (übernommen aus der PDF/A-Kopie, die das Fallback seit v2.0.0 besitzt)- Die gemeinsame Funktion
PdfReadStreamBytesverarbeitet nun indirekte/Length N G R-Referenzen (portiert aus der lokalen PDF/A-Kopie), sodass die PDF/VT-, PDF/R- und PDF/E-Validatoren XMP-Metadatenströme nicht mehr fälschlicherweise einlesen oder überspringen, wenn sie von Werkzeugen mit indirekter Length generiert wurden (Acrobat, Ghostscript)
Geändert (Changed)
- Standardübergreifende Deduplizierung: Die lokalen Kopien von
PdfReadTrailerinFPdfPdfaundFPdfPdfx, die lokalen Kopien vonSourceTrailerInfoRefinFPdfPdfaundFPdfPdfuasowiePdfReadStreamBytesinFPdfPdfawurden gelöscht — die gemeinsamen Versionen inFPdfPdfCommongelten nun überall; dies spart etwa 330 Zeilen duplizierten Code ein und eliminiert den Wartungsaufwand zur Synchronisierung der Kopien - Abbau von PDF/X-Testschulden: Sieben Inhaltsklassen-Enums, die zuvor eine Testabdeckung von null aufwiesen, erhielten positive Tests (
pvxiLzwForbidden,pvxiJavaScriptForbidden,pvxiFormFieldsForbidden,pvxiAdditionalActions,pvxiEmbeddedFilesForbidden,pvxiMissingTrimBox,pvxiTrappedNotSet)
Version 2.3.0
Geändert (Changed)
- Abbau von PDF/A-Testschulden wird fortgesetzt: Drei weitere Enums mit zuvor einer Testabdeckung von null erhielten positive Tests;
pvaiForbiddenRenderingIntent(§6.2.9) markiert einen nicht standardisierten rendering-intent-Namen in einem content stream;pvaiJpeg2000Violation(§6.2.2) markiert ein JPXDecode-Bild mit/NumComponentsaußerhalb von {1,3,4} in Part 2;pvaiInlineImageLzwForbidden(§6.1.10) markiert ein Inline-Bild mit LZW-Filter in Part 2
Version 2.2.0
Geändert
- Regressionsprüfungen für Kreuzreferenzströme (cross-reference stream): Das bestehende
Validate_XrefStreamTrailer_DetectsConformanceverifiziert nun auch, dass die catalog-Referenz/Metadataaufgelöst und das XMPpdfaid:partauf einer Kreuzreferenzstrom-Basis (xref-stream) gelesen wird (nicht nur/Root+/ID); ein neuer TestInjectPdfA_XrefStreamBase_RoundTripssichert den in v2.0.0 hinzugefügten Kreuzreferenzstrom-Pfad des Injektors ab; zwei standardübergreifende Tests (PdfE_XrefStreamBase_NotRejectedAsUnparsable,PdfR_XrefStreamBase_NotRejectedAsUnparsable) verifizieren, dass die PDF/E- und PDF/R-Validatoren PDFs mit Kreuzreferenzstrom nicht mehr als nicht analysierbar ablehnen - Abbau von PDF/A-Testschulden:
Validate_MinimalPdf_FlagsRequiredMarkersstellt sicher, dass ein minimales PDF die FlagspvaiMissingPdfAIdentifier,pvaiMissingOutputIntent,pvaiMissingIccProfile,pvaiMissingXmpMetadataundpvaiMissingXmpDatesauslöst — dies schließt die Symmetrielücke zu den PDF/E- und PDF/X-Validatoren, die bereits über entsprechende Tests verfügten; zwei weitere Enums mit zuvor null Abdeckung erhielten positive Tests:pvaiUnembeddedFontundpvaiSubsetMissingCidSet
Version 2.1.0
Behoben
- PDF/E wurde versehentlich bei der v2.0.0 Kreuzreferenzstrom-Korrektur (cross-reference-stream fix) ausgelassen: Sowohl
InjectPdfEMarkersals auchValidatePdfEComplianceriefenPdfReadTrailerweiterhin ohneAcceptXrefStreamauf, sodass der PDF/E-Injektor bei PDF 1.5+-Ausgaben (dem Standardverhalten von pdfiumsSaveAsCopy) geräuschlos fehlschlug; beide Aufrufstellen übergeben nunTrue - Das gemeinsam genutzte
PdfReadTrailer-Fallback für Kreuzreferenzströme enthält nun das Schutz-Flag/Type /XRef, das die lokalen Kopien von PDF/A und PDF/X bereits hatten, sodass ein beschädigterstartxref-Offset, der auf ein nicht verwandtes Wörterbuch verweist, sauber fehlschlägt, anstatt fälschlicherweise als Trailer analysiert zu werden - Der
/Lang-Auflöser für indirekte Referenzen inValidatePdfUaCompliance(v2.0.0) war unerreichbar:PdfFindObjDictfindet nur<<-Wörterbücher, aber ein/Lang-Zeichenkettenobjekt ist(...)oder<...>ohne Wörterbuch; dies wurde durch einen direkten Objekt-Body-Scan ersetzt, der das Zeichenketten-Token lokalisiert
Geändert
- Sieben tote Hilfsmethoden-Duplikate (PdfStructureBytes, PdfHasName, PdfCountName, BuildStreamObj), die byte-identische Kopien der gemeinsam genutzten
FPdfPdfCommon-Versionen waren, wurden ausFPdfPdfaundFPdfPdfuaentfernt — die gemeinsam genutzten Versionen werden nun überall überuseseingebunden
Version 2.0.0
Behoben
- Standardübergreifender geräuschloser Fehler: Der gemeinsam genutzte Helper
PdfReadTrailer(verwendet von den PDF/UA-, PDF/X-, PDF/VT- und PDF/R-Marker-Injektoren und -Validatoren) akzeptiert nun einen ParameterAcceptXrefStreamund fällt auf das Kreuzreferenzstrom-Objektwörterbuch zurück, wenn keintrailer-Schlüsselwort vorhanden ist (PDF 1.5+); zuvor führte dieSaveAsCopy-Ausgabe von pdfium (die einen Kreuzreferenzstrom verwendet) dazu, dass jeder Marker-Injektor geräuschlos fehlschlug — die Quellbytes wurden unverändert kopiert und der Aufruf lieferte dennoch Erfolg zurück; der PDF/R-1.0-Validator (dessen PDF 2.0-Basis immer ein Kreuzreferenzstrom ist) war praktisch wirkungslos; die ausgereifte Implementierung des PDF/A-Validators wurde auf den gemeinsam genutzten Helper portiert, sodass jeder Standard davon profitiert - Das Scannen des Trailer-Wörterbuchs in
InjectPdfUaMarkersundInjectPdfAMarkersverwendet nun das tieferenbewusstePdfDictEndanstelle einer einfachen>>-Suche, sodass ein Trailer, der ein verschachteltes Wörterbuch enthält (z. B./Encrypt << ... >>), nicht mehr vor einem nachfolgenden/Info-Eintrag abgeschnitten wird
Geändert
TPdf.ValidatePdfUaunterdrückt nun den groben Byte-Level-FehlerpvuaiFontNotEmbedded, wenn der präzise Fehler des Pdfium-ObjektmodellspvuaiPdfiumFontNotEmbeddedbereits ausgelöst wurde, sodass der Preflight-Bericht für denselben Defekt keine zwei nahezu identischen Zeilen zur Schrifteinbettung mehr enthältpvuaiLangInvalidFormat(§7.2) löst nun ein indirekt referenziertes/Lang(N 0 R) in sein Zeichenkettenobjekt auf und validiert den Inhalt, sodass ein indirekt referenzierter Sprach-Tag kein blinder Fleck mehr ist
Version 1.99.0
Behoben
pvuaiLangInvalidFormat(§7.2) lässt hex-kodierte/Lang-Zeichenketten nicht mehr ungeprüft passieren: UTF-16BE-Paare (mit einemFE FFBOM) und reine ASCII-Hex-Zeichenketten werden jetzt dekodiert und derselben BCP 47-Grammatikprüfung wie literale(...)-Zeichenketten unterzogen, sodass ein fehlerhaftes Hex-/Langerkannt wird, während ein konformes (z. B. ein UTF-16BEen-US) nicht mehr Gefahr läuft, markiert zu werden
Geändert
pvuaiFontMissingToUnicode(§7.21.7) nimmt nun/MacExpertEncodingneben/WinAnsiEncodingand/MacRomanEncodingaus, was den vier in der Klausel aufgeführten Ausnahmebedingungen entspricht
Version 1.98.0
Hinzugefügt
pvuaiNeedAppearancesTrue(§7.18.4) markiert ein AcroForm, dessen/NeedAppearances-Flag true ist, da Widget-Darstellungen nicht zuverlässig gesperrt sind und Hilfstechnologien sie nicht mit dem Strukturbaum verknüpfen können; portiert aus dem PDF/A-Validator und eingeschränkt auf das Vorhandensein von/AcroForm, um die Scanfläche einzugrenzen
Geändert
- veraPDF-Korpus-Regression: Das Pass/Fail-Paar für §7.20 Reference-XObject und die Pass/Fail-Paare für §7.21.4.2 Subset CharSet/CIDSet wurden in
Live_Corpus_ValidatePdfUaMatchesConformanceintegriert; die Pass-Beispiele für §7.21.7 ToUnicode-forbidden-value und §7.18.6.2 Media-Clip wurden ebenfalls als Schutz vor Falsch-Positiven integriert (ihre Fail-Beispiele verwenden Wörterbuch-Layouts, die der Byte-Level-Scan nicht erfasst, weshalb nur die Pass-Seite integriert ist) - Die Korpus-Pass-Path-Assertionsliste wurde um 15 neue Schutzmaßnahmen für null Falsch-Positive erweitert, sodass nun jede aktive
pvuai*-Prüfung auf Byte-Ebene und Strukturebene mit konformen Beispielen getestet wird (zuvor waren nur ca. 30 der 60 aktiven Probleme geschützt); der Schutz fürpvuaiLangInvalidFormatwurde bewusst weggelassen, da die Prüfung auf Byte-Ebene hex-kodierte/Lang-Zeichenketten, die sie nicht dekodieren kann, vorsorglich markiert
Version 1.97.0
Behoben
- Härtung von
ValidatePdfUaStructureElements: Der Durchlauf der Parent-Kette vonEnclosingTableenthält nun einen Hop-Zähler (begrenzt durch die Elementanzahl), sodass ein fehlerhafterParentIndex-Zyklus auf einem synthetischen Strukturelement-Array den Aufrufer nicht mehr blockieren kann; die Array-Allokation für Marked-Content-IDs inValidatePdfUaPageContentTaggingist nun auf eine Million Einträge begrenzt, um eine Multi-GB-Allokation bei fehlerhaften/böswilligenMarkedContentIDs zu verhindern
Geändert
- Der Enum-Dokumentationskommentar zu
pvuaiOrderedListMissingListNumberingbeschreibt nun genau, was die Prüfung tut: Sie markiert einL-Element, dessenListNumbering-Wert außerhalb der Menge aus ISO 32000-1 Tabelle 347 liegt (ein fehlendes Attribut wird nicht markiert); der vorherige Kommentar deutete an, dass auch geordnete Listen ohne das Attribut erkannt würden, was die Implementierung jedoch nicht tut - Die beiden
7.21.3.3-t02-WMode-Mismatch-Korpus-Fail-Beispiele sind nun inLive_Corpus_ValidatePdfUaMatchesConformanceintegriert — seit v1.95.0 wird der CMap-Stream mit FlateDecode dekomprimiert, sodass der Vergleich zwischen Wörterbuch und Inhalt nun auf einer lesbaren Seite erfolgt; der veraltete Kommentar „nicht integriert“ wurde entfernt
Version 1.96.0
Hinzugefügt
- Standardübergreifende Konsistenz:
TPdf.ValidatePdfUaerhält zwei aus dem PDF/A-Validator portierte Prüfungen;pvuaiAnnotationFlagsViolation(§7.18.1) markiert eine nicht freigestellte Annotation, die das Hidden- / Invisible- / NoView-Flag trägt, was den Lesefluss von Hilfstechnologien stört;pvuaiActionTargetMissing(§7.18.5) markiert eine GoToR- / URI- / SubmitForm-Aktion, der ihr erforderlicher Zielschlüssel (/F+/D, /URI, /F) fehlt, wodurch der Link für Hilfstechnologien unbrauchbar wird
Behoben
- Seitenübergreifendes Zusammenführen des Strukturbaums: Die
AllElems-Akkumulationsschleife inTPdf.ValidatePdfUapasst nun denParentIndexjedes Elements vom seitenlokalen Array an das zusammengeführte Array an; andernfalls behielten die untergeordneten Elemente von Seite 2 einen seitenlokalen Index bei, der auf den Bereich von Seite 1 verwies, was jede ParentIndex-abhängige Prüfung (Tabellen-/Listenstruktur, §7.4.4 H-Child-Zähler, EnclosingTable) geräuschlos beschädigte - RoleMap-Parsing:
PdfReadRoleMapPairsbeendet den gesamten Schlüssel/Wert-Scan nicht mehr, wenn ein Wert eine indirekte Referenz (N 0 R) oder ein Array ([...]) ist — beides gültige RoleMap-Formen gemäß ISO 32000-1 14.8.5.1; es überspringt nun nur diesen Eintrag (Continue) anstatt abzubrechen, was Fehlalarme vonpvuaiRoleMapUnresolvedbei Typen verhindert, die nach einem Indirekt-/Array-Eintrag zugewiesen werden
Geändert
FPdfPreflightReport: 18 aktiveTPdfUaValidationIssue-Werte, die zuvor in die Sammelkategorie „fehlender Marker“ fielen, tragen nun genaue Kategorien (Struktur / Inhalt / Metadaten / Sicherheit) und klauselspezifische Empfehlungen; außerdem wurde der TippfehlerpuaNone / pua1→pucNone / puc1inPDFSpecComplianceMatrix.mdbehoben
Version 1.95.0
Geändert
- Überprüfung der Zuverlässigkeit von
TPdf.ValidatePdfUa: Die Prüfung §7.21.3.3pvuaiCMapWModeMismatchund die Prüfung §7.21.7pvuaiToUnicodeForbiddenValuedekomprimieren nunFlateDecode-komprimierte CMap- / ToUnicode-Streams vor dem Scannen (zuvor wurden nur unkomprimierte Streams bewertet, ein bekannter Falsch-Negativ-Fall); die gemeinsam genutzten HelperPdfInflateundPdfReadAndDecodeStreamwurden vonFPdfPdfa/FPdfPdfxnachFPdfPdfCommonverlagert, sodass alle Konformitätsprüfungen dieselbe Kopie nutzen
Hinzugefügt
pvuaiSubsetCharSetEmpty(§7.21.4.2) markiert einen Type 1-Subset-FontDescriptor, der einen/CharSet-Schlüssel trägt, dessen Zeichenkettenwert leer ist — das bestehendepvuaiSubsetMissingCharSeterfasste nur einen fehlenden Schlüssel; ein leeres/CIDSetwird nicht markiert, da eine Schriftart ohne CIDs legitimerweise eine leere Bitmap tragen kann
Version 1.94.0
Hinzugefügt
- Zweite Audit-Runde für
TPdf.ValidatePdfUaschloss sechs Lücken zu ISO 14289-1, die durch eine klauselweise Überprüfung und einen erneuten Scan der bereits gepackten, aber vom PDF/UA-Pfad nicht genutzten nativen Pdfium-APIs aufgedeckt wurden;pvuaiHeadingFormatInvalid(§7.4.3) markiert benutzerdefinierte Überschriften-Tags, die mit H beginnen, aber Trennzeichen, Leerzeichen oder römische Zahlen anstelle von reinen arabischen Ziffern enthalten;pvuaiMissingDocumentOutline(§7.17, Soll-Bestimmung) markiert ein mehrseitiges Dokument, das keine Lesezeichen-Gliederung enthält (einseitige Dokumente sind ausgenommen);pvuaiStructElementLangInvalid(§7.2) markiert einen Strukturelement-/Lang-Wert, der kein gültiger BCP 47-Tag ist;pvuaiWidgetMissingPrintField(§7.14 / §7.18.4) markiert ein Widget-Strukturelement, dem der Attributbesitzer PrintField fehlt;pvuaiLinkNotInStructureTree(§7.18.5) markiert ein Dokument, dessen/Subtype /Link-Annotationen nicht als Link-Strukturelemente offengelegt sind;pvuaiPdfiumAnnotationMissingContentsundpvuaiPdfiumLinkMissingContents(§7.18.1 / §7.18.5) fügen einen präzisen Scan auf Basis des Pdfium-Objektmodells hinzu, der Hidden-, Off-Crop-Box-, Popup- und Widget-Annotationen ausnimmt — was Fehlalarme der Heuristik auf Byte-Ebene beseitigt, die die/F-Flags oder/Rectnicht lesen kann
Version 1.93.0
Hinzugefügt
TPdf.ValidatePdfUalegt nun eine Prüfung über das Pdfium-Objektmodell über den Byte-Level-Inspektor, was der PDF/A-Runde-7-Architektur entspricht: Sie durchläuft die Textobjekte jeder Seite überFPDFTextObj_GetFont→FPDFFont_GetIsEmbedded(pvuaiPdfiumFontNotEmbedded, §7.21.4) und scannt jedes Zeichen überFPDFText_HasUnicodeMapError(pvuaiPdfiumUnicodeMapError, §7.21.7) sowieFPDFText_GetUnicode(pvuaiPdfiumNotDefGlyph, §7.21.8) — präziser als die Heuristiken auf Byte-Ebene, die nur anspringt, wenn keine Schriftprogramme vorhanden sind oder überhaupt kein/ToUnicodeerscheint; der Durchlauf bricht auf drei Ebenen vorzeitig ab: Die Seitenschleife wird beendet, wenn alle drei Probleme der Pdfium-Ebene bereits gesetzt sind, die Schleife pro Objekt bricht beim ersten nicht eingebetteten Font ab, und der Zeichenscan überspringt den.notdef-Durchlauf, wennUnicodeMapErrorbereits aufgetreten ist; PDF/UA war der letzte PDF-Standard-Validator ohne eine Pdfium-Objektmodellebene
Version 1.92.0
Hinzugefügt
Tests.PdfRerstellt — die erste Testdatei für den PDF/R-1-Validator (FPdfPdfr), die Header-Validierung, das Verbot von ObjStm, die Erkennung von Raster-Markern und einen Schutz vor Falsch-Positiven bei fehlerfreien Dateien abdeckt; alle sechs PDF-Standard-Testsuiten verfügen nun über eigene Testdateien: PdfA(80), PdfUa(101), PdfX(7), PdfE(5), PdfVT(15), PdfR(4) = insgesamt 212 Tests
Version 1.91.0
Hinzugefügt
ValidatePdfEundValidatePdfVTerhielten Prüfungen auf Inhaltsebene, die zuvor nur in den PDF/A-, PDF/UA- und PDF/X-Validatoren verfügbar waren:pveiLzwForbidden,pveiJavaScriptForbidden,pveiFormFieldsForbidden(nur PDF/E),pveiEmbeddedFilesForbidden(nur PDF/E),pveiOpiForbidden,pvviLzwForbidden,pvviJavaScriptForbidden,pvviEmbeddedFilesForbidden,pvviOpiForbidden;TPdf.ValidatePdfEandTPdf.ValidatePdfVTerhalten zudem eine Pdfium-Objektmodellebene (pveiPdfiumFontNotEmbedded/pvviPdfiumFontNotEmbedded), die Textobjekte der Seite überFPDFFont_GetIsEmbeddeddurchläuft und beim ersten nicht eingebetteten Font vorzeitig abbricht
Version 1.90.0
Hinzugefügt
TPdf.ValidatePdfXlegt nun eine Prüfung über das Pdfium-Objektmodell über den Byte-Level-Inspektor: Sie durchläuft die Textobjekte jeder Seite überFPDFTextObj_GetFont→FPDFFont_GetIsEmbeddedund meldet eine nicht eingebettete Schriftart alspvxiPdfiumFontNotEmbedded— präziser als die Heuristik auf Byte-Ebene, die nur anspringt, wenn keine Schriftprogramme vorhanden sind; der Durchlauf bricht beim ersten gefundenen nicht eingebetteten Font ab
Geändert
- Strukturbaum-Durchlauf von
TPdf.ValidatePdfUa: Der seitenweise Aufruf vonValidatePdfUaPageContentTagging(der eine Zuordnungskarte für Marked-Content-IDs aufbaut und jedes Text-/Bildobjekt abgleicht) wird nun auf nachfolgenden Seiten übersprungen, sobaldpvuaiUntaggedContentbereits gefunden wurde — Strukturelemente werden weiterhin für die seitenübergreifenden Prüfungen (Note unique ID, Überschriftenreihenfolge) gesammelt, aber der aufwendige seitenweise Content-Tagging-Durchgang bricht frühzeitig ab
Version 1.89.0
Geändert
- Leistung der
TPdf.ValidatePdfA-Pdfium-Objektmodellebene: Der Seiten-/Objekt-Durchlauf bricht nun auf drei Ebenen vorzeitig ab — die Seitenschleife wird beendet, wenn alle zutreffenden Probleme der Pdfium-Ebene bereits gefunden wurden, die Schleife pro Objekt wird beendet, wenn beide Pro-Objekt-Probleme (Font-Einbettung + Transparenz) gesetzt sind, und der Zeichenscan auf Textseiten überspringt den.notdef-Durchlauf, wennUnicodeMapErrorbereits aufgetreten ist;Assigned()-Prüfungen zur API-Verfügbarkeit und Konformitätsflags werden einmal vor der Schleife in lokalen Booleans zwischengespeichert, anstatt bei jeder Seite/jedem Objekt/jedem Zeichen neu ausgewertet zu werden; bei einem großen nicht-konformen Dokument kann der Durchlauf nun nach der ersten Seite stoppen, anstatt alle Seiten zu scannen; bei einem konformen Dokument ist der Overhead pro Seite geringer (keine wiederholtenAssigned-Aufrufe)
Version 1.88.0
Hinzugefügt
ValidatePdfXerhielt acht neueTPdfXValidationIssue-Werte auf Inhaltsebene, die die Druckaustausch-Einschränkungen abdecken, die PDF/X über die Dateiformat-Marker hinaus auferlegt:pvxiLzwForbidden(/LZWDecode),pvxiJavaScriptForbidden(/JavaScript),pvxiFormFieldsForbidden(/AcroForm//XFA),pvxiAdditionalActions(/AA),pvxiEmbeddedFilesForbidden(/EmbeddedFiles//FileAttachment),pvxiOpiForbidden(/OPI//Alternates),pvxiMissingTrimBox(kein/TrimBoxauf einer Seite) undpvxiTrappedNotSet(/Trappedfehlt oder ist/Unknown); der PDF/X-Validator prüfte zuvor nur XMP/OutputIntent-Marker, dies ist seine erste Prüfung auf Inhaltsebene; die gemeinsam genutzten HelperPdfStructureBytes,PdfHasNameundPdfCountNamewurden zuFPdfPdfCommonhinzugefügt, sodass alle Konformitätsprüfungen sie nutzen können
Version 1.87.0
Hinzugefügt
- Die PDF/UA-Validierung deckt nun die Verbundschrift-Regeln gemäß ISO 14289-1 §7.21.3 ab:
pvuaiCidSystemInfoMismatchmarkiert Type0-Schriften, bei denen die eingebettete CMap und die untergeordnete CIDFont hinsichtlichRegistry/Orderingnicht übereinstimmen oder derenSupplementder CIDFont das der CMap überschreitet;pvuaiCMapNotEmbeddedmarkiert CMaps, die namentlich (alsEncodingoderUseCMap) referenziert werden und keine vordefinierten CMaps gemäß ISO 32000-1 Tabelle 118 sind;pvuaiCMapWModeMismatchmarkiert eingebettete CMaps, derenWMode-Wörterbucheintrag vom WMode im Stream-Inhalt abweicht
Behoben
- Die §7.21.3.2-Prüfung
pvuaiCidFontMissingCidToGidMapübersah CIDFontType2-Wörterbücher, deren Schlüssel-/WertpaarSubtypedurch einen Zeilenumbruch getrennt ist; zusätzlich wird nun einCIDToGIDMap-Namenswert, der nichtIdentityist, als Fehler gemeldet
Version 1.86.0
Hinzugefügt
- Die PDF/UA-Validierung deckt nun die TrueType-Kodierungsregeln gemäß ISO 14289-1 §7.21.6 ab:
pvuaiTrueTypeEncodingInvalidmarkiert nicht-symbolische TrueType-Schriften, derenEncodingfehlt oder wederMacRomanEncodingnochWinAnsiEncodingist (direkt oder überBaseEncoding);pvuaiSymbolicTrueTypeEncodingmarkiert symbolische TrueType-Schriften, die einen nicht-standardmäßigenEncoding-Namen tragen
Version 1.85.1
Geändert
- Die ISO 14289-1 §7.18.3-Tabulatorreihenfolgeprüfung
pvuaiMissingTabsOrderwird nun seitenweise ausgeführt: Jede Seite mit Anmerkungen muss/Tabs /Sin ihrem eigenen Seitenwörterbuch deklarieren, sodass eine konforme Nachbarseite eine Seite ohne diesen Eintrag nicht länger verdeckt
Version 1.85.0
Hinzugefügt
- Die PDF/UA-Validierung unterscheidet nun gemäß ISO 14289-1 §7.15 zwischen dynamischen und statischen XFA-Formularen:
pvuaiXfaDynamicmarkiert Formulare, deren XFA-KonfigurationdynamicRenderaufrequiredsetzt
Geändert
- Das bisherige Kandidaten-Flag
pvuaiXfaPresentfür beliebige XFA-Inhalte wird zurückgezogen und nicht mehr ausgelöst (statisches XFA entspricht §7.15); der Enum-Wert bleibt zur API-Kompatibilität erhalten
Version 1.84.0
Hinzugefügt
- Die PDF/UA-Validierung erkennt nun nicht getaggte Echtinhalte gemäß ISO 14289-1 §7.1:
pvuaiUntaggedContentmarkiert gerenderte Text- und Bildobjekte, die weder vom Strukturbaum der Seite (über ihre Markierungsinhalt-IDs) beansprucht noch als Artefakt ausgezeichnet sind - Neue Seitenebenen-Hilfsmethoden
GetPageContentMarkInfosundValidatePdfUaPageContentTaggingsowie derTPdfPageContentMarkInfo-Record zur direkten Verwendung
Version 1.83.0
Hinzugefügt
- Die PDF/UA-Validierung setzt nun das Überschriftenmodell gemäß ISO 14289-1 §7.4.4 durch:
pvuaiHeadingModelMixedmarkiert Dokumente, die das generischeH-Tag mit nummeriertenH1..Hn-Überschriften mischen;pvuaiHeadingMultipleInNodemarkiert Strukturknoten, die mehr als eine untergeordneteH-Überschrift enthalten
Version 1.82.0
Hinzugefügt
- Die PDF/UA-Validierung löst nun die gemäß ISO 14289-1 §7.1 erforderliche RoleMap auf:
pvuaiRoleMapRemapsStandardmarkiert RoleMap-Einträge, die einen Standard-Strukturtyp neu definieren;pvuaiRoleMapUnresolvedmarkiert verwendete nicht-standardmäßige Strukturtypen, deren RoleMap-Kette fehlt, hängt oder zyklisch ist — indirekte Ketten, die zu einem Standardtyp führen, werden akzeptiert, und ungenutzte RoleMap-Einträge werden nie bewertet - Neue Hilfsmethoden
PdfUaIsStandardStructType,PdfReadRoleMapPairs(mit PDF-Name-#hh-Escape-Dekodierung) undValidatePdfUaRoleMapUsagezur direkten Verwendung
Version 1.81.0
Hinzugefügt
- Die PDF/UA-Validierung deckt nun das gemäß ISO 14289-1 §7.6 erforderliche ISO 32000-1-Listen-Tagging ab:
pvuaiListStructureInvalidmarkiert LI-Elemente außerhalb eines L-Containers sowie Lbl-/LBody-Teile außerhalb eines LI-Elements, akzeptiert dabei jedoch verschachtelte Listen und die zulässige Lbl-Verwendung innerhalb von Note- und BibEntry-Elementen
Version 1.80.0
Hinzugefügt
- Die PDF/UA-Validierung deckt nun das gemäß ISO 14289-1 §7.5 erforderliche ISO 32000-1-Tabellen-Tagging ab:
pvuaiTableStructureInvalidmarkiert TH/TD-Zellen außerhalb einer TR-Zeile sowie Zeilen oder Zeilengruppen außerhalb ihres Table-Containers;pvuaiTableHeaderMissingScopemarkiert Kopfzellen, deren Beziehung weder über ein Scope-Attribut noch über eine Headers/ID-Zuordnung bestimmbar ist;pvuaiTableHeadersUndefinedIdmarkiert Headers-Referenzen in Dokumenten, die keine Strukturelement-IDs definieren TPdfStructureElementlegt die TabellenattributeScope,HasHeaders,HeadersIds,ColSpanundRowSpanfrei, die beim Strukturbaum-Durchlauf aufgelöst werden
Geändert
- Der Strukturbaum-Durchlauf liest nun alle Layout- und Tabellenattribute in einem einzigen Durchgang über die Attributwörterbücher jedes Elements, anstatt einen Scan pro Attribut durchzuführen
Version 1.79.1
Hinzugefügt
- Das
AnnotationsLab-Beispiel wurde nach Lazarus und C++Builder portiert und reiht sich damit in das bestehende Delphi-Konsolenbeispiel ein
Fehlerbehebung
TPdf.CreateAnnotationkonnte “Cannot set attachment points” für Markup-Anmerkungen (Hervorheben, Unterstreichen, Durchstreichen, Schnörkel) auslösen, die Quad-Punkte verwenden, da die neue Anmerkung noch keinen zu ersetzenden Quad-Slot hatte; stattdessen wird nun das erste Quad angehängt
Version 1.79.0
Hinzugefügt
- Neues Delphi-Konsolenbeispiel
AnnotationsLab: erstellt Text-, Hervorhebungs-, Quadrat- und Kreis-Anmerkungen, schreibt sie in eine PDF-Datei, lädt die Datei anschließend neu und listet die Anmerkungen der Seite auf
Version 1.78.0
Hinzugefügt
- Neu:
TPdf.MeasureTextundTPdf.MeasureTextWidth: Messen die gerenderte Breite und Höhe einer Zeichenfolge für eine bestimmte Schriftart und -größe (PDF-Benutzereinheiten, 1 Einheit = 1/72 Zoll), ohne der Seite Inhalt hinzuzufügen, was Layout- und Zeilenumbruchlogik auf der Grundlage vonAddTextermöglicht; bereitgestellt durch die eigenständige EinheitFPdfMeasureals Klassen-Hilfsmethode (Class Helper) - Neu:
TPdf.WrapText: Ein "gieriger" Zeilenumbruch (greedy word wrap), basierend aufMeasureTextWidth, der Text an Leerzeichen trennt und Wörter in Zeilen packt, die nicht breiter als eine vorgegebene Breite (in PDF-Benutzereinheiten) sind; ein überlanges einzelnes Wort erhält eine eigene Zeile (keine Umbrüche innerhalb von Wörtern), und die umgebrochenen Zeilen werden als Array zurückgegeben
Version 1.77.0
Hinzugefügt
ValidatePdfAerhielt drei neueTPdfAValidationIssue-Werte, die die Klauseln abdecken, die zuvor vom früheren Lücken-Audit als “NEIN” oder “Lese-Verhalten” (“reader behaviour”) bewertet wurden (angehängte Ordinalwerte, vorhandene Werte unverändert):pvaiPdfiumNotDefGlyph(PDF/A-2 6.2.11.8 — ein Zeichen, das ohne Zuordnungsfehler in Unicode 0 aufgelöst wird, das Laufzeitsymptom einer.notdef-Glyphenreferenz; erkannt über die Pdfium-Objektmodellschicht),pvaiWordBreakMissing(Level A 6.8.3.2 — ein Show-String in einem Content-Stream, der länger als 20 Zeichen ohne Leerzeichen ist, ein wahrscheinlicher Verstoß durch verschmolzene Wörter; grobe Heuristik, die CJK-Fehlerkennungen vermeidet) undpvaiLinkActionMissingTarget(6.6.3 — eine GoToR/URI/SubmitForm-Aktion, der ihr Anzeigeziel-Schlüssel fehlt, sodass ein Reader sie nicht präsentieren kann)
Version 1.76.0
Hinzugefügt (Added)
ValidatePdfAhat drei neueTPdfAValidationIssue-Werte erhalten (Ordnungszahlen angehängt, bestehende Werte unverändert):pvaiNameNotValidUtf8(PDF/A-2/3 6.1.8 — ein/BaseFont- oder/FontName-Token, das Bytes ≥ 0x80 enthält, die kein gültiges UTF-8 bilden),pvaiInlineImageLzwForbidden(PDF/A-2/3 6.1.10 — ein Inline-Bild in einem Seiten-Inhaltsstrom verwendet den LZW- oder Crypt-Filter) undpvaiTrueTypeDifferencesForbidden(6.3.7 Cor.2 — ein nicht-symbolischer TrueType-Font, dessen Encoding-Wörterbuch/Differencesenthält)
Version 1.75.0
Hinzugefügt (Added)
ValidatePdfAhat drei neueTPdfAValidationIssue-Werte erhalten (Ordinalzahlen angehängt, bestehende Werte unverändert):pvaiIntegerImplementationLimit(PDF/A-2/3 6.1.13 — ein numerisches Token, das die 32-Bit-Grenze für vorzeichenbehaftete Ganzzahlen von 2.147.483.647 überschreitet),pvaiBlendModeNotWhitelisted(PDF/A-2/3 6.2.10 — ein/BM-Wert außerhalb der standardmäßigen Blend-Mode-Menge nach ISO 32000-1 §11.3.5; ergänzt das PDF/A-1pvaiTransparentColorSpace, das nur Normal/Compatible zulässt) undpvaiHexStringOddDigits(6.1.6 — ein<...>Hex-String mit einer ungeraden Anzahl von Hex-Ziffern)
Version 1.74.0
Hinzugefügt (Added)
ValidatePdfAhat drei neueTPdfAValidationIssue-Werte erhalten (Ordinalzahlen angehängt, bestehende Werte unverändert):pvaiPermissionsViolation(6.1.12 — ein/Perms-Dictionary, das/DigestLocation,/DigestMethododer/DigestValuezusammen mit/DocMDPenthält),pvaiTransActionForbidden(PDF/A-2 6.5.1 — eine Trans-Übergangsaktion, erkannt durch das/S /Trans-Aktions-Dictionary-Muster, um falsche Übereinstimmungen mit/Transparencyzu vermeiden) undpvaiPdfiumObjectTransparency(PDF/A-1 6.4 — ein Seitenobjekt weist nachFPDFPageObj_HasTransparencyechte Transparenz auf, was die in v1.73.0 eingeführte Pdfium-Objektmodell-Schicht erweitert, um Blend-Mode-/Soft-Mask-Effekte zu erfassen, die dem Namens-Scan auf Byte-Ebene entgehen können)
Version 1.73.0
Hinzugefügt (Added)
TPdf.ValidatePdfAlegt nun einen Pdfium-Objektmodell-Durchlauf über den Byte-Level-Inspektor: Er durchläuft die Textobjekte jeder Seite überFPDFPage_GetObject→FPDFTextObj_GetFont→FPDFFont_GetIsEmbeddedund meldet eine nicht eingebettete gerenderte Schriftart alspvaiPdfiumFontNotEmbedded(ISO 19005 6.3.4), und lädt jede Textseite, umFPDFText_HasUnicodeMapErrorzu scannen und meldet eine fehlerhafte Unicode-Zuordnung alspvaiPdfiumUnicodeMapError(6.3.8). Dies sind Prüfungen, die der Byte-Level-Inspektor nicht durchführen kann — er sieht nur Namens-Token, keine aufgelösten Font-Handles oder den Mapping-Status pro Zeichen — und werden in das Byte-Level-Ergebnis zusammengeführt. Die eigenständige Byte-Level-FunktionValidatePdfACompliancebleibt unverändert
Version 1.72.0
Hinzugefügt (Added)
ValidatePdfAhat fünf neueTPdfAValidationIssue-Werte erhalten (Ordinalzahlen angehängt, bestehende Werte unverändert):pvaiNeedsRenderingPresent(PDF/A-2 6.4.2 — der Katalog darf/NeedsRenderingnicht enthalten),pvaiDestOutputProfileRef(PDF/A-3 6.2.3 — ein OutputIntent darf/DestOutputProfileRefnicht enthalten),pvaiEmbeddedFileMissingUF(PDF/A-3 6.8 — eine Dateispezifikation mit/EFmuss auch/UFenthalten),pvaiXmpPacketBytesAttr(6.7.5 — der XMP-Paket-Header darf das veraltete Attributbytes=oderencoding=nicht enthalten) undpvaiAnnotationToggleNoView(PDF/A-2 6.3.2 — das Annotations-/F-ToggleNoView-Bit, Wert 512, ist verboten)
Version 1.71.0
Geändert
ValidatePdfUalöst nunpvuaiOrderedListMissingListNumberingaus (ISO 14289-1 7.6): Der Strukturbaum-Walker löst das Layout-AttributListNumberingfür jedesL-Element über die Pdfium-Attribut-API auf und markiert jeden Wert außerhalb der in ISO 32000-1 Tabelle 347 definierten Menge (Decimal,UpperRoman,LowerRoman,UpperAlpha,LowerAlpha,None,Circle,Disc,Square). Ein fehlendes Attribut wird nicht markiert, da die Liste ungeordnet sein könnte; dies schließt die letzte verbleibende ISO 14289-1 Lücke, die am Ende von Runde 5 erfasst wurde
Version 1.70.0
Hinzugefügt
ValidatePdfUahat vier neueTPdfUaValidationIssue-Werte erhalten (Ordinalzahlen angehängt, bestehende Werte unverändert):pvuaiSubsetMissingCidSet(ISO 14289-1 7.21.4.2 — ein CID-Subset-FontDescriptormuss/CIDSetdeklarieren),pvuaiToUnicodeForbiddenValue(7.21.7 — eine ToUnicode-CMap darf keinen Code aufU+FEFFoderU+FFFEabbilden; unkomprimierte Streams werden auf die Ausgabeformen<FEFF>/<FFFE>gescannt),pvuaiLangInvalidFormat(7.2 —/Langmuss ein gültiger RFC 1766 / BCP 47-Tag sein; eine freizügige Grammatik akzeptierten,en-US,zh-Hans,es-419und markiert eindeutig nicht konforme Werte) undpvuaiOrderedListMissingListNumbering(7.6 — aus Gründen der API-Vollständigkeit beibehalten; wird vom Validator noch nicht ausgelöst, da die zuverlässige Unterscheidung zwischen geordneten und ungeordneten Listen den AttributwertListNumberingerfordert, den der Strukturbaum-Walker nicht bereitstellt)
Version 1.69.0
Hinzugefügt
ValidatePdfUahat zwei neueTPdfUaValidationIssue-Werte erhalten (Ordinalzahlen angehängt, bestehende Werte unverändert):pvuaiWidgetOutsideForm(ISO 14289-1 7.18.4 — ein Widget-Strukturelement muss innerhalb einesForm-Elements verschachtelt sein; der Strukturbaum-Walker überprüft nun den direkten übergeordneten Typ jedes Widgets) undpvuaiSubsetMissingCharSet(7.21.4.2 — ein Type-1-Subset-FontDescriptormuss/CharSetdeklarieren, identifiziert durch das aus sechs Buchstaben bestehende+-Subset-Namen-Präfix bei/FontName)
Version 1.68.0
Hinzugefügt
ValidatePdfUahat zwei neueTPdfUaValidationIssue-Werte erhalten (Ordinalzahlen angehängt, bestehende Werte unverändert):pvuaiUriActionIsMap(ISO 14289-1 7.18.5 — ein URI-Aktions-Dictionary darf nicht/IsMapmit dem Werttrueenthalten, da dies das barrierefreie Linkziel deaktiviert) undpvuaiHeadingSequenceViolation(7.4.2 — nummerierte Überschriften müssen beiH1beginnen, und eine absteigende Sequenz darf keine dazwischenliegende Ebene überspringen, z. B. istH1→H3eine Verletzung). Die Überschriftenprüfung ist die erste PDF/UA-Regel auf Strukturbaumebene im Validator:ValidatePdfUaStructureElementsdurchläuft nun die Liste der typisierten Elemente und verifiziert die SequenzH1…H6(undH7+gemäß 7.4.3) in Dokumentenreihenfolge
Version 1.67.0
Hinzugefügt
ValidatePdfUahat fünf neueTPdfUaValidationIssue-Werte erhalten (Ordinalzahlen angehängt, bestehende Werte unverändert):pvuaiLinkMissingContents(ISO 14289-1 7.18.5 — eine Link-Annotation muss eine alternative Beschreibung über/Contentsenthalten),pvuaiAnnotationMissingContents(7.18.1 — jede nicht ausgenommene Annotation ohne/Contentsmuss eine alternative Beschreibung haben; Popup und Widget sind ausgenommen),pvuaiEmbeddedFileMissingName(7.11 — ein Dateispezifikations-Dictionary muss/Fund/UFenthalten),pvuaiMediaClipMissingAlt(7.18.6.2 — ein Medienclip-Daten-Dictionary muss/CTund/Altenthalten) undpvuaiCidFontMissingCidToGidMap(7.21.3.2 — ein eingebetteter Type-2-CIDFont muss/CIDToGIDMapenthalten)
Version 1.66.0
Hinzugefügt
ValidatePdfUahat fünf neueTPdfUaValidationIssue-Werte erhalten (Ordinalzahlen angehängt, bestehende Werte unverändert):pvuaiRoleMapMissing(ISO 14289-1 7.1 — ein getaggtes Dokument mit nicht standardmäßigen Strukturtypen muss eine/RoleMapenthalten),pvuaiOptionalContentAsKey(7.10 — ein Konfigurations-Dictionary für optionalen Inhalt darf nicht den Auto-State-Schlüssel/ASenthalten),pvuaiXfaPresent(7.15 — das Vorhandensein eines AcroForm/XFAwird markiert, da dynamisches XFA verboten ist),pvuaiTrapNetAnnotation(7.18.2 —/TrapNet-Annotationen sind verboten) undpvuaiReferenceXObject(7.20 — Reference XObjects, die durch den/Ref-Marker gekennzeichnet sind, sind verboten)
Behoben
ValidatePdfUaliefert nicht länger bei jeder verschlüsselten Datei fälschlicherweisepvuaiEncryptionPresent(False-Positive): PDF/UA erlaubt Verschlüsselung, solange beim Schlüssel/Pdes Verschlüsselungs-Dictionarys die Bitposition 10 (Wert 1024) gesetzt ist, was den Zugriff für assistierende Technologien gewährt (7.16). Der genaue Verstoß wird nun über das neuepvuaiEncryptionPBitMissinggemeldet;pvuaiEncryptionPresentwird aus Gründen der API-Kompatibilität im Enum beibehalten, aber vom Byte-Level-Validator nicht mehr ausgelöst
Version 1.65.0
Hinzugefügt
ValidatePdfAhat fünf neueTPdfAValidationIssue-Werte erhalten (Ordinalzahlen angehängt, bestehende Werte unverändert):pvaiCidFontMissingCidToGidMap(ISO 19005-1 6.3.3.2 Cor.2 — ein eingebetteter Type-2-CIDFont muss/CIDToGIDMapenthalten),pvaiSubsetMissingCharSet(6.3.5 — ein Type-1-Subset-FontDescriptormuss/CharSetenthalten),pvaiSubsetMissingCidSet(6.3.5 — ein CID-Subset-FontDescriptormuss/CIDSetenthalten),pvaiWidgetActionForbidden(6.6.1 — eine Widget-Annotation darf weder/Anoch/AAenthalten) undpvaiOptionalContentAsKey(ISO 19005-2 6.9 — ein Konfigurations-Dictionary für optionalen Inhalt darf nicht den Auto-State-Schlüssel/ASenthalten; neuerdings relevant, da PDF/A-2 optionalen Inhalt zulässt)
Version 1.64.0
Hinzugefügt
ValidatePdfAhat acht neueTPdfAValidationIssue-Werte erhalten (Ordinalzahlen angehängt, bestehende Werte unverändert):pvaiHeaderBinaryMarkerMissing(ISO 19005-1 6.1.2 — dem Header%PDF-x.ymuss ein%-Kommentar mit mindestens vier Bytes größer als 127 folgen),pvaiExternalStreamRef(6.1.7 — ein Stream-Dictionary darf nicht/F,/FFilteroder/FDecodeParmsenthalten),pvaiOutputIntentScheme(6.2.2 — das OutputIntent/Smuss/GTS_PDFA1sein),pvaiInfoXmpDateMismatch(6.7.3 — InfoCreationDate/ModDatemuss auch alsxmp:CreateDate/xmp:ModifyDateerscheinen),pvaiMarkInfoMissing(6.8.2.2 — Level A erfordert/MarkInfomit/Marked true),pvaiAnnotationApDictViolation(6.5.3 Cor.2 — das Annotations-Dictionary/APdarf nur/Nenthalten),pvaiEmbeddedFileMissingAFRelationship(ISO 19005-3 Anhang E.2 — jede verknüpfte Dateispezifikation (associated filespec) muss/AFRelationshipenthalten) undpvaiJpeg2000Violation(ISO 19005-2 6.2.8.3 — ein JPEG2000-Bild muss 1, 3 oder 4 Komponenten deklarieren)
Behoben
ValidatePdfAliefert nicht länger fälschlicherweisepvaiAnnotationFlagsViolation(False-Positive) bei Dokumenten, die einen aus einem einzigen Buchstaben bestehenden Font-Ressourcennamen wie/Font << /F 5 0 R >>verwenden; der Scan nach dem/F-Flag ist nun an einen Annotationskontext (/Subtypeeines Annotationstyps) gebunden, was dem dokumentierten Verhalten entspricht (6.5.3)ValidatePdfAmeldet nun die PDF/A-3-Anforderung für verknüpfte Dateien pro Datei: Ein Dokument wird nur noch markiert, wenn einer eingebetteten/Type /Filespec, die über/EFauf einen eingebetteten Stream verweist,/AFRelationshipfehlt, anstelle der vorherigen Alles-oder-Nichts-Prüfung (any-or-none check) für das gesamte Dokument (ISO 19005-3 Anhang E.2)- Die veraltete (deprecated) Aktion
/SetStatewurde neben/SetOCGStatezur Menge der verbotenen Aktionen hinzugefügt, sodass der Name der Aktion aus der PDF-Referenz direkt abgefangen wird (6.6.1)
Version 1.63.0
Hinzugefügt (Hinzugefügt)
TPdf.MeasureTextundTPdf.MeasureTextWidthhinzugefügt: misst die gerenderte Breite und Höhe von Text bei einer bestimmten Schriftart und -größe, ohne Inhalte zur Seite hinzuzufügen (in PDF-Benutzereinheiten, 1 Einheit = 1/72 Zoll); ermöglicht Layoutberechnungen und automatischen Zeilenumbruch auf Basis vonAddText; wird von der eigenständigen UnitFPdfMeasureals Class Helper bereitgestellt
Geändert (Geändert)
Demo\Delphi\MergePDF,Demo\CBuilder\MergePDFundDemo\Lazarus\MergePDFfür alle drei IDEs erweitert: unterstützt jetzt die Auswahl von Seitenbereichen pro Datei, optionalen Ausgabepfad, Deduplizierung, ein Ausführungsprotokoll, eine Abbrechen-Schaltfläche und eine Zusammenfassung nach dem Zusammenführen; Lesezeichen und Metadaten werden beim Import der ersten Quelle übernommenCreatePDF-Demos für alle drei IDEs ergänzt um eine Option „Europäischer Text" zum Schreiben akzentuierter Texte in Tschechisch, Französisch, Deutsch, Spanisch, Portugiesisch, Polnisch und Türkisch, zur Prüfung von Schriftauswahl und Unicode-Verarbeitung (das frühere BeispielEuropeanTextwurde integriert)- Die Beispiele
ExtractTextPagesundEuropeanTextwurden entfernt: die seitenweise Textausgabe vonExtractTextPageswird nun von den Seitenbereichs- und Seitentrennoptionen inExtractTextabgedeckt; die mehrsprachige Textwiedergabe vonEuropeanTextwurde inCreatePDFintegriert
Version 1.62.2
Behoben (Behoben)
- Die C++Builder-Header (
.hpp) für jede RAD-Studio-Version und Plattform (Win32/Win64/Win64x) wurden neu erzeugt; sie hatten sich von den Pascal-Quellen entfernt und hinterließen veraltete Funktionssignaturen sowie fehlende Units, die C++Builder-Nutzer über die Quellverteilung erreichten
Version 1.62.1
Behoben (Behoben)
- Die Quellkompilierung unter RAD Studio 12 Athens und älter wurde wiederhergestellt: Eine
TArray<Byte>-Zuweisung im PDF/UA-Validierungspfad verwendete eine nur in Delphi 13 verfügbare implizite Array-Konvertierung, die auf älteren IDEs nicht kompilierte
Version 1.62.0
Hinzugefügt (Hinzugefügt)
TPdf.RenderPageThumbnailrendert jede Seite per Index in ein seitenverhältnisangepasstes Bitmap, ohne die aktuelle Dokumentseite, die geladene Seite oderOnPageChangezu ändern
Behoben (Behoben)
TPdfThumbnailViewsteuert beim Zeichnen nicht mehr diePageNumberdes Host-Dokuments; früher lud jede Neuzeichnung Seiten neu, lösteOnPageChangeaus und verwarf die Textseite, was eine verknüpfteTPdfViewstören und Neuzeichnungsschleifen auslösen konnte. Miniaturen werden jetzt überRenderPageThumbnailgerendert, ohne solche Nebenwirkungen- Die PDF/X-Konformitätsprüfung untersucht jetzt Dokumente mit Cross-Reference-Streams (PDF 1.6, typisch für PDF/X-4) und Objekte in komprimierten Objekt-Streams, statt solche Dateien pauschal als nicht konform zu melden; das
GTS_PDFXVersion-Markerfeld wird sowohl aus XMP in Elementform als auch in RDF-Attributform gelesen - Die PDF/R-Validierung meldet jetzt
pvriInfoXmpMismatch, wenn sich Info-Wörterbuch und XMP bei Producer oder Creator unterscheiden; der Fehler war zuvor deklariert, aber nie ausgelöst worden - Formularfüll-Timer werden jetzt pro Anforderung verfolgt, sodass ein Dokument, das mehrere Timer gleichzeitig laufen lässt (zum Beispiel ein JavaScript-Intervall neben dem Blink des Feldcursors), sie alle behält, statt alle bis auf den neuesten zu verlieren
- Das Zeichnen von
TPdfViewund seine öffentlichen MethodenRenderPage/RenderTilehalten jetzt den Dokument-Render-Lock und serialisieren damit gegen das Rendern desselbenTPdfim Worker-Thread (PDFium ist nicht threadsicher) - Nicht-ASCII-Text in PDF/X-, PDF/R- und PDF/VT-Metadaten (OutputIntent-Bedingungsnamen, Creator, Producer) wird jetzt gemäß ISO 32000-1 §7.9.2.2 als UTF-16BE-String statt als rohes UTF-8 kodiert, was konforme Leser sonst falsch lesen würden
- Konformitätshelfer lesen eingebettete Metadatenströme mit indirekter
/Length-Referenz jetzt korrekt, laden Quelldaten mitReadBuffer(sodass ein kurzer Lesevorgang sauber fehlschlägt) und weisen einen negativenstartxref-Offset zurück, statt einen Lesezugriff außerhalb des Bereichs zu riskieren
Version 1.61.0
Geändert (Geändert)
- FFI/ABI-Deklarationen wurden korrigiert, was eine Neukompilierung von Code erforderlich machen kann, der die betroffenen Callbacks implementiert: Der
FFI_OpenFile-Formularfüll-Callback trägt jetztcdecl(Win32-Stack-Konvention), und dervalue-Parameter vonFPDFAnnot_SetStringValueundFPDFAttachment_SetStringValueist jetztFPDF_WIDESTRING(UTF-16LE), passend zu den PDFium-Headern - Progressive-Load-Callbacks
FX_FILEAVAIL.IsDataAvailundFX_DOWNLOADHINTS.AddSegmentnehmen jetztsize_t-Offsets, undsize_that unter Free Pascal / Lazarus Win64 jetzt die Pointer-Breite statt wie zuvor auf 32 Bit gekürzt zu werden, was Data-Availability- undout-size_t-API-Aufrufe unter FPC Win64 korrigiert
Behoben (Behoben)
- Speichersicherheit: ein use-after-free des Formularfüll-Timers beim Zerstören eines
TPdfmit aktivem AcroForm-Cursor; ein doppeltesFPDF_CloseDocumentim Fehlerpfad vonImportNPagesToOne; Pascal-Ausnahmen, die während Speichern und JPEG-Einfügen dieFPDF_FILEWRITE- /FPDF_FILEACCESS-Callbacks über die C-Grenze verlassen; sowie ein Integer-Überlauf bei der Textextraktion beim Lesen von einem Startindex bis zum Seitenende TPdfFuture<T>liefert seinen Ergebnis-Callback jetzt zuverlässig aus; die Rückmeldung wurde zuvor fast immer verworfen und konnte einen freigegebenen Thread berühren, weil sich der Worker freigab, bevor die eingereihte Rückmeldung lief- PDF/A-, PDF/X-, PDF/E-, PDF/R-, PDF/VT- und PDF/UA-Ausgaben schreiben jetzt Kreuzreferenzeinträge mit exakt 20 Bytes, wie in ISO 32000-1 §7.5.4 gefordert
- Die Einschleusung von Standards-Markern zerstört kein Wörterbuch mehr, wenn der entfernte Schlüssel, zum Beispiel
/Trapped, der letzte Eintrag war; zuvor wurde dadurch das schließende>>verschluckt und ein fehlerhaftes Objekt erzeugt - Die OutputIntent-ICC-Profilströme geben jetzt die erforderliche
/N-Komponentenzahl für PDF/X und PDF/VT an, die bei PDF/A bereits vorhanden war; verschlüsselte Quelldokumente werden vor dem Einschleusen von PDF/X-, PDF/E-, PDF/R-, PDF/VT- und PDF/UA-Markern entschlüsselt, sodass die Ausgabe gültig statt stillschweigend beschädigt ist - Das UTF-8-xpacket-BOM in erzeugtem XMP wird jetzt als exakte Bytefolge ausgegeben, was Beschädigungen auf Delphi-Installationen mit einem ANSI-Codepage ungleich Latin-1 behebt; Trailer für inkrementelle Updates behalten jetzt die
/Info-Referenz des Dokuments SaveAsmit Kompression kürzt keine Streams mehr, deren/Lengtheine indirekte Referenz ist, und neu aufgebaute Kreuzreferenztabellen verwenden jetzt 20-Byte-Einträge, echte Generationsnummern und lassen den veralteten/Prev-Zeiger weg- Die Konformitätsvalidierung liest XMP-Versionsmarker in Attributform für PDF/E und PDF/X jetzt korrekt, sodass attributserialisierte PDF/X-4-Dateien erkannt werden, verlangt den exakten
PDF/E-1-Bezeichner, liest Metadatenströme mit indirekter/Lengthkorrekt und vergleicht beim Prüfen des PDF/UA-Trailers das/ID- oder/StructTreeRoot-Schlüssel eines Strukturelements nicht mehr fälschlich; ein fehlerhafterstartxref-Offset löst keinen Bereichsfehler mehr aus TPdfThumbnailView: Die letzte Seite ist jetzt über die Bildlaufleiste erreichbar, die aktuelle Seite des Host-Dokuments wird nach dem Zeichnen der Miniaturen wiederhergestellt, und die standardmäßige Mouse-Leave-Behandlung wird erneut ausgelöst- Graustufen-Seiten- und Bild-Bitmaps werden nicht mehr mit einer falschen Palette gerendert;
TPdfViewbleibt außerdem nicht mehr mit einer hängenden Referenz zurück, wenn seinTPdfzuerst freigegeben wird - Preflight-Berichte: HTML wird als UTF-8 gespeichert, passend zum deklarierten Zeichensatz, und JSON-Zeichen-Escaping erzeugt auf Free Pascal korrekte
\u-Sequenzen für Nicht-ASCII-Zeichen - Test-Builds: Der Dialog mit der Test-Erinnerung erscheint jetzt, statt unterdrückt zu werden, bevor er angezeigt werden kann
TPdfStreamAdapterweist jetzt Streams über 4 GiB mit einem klaren Fehler zurück, statt die an PDFium übergebene Länge stillschweigend zu kürzen
Version 1.60.1
Geändert (Geändert)
- Die AccessibilityReader-Demos für Delphi, Lazarus und C++Builder lesen jetzt über
TPdfReadingSessionvor: Jede Seite wird mitBuildSpokenTextFromWordszu einem gesprochenen Block zusammengesetzt, SAPI-Wortpositionen speisenFeedSpokenPosition, und die Session schaltet Seiten weiter und steuert den Wortcursor der Ansicht, statt der zuvor in jedem Demo vorhandenen handgeschriebenen Orchestrierung - Wortgenaues Karaoke-Tracking in den Demos funktioniert jetzt auch, wenn NVDA die Sprachausgabe ist:
EstimatePacingtaktet den Lese-Cursor nach verstrichener Sprechzeit, während NVDA zuvor ganz ohne Wortverfolgung vorgelesen hat - Pause und Resume funktionieren in den Demos jetzt ebenfalls mit NVDA:
ResumeRestartsChunkspricht die aktuelle Seite bei Resume erneut vom Anfang an, während SAPI sein natives Pausieren und Fortsetzen an Ort und Stelle behält
Version 1.60.0
Hinzugefügt (Hinzugefügt)
- Live-Low-Vision-Rendering in
TPdfView: Die neuen RenderoptionenreInvertundreNightDuotonefärben jedes gerenderte Seitenkachelbild vor dem Zeichnen von Such-, Auswahl-, Lese- und Wortcursor-Overlays neu ein, entweder mit vollständiger Farb-Invertierung oder einer Nacht-Duoton-Palette, und bringen damit die vorhandenen Bitmap-Farbtransformationen in den interaktiven Viewer für Einzel- und Doppelseitenlayouts; das Umschalten der Optionen zeichnet sofort neu NightDuotoneInkundNightDuotonePaperkonfigurieren die Nachtpalette, standardmäßig mit bernsteinfarbenem Text auf schwarzer Seite; wenn beide Optionen gesetzt sind, gewinntreInvert
Version 1.59.0
Hinzugefügt (Hinzugefügt)
TPdfReadingSession:Eine sprachengine-neutrale Orchestrierungskomponente für Vorlesen. Sie verwaltet den Chunk-Cursor, den Wort-Cursor und den Wiedergabestatus (Play/PlayFrom/Pause/Resume/Stop), arbeitet sich durch die geladenenTPdfSpokenText-Chunks, sobald der Host überTickLeerlauf meldet, übersetzt gesprochene Textoffsets zurück in Seitenzeichen und steuert automatisch einen angehängtenTPdfView-Wortcursor; der Host bindet jede Sprachausgabe überOnSpeaksowie die Anforderungsereignisse für Abbrechen / Pause / Fortsetzen an, sodass die Bibliothek selbst keine Speech-API verlinktFeedSpokenPositionverarbeitet Wortpositionen der Engine, etwa SAPIStatus.InputWordPosition;EstimatePacingmitEstimatedWordsPerMinutetaktet Engines ohne Positionssignal;ResumeRestartsChunkspricht für Engines ohne native Pause den aktuellen Chunk erneutOnChunkChange,OnWordChangeundOnFinishedfeuern nur bei echten Änderungen, und eine freigegebene angehängte Ansicht löst sich automatisch ab, sodass Hostcode flackerfrei und absturzsicher bleibt
Version 1.58.0
Hinzugefügt (Hinzugefügt)
EstimateSpokenWordIndexschätzt aus verstrichener Zeit und einer Wörter-pro-Minute-Rate, welches Wort eine Sprachausgabe gerade spricht, und gibt längeren Wörtern proportional mehr Zeit, sodass Engines ohne Wortpositionsmeldung, etwa der NVDA Controller Client, trotzdem den wortgenauen Lesecursor treiben können; der Aufrufer liefert die verstrichene Zeit, daher bleibt die Routine uhrfrei und unit-testbar
Version 1.57.0
Hinzugefügt (Hinzugefügt)
- Spoken-Text-Zusammenstellung mit Zwei-Domänen-Zuordnung für Vorlese-Tracking:
BuildSpokenTextFromWordsundSpokenTextAppendbauen aus Seitenwortboxen die Zeichenkette für eine Text-to-Speech-Engine und protokollieren dabei eine Bereichstabelle, undSpokenToPageCharübersetzt einen von der Engine gemeldeten gesprochenen Offset, etwa SAPIStatus.InputWordPosition, zurück in den Seitenzeichenindex, sodass das wortgenaue Hervorhebungs-Tracking korrekt bleibt, wenn der gesprochene Text nicht der gesamte Seitentext ist, etwa bei übersprungenen Bereichen, unitweiser Lektüre oder Ausspracheüberschreibungen TPdfSpokenTextundTPdfSpokenSpantragen den gesprochenen String sowie die Quellseitenbereiche, aus denen er aufgebaut wurde; Offsets auf eingefügten Trennzeichen lösen sich zum nächsten gemappten Wort auf und Offsets jenseits der gemappten Bereiche melden keinen Treffer
Version 1.56.9
Hinzugefügt (Hinzugefügt)
Demo\Delphi\PreflightReportergänzt eine Vorschau des Aktionsplans, die nicht bestandene Standards, Prioritäten, nächste Maßnahmen, Fehlercodes und Empfehlungen in eine Maßnahmen-Checkliste bündeltDemo\Delphi\PreflightReportCliakzeptiertplan/actionplanals Ausgabeformat für Einzeldatei- und Batchläufe und schreibt dieselbe Maßnahmen-Checkliste in eine Textdatei
Geändert (Geändert)
- Beide Delphi-PreflightReport-Demos zeigen jetzt Pass-/Aktions-/Überprüfungsstatus-Zählwerte zusammen mit den Gesamtstandards und Meldungen an
Version 1.56.8
Geändert (Geändert)
ViewerInteractionLabenthält jetzt Seiten-Sprung-Steuerelemente, manuelle Zoom-Steuerelemente, ein klickbasiertes Logging derDeviceToPage/PageToDevice-Koordinaten und ein klareres Interaktionsprotokoll für Auswahl-, Such-, Rotations- und Navigationsprüfungen- Die Readme-Seiten von
ViewerInteractionLabdokumentieren jetzt den hinzugefügten Interaktionsworkflow in den lokalisierten Demo-Readme-Dateien
Version 1.56.7
Hinzugefügt (Hinzugefügt)
AccessibilityWorkbenchCliordnet jede ausgelöste Feststellung ihrem WCAG 2.1 Success Criteria und der ISO 14289-1 (PDF/UA-1)-Klausel zu und zeigt im Bericht einen Abschnitt zur Standardabdeckung anAccessibilityWorkbenchCliberechnet einen dokumentierten Accessibility-Score von 0 bis 100 mit einer veröffentlichten Strafwertung und den Stufen excellent / good / needs work / poor, als Einzeldatei- und Batchdurchschnitt ausgegebenAccessibilityWorkbenchCliakzeptiertfailscore=N, um den Lauf mit Exit Code 2 zu beenden, wenn eine Datei unter N liegtAccessibilityWorkbenchClischreibt ein SARIF 2.1.0-Protokoll, wenn der Batch-Zusammenfassungsname auf.sarifendet, mit einer Regel pro Befundtyp und den dazugehörigen WCAG 2.1- sowie PDF/UA-Tags für CI und Code-ScansAccessibilityWorkbenchCliergänzt den Befehlversion, der die verknüpfte PDFiumPas-Version ausgibt
Version 1.56.6
Hinzugefügt (Hinzugefügt)
IntakeWorkbenchCliberechnet einen SHA-256-Forensikhash jeder Eingabedatei (fällt aufunavailablezurück bei Compilern ohneSystem.Hash) und meldet ihn in jedem FormatIntakeWorkbenchCliakzeptiertpasswords=file.txt, um passwortgeschützte Dokumente aus einer Kandidatenliste probeweise zu entsperren, wobei der passende Kandidatenindex gespeichert wird, ohne das Passwort selbst zu protokollierenIntakeWorkbenchCliakzeptiertcopyto=dir, um jede geprüfte Datei in einen risikobezogenen Unterordner zu verschieben und so aus dem Auditor einen Intake-Sortierer zu machenIntakeWorkbenchClischreibt ein SARIF 2.1.0-Protokoll, wenn der Batch-Zusammenfassungsname auf.sarifendet, mit einer Regel pro Risikomarker und einem Ergebnis pro markierte Datei für CI- und Code-ScansIntakeWorkbenchCliergänzt den Befehlversion, der die verknüpfte PDFiumPas-Version ausgibt
Version 1.56.5
Hinzugefügt (Hinzugefügt)
IntakeWorkbenchClileitet nun empfohlene Maßnahmen nach der Intake-Prüfung ab, darunter accept, request-password, manual-review, quarantine und deduplicate, und zeigt Maßnahmenzähler in Batch-Zusammenfassungen anAccessibilityWorkbenchClileitet nun empfohlene Behebungsmaßnahmen wie pass-through, remediate-tags, run-ocr, remediate-semantics und manual-review ab, inklusive passender Batch-Maßnahmenzähler
Geändert (Geändert)
- Beide CLI-Demos auf Tool-Ebene zeigen die empfohlene Maßnahme in der Konsole sowie in Text-, HTML-, JSON- und CSV-Ausgabe, damit Batch-Betreiber Dateien ohne Risiko beim Nachverarbeiten von Statusfeldern routen können
Version 1.56.4
Behoben (Behoben)
- Beim Lesen von Anmerkungen, Lesezeichen oder Link-Anmerkungen in einer Schleife gehen keine Textzeichenketten des vorherigen Elements mehr verloren: Die Ergebnisdatensätze von
TPdfAnnotation,TBookmarkundTLinkAnnotationwerden jetzt mit einem verwalteten Initialisierungsansatz geleert statt mit Rohspeicher-Nullung, so dass Dokumente mit vielen textbehafteten Anmerkungen den Prozessspeicher nicht mehr dauerhaft aufblasen - Das Zerstören eines
TPdf, das einenOnUnsupportedFeature-Handler registriert hatte, entfernt ihn jetzt aus dem prozessweiten PDFium-Callback, sodass ein späterer Dokument-Ladevorgang in einer anderenTPdf-Instanz ohne eigenen Handler nicht mehr in die freigegebene Komponente verzweigt (use-after-free)
Version 1.56.3
Behoben (Behoben)
AccessibilityWorkbenchClizählt leere Seiten nicht mehr als heuristische Lese-Reihenfolgesseiten, sodass getaggte Dokumente mit leeren Trennseiten ihren korrekten Zugänglichkeitsstatus behalten; Seiten ohne lesbaren Inhalt werden jetzt separat gemeldetAccessibilityWorkbenchCliweist bei der Tabellenkopf-Erkennung keine äußere Tabelle mehr einemTH-Zellensatz einer verschachtelten Tabelle zu, und Formularfeld- sowie Schriftartnamen werden mit Groß-/Kleinschreibung abgeglichen, sodass unterschiedliche Felder nicht zusammengeführt werdenIntakeWorkbenchCliURL-Host-Inventare entfernen jetzt Userinfo-, Query- und Fragmentanteile, sodass ein präparierter Link wietrusted.example@evil.exampledem echten Host zugeordnet wird undmailto:-Ziele ihre Domain statt unsichtbar beitragenIntakeWorkbenchCli-Markdown-Berichte maskieren Backticks in vom Angreifer kontrollierten Pfaden, Hosts und Anhangsnamen, damit das Berichtformat von einem Dokument aus nicht gebrochen werden kann
Geändert (Geändert)
AccessibilityWorkbenchClimeldet Fehler bei Font-Scan und Formularfeld-Scan als separate Zähler, markiert nicht eingebettete Schriften mit eingebetteten Instanzen und begrenzt lange Schriftenlisten mit einem expliziten KürzungsmarkerIntakeWorkbenchCliBatch-Zusammenfassungen erhalten eine Spalte für die Anzahl der Anhangs-Anmerkungen, und der Anmerkungsbestand je Seite ist auf 20000 Anmerkungen pro Seite begrenzt, wobei die Begrenzung in jedem Format angezeigt wird
Version 1.56.2
Hinzugefügt (Hinzugefügt)
AccessibilityWorkbenchCliprüft jetzt Schrifteinbettung, Tooltips von Formularfeldern, Quelle der Lesereihenfolge, Dokumentgliederungen, Tabellen- und Listenstruktur, verdächtigen Alternativtext und ausführlichere Prüfdetails pro Seite, damit Barrierefreiheits-Batchberichte mehr Korrekturziele erkennenIntakeWorkbenchClimeldet jetzt Seiten-Scanlimits, launch- und remote-go-to-Aktionen, URI-Hostinventare, Anmerkungszahlen, nicht unterstützte PDFium-Funktionen, doppelte Dokumentkennungen und erweiterte Risikomarker für die automatisierte intake-Prüfung
Geändert (Geändert)
IntakeWorkbenchCliakzeptiertmaxpages=Nim Einzeldatei- und Batchmodus, um Seiten-Scans pro Dokument zu begrenzen und trotzdem metadata-, attachment-, script-, XFA-, signature- und risk-Berichte abzuschließen
Version 1.56.1
Behoben (Behoben)
- Das Laden einer älteren
pdfium.dll, der ein neuerer Export fehlt, schlägt jetzt sauber fehl: Der Fehlerpfad setzt jeden gebundenen API-Einstiegspunkt zurück, sodassAssigned()-Prüfungen (zum Beispiel fürFPDF_GetLastErroroderFPDF_GetSecurityHandlerRevision) melden, dass die Bibliothek nicht geladen ist, statt das bereits entladene Modul aufzurufen und mit einer Zugriffsverletzung abzustürzen UnloadLibrarylöscht jetzt alle PDFium-API-Bindungen statt nur die optionalen V8-Hilfsfunktionen, sodass nach der Freigabe der DLL keine veralteten Funktionszeiger zurückbleiben
Version 1.56.0
Hinzugefügt (Hinzugefügt)
- Wortweiser Karaoke-Lesecursor in
TPdfView:TrackReadingWordAtordnet den Zeichenversatz des aktuellen Wortes einer Text-to-Speech-Engine, etwa SAPIStatus.InputWordPosition, den Wortboxen der Seite zu, hebt das enthaltene Wort als eigene Überlagerung über dem Leseblock hervor, rollt es in den sichtbaren Bereich und gibt den Wortindex zurück, sodass das gesprochene Wort mit fortschreitender Stimme aufleuchtet SetReadingWordundClearReadingWordsetzen oder löschen das hervorgehobene Wort direkt aus einemTPdfWordBox; das erneute Setzen desselben Wortes ist ein No-op, sodass wortweises Tracking die Ansicht nicht flackern lässtReadingWordColorundReadingWordFollowsteuern die Wortcursorfarbe und ob die Ansicht automatisch zum gesprochenen Wort rollt
Version 1.55.2
Behoben (Behoben)
- ViewerInteractionLab gibt den Toolbar-Zeilen jetzt mehr vertikalen Raum, sodass Open PDF, Create Sample, Navigation, Suche und Auswahlsteuerungen bei skalierten Schriftarten nicht mehr überlappen
Version 1.55.1
Behoben (Behoben)
- ViewerInteractionLab platziert Prev, Next und Rotate jetzt in der zweiten Toolbar-Zeile und vermeidet damit die Startüberlappung mit Open PDF und Create Sample
Version 1.55.0
Hinzugefügt (Hinzugefügt)
- Brücke von Wortbox zu Textauswahl für Lesen-und-Auswählen:
TPdfView.SelectWordBoxundSelectWordSpanwählen eine einzelne Wortbox oder eine gleichseitige Wortboxspanne ausPageWordBoxesüber ihre Zeichenbereiche aus, sodass das gerade gelesene Wort oder die Zeile auch ausgewählt und kopiert werden kann WordBoxIndexAtCharIndexordnet einen Zeichenindex der enthaltenden Wortbox zu und steuert die wortweise Hervorhebung, während der TTS-Lesecursor fortschreitet
Version 1.54.0
Hinzugefügt (Hinzugefügt)
- Sprachzugängliche Formular-Accessoren, die das fokussierte Feld direkt aus dem logischen Cursor lesen:
FocusedFormFieldValue,FocusedFormFieldNameundFocusedFormFieldDetailsaufTPdfundTPdfViewliefern den Wert des aktuellen Felds, den menschenlesbaren Namen als/TU-Tooltip mit Fallback auf/Tsowie die vollständigeTPdfFormFieldInfomit Typ, Flags und Optionen, also alles, was eine Sprach-UI beim Durchschalten durch ein Formular ansagen muss
Behoben (Behoben)
FocusedFormFieldValueliest das Feld überFocusedFormFieldIndexstatt über den interaktiven pdfium-Fokus, sodass ein sprachgesteuerter Formular-Workflow auch ohne sichtbares Caret den richtigen Wert erhält; das bestehendeFocusedFormFieldTextspiegelt weiterhin den pdfium-Fokus wider und bleibt unverändert
Version 1.53.0
Hinzugefügt (Hinzugefügt)
- Unterstützung für Hervorhebung auf Wortebene:
TPdf.PageWordBoxesundTPdfView.PageWordBoxeszerlegen eine Seite inTPdfWordBox-Records, von denen jeder den Worttext, seinen Zeichenbereich und ein Begrenzungsrechteck im Seitenraum trägt, sodass ein Accessibility-Reader jedes gesprochene Wort der Reihe nach hervorheben kann, indem er das Rechteck anSetReadingHighlightübergibt BuildWordBoxesteilt Seitentext in TPdfWordBox-Records mit Worttext und FTextPage-Zeichenbereichen
Version 1.52.0
Hinzugefügt (Hinzugefügt)
- Low-Vision-Rendering-Helfer
InvertPdfBitmap,GrayscalePdfBitmapundDuotonePdfBitmapwenden In-Place-Farbtransformationen auf ein gerendertes 32-Bit-Bitmap an, sodass ein Accessibility-Reader Seiten invertiert, im Dark Mode, in Graustufen oder in einem benutzerdefinierten Zwei-Farben-Schema anzeigen kann, zum Beispiel mit dunklem Hintergrund und hellem Text - Der Helfer erzwingt pf32bit und aktualisiert ScanLine-Pixel direkt, sodass er nach RenderPage oder ToBitmap ohne zusätzlichen Zwischenpuffer arbeitet
Version 1.51.0
Hinzugefügt (Hinzugefügt)
- Satzbasierte Leseeinheiten für assistives Zuhörlesen:
TPdf.ReadingUnits,TPdf.DocumentReadingUnitsundTPdfView.ReadingUnitslinearisieren den lesbaren Inhaltsstrom in geordneteTPdfReadingUnit-Records in Satzgröße; jeder Record trägt den vorzulesenden Text sowie seinen semantischen Typ, die Seite, Hervorhebungsrechtecke und das Sprach-Tag, sodass eine Screen-Reader-App seitenweise oder dokumentweit eine gesprochene Einheit nach der anderen durchlaufen kann NextReadingUnitOfKindFindet die nächste oder vorherige TPdfReadingUnit, deren Kind einem gewünschten TPdfContentFragmentKind entsprichtBuildReadingUnitswandelt beliebigeTPdfContentFragmentsdirekt in Leseeinheiten um: Überschriften sowie Figuren- und Alt-Beschreibungen bleiben als Ganzes erhalten, Absätze werden an Satzgrenzen getrennt, Dezimalpunkte bleiben erhalten, und der Lesecursor ist ein einfacher, vom Aufrufer verwalteter Index
Version 1.50.0
Hinzugefügt (Hinzugefügt)
ValidatePdfAkann nun auch PDF-1.5+-Dokumente prüfen, die den Katalog, OutputIntent oder andere Dictionaries innerhalb komprimierter Objekt-Streams (/Type /ObjStm) speichern. Die Objekt-Streams werden dekomprimiert und die darin enthaltenen Objekte aufgelöst, sodass solche Dokumente nach ihren tatsächlichen Eigenschaften validiert werden, statt als ohne ihre PDF/A-Kennzeichnungen gemeldet zu werden
Version 1.49.5
Behoben (Behoben)
ValidatePdfAmeldet eine fehlendepdfaExtension:schemas-Beschreibung nicht länger als Problem. Das PDF/A-Kennungsschema (pdfaid) ist allgemein bekannt, sodass weder veraPDF noch PDF/A-2/-3 dafür eine Erweiterungsschema-Beschreibung verlangen, und das Bemängeln ihres Fehlens hat jedes konforme PDF/A von Drittanbietern fälschlich beanstandet. Dokumente, die die Bibliothek selbst erzeugt, enthalten die Beschreibung weiterhin
Version 1.49.4
Behoben (Behoben)
ValidatePdfAerkennt nun die Konformitätsstufe auch dann, wenn die PDF/A-Kennung als XML-Attribute (pdfaid:part="2") statt als Kindelemente geschrieben ist, sodass Dokumente in Attributform nicht länger mit unbekannter Stufe gemeldet werden. Damit wird auch eine Folgewirkung behoben, bei der eine nicht erkannte Stufe dazu führte, dass die stufenspezifischen Prüfungen auf die strengen PDF/A-1-Regeln zurückfielen und eingebettete Dateien sowie Transparenz, die PDF/A-2 und PDF/A-3 erlauben, fälschlich beanstandeten
Version 1.49.3
Behoben (Behoben)
ValidatePdfAprüft nun auch PDF-1.5+-Dokumente, deren Cross-Reference-Daten als cross-reference stream vorliegen (Dateien ohnetrailer-Schlüsselwort). Die Konformitätsstufe, die Trailer-/IDund die übrigen Kennzeichnungen werden aus dem Dictionary des cross-reference stream gelesen, sodass solche Dokumente nach ihren tatsächlichen Eigenschaften validiert werden, statt als vollständig nicht konform gemeldet zu werden
Version 1.49.2
Behoben (Behoben)
ValidatePdfAmeldet bei Dokumenten, die alle ihre Schriften einbetten, kein fälschliches Problem mit nicht eingebetteten Schriften mehr. Die bisherige Heuristik verglich die Anzahl der/FontDescriptor-Tokens mit den eingebetteten Schriftprogrammen, doch jede eingebettete Schrift trägt zwei/FontDescriptor-Tokens bei (die Referenz im Schrift-Dictionary sowie das Descriptor-Objekt), sodass jede Datei mit eingebetteten Schriften fälschlich beanstandet wurde. Die Prüfung meldet nun nur noch ein Dokument, das Schriften referenziert, jedoch überhaupt kein Schriftprogramm einbettet – übereinstimmend mit der entsprechendenValidatePdfUa-Korrektur
Version 1.49.1
Behoben (Behoben)
- PDF/A-Ausgabe validiert nun mit veraPDF als konformes PDF/A-1b und PDF/A-1a: Der eingebettete sRGB-OutputIntent-ICC-Profil-Stream (referenziert durch
/DestOutputProfile) deklariert nun die erforderliche/N-Komponentenanzahl (3 für das integrierte RGB-Profil), wie von ISO 19005-1 6.2.3.2 vorgeschrieben. VonSaveAsPdfAerzeugte Dokumente bestanden die strenge PDF/A-1-Validierung bisher nicht, weil der Destination-Profile-Stream/Nausließ; der Wert wird aus dem Header des ICC-Profils abgeleitet, sodass auch ein vom Aufrufer bereitgestelltes CMYK- oder Gray-Profil die korrekte Anzahl erhält
Version 1.49.0
Behoben (Behoben)
ValidatePdfUameldet bei konformen getaggten PDF-Dokumenten keine fälschlich fehlende XMP-Kennzeichnung mehr – die PDF/UA-Kennung (pdfuaid:part),dc:title, die XMP-Datumsangaben und die Trailer-/IDwerden nun aus den ursprünglichen Dokument-Bytes statt aus der neu gespeicherten Kopie gelesen, der der/Metadata-XMP-Stream und bei cross-reference-stream-Dateien die Trailer-/IDfehlen- Die Schriften-Einbettungsprüfung von
ValidatePdfUawurde korrigiert, sodass ein Dokument, das alle seine Schriften einbettet, nicht länger als mit nicht eingebetteten Schriften gemeldet wird; es kennzeichnet nun nur noch ein Dokument, das Schriften referenziert, jedoch überhaupt kein Schriftprogramm einbettet ValidatePdfUaakzeptiert nun einFormula-Strukturelement, dessen Alternativtext überActualTextstatt über einenAlt-Eintrag bereitgestellt wird (ISO 14289-1 §7.7), übereinstimmend mit der bestehendenFigure-Regel
Version 1.48.0
Hinzugefügt (Hinzugefügt)
- Programmgesteuerte Textauswahl auf
TPdfView:SelectTextRange(nach Seite und Zeichenbereich) undSetSelection(nach expliziten seitenweisen Bereichen) wählen Text per Code aus – etwa um eine Passage zu lesen und hervorzuheben; beide zeichnen neu und lösenOnSelectionChangeaus, wenn sich die Auswahl ändert.SelectionRangesliest die aktuelle Auswahl als seitenweise Zeichenbereiche, undSelectionRectanglesliefert ihre Rechtecke in Seitenkoordinaten für eigene Hervorhebungen oder zum Hinscrollen
Version 1.47.0
Hinzugefügt (Hinzugefügt)
- Formularfeld-Navigation für sprachgesteuertes Ausfüllen von Formularen, sowohl auf
TPdfals auch aufTPdfView:FormFieldTabOrder,FocusedFormFieldIndex,FocusFormField,FocusNextFormField,FocusPreviousFormField,ClearFormFieldFocusundFocusedFormFieldText. Diese bewegen einen logischen Feldcursor in Tabulatorreihenfolge über die Widget-Felder der Seite (mit Umlauf an den Enden), sodass ein assistierendes Vorleseprogramm das Formular durchlaufen, jedes Feld überFormFieldInfo[Index].AlternateName(den /TU-Tooltip) ansagen und es überFormField[Index]ausfüllen kann - Ereignis
TPdfView.OnFormFieldFocusChange, das ausgelöst wird, wenn der Feldcursor sich bewegt (es übergibt den Index des neuen Felds bzw. -1, wenn der Fokus aufgehoben wird)
Version 1.46.0
Hinzugefügt (Hinzugefügt)
- Inhaltsstrom für assistierendes Vorlesen:
TPdf.ReadableContent,TPdf.ReadablePageContent,TPdf.DocumentReadableContentundTPdfView.ReadableContentliefern eine geordnete Liste semantischerTPdfContentFragment-Elemente. Jedes Element trägt den gesprochenen Text (echte Glyphen oderActualText/Alt bei Abbildungen), eine Fragmentart (Überschrift mit Ebene, Absatz, Abbildung, Listenelement, Tabellenzelle, Link, einfacher Text), die Sprache, die 1-basierte Seite sowie Block- und zeilenweise Hervorhebungsrechtecke. Getaggte PDF-Dokumente werden anhand des Strukturbaums in logischer Lesereihenfolge linearisiert; ungetaggte Seiten greifen auf die Renderreihenfolge zurück, sodass sich jedes Dokument vorlesen lässt - Synchronisierte Lese-Hervorhebung auf
TPdfView:SetReadingHighlight,ClearReadingHighlightund die veröffentlichte EigenschaftReadingHighlightColorheben den aktuell vorgelesenen Block über den Such- und Auswahl-Overlays hervor - Neue öffentliche Typen
TPdfContentFragment,TPdfContentFragments,TPdfReadableContent,TPdfContentFragmentKindundTPdfReadingOrderSourcesowie die neue HilfsfunktionClassifyStructType
Version 1.45.0
Hinzugefügt (Hinzugefügt)
ValidatePdfUadurchläuft nun auch den aktiven getaggten Strukturbaum und meldet drei Inhaltsverstöße mit hoher Konfidenz, die eine reine Byte-Analyse nicht erkennen kann: einFigure-Element ohne Alt-Eintrag und ohne ActualText (ISO 14289-1, 7.3), einFormula-Element ohne Alt-Attribut (7.7) sowie einNote-Element ohne eindeutige ID (7.9). Drei neueTPdfUaValidationIssue-Werte machen diese Verstöße sichtbar:pvuaiFigureMissingAlt,pvuaiFormulaMissingAltundpvuaiNoteMissingId. Der Strukturbaum-Durchlauf wird bei ungetaggten Dokumenten übersprungen- Neue öffentliche Hilfsfunktion
ValidatePdfUaStructureElements: Sie wendet die Strukturbaum-Regeln auf eine flache Elementliste an (wie sieTPdf.StructureElementszurückgibt), sodass die Prüfungen unabhängig vom Laden eines vollständigen Dokuments ausgeführt oder per Unit-Test verifiziert werden können
Version 1.44.5
Behoben (Behoben)
- Die
ValidatePdfA-Schrifteinbettungsprüfung (pvaiFontNotEmbedded, ISO 19005-1, 6.3.4) erkennt nun auch nicht eingebettete einfache Schriften ohne/FontDescriptor, insbesondere die 14 Standard-Type-1-Schriften (Helvetica, Times, Courier usw.), für die PDF/A keine Einbettungsausnahme gewährt. Bisher blieben solche Schriften unbemerkt; die Prüfung berücksichtigt nun auch einfache Schrift-Dictionaries (/Type1,/TrueType,/MMType1) bei der Auswertung eingebetteter Schriftprogramme – analog zur PDF/UA-Korrektur in 1.44.3
Version 1.44.4
Behoben (Behoben)
ValidatePdfVTlehnt nun fehlerhafte ISO 16612-2 §6.5 DPart-Bäume ab, bei denen/DPartsein flaches Referenz-Array statt des vorgeschriebenen array of arrays ist oder ein leaf DPart seine/Start-Seite als/Endwiederholt, obwohl der Bereich nur eine Seite enthältValidatePdfVTvalidiert/NodeNameList-Namen nun nach der Expansion von PDF name#xx-Escapes als XML NMTOKEN-Werte. Dadurch werden ungültige Hierarchieebenen-Namen überpvviMissingDPartRootgemeldet, statt als nutzbare DPart-Struktur akzeptiert zu werden
Version 1.44.3
Behoben (Behoben)
- Die
ValidatePdfUa-Schrifteinbettungsprüfung (pvuaiFontNotEmbedded, ISO 14289-1, 7.21.4) erkennt nun auch nicht eingebettete einfache Schriften ohne/FontDescriptor, insbesondere die 14 Standard-Type-1-Schriften (Helvetica, Times, Courier usw.), für die PDF/UA keine Einbettungsausnahme gewährt. Bisher blieben solche Schriften unbemerkt, sodass ein Dokument, das sie verwendete, als konform gemeldet werden konnte; die Prüfung berücksichtigt nun auch einfache Schrift-Dictionaries (/Type1,/TrueType,/MMType1) bei der Auswertung eingebetteter Schriftprogramme
Version 1.44.2
Behoben (Behoben)
ValidatePdfVTbelässt ein vorhandenes, aber nicht erkanntespdfvtid:GTS_PDFVTVersion-Marker nun beipvcUnknown, statt es zupvcNoneherabzustufen. Dadurch bleiben ungültige dateibezogene Zeichenfolgen wiePDF/VT-2svon Dokumenten unterscheidbar, die gar kein PDF/VT-Marker tragen; PDF/VT-2s wird nach ISO 16612-2 Annex A über den MIME stream header identifiziert, nicht über das XMP-Marker einer PDF-Datei- Die
/DPartRoot-Prüfung validiert die tree semantics aus ISO 16612-2 §6.5 nun strenger:/DPartRootNodeund/NodeNameListmüssen die tatsächliche DPart-Tiefe beschreiben, DPart parent links müssen einen Baum bilden,/Startund/DPartsschließen sich gegenseitig aus, und das/DPartjeder Seite muss auf das abdeckende leaf DPart in derselben depth-first-Reihenfolge wie der page tree zeigen
Version 1.44.1
Behoben (Behoben)
SaveAsPdfVTschreibt nun eine minimale Document Part Hierarchy nach ISO 16612-2 §6.5, wenn das Quell-PDF kein verwendbares/DPartRootbesitzt. Der erzeugte Baum verknüpft jede Seite über/DPart, erhält eine bereits gültige Hierarchie und überlässt reichere Empfänger-/DPM-Metadaten dem aufrufenden WorkflowValidatePdfVTprüft nun die verwendbare DPart-Struktur, liest PDF/VT-XMP-Werte sowohl aus RDF-Attributen als auch aus Elementtext und erzwingt die exakte PDF/VT-zu-PDF/X-Basis: PDF/VT-1 erfordert PDF/X-4, während PDF/VT-2 PDF/X-4p, PDF/X-5g oder PDF/X-5pg erfordertTPdfVTSaveOptions.Conformance = pvc2schreibt keine ungültigen einteiligen PDF/VT-2-Marker mehr. Der Einzeldaten-Writer normalisiert die Ausgabe auf PDF/VT-1, weil PDF/VT-2 Dateisatz-Semantik erfordert
Version 1.44.0
Hinzugefügt (Hinzugefügt)
ValidatePdfUameldet nun zusätzlich zu den Dateiformat-Markierungen auch byteprüfbare inhaltliche PDF/UA-Verletzungen: eine Schriftart, deren Schriftprogramm nicht eingebettet ist (ISO 14289-1, 7.21.4), eine Schriftart, der eine/ToUnicode-CMap fehlt, wenn keine befreite Simple-Font-Kodierung vorhanden ist (7.21.7), sowie ein Dokument, das Anmerkungen enthält, aber keine/Tabs /S-Tabulatorreihenfolge für die Seite deklariert (7.18.3)- Drei neue
TPdfUaValidationIssue-Werte —pvuaiFontNotEmbedded,pvuaiFontMissingToUnicodeundpvuaiMissingTabsOrder— werden vonValidatePdfUaund im Preflight-Bericht ausgegeben. Es handelt sich um grobe Heuristiken, die als Preflight-Hinweise gedacht sind und keine vollständige ISO 14289-1-Prüfung ersetzen
Version 1.43.1
Behoben (Behoben)
SaveAsPdfUaerzwingt nun die gemäß ISO 14289-1, 7.1 zwingend erforderlichen Katalogeinträge/ViewerPreferences/DisplayDocTitle truesowie/MarkInfo/Marked true/Suspects false, auch wenn das Quelldokument diese Dictionaries bereits mit fehlenden oder widersprüchlichen Werten enthält. Bisher wurden die Markierungen nur dann eingefügt, wenn die Dictionaries vollständig fehlten; ein Quelldokument, das beispielsweise ein/ViewerPreferencesohneDisplayDocTitleoder ein/MarkInfomit/Marked falseenthielt, erzeugte daher eine nicht konforme Ausgabedatei- Vorhandene Schlüssel in einem bereits vorhandenen
/ViewerPreferences- oder/MarkInfo-Dictionary bleiben erhalten; ein als indirekter Verweis geliefertes Dictionary wird aufgelöst, bevor die zwingend erforderlichen Schlüssel gesetzt werden
Version 1.43.0
Hinzugefügt (Hinzugefügt)
ValidatePdfAwendet nun die PDF/A-2-/PDF/A-3-Regeln für eingebettete und zugeordnete Dateien sowie für Text auf Stufe U an. Eingebettete Dateien werden für PDF/A-1 weiterhin abgelehnt; bei PDF/A-3 wird eine eingebettete Datei beanstandet, der der erforderliche Schlüssel/AFRelationship(ISO 19005-3 Annex E) fehlt, während PDF/A-2-Anhänge zulässig sind (deren eigene Konformität wird nicht rekursiv geprüft). Ein neues ProblempvaiUnicodeMappingMissingmeldet ein PDF/A-2u- oder PDF/A-3u-Dokument, dessen Schriften keine/ToUnicode-Zuordnung tragen (ISO 19005-2 6.2.11.7). Transparenz und Optional Content werden weiterhin nur für PDF/A-1 beanstandet
Version 1.42.0
Hinzugefügt (Hinzugefügt)
- PDF/A-2 (ISO 19005-2) und PDF/A-3 (ISO 19005-3) werden nun auf allen drei Konformitätsstufen — a, b und u — von
SaveAsPdfA,ValidatePdfAund der EigenschaftPdfAConformanceunterstützt. Die AufzählungTPdfAConformanceerhältpac2a,pac2u,pac3aundpac3u(PDF/A-1 hat keine Stufe u). Beim Speichern werden das passendepdfaid:part(2 oder 3) undpdfaid:conformance(A, B oder U) geschrieben, wobei der OutputIntent-SubtypGTS_PDFA1beibehalten wird, den ISO 19005-2 aus Kompatibilitätsgründen weiterhin vorsieht. Eine Anforderung auf Stufe A wird weiterhin auf die passende Stufe B herabgestuft (für jeden Teil), wenn dem Dokument die für diese Stufe erforderliche getaggte Struktur fehlt
Version 1.41.0
Hinzugefügt (Hinzugefügt)
ValidatePdfAerkennt nun zusätzlich zu den bereits gemeldeten strukturellen Markern auch PDF/A-Verstöße auf Inhaltsebene, die durch das Einfügen von Markern nicht behoben werden können: JavaScript und andere verbotene Aktionen, Additional Actions (/AA), eingebettete Dateien,LZWDecode, Transparenz (Soft Masks und Transparency Groups), Optional Content (/OCProperties), verbotene Annotation-Subtypen (FileAttachment, Sound, Movie, 3D, Screen), AcroForm/NeedAppearances trueund/XFA, Schriften, deren Deskriptoren kein eingebettetes Schriftprogramm enthalten, sowie eine Level-A-Angabe ohne die von ISO 19005-1 6.8 geforderte getaggte Struktur. Die Prüfungen auf Transparenz, Optional Content und eingebettete Dateien gelten nur für PDF/A-1 (diese Funktionen sind in PDF/A-2 und PDF/A-3 erlaubt). NeueTPdfAValidationIssue-Werte machen jeden Fall sichtbar; die vorhandenen Werte bleiben unverändert
Version 1.40.3
Behoben (Behoben)
SaveAsPdfAentfernt nun jede Verschlüsselung des Quelldokuments, bevor die PDF/A-Ausgabe erzeugt wird. ISO 19005-1 6.1.3 verbietet den Trailer-Schlüssel/Encrypt, doch der Speicherpfad behielt zuvor den Sicherheits-Handler der Quelle bei, sodass das Speichern eines verschlüsselten Dokuments als PDF/A eine verschlüsselte, nicht konforme Datei erzeugte. Beim PDF/A-Speichern wird das Dokument nun zuerst entschlüsselt. Unverschlüsselte Dokumente sind davon nicht betroffen
Version 1.40.2
Behoben (Behoben)
- Es wurde verhindert, dass
SaveAsPdfAeine falsche Konformitätsangabe für PDF/A Level A ausgibt. Wenn Level A (pac1a) angefordert wird, dem Quelldokument jedoch die von ISO 19005-1 6.8 geforderten Marker der getaggten Struktur fehlen — ein/StructTreeRootim Katalog sowie ein/MarkInfo-Dictionary mit/Marked true—, wird die gespeicherte Datei nun als das passende Level B (pdfaid:conformance=B) gekennzeichnet, statt Level A zu behaupten. Rein visuelle PDF/A-1b-Ausgabe ist davon nicht betroffen
Version 1.40.1
Behoben (Behoben)
- Die Prüfung der PDF-Versionskonformität wurde verschärft, sodass die Aktion
SetOCGState(set-optional-content-group-state) als PDF-1.5-Funktion erkannt wird. Das Speichern in ein Ziel der Version PDF 1.2, 1.3 oder 1.4, das eineSetOCGState-Aktion enthält, wird nun in Übereinstimmung mit ISO 32000-1 (Table 198) zurückgewiesen; zuvor konnte eine solche Aktion in eine Ausgabe niedrigerer Version durchgereicht werden. Die davon verschiedene, veraltete PDF-1.2-AktionSetStatewird weiterhin ab PDF 1.2 akzeptiert
Version 1.40.0
Hinzugefügt (Hinzugefügt)
- Die Upstream-API
FPDFPageObj_AddExistingMark()wurde angebunden; sie fügt einem Seitenobjekt eine vorhandene Inhaltsmarkierung hinzu. Wenn aufeinanderfolgende Seitenobjekte dieselbe Markierung teilen, fasst das gespeicherte PDF sie zu einer einzigen, alle umfassenden Markierung zusammen; nicht aufeinanderfolgende Objekte erhalten separate Kopien - Die Upstream-API
FPDFTextObj_SetFontSize()wurde angebunden, um die Punktgröße eines vorhandenen Textobjekts zu ändern, als Ergänzung zur bereits vorhandenen Anbindung vonFPDFTextObj_GetFontSize()
Geändert (Geändert)
- Die mitgelieferten PDFium-Laufzeit-DLLs (Win32 und Win64, Standard- und V8-Builds) wurden auf den Upstream-Snapshot vom 2026-06-02 aktualisiert
Version 1.39.53
Geändert (Geändert)
- Die Delphi-Beispiele
PDFViewer,SplitViewundMultiPageVieweröffnen Dokumente jetzt standardmäßig im ModusZoom to Page - Die erste Darstellung passt jetzt die gesamte Seite in den Anzeigebereich ein, bevor der Benutzer eine manuelle Zoomstufe auswählt
TPdf.AboutInfo, Lazarus-Paketmetadaten und Installationsprogramm-Versionsmetadaten wurden auf 1.39.53 aktualisiert
Version 1.39.52
Geändert (Geändert)
Demo\Lazarus\CreatePDFwurde erweitert, sodass das Einstiegssample jetzt eine zweiseitige PDF mit vector paths, table content, embedded image, text annotation, rotated text und einem klareren document-building walkthrough erzeugt- Für alle Delphi-, C++Builder- und Lazarus-Demoordner wurden ansprechendere
README.html-Seiten ergänzt; das verbleibende reine Text-README der Demo wurde durch eine browserlesbare Anleitung ersetzt TPdf.AboutInfo, Lazarus-Paketmetadaten und Installer-Versionsmetadaten wurden auf 1.39.52 aktualisiert
Version 1.39.51
- Die Batch-Zusammenfassungen von
Demo\Delphi\PreflightReportCliwurden um Standardstatus-Summen für Pass, Action required und Review über die ausgewählten Standards erweitert - Zeilen pro Datei enthalten jetzt Action-required- und Review-Zähler in TXT / HTML / JSON / CSV-Zusammenfassungen, sodass CI-Artefakte leichter geprüft werden können, ohne jeden erzeugten Bericht zu öffnen
TPdf.AboutInfo, Lazarus-Paketmetadaten und Installer-Versionsmetadaten wurden auf 1.39.51 aktualisiert
Version 1.39.50
- Der Verzeichnis-Batch-Modus von
Demo\Delphi\PreflightReportCliwurde erweitert:batchdir=foldersammelt gefundene PDF-Pfade, sortiert sie und erzeugt Berichte anschließend in stabiler Reihenfolge - Rekursive Verzeichnisscans erzeugen jetzt reproduzierbare Berichtsreihenfolgen und Zusammenfassungszeilen, während explizite
batch=list.txt-Verarbeitung weiterhin die Reihenfolge der Listendatei beibehält TPdf.AboutInfo, Lazarus-Paketmetadaten und Installer-Versionsmetadaten wurden auf 1.39.50 aktualisiert
Version 1.39.49
- Die Batch-Zusammenfassungen von
Demo\Delphi\PreflightReportCliwurden erweitert und protokollieren jetzt run settings: Quelltyp, Quellpfad, rekursiven Zustand, Ausgabeverzeichnis, Berichtsformat, ausgewählte Standards undfailon=-Modus - JSON-Zusammenfassungen enthalten jetzt ein
run-Objekt, TXT- und HTML-Zusammenfassungen zeigen einen Abschnitt für run settings, und CSV-Zeilen wiederholen dieselben Audit-Spalten für Tabellenkalkulationen und CI pipelines TPdf.AboutInfo, Lazarus-Paketmetadaten und Installer-Versionsmetadaten wurden auf 1.39.49 aktualisiert
Version 1.39.48
- Das batch output naming von
Demo\Delphi\PreflightReportCliwurde verbessert, sodass duplicate input file names mit demselbenoutdir=ihre generated reports nicht mehr gegenseitig ueberschreiben - Batch runs haengen jetzt
-2,-3und weitere Suffixe an, wenn ein generated report path in derselben Ausfuehrung bereits vergeben wurde, und summaries protokollieren den finalen collision-safe report path TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.48 aktualisiert
Version 1.39.47
- Die batch summaries von
Demo\Delphi\PreflightReportCliwurden erweitert, sodass TXT- und JSON-Ausgaben jetzt aggregate totals fuer total files, processed files, failed files, issues undfailon=matches enthalten - CSV summaries bleiben fuer bestehende consumers eine reine row table, waehrend HTML summaries dieselben aggregate metrics weiter im dashboard header anzeigen
TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.47 aktualisiert
Version 1.39.46
Demo\Delphi\PreflightReportCliwurde umsummary=batch.html/.htmerweitert, damit batch runs neben TXT / CSV / JSON manifests ein browser-readable dashboard ausgeben koennen- HTML summaries zeigen total-, processed-, failed-, issue- und
failon=match metrics und listen danach jeden input mit report links, status, counts und error text auf TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.46 aktualisiert
Version 1.39.45
Demo\Delphi\PreflightReportCliwurde umbatchdir=folderundrecursiveerweitert, damit Skripte PDF folders direkt scannen koennen, ohne zuerst ein list file zu schreiben- Directory batch mode verwendet das Verhalten von
outdir=,summary=,standards=undfailon=aus list-based batch mode wieder; non-recursive scannt nur die ausgewaehlte folder, undrecursiveschliesst subfolders ein TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.45 aktualisiert
Version 1.39.44
Demo\Delphi\PreflightReportCliwurde umsummary=batch.csv|json|txterweitert, damit batch runs neben den per-file reports ein machine-readable manifest ausgeben können- Batch summaries enthalten jeden input path, report path, status, standard count, passed count, issue count,
failon=match state und error text für CI jobs und externe scripts TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.44 aktualisiert
Version 1.39.43
Demo\Delphi\PreflightReportCliwurde umbatch=list.txtundoutdir=reportserweitert, damit scripts in einem Lauf preflight reports für eine Liste von PDF files erzeugen können- Batch mode überspringt leere Zeilen und
#-Kommentarzeilen, leitet jeden.preflight.<ext>report name aus dem Eingabe-PDF ab, fährt nach per-file errors fort und fasst processed und failed files vor der Rückgabe zusammen TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.43 aktualisiert
Version 1.39.42
Demo\Delphi\PreflightReportCliwurde umfailon=none|issues|action|reviewerweitert, damit CI jobs erzeugte preflight results in deterministische exit codes umsetzen können- Die CLI gibt jetzt exit code 2 zurück, wenn eine ausgewählte
failon=rule nach dem Erzeugen der report file und der optional attached-report PDF zutrifft; runtime errors geben weiterhin exit code 1 zurück TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.42 aktualisiert
Version 1.39.41
Demo\Delphi\PreflightReportCliwurde umattach=output.pdferweitert, sodass ein erzeugter preflight report als document-level attachment in eine neue PDF copy eingebettet werden kann- Die CLI behält die erzeugte TXT / HTML / Markdown / JSON / CSV report file auf dem Datenträger und verweigert das Anhängen an den ursprünglichen input PDF path, um versehentliches Überschreiben zu vermeiden
TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.41 aktualisiert
Version 1.39.40
Demo\Delphi\PreflightReportCliwurde hinzugefügt, ein Delphi console companion für scriptableFPdfPreflightReport-Erstellung ohne Öffnen eines viewer- Die CLI unterstützt no-argument sample creation sowie input / output arguments, optional password, die Ausgabeformate
text/html/md/json/csvundstandards=filtering für PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R und PDF/VT TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.40 aktualisiert
Version 1.39.39
FPdfPreflightReportwurde umTPdfPreflightReport.ToMarkdownundSaveMarkdownToFileerweitert, damit preflight reports als fuer issue tracker geeignetes Markdown exportiert werden koennen- Die Delphi-, C++Builder- und Lazarus-Beispiele
PreflightReportwurden um Markdown preview switching und Save MD actions neben dem bestehenden TXT / HTML / JSON / CSV workflow erweitert TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden aktualisiert, um 1.39.39 zu melden
Version 1.39.38
- Die Delphi-, C++Builder- und Lazarus-Beispiele
SecurityAuditwurden um JSON audit report export neben dem bestehenden TXT save / copy workflow erweitert - Der JSON report enthält
format,generatedAt,summary,findingCountsowie strukturiertefindings-Zeilen mit severity-, area- und detail-Feldern TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden aktualisiert, um 1.39.38 zu melden
Version 1.39.37
FPdfPreflightReportwurde umTPdfPreflightReport.ToCsvundSaveCsvToFileerweitert, sodass preflight reports als spreadsheet-friendly CSV exportiert werden können- Die Delphi-, C++Builder- und Lazarus-
PreflightReport-samples wurden um CSV preview switching und Save CSV actions neben dem vorhandenen TXT / HTML / JSON workflow erweitert TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden aktualisiert, um 1.39.37 zu melden
Version 1.39.36
FPdfPreflightReportwurde umTPdfPreflightReport.IssueCategoryCountssowie die wiederverwendbaren TypenTPdfPreflightIssueCategoryCountundTPdfPreflightIssueCategoryCountserweitert, um marker-level issues nach category zu aggregierenTPdfPreflightReport.ToText,ToHtmlundToJsonwurden aktualisiert, sodass generierte PreflightReport-Ausgaben issue-category count summaries neben per-standard rows und detailed issue recommendations enthaltenTPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.36 aktualisiert
Version 1.39.35
- Das erweiterte
PrintDialogsample wurde in Delphi, C++Builder und Lazarus inPrintPreferencesumbenannt, sodass der demo name jetzt zum Workflow für PDF author print preferences, N-up printing, odd / even filtering, grayscale, cell border und duplex mapping passt TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.35 aktualisiert
Version 1.39.34
Demo\Delphi\PrintPDFwurde um PDF-Laden per Drag-and-drop erweitert, und der vorhandeneDemo\CBuilder\PrintPDFworkflow wurde zusammen mit den PrintPDF-Beispielen für Delphi und Lazarus dokumentiertTPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden aktualisiert, sodass 1.39.34 gemeldet wird
Version 1.39.33
Demo\CBuilder\SplitViewwurde hinzugefügt und vervollständigt die SplitView sample matrix für Delphi, C++Builder und LazarusTPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden aktualisiert, damit sie 1.39.33 melden
Version 1.39.32
Demo\Lazarus\SplitViewwurde hinzugefügt und bringt side-by-side PDF comparison mit two- or three-pane layouts, active-view navigation, synchronized commands, zoom presets und rotation nach LazarusTPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden aktualisiert, damit sie 1.39.32 melden
Version 1.39.31
Demo\Lazarus\PrintPDFwurde hinzugefügt und bringt den standard PDF print workflow mit preview navigation, page ranges, copies, collate mode, progress und cancellation nach LazarusTPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden aktualisiert, damit sie 1.39.31 melden
Version 1.39.30
Demo\Lazarus\FontPropertieswurde hinzugefügt und vervollständigt die FontProperties-Beispielmatrix über Delphi, C++Builder und LazarusTPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden aktualisiert, sodass 1.39.30 gemeldet wird
Version 1.39.29
Demo\CBuilder\FontPropertieswurde hinzugefügt und bringt die Prüfung indexierter Zeichen- und Schriftmetadaten neben dem Delphi-Beispiel auch zu C++BuilderTPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden aktualisiert, sodass 1.39.29 gemeldet wird
Version 1.39.28
Demo\Delphi\ExtractTextPageswurde hinzugefügt und vervollständigt die Beispielmatrix für die seitenweise Textextraktion über Delphi, C++Builder und LazarusTPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden aktualisiert, sodass 1.39.28 gemeldet wird
Version 1.39.27
Demo\Lazarus\PrintDialogwurde hinzugefügt und vervollständigt den PrintDialog sample matrix für Delphi, C++Builder und LazarusTPdf.AboutInfo, Lazarus package metadata und installer version metadata melden jetzt 1.39.27
Version 1.39.26
Demo\CBuilder\PrintDialogwurde hinzugefügt, sodass der N-up printing und PDF author print preferences workflow neben dem Delphi sample auch C++Builder abdecktTPdf.AboutInfo, Lazarus package metadata und installer version metadata melden jetzt 1.39.26
Version 1.39.25
Demo\CBuilder\ViewerInteractionLabwurde hinzugefügt und vervollständigt den ViewerInteractionLab sample matrix für Delphi, C++Builder und Lazarus- Library build workflow und Win64 C++Builder package outputs wurden aktualisiert, damit
TPdfViewviewer interaction methods in Win64 demos korrekt linken TPdf.AboutInfo, Lazarus package metadata und installer version metadata melden jetzt 1.39.25
Version 1.39.24
Demo\Lazarus\ViewerInteractionLabwurde hinzugefügt, sodass der focused viewer interaction workflow neben dem Delphi sample auch Lazarus abdecktTPdf.AboutInfo, Lazarus package metadata und installer version metadata melden jetzt 1.39.24
Version 1.39.23
Demo\Lazarus\SearchAndSelectwurde hinzugefügt und vervollständigt die SearchAndSelect sample matrix für Delphi, C++Builder und LazarusTPdf.AboutInfo, Lazarus package metadata und installer version metadata melden jetzt 1.39.23
Version 1.39.22
Demo\CBuilder\ContentExtractionLabundDemo\Lazarus\ContentExtractionLabwurden hinzugefügt, sodass der multi-category content extraction workflow alle unterstützten demo IDEs abdecktTPdf.AboutInfo, Lazarus package metadata und installer version metadata melden jetzt 1.39.22
Version 1.39.21
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportundDemo\CBuilder\PreflightReportum einen preview format selector erweitert, damit Benutzer text oder JSON output vor dem Speichern prüfen könnenTPdf.AboutInfo, Lazarus package metadata und installer version metadata melden jetzt 1.39.21
Version 1.39.20
- JSON-Export für
FPdfPreflightReportüberTPdfPreflightReport.ToJsonundSaveJsonToFilehinzugefügt, mit maschinenlesbarer summary, per-standard status / priority, next action und issue detail Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportundDemo\CBuilder\PreflightReportum Save JSON Aktionen neben dem TXT / HTML Export erweitertTPdf.AboutInfo, Lazarus package metadata und installer version metadata melden jetzt 1.39.20
Version 1.39.19
FPdfPreflightReportwurde umTPdfPreflightStatus, issue categories, per-standard priority und next-action guidance in TXT / HTML reports erweitertDemo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportundDemo\CBuilder\PreflightReportzeigen jetzt status, priority, issue count und next action in der summary gridTPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.19 aktualisiert
Version 1.39.18
Demo\Lazarus\SecurityAuditwurde hinzugefügt und vervollständigt die Delphi-, C++Builder- und Lazarus-Beispielmatrix für den read-only PDF risk-surface audit workflow- Das Lazarus-Beispiel listet permissions, attachments, JavaScript actions, URI / Launch link annotations, web links, signatures, XFA state, V8 / XFA helper availability und unsupported-feature callbacks auf und speichert oder kopiert die finding list als TXT report
TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.18 aktualisiert
Version 1.39.17
Demo\CBuilder\SecurityAuditwurde hinzugefügt und bringt den read-only PDF risk-surface audit workflow neben dem vorhandenen Delphi-Beispiel zu C++Builder- Das C++Builder-Beispiel listet permissions, attachments, JavaScript actions, URI / Launch link annotations, web links, signatures, XFA state, V8 / XFA helper availability und unsupported-feature callbacks auf und speichert oder kopiert die finding list als TXT report
TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.17 aktualisiert
Version 1.39.16
Demo\CBuilder\SearchAndSelectwurde hinzugefügt und bringt den eigenständigen SearchAndSelect viewer workflow neben dem vorhandenen Delphi-Beispiel zu C++Builder- Das C++Builder-Beispiel erstellt oder öffnet PDFs, listet seitenübergreifende matches mit page / character-index previews, unterstützt Previous / Next und double-click navigation und hebt aktuelle Seitentreffer mit
HighlightSearchTexthervor - Es zeigt außerdem
AllowUserTextSelection,SelectedText,SelectAll,CopySelectionToClipboard,ClearSelection,OnSelectionChangeund spreadDisplayMode-Optionen; Versionsmetadaten melden jetzt 1.39.16
Version 1.39.15
Demo\CBuilder\WatermarkStampwurde hinzugefügt und vervollständigt die Delphi-, Lazarus- und C++Builder-demo matrix für wiederverwendbare Form XObject watermark und stamp workflows- Das C++Builder-Beispiel erstellt target- und stamp-PDFs, verwendet die stamp page über
CreateXObjectFromPagewieder, wendetTPdfMatrixtransforms an und speichert centered watermarks, corner stamps und page number labels TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden aktualisiert, damit sie 1.39.15 melden
Version 1.39.14
Demo\Lazarus\WatermarkStampwurde hinzugefügt und bringt den wiederverwendbaren Form XObject watermark und stamp workflow nach Lazarus- Das Lazarus-Beispiel erstellt target- und stamp-PDFs, verwendet die stamp page über
CreateXObjectFromPagewieder, wendetTPdfMatrixtransforms an und speichert centered watermarks, corner stamps und page number labels TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden aktualisiert, damit sie 1.39.14 melden
Version 1.39.13
Demo\CBuilder\PreflightReportwurde hinzugefügt und vervollständigt die Delphi-, Lazarus- und C++Builder-Demomatrix für den wiederverwendbarenFPdfPreflightReportworkflow- Das C++Builder-Beispiel verwendet
FPdfPreflightReport.hpp, um standard summaries, TXT report previews, TXT / HTML report files und Open Last Report-Verhalten zu erzeugen TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden aktualisiert, damit sie 1.39.13 melden
Version 1.39.12
Demo\Lazarus\PreflightReportwurde hinzugefügt und bringt den PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R und PDF/VT preflight report workflow zu Lazarus- Das Lazarus-Beispiel kann ein PDF öffnen oder erstellen, target standards auswählen, summary rows und TXT report output anzeigen, TXT / HTML reports speichern und den zuletzt gespeicherten report öffnen
TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden aktualisiert, damit sie 1.39.12 melden
Version 1.39.11
Demo\Delphi\SearchAndSelectwurde um eine Suchergebnisliste über alle Seiten erweitert, die page number, character index und preview text erfasst- Previous / Next match navigation und double-click result jumping wurden ergänzt, während das Verhalten von
HighlightSearchTextauf der aktuellen Seite erhalten bleibt TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden aktualisiert, damit sie 1.39.11 melden
Version 1.39.10
Demo\Delphi\SecurityAuditwurde um Save Report und Copy Report actions erweitert, die den aktuellen summary und die finding rows als TXT audit report exportieren- Das demo löscht jetzt den report export state, wenn das audit panel zurückgesetzt wird, damit kopierte oder gespeicherte reports den sichtbaren findings entsprechen
TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.10 aktualisiert
Version 1.39.9
Demo\Delphi\ContentExtractionLabwurde um source-PDF save, report copy-to-clipboard und all / none category selection actions erweitert- Das demo invalidiert jetzt den aktuellen report, wenn sich category selection ändert, damit TXT / JSON exports dem sichtbaren extraction scope entsprechen
TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.9 aktualisiert
Version 1.39.8
Demo\Delphi\ContentExtractionLabwurde hinzugefügt, ein einheitliches content extraction workflow sample für document metadata, page text, page objects, images, attachments, links, annotations, bookmarks und font / character metrics- Das Beispiel kann ein vorhandenes PDF öffnen oder ein synthetic PDF mit text, image, attachment und annotation Inhalt erzeugen und anschließend summary rows sowie detaillierte TXT / JSON reports generieren
TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.8 aktualisiert
Version 1.39.7
Lib\FPdfPreflightReport.paswurde hinzugefügt, ein wiederverwendbarer report helper, derValidatePdfA,ValidatePdfUa,ValidatePdfE,ValidatePdfX,ValidatePdfRundValidatePdfVTin einTPdfPreflightReport-Objekt zusammenführtDemo\Delphi\PreflightReportwurde als workflow sample hinzugefügt: PDF öffnen oder erstellen, target standards auswählen, summary rows und issue recommendations anzeigen sowie TXT- oder HTML-Berichte speichern- Die erzeugten Berichte beschreiben ausdrücklich die Grenze der eingebauten marker-level validation, damit Anwendungen bei Bedarf dedizierte content-level preflight tools ergänzen können
TPdf.AboutInfo, Lazarus package metadata, package project lists und installer version metadata wurden auf 1.39.7 aktualisiert
Version 1.39.6
Demo\Delphi\SearchAndSelectwurde hinzugefügt, ein fokussiertes viewer workflow Beispiel für search highlighting, text selection, selected-text preview, copy, clear und spread display modes- Das Beispiel demonstriert
HighlightSearchText, match-case / whole-word Suchoptionen,AllowUserTextSelection,SelectedText,SelectAll,CopySelectionToClipboardundClearSelection, ohne neue Library API hinzuzufügen TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.6 aktualisiert
Version 1.39.5
Demo\Delphi\ViewerInteractionLabwurde zu einem SearchAndSelect-artigen viewer UX Beispiel mitHighlightSearchText, match-case / whole-word Optionen, Vorschau des ausgewählten Textes und vorhandenen selection / clipboard controls erweitertDemo\Delphi\PrintDialogwurde erweitert, um PDF author print preferences zu prüfen:PrintCopies,PrintPageRanges,PrintScaling,PrintPaperHandlingund sichtbaresSetPdfPrintPaperHandlingDevModeduplex mappingDemo\Delphi\SecurityAuditwurde hinzugefügt, ein schreibgeschütztes risk-surface Beispiel, das permissions, attachments, document JavaScript, URI / Launch links, web links, signatures, XFA state und V8 / XFA helper availability auflistetTPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.5 aktualisiert
Version 1.39.4
Demo\CBuilder\ImageToPDFundDemo\Lazarus\ImageToPDFwurden hinzugefügt und vervollständigen die ImageToPDF-Beispielmatrix für Delphi, C++Builder und Lazarus- Die neuen Beispiele demonstrieren Mehrfachauswahl von Bildern, Vorschau des ausgewählten Bildes, eine PDF-Seite pro Bild, A4 portrait / landscape-Seitengröße, zentrierte Bildskalierung, Fortschritt pro Bild und das Öffnen des erzeugten PDF nach dem Speichern
TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.4 aktualisiert
Version 1.39.3
Demo\CBuilder\BatchExportwurde hinzugefügt und bringt den Multi-File-PDF-zu-JPG-Export-Workflow zu C++Builder, neben den vorhandenen Delphi- und Lazarus-Beispielen- Das Beispiel demonstriert
LoadCustomDocument,IPdfCancellationTokenSource, Streaming-Eingabe überTFileStream, Fortschritt pro Datei und pro Seite, Abbruchbehandlung, DPI / quality / password-Eingaben und das Öffnen des Ausgabeordners nach Abschluss TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.3 aktualisiert
Version 1.39.2
Demo\Delphi\WatermarkStampwurde hinzugefügt, ein ausführbares Form XObject Workflow-Beispiel, das ein Ziel-PDF und ein wiederverwendbares stamp PDF erstellt und danach zentrierte Wasserzeichen, Stempel oben rechts und Seitenzahl-Labels auf jede Seite anwendet- Das Beispiel demonstriert
CreateXObjectFromPage,InsertFormObjectFromXObject,TPdfMatrixundFPDFPageObj_SetMatrix, ohne neue Bibliotheks-API hinzuzufügen Docs\en-us\Examples.htmlwurde aktualisiert, um beim Übergeben von Matrizen das aktuelle MusterTPdfMatrix.Handlefür Aufrufe vonFPDFPageObj_SetMatrixzu verwendenTPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.2 aktualisiert
Version 1.39.1
Demo\Delphi\ViewerInteractionLabwurde hinzugefügt, ein fokussiertesTPdfView-Beispiel für display modes, fit modes, page colors, rotation, user text selection, clipboard actions undDeviceToPage-KoordinatenfeedbackDemo\CBuilder\StandardsLab/Demo\Lazarus\StandardsLabwurde hinzugefügt, damit Lazarus-Benutzer den Validierungs- und marker-output-Workflow für PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R und PDF/VT ausführen können- Die standards units wurden in
Lib\37.0\PDFiumPas.dprojundLib\FPC\PDFiumLaz.lpkaufgeführt, und der Build des Delphi-DemosSplitViewwurde durch Entfernen eines doppeltenWinapi.ShellAPI-Imports korrigiert - Batch-build-Blocker der Delphi-Demos in
BatchExport,PDFViewer,MultiPageViewerundSplitViewwurden behoben, ohne ihr Laufzeitverhalten zu ändern - Die Batch-build-Kompatibilität der C++Builder-Demos
PDFViewerundMultiPageViewerwurde korrigiert, indemnullptrfür den aktuellen project mode durchNULLersetzt wurde TPdf.AboutInfo, Lazarus package metadata und installer version metadata wurden auf 1.39.1 aktualisiert
Version 1.39.0
Demo\Delphi\StandardsLabwurde hinzugefügt, ein ausführbares Standards-Workflow-Beispiel, das ein PDF lädt oder erstellt,ValidatePdfA,ValidatePdfUa,ValidatePdfE,ValidatePdfX,ValidatePdfRundValidatePdfVTausführt und erkannte conformance, Bestehensstatus und issue-Zahlen in einer Tabelle zeigt- Die Speichern-Schaltflächen in StandardsLab rufen
SaveAsPdfA,SaveAsPdfUa,SaveAsPdfE,SaveAsPdfX,SaveAsPdfRundSaveAsPdfVTauf, sodass die PDF-Standards-marker-Ausgabe ohne eigenes Testprogramm sichtbar wird TPdf.AboutInfo, Lazarus-Paketmetadaten und Installer-Versionsmetadaten wurden auf 1.39.0 aktualisiert
Version 1.38.0
- Such- und Textauswahl-Overlays in
TPdfViewverwenden jetzt echtes alpha blending statt logischer mask-Zeichnung, sodass Seiteninhalt unter Hervorhebungen erhalten bleibt SetPdfPrintPaperHandlingDevModehinzugefügt, umTPrintPaperHandlingauf Windows-DEVMODE.dmDuplex-Werte abzubilden:DMDUP_SIMPLEX,DMDUP_HORIZONTALundDMDUP_VERTICALTPdfView.SmoothScrollanimiert line/page scrollbar commands jetzt in timer-driven segments; thumb tracking bleibt unmittelbarTPdf.AboutInfound Installer-Versionsmetadaten auf 1.38.0 aktualisiert
Version 1.37.0
TPdfbesitzt jetzt eine Render-Sperre pro Instanz, dieRenderPage,RenderTile,RenderPageProgressive, Seiten-Reload und Dokument-Unload serialisiert. Worker-Rendering über eine gemeinsame Komponente ist damit praktikabel; die Anwendung koordiniert weiterhin Dokumentänderungen und Lebensdauer- Der zero-copy-Bitmap-Wrapper weist bottom-up
TBitmap-DIBs nun zurück und fällt auf einen PDFium-eigenen Buffer mit abschließender Kopie zurück, wodurch stride corruption / access violation in VCL-Render-Tests beseitigt werden TPdfView-Auswahl präzisiert:AllowUserTextSelectionsperrt nur Benutzereingaben, code-level Auswahl-APIs zeichnen weiterhin, undSelectAllfolgt dem tatsächlich sichtbaren spread, sodass die Cover-Seite nicht mehr Seite 2 auswählt. Delphi-, Lazarus- und C++Builder-Tests wurden erweitertTPdf.AboutInfound Installer-Versionsmetadaten auf 1.37.0 aktualisiert
Version 1.36.0
- Die Endbenutzer-Textauswahl in
TPdfViewist jetzt aktiviert; die in v1.17.0 reservierte EigenschaftAllowUserTextSelectionsteuert nun eine vollständige Drag-Select-Pipeline. Ein Linksklick auf ein Textzeichen wechselt in den Auswahlmodus, ein Linksklick auf leeren Raum schwenkt wie bisher weiter. Das Form-Fill-Widget behält Vorrang, sodass ein Klick auf ein Formularfeld weiterhin das Feld fokussiert, statt eine Auswahl zu starten - Ein Doppelklick wählt das Wort, ein Dreifachklick die Zeile,
Ctrl+Awählt die aktuelle Seite aus, in spread display modes beide Seiten, undCtrl+Ckopiert die Auswahl alsCF_UNICODETEXTin die Windows-Zwischenablage Shift+Left/Shift+Righterweitert die Auswahl zeichenweise, auch auf die Nachbarseite im spread mode;Shift+Home/Shift+Enderweitert bis zum sichtbaren Zeilenrand und verwendet die Box-Höhe des Seed-Zeichens als Toleranz für die Zeilenclusterung, sodass Zeilen mit gemischten Schriftgrößen korrekt zusammenbleiben- Beim Überfahren von Text wechselt der Cursor zu
crIBeam, außerhalb von Text wird der Standardcursor wiederhergestellt. Während eines Textauswahl-Drags scrollt ein Ziehen in eine 20-Pixel-Totzone an einer Viewer-Kante die Seite automatisch weiter, Takt 50 ms und 16 px je Takt, begrenzt auf dieselben Grenzen wie der Pan-Pfad, sodass die Auswahl ohne vorheriges Loslassen der Maus über den aktuellen Viewport hinaus erweitert werden kann - Seitenübergreifende Auswahl funktioniert in spread display modes,
dmTwoPageContinuousunddmTwoPageContinuousWithCover; ein Drag, der auf der linken Seite beginnt und auf der rechten endet, wählt den zusammenhängenden Bereich über beide Seiten hinweg aus.SelectedTextverbindet die seitenweisen Ausschnitte mit CR/LF, sodass der zurückgewonnene Text wie normaler mehrzeiliger Inhalt gelesen werden kann - Neue published property
SelectionColor, StandardwertclHighlight, die Windows-Systemfarbe für Auswahl, unabhängig vonHighlightColor, das Suchtreffer gelb einfärbt. Suchhervorhebungen und eine laufende Drag-Auswahl können gleichzeitig ohne Farbkonflikt angezeigt werden - Neues published event
OnSelectionChangewird immer dann ausgelöst, wenn sich die materialisierten Bereiche der Auswahl tatsächlich ändern, niemals bei identischer erneuter Anwendung, sodass Host-Anwendungen es ohne Debouncing direkt an Statusleisten-Text oder Button-Enabled-State binden können - Neue public API auf
TPdfView:HasSelection,SelectionCharCount,SelectedText,ClearSelection,SelectAll,CopySelectionToClipboard. Das sind Einstiegspunkte auf Code-Ebene und sie funktionieren immer unabhängig vonAllowUserTextSelection; der Schalter sperrt nur Benutzereingaben, sodass Kiosk-Hosts benutzergesteuerte Auswahl deaktivieren und trotzdem Toolbar-Schaltflächen wie Select All oder Copy über dieselbe API ansteuern können - Ein Standard-Kontextmenü mit Rechtsklick für
Copy/复制wird automatisch angehängt, wenn der Host kein eigenesPopupMenuzugewiesen hat; der übliche Ablauf Auswahl markieren, Rechtsklick, Kopieren funktioniert damit sofort. Die Beschriftung wird anhand vonSysLocale.PriLangIDzwischen Englisch und Chinesisch gewählt; Hosts mit voller Lokalisierung oder erweitertem Menü weisen einfach ihr eigenesPopupMenuzu, dann wird das Standardmenü unterdrückt - Die Auswahl wird bei Übergängen über
SetPdf,SetPageNumber,SetActive(False)undDisplayModeautomatisch gelöscht;OnSelectionChangewird dabei genau einmal ausgelöst, wenn die vorherige Auswahl nicht leer war. Das Form-Fill-Subsystem behält Vorrang; während ein Formularfeld bearbeitet wird, werden alle Auswahl-Tastenkürzel zurückgestellt, sodass das FeldCtrl+C/Ctrl+A/Shift+arrowsfür seine eigene Auswahl erhält - Die Regressionssuiten für Delphi und Lazarus wurden auf jeweils 202 Fälle und die C++Builder-Suite auf 159 Fälle erweitert; abgedeckt sind Standardwerte, Round-Trip, Verhalten der public API, Löschung bei Zustandswechseln, Maus-Drag auf Text oder Leerraum, Klick versus Drag, Wechsel des IBeam-Cursors, Doppelklick-Wort, Dreifachklick-Zeile, Tastenkürzel, Standard-Popup mit Attach / Defer / Caption sowie seitenübergreifende Auswahl im spread, einschließlich einer CR/LF-Round-Trip-Prüfung der Zwischenablage
Version 1.35.0
- PDF/VT-Marker-Injektion (ISO 16612-2:2010) hinzugefügt: TPdf.SaveAsPdfVT erhebt das aktuelle Dokument zu einer PDF/VT-1- oder PDF/VT-2-konformen Datei, dem PDF-Subset für variable und transaktionale Druckaufgaben. PDF/VT baut auf PDF/X-4 auf, ISO 16612-2 §6.2.1 verlangt daher, dass jede PDF/VT-1-Datei auch PDF/X-4 entspricht, also schreibt der Injektor zusammen mit den PDF/VT-spezifischen Eigenschaften den vollständigen PDF/X-4-Marker-Satz mit XMP
pdfxid:GTS_PDFXVersion = "PDF/X-4", Info/GTS_PDFXVersion (PDF/X-4)und/Trappedsowie Katalog-/OutputIntentsmit Verweis auf ein OutputIntent-Dictionary mit eingebettetem ICC-Profil - Die PDF/VT-spezifische Injektion umfasst XMP
pdfvtid:GTS_PDFVTVersion, gleich "PDF/VT-1" oder "PDF/VT-2" nach §6.3 Table 2, undpdfvtid:GTS_PDFVTModDate, synchron gehalten mitxmp:ModifyDatenach §6.3 NOTE 1, sowie eine pdfaExtension:schemas-Beschreibung, die beide pdfxid- und pdfvtid-Namespaces mit den NPES-URIshttp://www.npes.org/pdfx/ns/id/undhttp://www.npes.org/pdfvt/ns/id/deklariert. Der Trailer trägt ein/ID-Array - TPdf.SaveAsPdfVTToStream für PDF/VT-Ausgabe im Speicher und Kurzform
TPdf.SaveAsPdfVT(FileName)hinzugefügt; erzeugt PDF/VT-1 mit dem gebündelten sRGB IEC61966-2.1 OutputIntent, 3144 Bytes und dasselbe Profil wie SaveAsPdfA / SaveAsPdfX, sowie/Trapped /False - TPdf.ValidatePdfVT hinzugefügt: prüft ein offenes PDF auf PDF/VT-Konformitätsmarker, darunter XMP
pdfvtid:GTS_PDFVTVersionundGTS_PDFVTModDate, die Gleichheit vonpdfvtid:GTS_PDFVTModDateundxmp:ModifyDate, das zugrunde liegendepdfxid:GTS_PDFXVersion-Kennzeichen, Katalog-/DPartRootnach §6.5,/OutputIntentsmit/DestOutputProfilesowie das Vorhandensein vonxmp:CreateDate/ModifyDate, und liefert TPdfVTValidationResult mit erkanntem Konformitätslevel und den gefundenen Problemen - Eigenschaft TPdf.PdfVTConformance hinzugefügt: liefert das Level ohne expliziten ValidatePdfVT-Aufruf
- Neue Typen, exportiert in der neuen Unit FPdfPdfvt: TPdfVTConformance, TPdfVTTrappedState, TPdfVTValidationResult, TPdfVTValidationIssue, TPdfVTSaveOptions
- Die Document Part Hierarchy, also der
DPartRoot- /DPart-Baum nach §6.5, ist eine Struktur auf Anwendungsebene und hängt von der Empfänger- und Seitenbereichszuordnung des Variable-Data-Print-Workflows ab. SaveAsPdfVT synthetisiert keinen DPart-Baum; ValidatePdfVT meldet ein fehlendes/DPartRootalspvviMissingDPartRoot, damit Aufrufer PDF/VT-Dateien durch einen separaten DPart-Aufbauschritt leiten können. Inhaltsseitige PDF/X-4-Anforderungen wie Schrifteinbettung, Transparenz, ICC-Farbmanagement und OPI- / JavaScript- / Reference-XObject-Verbote bleiben in der Verantwortung des Dokumentautors und der PDFium-Rendering-Pipeline - TPdf.AboutInfo-Zeichenkette aktualisiert, um die aktuelle Produktversion zu melden
Version 1.34.0
- PDF/R-1-Marker-Injektion (ISO 23504-1:2020) hinzugefügt: TPdf.SaveAsPdfR erhebt das aktuelle Dokument zu einer PDF/R-1-konformen Datei, dem Raster-Image-Transport-Subset von PDF für gescannte Dokumente. Die Injektion umfasst die dateiformatspezifischen Anforderungen, die sich per Nachbearbeitung anhängen lassen: den eindeutigen
%PDF-raster-1.0-Versionskommentar zwischen Trailer-Dictionary und startxref-Schlüsselwort nach §5, ein auf die §6.3-White-List reduziertes Katalog-Dictionary, ein auf die §6.4.3-White-List reduziertes Document Information Dictionary, einen Katalog-/Metadata-XMP-Stream mit den vier Einträgen aus §6.4.4 Table 1 und ein Trailer-/ID-Array - TPdf.SaveAsPdfRToStream für PDF/R-Ausgabe im Speicher und Kurzform
TPdf.SaveAsPdfR(FileName)hinzugefügt - TPdf.ValidatePdfR hinzugefügt: prüft ein offenes PDF auf PDF/R-1-Konformitätsmarker, darunter den
%PDF-raster-x.y-Fußkommentar, die Header-Version, das Fehlen von /Type /ObjStm, White-List-Konformität von Katalog und Info-Dictionary, das Vorhandensein des XMP-Metadatenstreams und Trailer /ID, und liefert TPdfRValidationResult mit erkanntem Konformitätslevel und den gefundenen Problemen - Eigenschaft TPdf.PdfRConformance hinzugefügt: liefert das Level ohne expliziten ValidatePdfR-Aufruf
- Neue Typen, exportiert in der neuen Unit FPdfPdfr: TPdfRConformance, TPdfRValidationResult, TPdfRValidationIssue, TPdfRSaveOptions.
TPdfRSaveOptions.Defaultsetzt StripInfoOptionalEntries und StripCatalogOptionalEntries auf True, sodass der Injektor standardmäßig ein zu §6.3 und §6.4.3 konformes Katalog- und Info-Dictionary erzeugt; Aufrufer können beide Werte auf False setzen, um Quell-Einträge zu erhalten, dann erfüllt die Ausgabe diese PDF/R-Klauseln jedoch nicht mehr - Inhaltslevel-Anforderungen (Contents-Struktur pro Seite, MediaBox
[0 0 w h], beschränkte Filter, keine Object-Streams, Strip-Layout) bleiben in der Verantwortung des Quell-PDFs. PDF/R ist strukturell strenger als andere PDF/x-Standards; mit einem TWAIN-Working-Group-Validator für vollständige Prüfung kombinieren - TPdf.AboutInfo-Zeichenkette aktualisiert, um die aktuelle Produktversion zu melden
Version 1.33.0
- PDF/X-Marker-Injektion (ISO 15930-Familie) hinzugefügt: TPdf.SaveAsPdfX erhebt das aktuelle Dokument durch Nachbearbeitung des Basis-PDFs mit einem Inkrement-Update zu einer PDF/X-1a:2001-, PDF/X-3:2002- oder PDF/X-4-konformen Datei. Die Injektion umfasst die dateiformatspezifischen Anforderungen, die sich per Nachbearbeitung anhängen lassen: einen XMP-Metadatenstream mit
pdfxid:GTS_PDFXVersionund für PDF/X-1a sowie PDF/X-3 auchpdfxid:GTS_PDFXConformancesamt passender pdfaExtension:schemas-Beschreibung, ein neu geschriebenes Document Information Dictionary mit/GTS_PDFXVersion,/GTS_PDFXConformanceund/Trapped, einen aktualisierten Katalog mit/OutputIntents [N 0 R]auf ein OutputIntent-Dictionary mit/S /GTS_PDFXund eingebettetem ICC-Profil sowie ein Trailer-/ID-Array - TPdf.SaveAsPdfXToStream für PDF/X-Ausgabe im Speicher und Kurzform
TPdf.SaveAsPdfX(FileName)hinzugefügt — erzeugt PDF/X-4 mit eingebauter sRGB IEC61966-2.1-OutputIntent als Default - TPdf.ValidatePdfX hinzugefügt: prüft Konformitätsmarker und liefert TPdfXValidationResult mit erkanntem Level und Problemsatz
- Eigenschaft TPdf.PdfXConformance hinzugefügt: liefert das Konformitätslevel ohne expliziten ValidatePdfX-Aufruf
- Neue Typen, exportiert in der neuen Unit FPdfPdfx: TPdfXConformance, TPdfXTrappedState, TPdfXValidationResult, TPdfXValidationIssue, TPdfXSaveOptions.
TPdfXSaveOptions.Defaultzielt auf PDF/X-4 mit sRGB OutputIntent und/Trapped /False; Aufrufer könnenConformanceüberschreiben, ein CMYK-IccProfileData-Blob für kommerzielle Druck-Workflows liefern oderOutputCondition,OutputConditionIdentifierundRegistryNameanpassen, um auf einen bestimmten ICC-Charakterisierungsregister-Eintrag wie FOGRA39 oder GRACoL2006_Coated1v2 zu zeigen - Inhaltslevel-Anforderungen (alle Schriften eingebettet, kein JavaScript, keine sichtbaren Annotationen, OPI-Verbot, Transparenzregeln für PDF/X-1a / PDF/X-3) bleiben in der Verantwortung des Autors. Mit callas pdfaPilot oder Ghent PDF Workgroup Output Suite für vollständige Prüfung kombinieren
- TPdf.AboutInfo-Zeichenkette aktualisiert, um die aktuelle Produktversion zu melden
Version 1.32.0
- PDF/E-1-Marker-Injektion (ISO 24517-1:2008) hinzugefügt: TPdf.SaveAsPdfE erhebt das aktuelle Dokument durch Nachbearbeitung mit einem Inkrement-Update zu einer PDF/E-1-konformen Datei. Die Injektion umfasst alle dateiformat-level Anforderungen, die per Nachbearbeitung anhängbar sind — XMP-Metadaten-Stream mit
pdfe:ISO_PDFEVersion = "PDF/E-1"und pdfaExtension:schemas-Beschreibung, neu geschriebenes Document Information Dictionary mit der in §5 vorgeschriebenen/ISO_PDFEVersion (PDF/E-1)-Eintragung, Info-XMP-Äquivalenz aus ISO 19005-1 §6.7 via §13.1 und/ID-Array im Trailer (§6.2) - TPdf.SaveAsPdfEToStream für PDF/E-Ausgabe im Speicher und Kurzform
TPdf.SaveAsPdfE(FileName)hinzugefügt - TPdf.ValidatePdfE hinzugefügt: prüft Konformitätsmarker und liefert TPdfEValidationResult mit erkanntem Level und Problemsatz
- Eigenschaft TPdf.PdfEConformance hinzugefügt: liefert das Konformitätslevel ohne expliziten ValidatePdfE-Aufruf
- Neue Typen, exportiert in der neuen Unit FPdfPdfe: TPdfEConformance, TPdfEValidationResult, TPdfEValidationIssue, TPdfESaveOptions
- Info-Dictionary-Neuschreibung ist die erste ihrer Art in PDFiumPas's PDF/x-Nachbearbeitungspfad — schreibt das vorhandene Info-Objekt unter derselben Objektnummer neu (bleibende /Info-Referenz im Trailer) und synthetisiert ein neues, wenn der Quell-Trailer kein /Info hat
- Inhaltslevel-Anforderungen (Schrifteinbettung, ToUnicode-CMaps, verbotene XObjects / ExtGState-Schlüssel / XFA-Formulare) bleiben in der Verantwortung des Dokumentautors
- TPdf.AboutInfo-Zeichenkette aktualisiert, um die aktuelle Produktversion zu melden
Version 1.31.0
- Unterstützung für das Einspeisen von PDF/UA-1-Markern (ISO 14289-1:2014) hinzugefügt: TPdf.SaveAsPdfUa erhebt das aktuelle Dokument durch Nachbearbeitung mit einem Inkrement-Update zu einer PDF/UA-1-konformen Datei. Die Injektion umfasst alle dateiformat-level Anforderungen, die per Nachbearbeitung durchsetzbar sind — XMP-Metadaten-Stream mit
pdfuaid:part = 1und passender pdfaExtension:schemas-Beschreibung, verpflichtendesdc:title, Katalog/MarkInfo << /Marked true /Suspects false >>und/ViewerPreferences << /DisplayDocTitle true >>(nur wenn die Quelle keines hat), Katalog/Lang(wenn der Aufrufer ein BCP 47-Tag liefert) und/ID-Array im Trailer - TPdf.SaveAsPdfUaToStream für PDF/UA-Ausgabe im Arbeitsspeicher hinzugefügt sowie eine Default-Options-Kurzform
TPdf.SaveAsPdfUa(FileName)für den häufigen Fall - TPdf.ValidatePdfUa hinzugefügt: prüft eine geöffnete PDF auf PDF/UA-1-Konformitätsmarker (StructTreeRoot-Existenz, /Lang, /MarkInfo /Marked true mit /Suspects = false, /ViewerPreferences /DisplayDocTitle true, XMP pdfuaid:part-Identifier, dc:title-Vorhandensein, Trailer /ID, Verschlüsselungsstatus) und liefert ein strukturiertes Ergebnis mit erkanntem Konformitätslevel und Problemmenge
- Eigenschaft TPdf.PdfUaConformance hinzugefügt: liefert das Konformitätslevel des geöffneten Dokuments (puc1, pucNone oder pucUnknown) ohne expliziten ValidatePdfUa-Aufruf
- Neue Typen, exportiert in der neuen Unit FPdfPdfua: TPdfUaConformance, TPdfUaValidationResult, TPdfUaValidationIssue, TPdfUaSaveOptions
- Leere Felder in TPdfUaSaveOptions (Title / Author / Subject / Keywords / Creator / Producer / CreationDate / ModDate / DocumentId / InstanceId / Language) werden automatisch über FPDF_GetMetaText / FPDF_GetFileIdentifier / FPDFCatalog_GetLanguage befüllt
- Inhaltslevel-Anforderungen (vollständige StructTreeRoot-Auszeichnung, Figure-Alt-Text, ToUnicode-CMaps, Schrifteinbettung usw.) bleiben in der Verantwortung des Dokumentautors — SaveAsPdfUa fügt nur Dateiformat-Marker an. ValidatePdfUa meldet das Fehlen eines StructTreeRoot als
pvuaiMissingStructTreeRoot - TPdf.AboutInfo-Zeichenkette aktualisiert, um die aktuelle Produktversion zu melden
Version 1.30.0
- Die PDF/A-1b-Ausgabe erfüllt nun die Anforderungen von ISO 19005-1 (mit Cor.1:2007) an die Äquivalenz zwischen Document Information Dictionary und XMP: Jeder Eintrag im Info dictionary, den PDFium in das Basis-PDF schreibt, wird im XMP-Paket gespiegelt, einschließlich Title (dc:title), Author (dc:creator), Subject (gemäß Cor.1 als dc:description), Keywords (pdf:Keywords), Creator (xmp:CreatorTool), Producer (pdf:Producer), CreationDate (xmp:CreateDate) und ModDate (xmp:ModifyDate). xmp:MetadataDate wird ebenfalls geschrieben
- Der Trailer eines PDF/A-Dokuments enthält nun stets ein /ID-Array (zwingende Anforderung in ISO 19005-1 6.1.3). Wenn TPdf.SaveAsPdfA ein Dokument verarbeitet, dessen Quelle bereits eine file identifier hat, werden die 16-Byte-IDs permanent und changing wiederverwendet; andernfalls wird eine deterministische 16-Byte-Fallback-ID aus den Quellbytes abgeleitet
- Das eingespeiste XMP enthält jetzt die in ISO 19005-1 6.7.8 (durch Cor.1 ersetzt) verlangte pdfaid Extension-Schema-Beschreibung — pdfaid gilt relativ zur XMP Specification 2004 als Extension-Schema, daher müssen alle konformen Dateien ihre property names, value types und categories im Container pdfaExtension:schemas deklarieren
- TPdfASaveOptions wurde um fünf optionale Felder erweitert: Producer, CreationDate, ModDate (PDF-Datums-Strings in der Form “D:YYYYMMDDHHmmSSOHH'mm'”), DocumentId und InstanceId (16-Byte-Strings für das /ID-Array im Trailer). TPdf.SaveAsPdfA / SaveAsPdfAToStream füllen fehlende Werte automatisch über FPDF_GetMetaText und FPDF_GetFileIdentifier, sodass bestehender Aufrufer-Code unverändert weiterläuft
- TPdf.ValidatePdfA / TPdf.PdfAConformance melden nun drei zusätzliche Probleme: pvaiMissingTrailerId (kein /ID im Trailer), pvaiMissingXmpDates (xmp:CreateDate oder xmp:ModifyDate fehlt) und pvaiMissingExtensionSchema (pdfaid Extension-Schema-Beschreibung fehlt)
- Nicht-ASCII-Zeichen in Title, Author, Subject, Keywords, Creator und Producer werden nun als UTF-8 in das XMP-Paket geschrieben (XMP Specification verlangt UTF-8). Mehrsprachige Metadaten bleiben dadurch beim Durchlauf von SaveAsPdfA erhalten
- TPdf.AboutInfo-Zeichenkette aktualisiert, um die aktuelle Produktversion zu melden
Version 1.29.0
- Die mitgelieferten PDFium-DLLs (Win32 und Win64, sowohl Standard- als auch V8-Builds) wurden auf den Upstream-Snapshot vom 2026-05-22 aktualisiert. Damit werden Upstream-Korrekturen an den Absturzpfaden in FPDFText_SetText / FPDFText_SetCharcodes sowie diverse interne Härtungen aus dem PDFium-Projekt übernommen
- Das neue Speicher-Flag FPDF_SUBSET_NEW_FONTS von PDFium wurde in FPdfPageOps.pas freigegeben, sodass Aufrufer von FPDF_SaveAsCopy automatisches Subsetting eingebetteter Schriftdateien für neu hinzugefügte Textobjekte anfordern können. Die bestehenden Konstanten FPDF_INCREMENTAL, FPDF_NO_INCREMENTAL und FPDF_REMOVE_SECURITY werden nun mit der Upstream-Bitshift-Form definiert (der bisherige numerische Wert 3 bleibt als FPDF_REMOVE_SECURITY_DEPRECATED erhalten, um die Binärkompatibilität zu wahren)
- FPDF_FONT_BACKEND_TYPE-Enum (FREETYPE / FONTATIONS) sowie das passende Feld m_FontLibraryType in FPDF_LIBRARY_CONFIG wurden in FPdfView.pas ergänzt, sodass Anwendungen, die PDFium mit dem Skia-Renderer initialisieren, beim Start das Schrift-Backend wählen können
- Die Signatur von TFPDFPage_InsertObject wurde an den Upstream angepasst: Die C-Funktion liefert nun FPDF_BOOL (TRUE bei Erfolg, FALSE wenn page_object NULL ist oder die Ownership-Übergabe fehlschlägt) statt void. Bestehende PDFiumPas-Aufrufer bleiben kompilierbar, da Delphi / FPC das Ignorieren des Funktionsrückgabewerts erlauben
- Die Zeichenkette TPdf.AboutInfo wurde korrigiert und meldet nun die aktuelle Produktversion (stand seit der reinen Dokumentationsversion 1.28.0 noch auf v1.27.0)
Version 1.28.0
- Die Inline-Dokumentation der gesamten API-Referenz wurde erheblich erweitert: jeder Eintrag für Property, Methode, Event und globale Funktion enthält nun eine dreiteilige Description, eine Remarks-Liste, ein mehrzeiliges Delphi Example sowie einen umfangreicheren See Also-Block — abdeckend 200+ zuvor knapp gehaltene Seiten einschließlich aller TPdf-Zähler, Metadaten-Getter, Font- und Character-Accessor, Page-Level Properties, indexierter Records, dokumentebener Methoden und der gesamten TPdfView Status- / Display- / Event-API
- Das Hilfe-Layout wurde fein abgestimmt, um der visuellen Basis von losLab in der HotXLS-Referenz zu entsprechen: angeglichene h1/h2-Größen, Konsolidierung der API-Navigationsraster-Stile in das gemeinsame StyleSheet sowie Entfernung der seitenbezogenen Inline-CSS-Überschreibungen in Navigation.html
- Die Dokumentation enthält nun ein Hilfsskript (Docs\Build-Expand-Entries.ps1), das die Einträgsseiten-Anreicherung aus einer einzigen Datentabelle regeneriert und so wiederholbare Wartung ermöglicht
Version 1.27.0
- PDF/A-1b-Erstellung hinzugefügt: TPdf.SaveAsPdfA speichert ein beliebiges geöffnetes Dokument als PDF/A-1b-konforme Datei, indem die Basis-PDF durch ein inkrementelles Update nachbearbeitet wird, das einen XMP-Metadatenstrom, einen sRGB-ICC-OutputIntent und einen aktualisierten Dokumentkatalog einfügt — alles ohne zusätzliche DLL-APIs. Funktioniert auf allen von PDFiumPas unterstützten Plattformen
- TPdf.SaveAsPdfAToStream für PDF/A-Ausgabe in den Arbeitsspeicher hinzugefügt
- TPdf.ValidatePdfA hinzugefügt: überprüft ein geöffnetes PDF auf PDF/A-Konformität (XMP pdfaid-Marker, OutputIntent mit eingebettetem ICC-Profil, Verschlüsselung) und gibt ein strukturiertes Ergebnis mit dem erkannten Konformitätslevel und einer Menge konkret gefundener Probleme zurück
- Property TPdf.PdfAConformance hinzugefügt: liefert den Konformitätslevel des aktuell geöffneten Dokuments (pac1b, pac1a, pac2b, pac3b, pacNone oder pacUnknown) ohne expliziten Aufruf von ValidatePdfA
- Neue Typen exportiert: TPdfAConformance, TPdfAValidationResult, TPdfAValidationIssue, TPdfASaveOptions (in neuer Unit FPdfPdfa.pas)
- SaveAsPdfA unterstützt ein benutzerdefiniertes ICC-Profil über TPdfASaveOptions.IccProfileData; bleibt es leer, wird automatisch das eingebaute sRGB IEC61966-2.1-Profil (HP/Microsoft, 3144 bytes) verwendet
- Die monolithische HTML-Referenz wurde durch ein restrukturiertes Web-Hilfesystem ersetzt: 302 individuelle API-Einträgsseiten (je eine pro Property, Methode, Event und globaler Funktion) für TPdf und TPdfView, jede mit vollständiger Beschreibung, Parametertabelle, Delphi-Code-Beispiel und See Also-Links
- Navigation.html hinzugefügt: ein umfassender einseitiger API-Navigationsindex, organisiert in sechs Abschnitten (TPdf Properties/Methoden/Events, TPdfView Properties/Methoden/Events, globale Funktionen) mit einem 5-spaltigen Flex-Grid für schnelles Überfliegen
- TPdf.html und TPdfView.html wurden als kompakte Komponenten-Übersichtsseiten neu aufgebaut, die die Typreferenz-Abschnitte (Types, Constants, Global Variables) beibehalten und für alle Member auf die einzelnen Einträgsseiten verweisen
- Volltextsuche mit Search.js hinzugefügt, mit inkrementellem clientseitigem Matching über alle 312 indizierten Seiten
- Alle Navigationsleisten der gesamten Site wurden auf Navigation.html aktualisiert
Version 1.26.0
- Demo/Lazarus/BatchExport hinzugefügt, die LCL-Portierung des Delphi-Demos BatchExport aus v1.14.0. Gleicher Funktionsumfang: Mehrdatei-PDF -> JPG-Export mit Fortschritt pro Datei (Gesamtfortschritt), Seitenfortschritt (aktueller Fortschritt), DPI- / Qualitäts- / Passworteingaben und kooperativ abbrechbarem Batch auf Basis von IPdfCancellationToken. Der Ausgabeordner wird nach erfolgreichem Abschluss im plattformeigenen Dateimanager geöffnet
Version 1.25.0
- Form XObject-Seitenwiederverwendung zu TPdf hinzugefügt und damit Workflows für Wasserzeichen, Template-Overlay und “eine Seite auf viele stempeln” ermöglicht: CreateXObjectFromPage erzeugt aus einer beliebigen Seite eines anderen Dokuments ein wiederverwendbares Handle; InsertFormObjectFromXObject fügt EINE Kopie der gekapselten Seite in die aktuelle Seite ein. Liefert das eingefügte FPDF_PAGEOBJECT zurück, so dass der Aufrufer es mit FPDFPageObj_SetMatrix und den TPdfMatrix-Hilfen aus v1.9.0 positionieren / skalieren / rotieren kann
- Die neue Pascal-Klasse TPdfXObject kapselt das FPDF_XOBJECT-Handle von PDFium und schließt es im Destruktor automatisch, wodurch die manuelle FPDF_CloseXObject-Zeremonie entfällt
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 147 Fälle erweitert, die C++Builder-Suite auf 123 Fälle — mit Abdeckung der Handle-Erzeugung und Page-Object-Insertion-Kontrakte
Version 1.24.0
- TPdf.RenderPageProgressive hinzugefügt — eine abbrechbare Variante von RenderPage, die PDFiums progressive Rendering-Schleife antreibt und zwischen Iterationen ein IPdfCancellationToken (v1.7.0) abfragt, so dass lange Renderings mit hoher DPI mitten in der Seite abgebrochen werden können, statt den Aufrufer bis zum Abschluss zu blockieren
- Gibt einen TPdfProgressiveStatus-Wert zurück: prsDone, prsCancelled oder prsFailed. Mit AToken = nil rendert die Methode ohne jegliche Pause bis zum Ende (keine Möglichkeit von prsCancelled)
- Verwendet denselben Zero-Copy-Schnellpfad aus v1.21.0 — PDFium rendert direkt in die DIB des Ziel-TBitmap. Der bisherige Legacy-Fallback gilt weiterhin, wenn die DIB nicht gekapselt werden kann
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 145 Fälle erweitert, die C++Builder-Suite auf 121 Fälle — mit Abdeckung von nil-Token (durchläuft komplett), bereits abgebrochenem Token (prsCancelled) und Pixel-Äquivalenz mit synchronem RenderPage bei aktivem Token
Version 1.23.0
- Sechs neue TPdfView-Methoden hinzugefügt, die PDFiums Textauswahl in Formular-Widgets und Undo/Redo für Anwendungen verfügbar machen: GetSelectedFormText liefert den aktuell ausgewählten Text innerhalb des fokussierten Formular-Widgets; SelectAllFormText wählt jedes Zeichen; FormUndo / FormRedo / FormCanUndo / FormCanRedo steuern den Edit-Verlauf des fokussierten Widgets. Die zugrundeliegenden PDFium-APIs waren bereits gebunden, hatten aber keinen High-Level-Einstiegspunkt. Alle sechs Methoden brechen sicher ab, wenn die View inaktiv ist oder das Dokument kein AcroForm-Widget fokussiert hat
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 142 Fälle erweitert, die C++Builder-Suite auf 119 Fälle — mit Abdeckung des Kontrakts “kein Formular / kein Fokus” für jede neue Methode
Version 1.22.0
- Seitenkompositions-Wrapper zu TPdf hinzugefügt: ImportPagesByIndex erwartet ein nullbasiertes Indexarray, um bestimmte Seiten aus einem Quelldokument zu kopieren; ImportNPagesToOne liefert ein brandneues TPdf, dessen Seiten N-up-Komposite dieses Dokuments sind; MovePages ordnet Seiten an Ort und Stelle um. Die zugrundeliegenden PDFium-APIs waren bereits gebunden, hatten aber keinen Pascal-freundlichen Einstiegspunkt
- ImportPagesByIndex akzeptiert ein leeres Array, um jede Quellseite zu importieren (entspricht der Übergabe von nil auf C-ABI-Ebene)
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 136 Fälle erweitert, die C++Builder-Suite auf 115 Fälle — mit Abdeckung von Subset-Import, Volldokument-Import, Seitenneuordnung und N-up-Komposit
Version 1.21.0
- Rendering-Leistung verbessert durch Umstellung von TPdf.RenderPage / TPdf.RenderTile (und der entsprechenden TPdfView-Helfer) auf einen Zero-Copy-Ausgabepfad. PDFium schreibt nun direkt in den DIB-Puffer des Ziel-TBitmap statt in einen internen Puffer, der anschließend zeilenweise kopiert wurde — das spart je Render eine Speicherkopie der Größe Breite x Höhe x 4 Bytes. Der Effekt ist bei hoher DPI am deutlichsten (Thumbnail-Paneele, Druckqualitäts-Export, Batch-Export)
- Der bisherige zeilenweise Pfad bleibt als Sicherheits-Fallback erhalten, für den unwahrscheinlichen Fall, dass die Ziel-DIB nicht gekapselt werden kann (extreme Dimensionen, ungewöhnlicher Stride, OOM). Das Verhalten ist Byte für Byte identisch — der Fallback ist nur langsamer
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 132 Fälle erweitert, die C++Builder-Suite auf 112 Fälle — mit Abdeckung der pf32bit-Konvertierung des aufruferseitigen Bitmaps, Dimensions-Round-Trip und einer Sanity-Prüfung für den Stride großer Bitmaps
Version 1.20.0
- Such-Ergebnishervorhebung zu TPdfView hinzugefügt: HighlightSearchText(Text, MatchCase, MatchWholeWord) durchsucht die aktuelle View-Seite, gibt die Anzahl der Treffer zurück und malt bei jedem Neuzeichnen eine HighlightColor-Maske über jeden Treffer. ClearHighlight entfernt die Hervorhebungen; das Wechseln der View auf eine andere Seite löscht sie automatisch, da Treffer seitenspezifisch sind
- HighlightColor ist standardmäßig clYellow und published, damit Anwendungen die Hervorhebung an ihre UI-Palette anpassen können
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 129 Fälle erweitert, die C++Builder-Suite auf 109 Fälle — mit Abdeckung von Standardfarbe, Farb-Round-Trip, “reale Fixture-Worttreffer” gegen den Text in sample.pdf und dem Kontrakt “fehlendes Wort liefert null Treffer”
Version 1.19.0
- Property FitMode zu TPdfView mit vier Werten hinzugefügt: pfmNone (manueller Zoom), pfmActualSize (100%), pfmFitPage (gesamte Seite passt in den Viewport) und pfmFitWidth (Seitenbreite entspricht der Viewport-Breite). Der aktive Fit-Modus wird bei Resize und beim Wechsel der aktuellen Seite automatisch erneut angewendet, sodass lange Dokumente mit gemischten Seitengrößen jederzeit perfekt eingepasst bleiben
- Das direkte Setzen von Zoom hebt den aktiven Fit-Modus auf (FitMode fällt zurück auf pfmNone) — entsprechend der gängigen Konvention von PDF-Viewern, bei der die Eingabe eines Zoomwerts Fit Page / Fit Width verlässt
- Der Standardwert ist pfmNone, so dass bestehende Anwendungen ihr Verhalten mit explizitem Zoom beibehalten
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 124 Fälle erweitert, die C++Builder-Suite auf 106 Fälle — mit Abdeckung von Standardwert, Modus-Round-Trip, fit-page erzeugt auf einem geladenen Dokument einen realen Zoom und manueller Zoom hebt den Fit-Modus auf
Version 1.18.0
- Property PageColor zu TPdfView hinzugefügt, die den gerenderten PDF-Seitenhintergrund von der Color des umgebenden Steuerelements entkoppelt. Standardwert ist clWhite, damit PDF-Seiten unabhängig vom Theme der Host-Anwendung in Papierweiß gerendert werden. Dark-Mode-Viewer können den Scrollbereich dunkel halten und gleichzeitig die eigentliche PDF-Seite weiß (oder in jeder von der Anwendung gewählten Farbe) belassen
- Verhaltensänderung: Anwendungen, die TPdfView.Color setzten, um die PDF-Seite umzufärben, sollten stattdessen PageColor setzen. Das Standardverhalten wird für den häufigen Fall (weiße Seiten auf themengefärbten Steuerelement-Hintergründen) ohne Code-Änderung besser
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 120 Fälle erweitert, die C++Builder-Suite auf 103 Fälle — mit Abdeckung von Standardwert und Farb-Round-Trip
Version 1.17.0
- Benutzerinput-Sperrschalter zu TPdfView hinzugefügt, damit Anwendungen, die den Viewer in Kiosks, Vorschaupaneelen oder schreibgeschützten Kontexten einbetten, Navigationsgesten ohne Subclassing deaktivieren können: AllowUserPageChange steuert die neuen Tastenkürzel PgUp / PgDn / Ctrl+Home / Ctrl+End; ChangePageOnMouseScrolling steuert die neuen Sprünge per Mausrad-hoch / Mausrad-runter; AllowUserTextSelection ist für den künftigen Pfad der Mauszug-Textauswahl reserviert. Alle drei sind standardmäßig True, sodass bestehende Anwendungen ohne Verhaltensänderung aktualisieren können
- Die Seiten-Navigation per Mausrad überspringt Ctrl+Rad, damit Anwendungen Ctrl+Rad weiterhin für Zoom reservieren können
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 118 Fälle erweitert, die C++Builder-Suite auf 101 Fälle — mit Abdeckung von Standardwerten und Schalter-Round-Trip
Version 1.16.2
- TPdfView-Regressionsabdeckung für Annotation-Linkklicks erweitert, wenn die Viewer-Seite von der zugehörigen TPdf-Seite abweicht — mit einem echten headless Mausklick-Pfad in Delphi, Lazarus und C++Builder
- Die Delphi- und Lazarus-Suites laufen nun mit je 114 Fällen, C++Builder mit 99 Fällen
Version 1.16.1
- Behoben: TPdfView-Linkklick-Behandlung verwendet nun bei automatischen Annotation- und Web-Link-Aktionen die aktuell vom Viewer angezeigte Seite, selbst wenn die zugehörige TPdf-Komponente auf einer anderen Seite steht
- TPdfThumbnailView gegen dangling Pdf-Referenzen abgesichert, wenn die verknüpfte TPdf-Komponente zerstört wird
- Lebenszyklus-Regressionsabdeckung für Thumbnail-Referenzen hinzugefügt; die Delphi- und Lazarus-Suites laufen nun mit je 113 Fällen, C++Builder mit 98 Fällen
- README, Testdokumentation, HTML-Help Such-/Indexinhalte und generierte C++-Paketausgaben mit den Integrations-Updates von v1.7.0 bis v1.16.0 synchronisiert
Version 1.16.0
- Neues Delphi-PrintDialog-Demo (Demo/Delphi/PrintDialog) hinzugefügt, das N-up-Druck (1 / 2 / 4 / 9 Seiten pro Blatt) mit Filterung gerader / ungerader Seiten, Graustufen-Rendering und optionalen 1-Pixel-Zellrahmen demonstriert. Es ist ein bewusst kleiner Begleiter zum bestehenden PrintPDF-Demo, das bereits Vorschau, Recent-Files, Zoom und Skalierung abdeckt
Version 1.15.0
- Neue Komponente TPdfThumbnailView (Unit FPdfThumbnail) hinzugefügt, die in einem scrollbaren Seitenpaneel ein Seiten-Thumbnail pro Zeile rendert — mit Hover- und Auswahl-Hervorhebung sowie Klick-Navigation. Vorgesehen für die Platzierung neben einem TPdfView, damit Endanwender lange Dokumente seitenweise durchblättern können
- Die Komponente ist auf der losLab-Palettenseite zusammen mit TPdf und TPdfView registriert; wichtige Properties: Pdf, CurrentPageIndex, ThumbnailWidth, ThumbnailHeight, TextColor, HoverColor, SelectionColor, BorderColor und das Event OnPageClick
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 112 Fälle erweitert, die C++Builder-Suite auf 97 Fälle — mit Abdeckung von Standardwerten, Thumbnail-Größen-Round-Trip, Klemmung extremer Werte, Farb-Round-Trip und Event-Handler-Zuweisung
Version 1.14.0
- Neues Delphi-BatchExport-Demo (Demo/Delphi/BatchExport) hinzugefügt, das zeigt, wie viele PDF-Dateien in einem Durchlauf nach JPG konvertiert werden — mit TPdf.LoadCustomDocument für streamendes Laden, IPdfCancellationToken für kooperative Abbrechbarkeit sowie Gesamt-Fortschritt pro Datei und Fortschrittsbalken pro Seite. Das Demo verwendet je eine TPdf-Instanz pro Datei (PDFium selbst ist nicht thread-sicher) und öffnet nach erfolgreichem Export den Ausgabeordner im Explorer
Version 1.13.0
- Async-Rendering-UI-Overlay zu TPdfView durch drei neue Properties hinzugefügt: AsyncRendering, LoadingText und LoadingColor. Wenn AsyncRendering True ist, zeichnet der Single-Page-Paint-Pfad einen kleinen “Loading...”-Indikator über die gerenderte Seite, sodass Anwendungen, die einen eigenen Worker für lange Renderings nutzen, eine einheitliche visuelle Affordanz teilen
- Standardwerte erhalten das bestehende Verhalten: AsyncRendering ist False, sodass Anwendungen, die sich nicht aktiv einklinken, keine visuelle Änderung bemerken
- Die Dokumentation stellt klar, dass PDFium selbst nicht thread-sicher ist — das tatsächliche Auslagern des Renderings auf einen Worker erfordert vom Aufrufer eine TPdf pro Worker; das anstehende Batch-Export-Demo demonstriert dieses Muster
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 106 Fälle erweitert, die C++Builder-Suite auf 93 Fälle — mit Abdeckung von Standardwerten und Round-Trip der drei Properties
Version 1.12.0
- Klickgesteuerte Linkbehandlung zu TPdfView hinzugefügt. Die neue Property LinkOptions steuert das automatische Verhalten für die vier PDF-Link-Aktionstypen: goto (Seitensprung), URI (ShellExecute), launch (ShellExecute) und embedded GotoR (reserviert). Standardmäßig sind loAutoGoto und loAutoOpenURI aktiviert; loAutoLaunch und loAutoEmbeddedGoto bleiben aus, damit ein versehentlicher Klick kein beliebiges Programm ausführen kann
- Die Events OnAnnotationLinkClick und OnWebLinkClick wurden hinzugefügt, feuern vor jeder automatischen Aktion und ermöglichen es Anwendungen, den Link zu prüfen, ihn als Handled zu markieren oder umzulenken (zum Beispiel auf eine Sicherheitsabfrage)
- Die Erkennung von Linkklicks läuft nur, wenn die Geste ein Klick und kein Ziehen ist — ein frischer MouseDown-Anker wird verwendet, damit Schwenkgesten weiterhin unverändert über den bestehenden Scrollpfad laufen
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 102 Fälle erweitert, die C++Builder-Suite auf 91 Fälle — mit Abdeckung von Standard-LinkOptions, Set-Round-Trip und Event-Handler-Zuweisung
Version 1.11.0
- Visuelle Aufwertung von TPdfView: Die Properties PageShadowSize, PageShadowColor und PageBorderColor malen optional einen Schlagschatten unter dem Seitenrechteck und einen Ein-Pixel-Rahmen darum. Die Standardwerte erhalten das vorherige flache Aussehen (PageShadowSize = 0; der Rahmen wird im Standard-clBlack gezeichnet, verschmilzt aber mit dem Standard-Weißhintergrund, bis Aufrufer die Farben ändern)
- Eine SmoothScroll-Property als Opt-in-Flag für eine künftige inkrementelle Scroll-Animation hinzugefügt; die Property macht heute Round-Trip und ist so verdrahtet, dass Anwendungen die Einstellung persistieren können, während die Renderseite weiterhin das bestehende sofortige Scrollverhalten verwendet
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 98 Fälle erweitert, die C++Builder-Suite auf 89 Fälle — mit Abdeckung von Standardwerten, Property-Round-Trip und der Klemmung negativer Schattenbreiten
Version 1.10.0
- Direktes Einfügen von Bildern durch neue Überladungen von TPdf.AddImage und TPdfView.AddImage hinzugefügt, die zusätzlich zum bestehenden TPicture-basierten AddPicture entweder einen Dateipfad oder ein TBitmap akzeptieren. AddImage(FileName) erkennt jedes Format, das bei den Grafik-Units von VCL oder LCL registriert ist (BMP, PNG über die PngImage-Unit, JPG usw.), und durchläuft dieselbe Pipeline wie AddPicture — das Verhalten ist identisch
- AddImage(TBitmap) umgeht den TPicture-Zwischenschritt und vereinfacht Aufrufer, die bereits aus Rendering- oder Batch-Generationsaufgaben über ein TBitmap verfügen
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 92 Fälle erweitert, die C++Builder-Suite auf 84 Fälle — mit Abdeckung von Bitmap-Einfügung, Page-Object-Grenzen, Ablehnung von nil-Bitmaps und BMP-Datei-Laden
Version 1.9.0
- High-Level-Unterstützung für Transformationsmatrizen über die neue Klasse TPdfMatrix in der Unit FPdfMatrix hinzugefügt. TPdfMatrix kapselt PDFiums FS_MATRIX mit einer OO-API für Translate, Scale, Rotate, HorizontalFlip, VerticalFlip, CentralFlip, Skew und Multiply — geeignet zum Komponieren von Transformationen, bevor sie an FPDFPageObj_SetMatrix und ähnliche PDFium-APIs übergeben werden
- TPdfMatrix.Multiply nimmt die sechs Matrixelemente korrekt als Snapshot, bevor die neuen Zeilenwerte berechnet werden — und behebt damit ein latentes Problem, bei dem alternative Pascal-Implementierungen frühere Elemente während desselben Aufrufs überschreiben und für jede Komposition jenseits reiner Translation falsche Ergebnisse liefern
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 88 Fälle erweitert, die C++Builder-Suite auf 81 Fälle — mit Abdeckung von Identität, Reset, Translate / Scale / Flip, post-multiplikativer Kompositionsreihenfolge und dem Multiply-Regressionsfall
Version 1.8.0
- On-Demand-Stream-Laden über die neue Methode TPdf.LoadCustomDocument(AStream, AOwnsStream) und die Hilfsklasse TPdfStreamAdapter hinzugefügt, basierend auf PDFiums FPDF_LoadCustomDocument. PDFium liest nun Blöcke aus dem übergebenen TStream nur bei Bedarf, sodass sehr große oder entfernte PDFs keine vorab im Speicher gehaltene Kopie mehr benötigen
- Optionale Stream-Eigentumsübergabe hinzugefügt: bei AOwnsStream = True übernimmt TPdf den Lebenszyklus des TStream und gibt ihn beim Aufruf von UnloadDocument frei
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 79 Fälle erweitert, die C++Builder-Suite auf 75 Fälle — mit Abdeckung von Streaming-Laden via TFileStream, Cleanup eines eigenen Streams und dem Kontrakt, dass extern besessene Streams das Unload überleben
Version 1.7.0
- Kooperative asynchrone Abbruch-Primitiven in der neuen Unit FPdfAsync hinzugefügt, die IPdfCancellationToken / IPdfCancellationTokenSource sowie ein wiederverwendbares PdfNoCancellationToken-Singleton bereitstellen — damit langlaufende Rendering- und Export-Workflows saubere Cancel-from-UI-Semantik unterstützen können
- Einen leichtgewichtigen TPdfFuture<T>-Helfer hinzugefügt, der einen Worker in einem Hintergrundthread ausführt und die Hülle TPdfFutureResult<T> zurück an den Hauptthread postet, um Erfolg, Abbruch und Fehlerfälle voneinander zu unterscheiden
- Die Delphi- und Lazarus-Regressionssuites wurden auf je 76 Fälle erweitert, die C++Builder-Suite auf 73 Fälle — mit gemeinsamer Abdeckung von Abbruchzustand, idempotentem Cancel, Callback-Fan-Out und Registrierung nach erfolgtem Cancel
Version 1.6.10
- High-Level-Zugriff via TPdf.PrintPageRanges auf den Druck-Seitenbereich der PDF Viewer Preference hinzugefügt — gibt einbasierte Seitenbereiche an den Anwendungscode zurück
- TPdf.SetFormFieldFlags / SetFormFieldFlagsAt sowie passende TPdfView-Helfer hinzugefügt, damit Anwendungen AcroForm-Feld-Flags über die öffentliche API aktualisieren können — inklusive Abdeckung der Password- und Multi-Select-Flags
- PDFium-Binding-ABI-Abdeckung für die Windows-konformen FPDF_DWORD, FPDF_FILEACCESS-Callbacks und die V8 Embedder Slot-Felder gehärtet
Version 1.6.9
- Low-Level-Skia-Rendering-Bindings für die neu exportierten APIs FPDF_RenderPageSkia und FPDF_FFLDrawSkia in den mitgelieferten Standard- und V8-PDFium-DLLs hinzugefügt
- Die öffentliche Binding-Abdeckung erweitert: das Laden der Standard- und V8-DLL prüft nun zusätzlich zu den bestehenden V8/XFA-Capability-Probes auch die Skia-Render-Einstiegspunkte
Version 1.6.8
- TPdf.SetTextPositions und TPdfSingleArray hinzugefügt, um zeichenweise Positionen an bestehenden Textobjekten über die neu exportierte API FPDFText_SetPositions zu setzen
- FPDFText_SetPositions zu einem erforderlichen Binding für die aktuell mitgelieferten PDFium-DLLs erhoben, während gleichzeitig bestätigt wird, dass die Skia-Render-Einstiegspunkte weiterhin nicht verfügbar sind, da die DLLs sie nicht exportieren
- Die Regressionssuites in Delphi, C++Builder und Lazarus wurden auf je 65 Fälle erweitert — mit Abdeckung der Text-Positions-Änderung
Version 1.6.7
- High-Level-Zugriff von TPdf auf JavaScript name-tree-Aktionen auf Dokumentebene hinzugefügt — Aktionsnamen und Skripte werden über JavaScriptAction und JavaScriptActions zurückgegeben
- TPdf.FileIdentifier hinzugefügt, um die permanente und die wechselnde Trailer-ID als binäre TBytes ohne das PDFium-Terminierungsbyte zu lesen
- TPdf.PageBox, GetPageBox und SetPageBox für MediaBox, CropBox, BleedBox, TrimBox und ArtBox auf der aktuellen Seite hinzugefügt
- Bestätigt, dass die aktuell mitgelieferten PDFium-DLLs zur Laufzeit nur die Skia-Render-Einstiegspunkte nicht zur Verfügung stellen, da diese Exporte nicht vorhanden sind
- Die Regressionssuites in Delphi, C++Builder und Lazarus wurden auf je 64 Fälle erweitert — mit Abdeckung von Dokument-JavaScript, Trailer-ID und Page-Box
Version 1.6.6
- Laufzeit-Unterstützung für die mitgelieferte V8-fähige PDFium-DLL hinzugefügt. Setzt man EnableV8Engine vor dem Laden, wählt der Loader pdfium.v8.dll aus dem Baum DLLs\Win32 oder DLLs\Win64 und gibt die V8/XFA-spezifischen Bindings frei, sofern die geladene DLL diese bereitstellt
- V8FeaturesAvailable, XfaBStrHelpersAvailable, GetRecommendedV8Flags sowie Low-Level-Optional-Bindings für FPDF_BStr_*, FPDF_GetRecommendedV8Flags und FPDF_GetArrayBufferAllocatorSharedInstance hinzugefügt
- FPDFText_SetPositions als optionales Binding klassifiziert, damit PDFiumPas auch mit PDFium-DLLs lädt, die diesen experimentellen Text-Positions-Setter nicht exportieren
- Die Regressionssuites in Delphi, C++Builder und Lazarus wurden auf je 61 Fälle erweitert — mit Abdeckung der Capability-Probes für Standard-DLL und V8-DLL
Version 1.6.5
- Tagged-PDF-Strukturbaum-Inspektion über TPdf.StructureElements und TPdfView.StructureElements hinzugefügt — mit Elementtyp, Titel, Alternativtext, tatsächlichem Text, Erweiterungstext, Sprache, marked-content-IDs, Anzahl der Kinder und Anzahl der Attribute
- Windows-PDFium-Druckmodusauswahl über TPdfPrintMode und SetPdfPrintMode hinzugefügt — abdeckend EMF, Nur-Text, PostScript, Pass-Through, Image-Mask und Type-42-Druckmodi
- Low-Level-Bindings für die übrigen Standard-DLL-PDFium-Public-Exporte hinzugefügt — betreffend JavaScript-Aktionen, Annotation-Form-Flags / Schriftfarbe, Aktiv-Status von Page-Objekten, indizierte Einfügung, Float-Werte für Content-Marks, ICC-Profildaten von Bildern, Entfernen von Form-Objekten und Text-Positionen
- Die Regressionssuites in Delphi, C++Builder und Lazarus wurden auf je 59 Fälle erweitert — mit Abdeckung des Tagged-PDF-Strukturbaums, der Druckmodi und der Public-Export-Bindings
Version 1.6.4
- Die Demos in Delphi, C++Builder und Lazarus wurden aktualisiert, so dass sie erzeugte PDFs, exportierte Text-/Bilddateien und Batch-Ausgabeordner nach erfolgreichem Erstellen automatisch öffnen
Version 1.6.3
- Die aufeinander abgestimmten Regressionssuites in Delphi, C++Builder und Lazarus wurden auf je 56 Fälle erweitert — mit TPdfView-GUI-Abdeckung für Fit-Zoom-Helfer, Round-Trips zwischen Geräte- und Seitenkoordinaten, Zeichen-Hittest und Maus-Schwenken über unsichtbare Viewer-Steuerelemente
- Die TPdfView-Fixtures verwenden nun eine explizite Viewergröße und testspezifische Subklassen, die geschützte Maus-Handler ausführen und die Suites dennoch vollständig headless halten
Version 1.6.2
- Behoben: TPdf.AddPage(0, ...) macht die eingefügte erste Seite sofort zur aktiven Seite. Bestehender Beispielcode funktioniert weiterhin, und PageNumber meldet nach dem Einfügen eine gültige einbasierte Seitennummer
- Die Version des Lazarus-Pakets synchronisiert und die aufeinander abgestimmten Regressionssuites in Delphi, C++Builder und Lazarus auf je 52 Fälle erweitert
Version 1.6.1
- Eine falsche Mindestversionsanforderung im PDF-Versions-Konformitäts-Validator aus v1.6.0 behoben: die SetState-Aktion wurde von PDF 1.5 auf PDF 1.2 herabgestuft — in Übereinstimmung mit PDF 1.2 Reference 6.9.9. SaveAs-Ziele für PDF 1.3 / 1.4, die SetState-Aktionen enthalten, werden jetzt korrekt gespeichert statt abgelehnt
- Passende lexikalische PDF-1.2-Prüfungen aus demselben Spezifikationsabschnitt hinzugefügt: die Aktionen Sound, Movie und NOP sowie der Farbraum Separation werden nun blockiert, wenn die gewählte Zielversion älter als PDF 1.2 ist
- Die Regressionssuites in Delphi, C++Builder und Lazarus wurden auf je 50 Fälle erweitert — durch Hinzufügen eines positiven Akzeptanztests für SetState unter PDF 1.4, der die korrigierte Grenze festhält
Version 1.6.0
- Explizite SaveAs-Ziele von PDF 1.0 bis PDF 1.7 wurden mit einem umfassenden Versions-Feature-Validator gehärtet, der die gesamte Feature-Zeitleiste von PDF 1.1 bis ISO 32000-1 abdeckt. Der Validator blockiert nun Speicherungen, die Dictionary-Einträge, Filternamen, Annotation-Subtypen, Aktionstypen, Schriftarten, Farbräume oder Verschlüsselungsparameter enthalten, die nach der gewählten Zielversion eingeführt wurden. Beispiele: JBIG2Decode (1.4+), MarkInfo / Tagged PDF (1.4+), OutputIntents (1.4+), ICCBased / DeviceN / BleedBox / TrimBox / ArtBox / StructTreeRoot (1.3+), Annotationen Polygon / PolyLine / Caret / Screen / Watermark / Redact, AES- und AES-256-Verschlüsselung (CFM AESV2 / AESV3), Katalogeinträge Perms / Legal / Requirements / NeedsRendering sowie versionsabhängige Aktionen wie JavaScript, Trans, SetState, Rendition, GoToE, GoTo3DView — alle werden abgelehnt, wenn die Ziel-PDF-Version sie nicht ausdrücken kann
Version 1.5.13
- Die Regressionssuites in Delphi, C++Builder und Lazarus wurden auf je 49 Fälle erweitert — mit direkter Abdeckung der Ablehnung von ICCBased-Farbräumen, Tagged-PDF MarkInfo, Polygon-Annotationen, AES (V2)-Verschlüsselung und Redact-Annotationen gegen die Ziele PDF 1.2 / 1.3 / 1.4 / 1.5 / 1.6
Version 1.5.12
- SaveAs-Nachverarbeitung für inkrementelle Katalog-Rewrites behoben. PDFiumPas validiert nun das jüngste wiederholte indirekte Objekt, so dass bestehende /Version-Überschreibungen im Katalog beim Speichern auf eine explizit ältere PDF-Zielversion korrekt ersetzt werden
- Die Regressionssuites in Delphi, C++Builder und Lazarus wurden auf je 44 Fälle erweitert — mit direkter Abdeckung des Ersetzens veralteter /Version-Katalogeinträge, der PDF 1.4-Katalogversion-Normalisierung und der Ablehnung von Transparenz- und Portable-Collection-Features, wenn die gewählte PDF-Zielversion sie nicht ausdrücken kann
Version 1.5.11
- Versionierte SaveAs-Ausgabe für explizite Ziele PDF 1.3, 1.4, 1.5, 1.6 und 1.7 gehärtet. PDFiumPas normalisiert nun Katalog-Versionsmarker, hält die standardmäßige Fit-Height-OpenAction versionsverträglich und lehnt neuere PDF-Features ab, wenn die gewählte Zielversion sie nicht ausdrücken kann
- Regressionsabdeckung in Delphi, C++Builder und Lazarus hinzugefügt, die explizite PDF 1.3 bis PDF 1.7-Dateien speichert und neu lädt — um den finalen Header, die standardmäßige Fit-Height-OpenAction und die gemeldete PDF-Version zu verifizieren
Version 1.5.10
- Von Option B der Spezifikation zu Option C gewechselt: TPdfView-Smoke-Tests in allen drei IDE-Suites hinzugefügt (Tests.PdfView). Jede Suite baut ein verstecktes Eltern-TForm (auf Pascal-Seite via TForm.CreateNew, auf C++Builder-Seite via
new TForm(NULL, 0)), repartiert ein TPdfView, setzt Active := True und prüft anschließend den Round-Trip der API für PageCount, PageNumber-Default, Zoom, Rotation, DisplayMode sowie dass View.Text dem zugrundeliegenden TPdf.Text entspricht. Jede IDE-Suite läuft nun mit 39 Fällen
Version 1.5.9
- Von Option A der Spezifikation zu Option B gewechselt: Render-Smoke-Tests in allen drei IDE-Suites hinzugefügt. Jede Tests.Render-Suite ruft TPdf.RenderPage auf sample.pdf auf und verifiziert drei robuste Signale anstelle byteweiser Checksummen: das zurückgegebene Bitmap entspricht exakt der angeforderten Pixelgröße; verschiedene angeforderte Größen (200x100, 64x256) erzeugen passende Bitmaps; und die gerenderte Seite ist zu mindestens 95% weißer Hintergrund mit mindestens 50 (Lazarus: 20) nicht-weißen Pixeln, die den antialiasierten Text markieren. Jede IDE-Suite läuft nun mit 33 Fällen
Version 1.5.8
- Die ursprünglichen A(2)-Testplan-Gruppen wurden abgeschlossen, indem pro IDE sieben weitere Regressionen ergänzt wurden: TPdf.CreateAnnotation, das eine anHighlight-Annotation aufbaut, plus ein SaveAs/LoadDocument-Round-Trip; der AcroForm-Lesepfad auf Demo/Delphi/FormFill/cmp_fill_out_and_merge_forms.pdf (FormType ist ftAcroForm, FormFieldCount > 0, FlattenAllPages reduziert die Felder auf null); und stille Leseweg-Abdeckung für Bookmarks, LinkAnnotationCount und WebLinkCount auf einem Dokument, das keines dieser Features besitzt. Jede IDE-Suite läuft nun mit 30 Fällen
Version 1.5.7
- Die Suites in Delphi (DUnitX), Lazarus (FPCUnit) und C++Builder (GoogleTest) wurden um sieben neue Regressionen pro IDE erweitert: PdfVersion, PageRotation, TPdf.FindFirst / FindNext-Substring-Suche, Übereinstimmung von CharacterOrigin / CharacterRectangle mit dem AddText-Ursprung, CreateAttachment-Registrierung plus ein SaveAs/LoadDocument-Round-Trip sowie ein Round-Trip mit akzentuiertem Text via AddText, der verifiziert, dass der europäische TrueType-Einbettungspfad aus v1.3.0 Codepoints des Latin-1-Supplements unverändert beibehält
Version 1.5.6
- Gespeicherte PDFs erhalten nun eine Standard-OpenAction für die erste Seite mit Fit-Height, wenn keine bestehende OpenAction vorhanden ist, sodass PDF-Reader generierte Dokumente initial mit Seitenhöhen-Zoom anzeigen
- Regressionsabdeckung in Delphi, Lazarus und C++Builder für die erzeugte OpenAction und die Fit-Height-Einstellung hinzugefügt
Version 1.5.5
- Regressionstests in den Suites Delphi (DUnitX), Lazarus (FPCUnit) und C++Builder (GoogleTest) für die indizierten Character- und Font-Inspektions-APIs hinzugefügt (TPdf.FontBaseName, FontFamilyName, FontWeight, FontItalicAngle, FontData, FontIsEmbedded, CharacterFontWeight, CharacterAngle). Die Lazarus-Suite überspringt FontData absichtlich, da es derzeit unter FPC innerhalb von FPDFFont_GetFontData eine Zugriffsverletzung auslöst
Version 1.5.4
- Ein C++Builder Attachment-Demo hinzugefügt, das vom Delphi-Beispiel portiert wurde und das Erzeugen von PDFs, das Hinzufügen, Auflisten, Extrahieren, Löschen und Speichern eingebetteter Datei-Attachments samt Anzeige des MIME-Subtyps abdeckt
Version 1.5.3
- Die Spread-Page-Berechnung, die hinter den Zwei-Seiten-Modi von TPdfView steht, als Unit-Level-Helfer ComputeSpreadPages(DisplayMode, PageNumber, PageCount, out LeftPageNo, out RightPageNo) verfügbar gemacht. Das Verhalten ist unverändert; der Helfer macht die titelblattbewusste Regel unabhängig testbar, ohne einen Viewer instanziieren zu müssen
- Fünf Regressionstests in den Suites Delphi (DUnitX), Lazarus (FPCUnit) und C++Builder (GoogleTest) hinzugefügt — mit Abdeckung von leeren Dokumenten, der Standardpaarung zweier Seiten, dem allein stehenden Cover in dmTwoPageContinuousWithCover, der Paarung nach dem Cover und dem Klemmverhalten für Letzte-Seite / außerhalb des Bereichs
Version 1.5.2
- Unterstützung für die Dokumentsprache über TPdf.Language hinzugefügt, abgebildet auf den /Lang-Eintrag des PDF-Katalogs
- Zugriff auf den MIME-Subtyp des Attachments mit TPdf.AttachmentType hinzugefügt
- anRedact zu TPdfAnnotationSubtype hinzugefügt und Hilfsmethoden zum Entfernen von Page-Objekten in TPdf und TPdfView ergänzt
- Die Viewer- und Attachment-Demos aktualisiert, sodass sie die neuen Informationen zu Dokumentsprache und Attachmenttyp anzeigen, sofern verfügbar
Version 1.5.1
- dmTwoPageContinuousWithCover für TPdfView hinzugefügt, damit Viewer-Layouts die erste Seite allein zeigen und anschließend mit Zwei-Seiten-Spreads fortfahren können
- Die MultiPageViewer-Demos in Delphi, C++Builder und Lazarus aktualisiert, um den Cover-bewussten Zwei-Seiten-Anzeigemodus zugänglich zu machen
Version 1.5.0
- Automatisierte Smoke-Test-Suites für Delphi (DUnitX), Lazarus (FPCUnit) und C++Builder (GoogleTest) hinzugefügt. Die drei Suites teilen sich eine einzige Fixture-PDF in Tests\TestData und führen jeweils dieselben sieben Fälle aus, die das Laden von Dokumenten, Seiteninformationen, Textextraktion, Metadaten, Save-Round-Trip, PDF-Header-Validierung und die Compressed-Property abdecken
Version 1.4.3
- Das FontProperties-Demo erweitert, damit es sowohl die TPdfView- als auch die TPdf-APIs zu Schrift-Metadaten zeigt — einschließlich Schrift-Handles, Schriftdatengröße und Zeichenmetriken
- Indizierte TPdfView-Character- und Font-Inspektions-Properties hinzugefügt und das FontProperties-Demo aktualisiert, damit es Schrift-Metadaten von Textobjekten abfragt
Version 1.4.2
- Indizierte Character- und Font-Inspektions-Properties zu TPdf hinzugefügt, um Textanalyse ohne Viewer zu ermöglichen. Zeichen-indizierte Properties (CharacterAngle, CharacterFontSize, CharacterFontWeight) fragen Metriken pro Zeichen aus dem Textstream der aktuellen Seite ab. Page-Object-indizierte Properties (FontAscent, FontBaseName, FontData, FontDescent, FontFamilyName, FontHandle, FontIsEmbedded, FontItalicAngle, FontWeight) fragen Schrift-Metadaten für jedes Textobjekt auf der aktuellen Seite ab
- Nicht-Text-Page-Objekte liefern für alle Font*-Properties sichere Nullwerte oder leere Werte zurück, statt einen Fehler auszulösen — das vereinfacht das Iterieren über jedes Page-Objekt und das Untersuchen nur der Text-Objekte
- FontBaseName liest den PostScript-Basisschriftnamen direkt, statt auf den Schriftfamiliennamen zurückzugreifen, und liefert damit eine genauere Kennung für eingebettete Schriften
Version 1.4.1
- C++Builder- und Lazarus-Varianten des EuropeanText-Demos hinzugefügt, damit alle unterstützten IDE-Familien die Generierung akzentuierten europäischen Texts mit System-TrueType-Schriften verifizieren können
- C++Builder- und Lazarus-Varianten des FormFill-Demos hinzugefügt — inklusive Beispiel-Formular-PDFs, Feldbearbeitung, Erscheinungsbild-Regenerierung sowie Workflows für ausgefülltes Speichern und geflattetes Speichern
Version 1.4.0
- Lazarus / Free Pascal-Unterstützung hinzugefügt: das neue Paket PDFiumLaz stellt dieselben TPdf-, TPdfView- und verwandten Komponenten unter dem LCL-Widget-Set bereit und erweitert die Bibliothek auf die Lazarus-IDE und den Free Pascal-Compiler neben den bestehenden Paketen für Delphi und C++Builder
- Lazarus-Varianten der Demos hinzugefügt, damit Lazarus-Entwickler jedes Feature mit lauffähigen Beispielen erkunden können
- Behoben: ein Lazarus-Kompilierungsproblem, bei dem Free-Pascal-Conditional-Defines zusammen mit Delphi-Compiler-Versionsprüfungen ausgewertet wurden — was FPC-Builds dazu brachte, Delphi-spezifische Unit-Namen aufzulösen und zu scheitern
Version 1.3.1
- Den Form-Flattening-Workflow in den Hilfeunterlagen dokumentiert: GenerateFormAppearances, FlattenPage, FlattenAllPages sowie die zugehörigen FLAT_- / FLATTEN_-Konstanten sind nun in TPdf, TPdfView, der API-Referenz, der Feature-Matrix und den Programmierbeispielen abgedeckt
- Die Architekturtabelle auf der Übersichtsseite korrigiert, sodass sie die tatsächlich im Lib-Ordner ausgelieferten Binding-Units auflistet
Version 1.3.0
- Verbesserte Unterstützung europäischer Zeichen beim Erstellen von PDFs. TPdf.AddText lädt und cacht nun die passende System-TrueType-Schrift, bevor ein Textobjekt erzeugt wird, und bewahrt damit akzentuierte Zeichen aus Tschechisch, Französisch, Deutsch, Spanisch, Portugiesisch, Polnisch und Türkisch, die PDFiums eingebaute Standardschriften nicht darstellen können
- Anwendungen, die zuvor Fragezeichen oder Ersatzglyphen für Latin-Text außerhalb von ASCII erzeugt haben, rendern nun ohne Code-Änderung korrekt. Das EuropeanText-Demo wurde hinzugefügt, um die Funktion zu veranschaulichen
Version 1.2.0
- Refresh des AcroForm-Erscheinungsbildes zu TPdf hinzugefügt: ein Aufruf von GenerateFormAppearances nach Änderungen an FormField[]-Werten aktualisiert das Widget-Erscheinungsbild, sodass ausgefüllte Werte in Standard-PDF-Readern ohne interaktive Bearbeitungssitzung sichtbar sind
- Form-Flattening-Hilfen zu TPdf (FlattenPage / FlattenAllPages) und TPdfView (FlattenPage für die aktuelle Viewseite) hinzugefügt. Flattening bettet ausgefüllte Feldwerte dauerhaft als gewöhnlichen Seiteninhalt ein und entfernt die interaktive Formularschicht, sodass ein statisches Dokument entsteht, das in allen Viewern konsistent rendert
- Demo\Delphi\FormFill hinzugefügt, um die Workflows Fill-and-Save und Fill-and-Flatten anhand einer Beispiel-AcroForm-PDF zu demonstrieren
Version 1.1.2
- Komprimierung von PDF-Streams beim Speichern hinzugefügt. Die neue Property TPdf.Compressed (standardmäßig aktiviert) schreibt unkomprimierte Content-Streams beim Speichern als FlateDecode-komprimierte Streams um, was die Dateigröße programmgenerierter PDFs deutlich reduziert. Anwendungen, die unkomprimierte Ausgabe benötigen, können Compressed vor dem Aufruf von SaveAs auf False setzen
Version 1.1.1
- Win64-Paket-Builds enthalten keine Design-Time-Registrierungs-Units mehr, was Build-Zeit-Fehler verhindert, wenn das Win64-Paket in einem ausschließlich Runtime-Kontext eingesetzt wird
- Der PDFium-DLL-Loader sucht nun zuerst im Win32- oder Win64-Anwendungsunterverzeichnis — mit den Standardnamen pdfium.dll und pdfium.v8.dll — und fällt anschließend auf das flache Anwendungsverzeichnis und das Windows-Systemverzeichnis zurück. Das entspricht dem DLL-Layout, das im Komponentenpaket mitgeliefert wird, und macht die Installation unkompliziert
Version 1.1.0
- Behoben: ein visueller Clipping-Defekt im Zwei-Seiten-Modus von TPdfView — Seiteninhalte gingen durch den Bundsteg über die Mitte hinaus, weil sich linke und rechte Seitenkachel ein einziges Clipping-Rechteck teilten. Jede Kachel hat nun ein eigenes Clipping, sodass Inhalte innerhalb ihrer Seitengrenze bleiben
- Die Fehlermeldung des Delphi-Demos verbessert, wenn die PDFium-DLL nicht gefunden werden kann — mit einem klareren Hinweis auf den erwarteten DLL-Namen und Speicherort