Afgrænset afsnitsredigering
HPDFParagraphReflow vælger indlæste glyph-centre inden for et eksplicit kilderektangel og skriver et nymålt afsnit inden for et eksplicit targetrektangel på samme side
Acceptprofilen dækker Delphi Win32/Win64 og Windows FPC/Lazarus; målt fontgenerering bruger den eksisterende dokument appearance-builder og dens installeret-font-understøttelse
Markering, layout og bevaring
Koordinater er uroterede PDF-side user space-points med en opadgående y-akse; begge rektangler skal være finitære, have positive dimensioner på højst 14400 points og passe i sidens MediaBox
Markeringen kan spænde over flere originale baselines og flere sideindholdsstreams; literal, hexadecimale, TJ, enkelte citat- og dobbelte citat-tekstoperatorer omskrives ved valgte tegnkode-grænser
Beholdte præfikser, suffikser, tekst-advances og originale numeriske kerning-justeringer forbliver på plads; kildeteksten fjernes fra faktiske operatorer snarere end skjult af en baggrundrektangel
Nestede Form XObjects bruger deres Matrix og BBox; hver valgt invokation og dens forfader-ressourcer kopieres privat, hvilket bevarer andre invokationer og andre sider, der deler de originale Forms
Glyph-centre uden for en Form BBox ekskluderes; delvise kilde glyph-beggrundskanter afvises som standard, og RejectPartialSourceGlyphs = False tillader eksplicit fjernelse af en hel tegnkode, når dens center er valgt
Appearance vælger installeret font, stil, størrelse, farve, padding, justering og overflow-politik; targetbredde styrer ombrydning, og shrink-to-fit rapporterer den faktiske EffectiveFontSize
Genereret glyph-geometri fortolkes uafhængigt og tjekkes mod targetrektanglet; rotation er fastlåst til nul, og opacitet til én for denne afgrænsede helper
En tom erstatning sletter den valgte kildetekst; sæt RequireSourceText = False for at indsætte et afsnit i en tom kilderegion
Kollisionsevidence
Uvalgt ikke-whitespace tekst, XObject- og inline-billeder, malede path-beggrundskanter og annotationsrektangler sammenlignes med de genererede erstatnings-glyph-beggrundskanter
Hver kollision identificerer sin kind, side rum-beggrundskanter, valgfri nabotekst og et erstatnings-glyph-indeks; det samlede antal beholdes, selv når den returnerede kollisionsliste når sit loft
Path-kontrolpunkter, transformerede Form clip-beggrundskanter, stregbredde og miter-grænser giver konservative bokse; shading med ukendt male-udstrækning optager konservativt hele targetrektanglet
Denne geometritest kan overrapportere transparente billeder, umalede annotationsområder, kurver, clippede paths og roterede Form-kuverter; den beviser ikke pixel-perfekt blæk-adskillelse eller inspicerer vilkårlige clip-paths, blend-komposition eller font-outlines
RejectCollisions = True afviser overlappende erstatninger uden mutation; at sætte den til false beholder rapporten, mens kalderens bevidste overlapspolitik tillades
Preview, commit og rollback
HPDFPreviewParagraphReflow returnerer en kalder-ejet forseglet plan, semantisk erstatningslayout, fingeraftryk og kollisionsevidence og ruller derefter genererede dokumentobjekter tilbage
HPDFCommitParagraphReflow gentager den afgrænsede analyse og anvender atomisk planen kun, når kildeindhold, Form-beggrundskanter, annotationsgeometri og erstatningsfont-geometri stadig matcher previewet
En plan tilhører samme live dokumentinstans; frigør den, når du er færdig, hold dokumentet i live hele vejen, og generér previewet igen efter indlæsning af et andet dokument eller ændring af valgt indhold
THPDFParagraphReflowSession tilføjer en anvendt gennemgangstilstand: Apply udstiller det redigerede dokument til ekstraktion eller rendering, Commit publicerer det, og Rollback eller destruktion gendanner den originale graf
Brug sessioner serielt; dokumentet skal overleve sessionen, og andre graftransaktioner eller redigeringskald må ikke interleaves, mens Pending er true
Rollback gendanner in-memory dokumenttilstand; allerede gemte eksterne filer forbliver kalderens ansvar
Endeligt arbejde og fejladfærd
Standardgrænser er 64 MiB dekodet indhold, 64 MiB genererede streams, 100000000 arbejdsunits, 100000 glyphs, 250000 tokens, 12 Form-niveauer, 256 Form-invokationer, 256 returnerede kollisioner og 100000 klonede ressourcenoder
Encodede streng-bytes tjekkes inden glyph-fortolkning mod den resterende glyph-grænse, så multi-byte tegnencodings konservativt kan forbruge mere budget end deres synlige glyph-antal
Dekodede og genererede grænser dækker indhold håndteret af helperen; genereret streamstørrelse tjekkes inden publicering og repræsenterer ikke en proces peak memory-grænse eller begrænser alle installeret-font-builder-allokeringer
Cancellation er kooperativ gennem content-tokenisering og helper-løkker med tjek omkring eksisterende font-genereringskald; behold tokenet, indtil kaldet fuldføres
Manglende kilde, ugyldigt input, kollisioner, forældede planer, ikke-understøttet indhold, opbrugte budgetter, cancellation og almindelige fejl returnerer false med en eksplicit status og bevarer den originale objektgraf
Valgt lodret eller singular tekst, cykliske eller uopløste Forms, ikke-understøttede malede XObject-typer og dokumenter med signaturfelter afvises; signaturbevarende inkrementel redigering kræver et separat workflow
Eksempel
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;
Accept og gemt output
De dedikerede Delphi- og FPC-runnerne bruger rigtige indlæste PDF-fixtures til multi-baseline afsnit, delvise operander, nestede delte Forms, clippe Form-tekst, bredde- og fontændringer, kollisionskind, budgetter, cancellation og gem/regressioner
Gentagne fil/fil- og stream/fil-gemninger bevarer den redigerede graf; friske uændrede indlæste dokumenter beholder deres eksakte kilde-bytes, og en injiceret output-skrivefejl kan følges af en succesfuld retry på samme dokument
Tests/Fixtures/ParagraphReflow/loaded-repeat-save.pdf isolerer gem-regressionen uden at bruge afsnit-helperen: indlæs, indsæt en markør, gem to gange og læs den anden fil uafhængigt
Kør Tests/Delphi/Run-ParagraphReflowTests.ps1 -Platform Win64 eller Tests/FPC/Run-ParagraphReflowTests.ps1 -Platform Win64 og vælg Win32 for den anden arkitektur
Den valgfrie Python-verifikator Tests/Fixtures/ParagraphReflow/verify_output.py bruger PyMuPDF til at udtrække faktisk gemt Unicode-tekst og rendere redigerede sider; enhver runner undertrykker automatisk viewer-start