Bounded paragraph editing

HPDFParagraphReflow vybere středy načtených glyfů uvnitř explicitního zdrojového obdélníku a zapíše nově naměřený odstavec uvnitř explicitního cílového obdélníku na týže stránce

Akceptační profil pokrývá Delphi Win32/Win64 a Windows FPC/Lazarus; generování naměřených písem používá stávající builder appearance dokumentu a jeho podporu instalovaných písem

Výběr, layout a zachování

Souřadnice jsou neotočené PDF body v user space stránky, s osou y směřující nahoru; oba obdélníky musí být konečné, mít kladné rozměry nejvýše 14400 bodů a vejít se do MediaBoxu stránky

Výběr může přesahovat víc původních baseline i víc content streamů stránky; textové operandy literal, hexadecimální, TJ, jednoduché uvozovky i dvojité uvozovky se přepisují na vybraných hranicích znakových kódů

Držené předpony, přípony, textové advancy i původní číselné kerning úpravy zůstávají na místě; zdrojový text se odstraní ze skutečných operandů, nikoli se schová za pozadí obdélníkem

Vnořené Form XObject použijí svou Matrix a BBox; každé vybrané vyvolání i jeho předkové resource se zkopírují soukromě, se zachováním ostatních vyvolání i jiných stránek sdílejících původní Form

Středy glyfů mimo Form BBox se vyloučí; částečné zdrojové glyfové meze defaultně odmítnou a RejectPartialSourceGlyphs = False explicitně dovolí odebrání celého znakového kódu, když je jeho střed vybraný

Appearance volí instalované písmo, styl, velikost, barvu, padding, zarovnání i politiku přetečení; cílová šířka řídí zalamování a shrink-to-fit reportuje skutečné EffectiveFontSize

Generovaná glyfová geometrie se interpretuje nezávisle a kontroluje proti cílovému obdélníku; u tohoto ohraničeného helperu je rotace pevně nulová a opacity jedničková

Prázdná náhrada vybraný zdrojový text smaže; nastavte RequireSourceText = False, chcete-li vložit odstavec do prázdné zdrojové oblasti

Důkazy kolizí

Ne vybraný netextový text, XObject i inline obrázky, malované meze cest i anotační obdélníky se porovnávají s mezními obdélníky generované náhrady glyfů

Každá kolize identifikuje svůj druh, meze v page space, volitelný okolní text i index náhradního glyfu; celkový počet se uchová, i když vrácený seznam kolizí dosáhne svého stropu

Kontrolní body cest, transformované meze clipu Form, šířka tahu i meze miter vytvoří konzervativní boxy; shading s neznámým rozsahem malby konzervativně zaujme celý cílový obdélník

Ten geometrický test může přehlásit průhledné obrázky, nemalované anotační oblasti, křivky, oříznuté cesty i otočené obálky Form; nedokazuje pixelově dokonalé oddělení inku ani neprohlíží libovolné ořezové cesty, blend skládání ani glyfové obrysy

RejectCollisions = True odmítne překrývající se náhrady bez mutace; nastavení false si report uchová a zároveň dovolí záměrnou politiku překryvů volajícího

Náhled, commit a rollback

HPDFPreviewParagraphReflow vrátí zapečetěný plán vlastněný volajícím, sémantický náhradní layout, fingerprinty i důkazy kolizí, a pak odroluje generované dokumentové objekty

HPDFCommitParagraphReflow zopakuje ohraničenou analýzu a atomicky aplikuje plán jen tehdy, když zdrojový obsah, meze Form, anotační geometrie i náhradní fontová geometria pořád odpovídají náhledu

Plán patří k téže živé instanci dokumentu; po dokončení ho uvolněte, dokument držte naživu po celou dobu a náhled zregenerujte po načtení jiného dokumentu či změně vybraného obsahu

THPDFParagraphReflowSession přidává aplikovaný revizní stav: Apply vystaví editovaný dokument extrakci či renderování, Commit ho publikuje a Rollback či zničení obnoví původní graf

Sezení používejte sériově; dokument musí žít déle než sezení a jiné grafové transakce či editační volání se nesmí míchat, dokud je Pending true

Rollback obnoví stav dokumentu v paměti; už uložené externí soubory zůstávají odpovědností volajícího

Konečná práce a chování selhání

Defaultní limity jsou 64 MiB dekódovaného obsahu, 64 MiB generovaných streamů, 100000000 pracovních jednotek, 100000 glyfů, 250000 tokenů, 12 úrovní Form, 256 vyvolání Form, 256 vrácených kolizí a 100000 klonovaných resource uzlů

Kódované bajty řetězců se kontrolují před interpretací glyfů proti zbývajícímu limitu glyfů, takže vícebajtová znaková kódování mohou konzervativně konzumovat víc rozpočtu než svůj viditelný počet glyfů

Dekódované i generované limity pokrývají obsah zpracovaný helperem; velikost generovaného streamu se kontroluje dřív než publikace a nereprezentuje limit špičkové paměti procesu ani strop všech alokací buildera instalovaných písem

Zrušení je kooperativní skrz tokenizaci obsahu a smyčky helperu, s kontrolami kolem stávajících volání generování písem; token držte, dokud volání neskončí

Chybějící zdroj, neplatný vstup, kolize, zastaralé plány, nepodporovaný obsah, vyčerpané rozpočty, zrušení i běžná selhání vrátí false s explicitním statusem a zachovají původní objektový graf

Vertikální či jednotný vybraný text, cyklické či nerozřešené Form, nepodporované malované typy XObject i dokumenty s poli podpisů se odmítnou; inkrementální editace zachovávající podpisy vyžaduje samostatné workflow

Příklad

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;

Akceptace a ukládaný výstup

Věnované Delphi i FPC runnery použijí skutečné načtené PDF fixtury pro odstavce přes víc baseline, částečné operandy, vnořené sdílené Form, oříznutý text Form, změny šířky i písma, druhy kolizí, zrušení i rollback grafu

Opakované ukládání soubor/soubor i stream/soubor zachovává editovaný graf; čerstvé nezměněné načtené dokumenty si uchovají své přesné zdrojové bajty a vstříknutá chyba zápisu výstupu může být následovaná úspěšným retry

Tests/Fixtures/ParagraphReflow/loaded-repeat-save.pdf izoluje save regresi bez použití paragraph helperu: načtěte, vložte marker, uložte dvakrát a nezávisle přečtěte druhý soubor

Spusťte Tests/Delphi/Run-ParagraphReflowTests.ps1 -Platform Win64 či Tests/FPC/Run-ParagraphReflowTests.ps1 -Platform Win64 a pro druhou architekturu vyberte Win32

Volitelný Python verifikátor Tests/Fixtures/ParagraphReflow/verify_output.py použije PyMuPDF k extrakci skutečně uloženého Unicode textu i renderování editovaných stránek; každý runner potlačí automatické spuštění čtečky

Související témata

Ohraničená editace odstavců · Volby · Report