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

Verwandte Themen

Begrenztes Absatz-Editing · Optionen · Bericht