Begrenztes Absatz-Editing
HPDFParagraphReflow wählt geladene Glyphenmittelpunkte innerhalb eines expliziten Quellrechtecks aus und schreibt einen neu gesetzten Absatz in ein explizites Zielrechteck auf derselben Seite
Das Abnahmeprofil deckt Delphi Win32/Win64 und Windows FPC/Lazarus ab; die Generierung gemessener Schriftarten nutzt den vorhandenen Document-Appearance-Builder samt Unterstützung installierter Schriftarten
Auswahl, Layout und Erhalt
Koordinaten sind Punkte im unrotierten User-Space der PDF-Seite mit nach oben zeigender y-Achse; beide Rechtecke müssen endlich sein, positive Abmessungen von höchstens 14400 Punkten haben und in die MediaBox der Seite passen
Die Auswahl kann mehrere ursprüngliche Baselines und mehrere Content-Streams der Seite umfassen; literale, hexadezimale, TJ-, Single-Quote- und Double-Quote-Text-Operanden werden an ausgewählten Zeichencode-Grenzen neu geschrieben
Behaltene Präfixe, Suffixe, Textvorschübe und ursprüngliche numerische Kerning-Korrekturen bleiben an Ort und Stelle; der Quelltext wird aus den tatsächlichen Operanden entfernt statt von einem Hintergrundrechteck verdeckt zu werden
Verschachtelte Form XObjects verwenden ihre Matrix und BBox; jeder ausgewählte Aufruf und seine übergeordneten Ressourcen werden privat kopiert, sodass andere Aufrufe und andere Seiten, die die Original-Forms teilen, erhalten bleiben
Glyphenmittelpunkte außerhalb einer Form-BBox werden ausgeschlossen; teilweise erfasste Quellglyphen führen standardmäßig zur Ablehnung, und RejectPartialSourceGlyphs = False erlaubt ausdrücklich das Entfernen eines gesamten Zeichencodes, wenn dessen Mittelpunkt ausgewählt ist
Appearance legt installierte Schriftart, Stil, Größe, Farbe, Innenabstand, Ausrichtung und Überlauf-Verhalten fest; die Zielbreite steuert den Umbruch, und Shrink-to-fit meldet die tatsächliche EffectiveFontSize
Die erzeugte Glyphengeometrie wird unabhängig interpretiert und gegen das Zielrechteck geprüft; bei diesem begrenzten Helfer ist die Rotation auf null und die Deckkraft auf eins festgelegt
Ein leerer Ersatz löscht den ausgewählten Quelltext; mit RequireSourceText = False fügen Sie einen Absatz in eine leere Quellregion ein
Kollisionsnachweise
Nicht ausgewählter Text außerhalb von Leerraum, XObject- und Inline-Bilder, gezeichnete Pfadgrenzen und Anmerkungsrechtecke werden mit den erzeugten Grenzen der Ersatz-Glyphen verglichen
Jede Kollision nennt ihre Art, ihre Grenzen im Seitenraum, optionalen Nachbartext und einen Ersatz-Glyphenindex; die Gesamtzahl bleibt erhalten, auch wenn die zurückgegebene Kollisionsliste ihr Limit erreicht
Pfad-Kontrollpunkte, transformierte Form-Clip-Grenzen, Strichbreite und Gehrungslimits erzeugen konservative Boxen; Shading mit unbekannter Füllausdehnung belegt konservativ das gesamte Zielrechteck
Dieser Geometrietest kann transparente Bilder, unbelegte Anmerkungsflächen, Kurven, abgeschnittene Pfade und rotierte Form-Hüllen übermelden; er beweist keine pixelgenaue Tintentrennung und untersucht keine beliebigen Clipping-Pfade, kein Blend-Compositing und keine Schriftkonturen
RejectCollisions = True verwirft überlappende Ersetzungen ohne Mutation; auf false gesetzt bleibt der Bericht erhalten und lässt die bewusste Überlappungsstrategie des Aufrufers zu
Vorschau, Commit und Rollback
HPDFPreviewParagraphReflow gibt einen abgeschlossenen Plan im Besitz des Aufrufers zurück, ein semantisches Ersatz-Layout, Fingerabdrücke und Kollisionsnachweise, und rollt danach die erzeugten Dokumentobjekte zurück
HPDFCommitParagraphReflow wiederholt die begrenzte Analyse und wendet den Plan atomar an, und zwar nur, wenn Quellinhalt, Form-Grenzen, Anmerkungsgeometrie und Ersatz-Schriftgeometrie weiterhin der Vorschau entsprechen
Ein Plan gehört zur selben lebenden Dokumentinstanz; geben Sie ihn nach Gebrauch frei, halten Sie das Dokument währenddessen am Leben und erzeugen Sie die Vorschau neu, nachdem Sie ein anderes Dokument geladen oder ausgewählten Inhalt geändert haben
THPDFParagraphReflowSession ergänzt einen angewendeten Prüfzustand: Apply legt das bearbeitete Dokument für Extraktion oder Rendering offen, Commit veröffentlicht es, und Rollback oder Zerstörung stellt den ursprünglichen Graphen wieder her
Nutzen Sie Sessions seriell; das Dokument muss die Session überleben, und andere Graph-Transaktionen oder Editing-Aufrufe dürfen nicht eingestreut werden, solange Pending true ist
Rollback stellt den Dokumentzustand im Speicher wieder her; bereits gespeicherte externe Dateien bleiben Sache des Aufrufers
Endliche Arbeit und Fehlerverhalten
Standardlimits sind 64 MiB dekodierter Inhalt, 64 MiB erzeugte Streams, 100000000 Arbeitseinheiten, 100000 Glyphen, 250000 Token, 12 Form-Ebenen, 256 Form-Aufrufe, 256 zurückgegebene Kollisionen und 100000 geklonte Ressourcenknoten
Kodierte String-Bytes werden vor der Glypheninterpretation gegen das verbleibende Glyphenlimit geprüft, daher können Multi-Byte-Zeichenkodierungen konservativ mehr Budget verbrauchen als ihre sichtbare Glyphenzahl
Die Grenzen für Dekodiertes und Erzeugtes betreffen den Inhalt, den der Helfer verarbeitet; die Größe erzeugter Streams wird vor der Veröffentlichung geprüft und stellt weder ein Prozess-Peak-Memory-Limit dar noch begrenzt sie alle Allokationen des Builders für installierte Schriftarten
Abbruch erfolgt kooperativ über Content-Tokenisierung und Helfer-Schleifen, mit Prüfungen rund um vorhandene Schriftgenerierungs-Aufrufe; behalten Sie das Token bis zum Abschluss des Aufrufs
Fehlende Quelle, ungültige Eingabe, Kollisionen, veraltete Pläne, nicht unterstützter Inhalt, ausgeschöpfte Budgets, Abbruch und gewöhnliche Fehler liefern false mit explizitem Status zurück und erhalten den ursprünglichen Objektgraphen
Ausgewählter vertikaler oder singulärer Text, zyklische oder unaufgelöste Forms, nicht unterstützte gezeichnete XObject-Typen und Dokumente mit Signaturfeldern werden abgelehnt; signaturerhaltendes inkrementelles Editing erfordert einen eigenen Workflow
Beispiel
Options := HPDFDefaultParagraphReflowOptions;
Options.Appearance.FontName := 'Arial';
Options.Appearance.FontSize := 11;
Source.Left := 55; Source.Bottom := 659;
Source.Right := 350; Source.Top := 714;
Target := Source;
Plan := nil;
try
if HPDFPreviewParagraphReflow(Document, 0, Source, Target,
'The Supplier must deliver signed monthly reports.', Options,
Plan, Report, CancellationToken) then
if HPDFCommitParagraphReflow(Document, Plan, Report, CancellationToken) then
Document.SaveLoadedDocument('reviewed-contract.pdf');
finally
Plan.Free;
end;
Abnahme und gespeicherte Ausgaben
Die eigenen Delphi- und FPC-Runner verwenden echte geladene PDF-Fixtures für Absätze über mehrere Baselines, partielle Operanden, verschachtelte gemeinsame Forms, abgeschnittenen Form-Text, Breiten- und Schriftänderungen, Kollisionsarten, Abbruch und Graph-Rollback
Wiederholtes Speichern als Datei/Datei und Stream/Datei erhält den bearbeiteten Graphen; frisch geladene unveränderte Dokumente behalten ihre exakten Quell-Bytes, und auf einen injizierten Ausgabeschreibfehler kann ein erfolgreicher zweiter Versuch folgen
Tests/Fixtures/ParagraphReflow/loaded-repeat-save.pdf isoliert die Speicher-Regression ohne den Absatz-Helfer: laden, einen Marker einfügen, zweimal speichern und die zweite Datei unabhängig lesen
Führen Sie Tests/Delphi/Run-ParagraphReflowTests.ps1 -Platform Win64 oder Tests/FPC/Run-ParagraphReflowTests.ps1 -Platform Win64 aus, und wählen Sie Win32 für die andere Architektur
Der optionale Python-Verifizierer Tests/Fixtures/ParagraphReflow/verify_output.py nutzt PyMuPDF, um tatsächlich gespeicherten Unicode-Text zu extrahieren und bearbeitete Seiten zu rendern; jeder Runner unterdrückt den automatischen Viewer-Start