Begrensde paragraafbewerking

HPDFParagraphReflow selecteert geladen glyph-centra binnen een expliciete bronrechthoek en schrijft een opnieuw gemeten paragraaf binnen een expliciete doelrechthoek op dezelfde pagina

Het acceptatieprofiel dekt Delphi Win32/Win64 en Windows FPC/Lazarus; het genereren van gemeten fonts gebruikt de bestaande document appearance builder en diens installed-font-ondersteuning

Selectie, layout en behoud

Coördinaten zijn ongeroteerde PDF-paginapunten in user space met een y-as omhoog; beide rechthoeken moeten eindig zijn, positieve dimensies van hoogstens 14400 punten hebben en in de MediaBox van de pagina passen

De selectie kan meerdere oorspronkelijke baselines en meerdere page content streams bespannen; letterlijke, hexadecimale, TJ-, single-quote- en double-quote-tekstoperanden worden herschreven op geselecteerde character-code-grenzen

Behouden prefixes, suffixes, text advances en oorspronkelijke numerieke kerning-correcties blijven op hun plek; de brontekst wordt uit de werkelijke operanden verwijderd in plaats van verborgen achter een achtergrondrechthoek

Nested Form XObjects gebruiken hun Matrix en BBox; elke geselecteerde invocatie en diens voorouder-resources worden privé gekopieerd, met behoud van andere invocaties en andere pagina's die de oorspronkelijke Forms delen

Glyph-centra buiten een Form-BBox worden uitgesloten; gedeeltelijke bron-glyph-bounds leiden standaard tot afwijzing, en RejectPartialSourceGlyphs = False staat expliciet toe om een hele character code te verwijderen wanneer diens centrum geselecteerd is

Appearance kiest het installed font, de stijl, grootte, kleur, padding, uitlijning en overflow-policy; de doelbreedte stuurt het wrapping, en shrink-to-fit rapporteert de werkelijke EffectiveFontSize

gegenereerde glyph-geometrie wordt onafhankelijk geïnterpreteerd en gecontroleerd tegen de doelrechthoek; rotatie staat vast op nul en opacity op één voor deze begrensde helper

Een lege vervanging verwijdert de geselecteerde brontekst; zet RequireSourceText = False om een paragraaf in een lege bronregio in te voegen

Collision-bewijs

Niet-geselecteerde niet-witruimtetekst, XObject- en inline-afbeeldingen, getekende path-bounds en annotatierechthoeken worden vergeleken met de bounds van de gegenereerde vervangingsglyphs

Elke collision identificeert diens soort, bounds in page space, optionele naburige tekst en een vervangingsglyph-index; het totaalaantal blijft behouden ook wanneer de teruggegeven collision-lijst haar cap bereikt

Path-controlepunten, getransformeerde Form-clip-bounds, stroke-breedte en miter-limieten leveren conservatieve boxen op; shading met een onbekende verfomvang beslaat conservatief de hele doelrechthoek

Deze geometrietest kan transparante afbeeldingen, onverfde annotatiegebieden, curven, geclipte paths en geroteerde Form-enveloppen overrapporteren; ze bewijst geen pixelperfecte inkscheiding en inspecteert geen willekeurige clipping paths, blend compositing of font-outlines

RejectCollisions = True verwerpt overlappende vervangingen zonder mutatie; zet je hem op false, dan blijft het rapport bestaan terwijl de bewuste overlap-policy van de aanroeper geldt

Preview, commit en rollback

HPDFPreviewParagraphReflow geeft een plan in caller-eigendom terug dat sealed is, samen met semantische vervangingslayout, fingerprints en collision-bewijs, en rolt daarna de gegenereerde documentobjecten terug

HPDFCommitParagraphReflow herhaalt de begrensde analyse en past het plan atomair toe alleen wanneer broninhoud, Form-bounds, annotatiegeometrie en vervangingsfont-geometrie nog steeds overeenkomen met de preview

Een plan hoort bij dezelfde live documentinstantie; geef hem vrij als je klaar bent, houd het document gedurende de hele levensduur in leven en genereer de preview opnieuw na het laden van een ander document of het wijzigen van geselecteerde inhoud

THPDFParagraphReflowSession voegt een toegepaste review-status toe: Apply stelt het bewerkte document bloot voor extractie of rendering, Commit publiceert het, en Rollback of destructie herstelt de oorspronkelijke graaf

Gebruik sessions serieel; het document moet de session overleven, en andere graaftransacties of bewerkingsaanroepen mogen niet worden tussengevoegd zolang Pending true is

Rollback herstelt de in-memory documentstatus; al opgeslagen externe bestanden blijven de verantwoordelijkheid van de aanroeper

Eindig werk en faalgedrag

Standaardlimieten zijn 64 MiB gedecodeerde content, 64 MiB gegenereerde streams, 100000000 work units, 100000 glyphs, 250000 tokens, 12 Form-niveaus, 256 Form-invocaties, 256 teruggegeven collisions en 100000 gekloonde resource-nodes

Encoded string-bytes worden vóór de glyph-interpretatie gecontroleerd tegen de resterende glyph-limiet, dus multi-byte-charactercoderingen kunnen conservatief meer budget verbruiken dan hun zichtbare glyph-aantal

Gedecodeerde en gegenereerde limieten dekken content die de helper verwerkt; de grootte van gegenereerde streams wordt vóór publicatie gecontroleerd en stelt geen proces-breed geheugenplafond voor, noch begrenst hij alle allocations van de installed-font-builder

Annulering is coöperatief via content-tokenisatie en helper-loops, met checks rond bestaande font-generatieaanroepen; houd de token vast tot de aanroep afrondt

Ontbrekende bron, ongeldige invoer, collisions, verouderde plans, niet-ondersteunde content, uitgeputte budgetten, annulering en gewone fouten geven false terug met een expliciete status en behouden de oorspronkelijke objectgraaf

Geselecteerde verticale of singuliere tekst, cyclische of onopgeloste Forms, niet-ondersteunde getekende XObject-types en documenten met signature-velden worden geweigerd; signature-preserving incrementele bewerking vraagt een aparte workflow

Voorbeeld

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;

Acceptatie en opgeslagen uitvoer

De aparte Delphi- en FPC-runners gebruiken echte geladen PDF-fixtures voor multi-baseline-paragrafen, gedeeltelijke operanden, nested gedeelde Forms, geclipte Form-tekst, breedte- en fontwijzigingen, collision-soorten, annulering en graaf-rollback

Herhaalde file/file- en stream/file-opslag behouden de bewerkte graaf; verse ongewijzigde geladen documenten houden exact hun bronbytes, en een geïnjecteerde schrijffout bij de uitvoer kan worden gevolgd door een geslaagde retry

Tests/Fixtures/ParagraphReflow/loaded-repeat-save.pdf isoleert de save-regressie zonder de paragraafhelper te gebruiken: laden, een marker invoegen, twee keer opslaan en het tweede bestand onafhankelijk lezen

Draai Tests/Delphi/Run-ParagraphReflowTests.ps1 -Platform Win64 of Tests/FPC/Run-ParagraphReflowTests.ps1 -Platform Win64, en kies Win32 voor de andere architectuur

De optionele Python-verifier Tests/Fixtures/ParagraphReflow/verify_output.py gebruikt PyMuPDF om werkelijk opgeslagen Unicode-tekst te extraheren en bewerkte pagina's te renderen; elke runner onderdrukt automatisch de viewer-launch

Verwante topics

Begrensde paragraafbewerking · Options · Report