Avgränsad styckeredigering
HPDFParagraphReflow markerar laddade glyfcentrum inom en explicit källrektangel och skriver ett nymätt stycke inom en explicit målrektangel på samma sida
Acceptansprofilen täcker Delphi Win32/Win64 och Windows FPC/Lazarus; uppmätt teckensnittsgenerering använder dokumentets befintliga appearance-byggare och dess stöd för installerade teckensnitt
Urval, layout och bevarande
Koordinater är oroterade punkter i PDF-sidans användarrymd, med uppåtgående y-axel; båda rektanglarna måste vara ändliga, ha positiva dimensioner på högst 14400 punkter och passa sidans MediaBox
Urvalet kan spänna över flera ursprungliga baslinjer och flera sidinnehållsströmmar; literala, hexadecimala, TJ-, enkla citattecken- och dubbla citattecken-textoperander skrivs om vid valda teckenkodgränser
Kvarhållna prefix, suffix, textbredder och ursprungliga numeriska kerningjusteringar stannar på plats; källtexten tas bort från verkliga operander i stället för att döljas av en bakgrundsrektangel
Nästlade Form XObjects använder sin Matrix och BBox; varje vald invokation och dess förfaderresurser kopieras privat, medan andra invokationer och andra sidor som delar original-Forms bevaras
Glyfcentrum utanför en Form-BBox utesluts; partiella källglyfgränser ger avvisning som standard, och RejectPartialSourceGlyphs = False tillåter uttryckligen borttagning av en hel teckenkod när dess centrum är valt
Appearance väljer installerat teckensnitt, stil, storlek, färg, utfyllnad, justering och policy för överfullt innehåll; målbredden styr radbrytningen, och shrink-to-fit redovisar den verkliga EffectiveFontSize
Genererad glyfgeometri tolkas och kontrolleras oberoende mot målrektangeln; rotation är låst till noll och opacitet till ett för denna avgränsade hjälpfunktion
En tom ersättning raderar den valda källtexten; sätt RequireSourceText = False för att infoga ett stycke i en tom källregion
Kollisionsbelägg
Ovald text som inte är blanksteg, XObject- och inline-bilder, ritade path-gränser och annoteringsrektanglar jämförs med de genererade ersättningsglyfernas gränser
Varje kollision anger sin sort, gränser i sidrummet, valfri omgivande text och ett ersättningsglyfindex; det totala antalet behålls även när den returnerade kollisionslistan når sitt tak
Path-kontrollpunkter, transformerade Form-klippgränser, streckbredd och miter-gränser ger konservativa lådor; shading med okänt målutsträck upptar konservativt hela målrektangeln
Detta geometritest kan överrapportera transparenta bilder, omålade annoteringsytor, kurvor, klippta paths och roterade Form-omslag; det bevisar inte pixelperfekt bläckseparation och granskar inte godtyckliga klipp-paths, blend-komponering eller teckensnittskonturer
RejectCollisions = True avvisar överlappande ersättningar utan mutering; sätts den till false behålls rapporten samtidigt som anroparens medvetna överlappspolicy tillåts
Förhandsvisning, verkställande och återställning
HPDFPreviewParagraphReflow returnerar en förseglad plan som anroparen äger, semantisk ersättningslayout, fingeravtryck och kollisionsbelägg, och rullar sedan tillbaka genererade dokumentobjekt
HPDFCommitParagraphReflow upprepar den avgränsade analysen och tillämpar planen atomärt endast när källinnehåll, Form-gränser, annoteringsgeometri och ersättningsteckensnittsgeometri fortfarande matchar förhandsvisningen
En plan tillhör samma levande dokumentinstans; frigör den när du är klar, håll dokumentet vid liv hela vägen och generera förhandsvisningen på nytt efter att ha laddat ett annat dokument eller ändrat valt innehåll
THPDFParagraphReflowSession lägger till ett tillämpat granskningstillstånd: Apply exponerar det redigerade dokumentet för extraktion eller rendering, Commit publicerar det, och Rollback eller destruktion återställer originalgrafen
Använd sessioner seriellt; dokumentet måste överleva sessionen, och andra graftransaktioner eller redigeringsanrop får inte blanda sig in medan Pending är true
Rollback återställer dokumentstatusen i minnet; redan sparade externa filer förblir anroparens ansvar
Ändligt arbete och felförlopp
Standardgränserna är 64 MiB avkodat innehåll, 64 MiB genererade strömmar, 100000000 arbetsenheter, 100000 glyfer, 250000 tokens, 12 Form-nivåer, 256 Form-invokationer, 256 returnerade kollisioner och 100000 klonade resursnoder
Kodade strängbyte kontrolleras mot den återstående glyfgränsen före glyftolkningen, så flerbyte-teckenkodningar kan konservativt förbruka mer budget än sitt antal synliga glyfer
Avkodade och genererade gränser täcker innehåll som hjälpfunktionen hanterar; genererad strömstorlek kontrolleras före publiceringen, och representerar ingen gräns för processens toppminne eller tak för alla allokeringar i byggaren för installerade teckensnitt
Avbrott är kooperativa genom innehållstokenisering och hjälpfunktionens loopar, med kontroller runt befintliga teckensnittsgenereringsanrop; behåll token tills anropet är klart
Saknad källa, ogiltig indata, kollisioner, inaktuella planer, innehåll som inte stöds, uttömda budgeter, avbrott och vanliga fel returnerar false med en explicit status och bevarar originalobjektgrafen
Vald vertikal eller enkel text, cykliska eller olösta Forms, XObject-typer som inte stöds för målning och dokument med signaturfält avvisas; inkrementell redigering med bevarade signaturer kräver ett separat arbetsflöde
Exempel
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;
Acceptans och sparad utdata
De dedikerade Delphi- och FPC-runnerarna använder verkliga laddade PDF-fixtures för flerbaslinjestycken, partiella operander, nästlade delade Forms, klippt Form-text, bredd- och teckensnittsändringar, kollisionssorter, avbrott och grafåterställning
Upprepade fil/fil- och ström/fil-sparningar bevarar den redigerade grafen; färska oförändrade laddade dokument behåller sina exakta källbyte, och ett injicerat skrivfel vid utdata kan följas av ett lyckat nytt försök
Tests/Fixtures/ParagraphReflow/loaded-repeat-save.pdf isolerar spara-regressionen utan att använda styckehjälpfunktionen: ladda, infoga en markör, spara två gånger och läs den andra filen oberoende
Kör Tests/Delphi/Run-ParagraphReflowTests.ps1 -Platform Win64 eller Tests/FPC/Run-ParagraphReflowTests.ps1 -Platform Win64, och välj Win32 för den andra arkitekturen
Den valfria Python-verifieraren Tests/Fixtures/ParagraphReflow/verify_output.py använder PyMuPDF för att extrahera verklig sparad Unicode-text och rendera redigerade sidor; varje runner undertrycker automatisk visarstart