Voeg FPdfStyledEdit toe en lever een IPdfRegexEngine om vervangingen op native top-level tekstobjecten te plannen en uit te voeren
PlanStyledPdfRegexReplacements legt een reproduceerbare bronsnapshot vast, voegt de echte Unicode-glyphs samen in pagina- en objectvolgorde en wijst treffers terug aan stabiele objectankers; gegenereerde spaties en regeleinden uit de extractie blijven buiten beschouwing
ExecuteStyledPdfReplacements valideert de snapshot-SHA-256, de huidige bronidentiteit, de ankers en niet-overlappende intervallen voordat een onafhankelijk geladen document wordt gewijzigd
De bronidentiteit gebruikt reproduceerbare serialisatie, inclusief genormaliseerde timestamps en identifiers, in plaats van de oorspronkelijke bestandsbytes; het plan bewaart de feitelijke snapshotbytes en hun SHA-256
Native font, tekengrootte, kleur en matrix worden waar mogelijk hergebruikt; vervangingen die objecten of pagina's overspannen behouden de stijl van het eerste object en verwijderen verbruikte tekens uit latere objecten, met behoud van resterende tekst en paginavolgorde
FallbackFontName kiest expliciet een standaard PostScript-font wanneer native Unicode niet gereproduceerd kan worden; ForceFallbackFont vraagt dat pad direct aan
De fallback behoudt de tekenvolgorde, matrix, renderingmodus en vul- en lijneigenschappen; geclipte, transparante, gemarkeerde of getagde objecten worden geweigerd in plaats van stilletjes hun grafische semantiek te verliezen
Tekst die breder is dan zijn bronbegrenzing kan horizontaal krimpen wanneer zijn matrix rechtop en zonder afschuiving is; MinHorizontalScale staat standaard op 0.5, en smallere vervangingstekst behoudt de oorspronkelijke matrix
Deze werkstroom ondersteunt vervangingstekst van één regel en begrensd horizontaal inpassen; hij doorloopt geen geneste Form XObjects, herschrijft geen Tagged PDF-semantiek en doet geen alinea-herflow
Ondertekende of versleutelde documenten en XFA worden geweigerd; annulering, verouderde plannen, ongeldige UTF-16, niet-ondersteunde fonts en uitgeputte budgetten laten het document van de aanroeper ongewijzigd
PreviewOnly geeft het onafhankelijk heropende resultaat terug in PreviewPdf zonder de aanroeper te vervangen; een geslaagde commit vervangt het document pas nadat glyphextractie en pagina-aantal na opslaan en heropenen zijn geverifieerd
Alle treffers worden samengevoegd tot de definitieve objecttekst voordat native objecten worden gewijzigd; inpassen en de minimale schaal worden één keer tegen de oorspronkelijke begrenzing gecontroleerd, zodat herhaalde treffers geen overmatige krimp ophopen
Lege vervangingstekst verwijdert een volledig verbruikt tekstobject nadat alle geankerde bewerkingen zijn uitgevoerd; meervoudige vervangingen lopen achterstevoren zodat eerdere bronoffsets geldig blijven
Standaardlimieten zijn 256 MiB aan documentbytes, 10,000 pagina's, 100,000 tekstobjecten, 16,777,216 UTF-16-eenheden en 100,000 vervangingen; het werkbudget voor het tekstscangen is 67,108,864 native tekenbezoeken en UTF-16-plankopie-eenheden
Harde maxima behouden die paginagebonden, object-, teken- en vervangingslimieten, staan 512 MiB aan documentbytes en 1,073,741,824 scanbezoeken toe en begrenzen een fallback-fontnaam op 1,024 bytes
Het rapport bevat bron- en uitvoer-SHA-256-waarden, aantallen toegepaste vervangingen, fallbacks en schalingen, en per object de oorspronkelijke/definitieve tekst en begrenzing in PDF-user-space-punten; pagina- en objectindexen zijn op 0 gebaseerde bronindexen
Een vervangingsoperatie is geen security-redaction-werkstroom; gebruik de specifieke redaction-API's om gevoelige inhoud en bijbehorende documentgegevens te verwijderen
Options := TPdfStyledEditOptions.Default; Plan := PlanStyledPdfRegexReplacements(Pdf, Pattern, Replacement, Engine, Options); Options.PreviewOnly := True; if not ExecuteStyledPdfReplacements(Pdf, Plan, Options, PreviewPdf, Report) then raise EPdfProduction.Create(Report.ErrorMessage);
type
TPdfStyledEditOptions= record
MaxDocumentBytes: Integer;
MaxPages, MaxTextObjects, MaxCharacters, MaxReplacements: Integer;
MaxTextScanWork: Int64;
MinHorizontalScale: Double;
FallbackFontName: AnsiString;
ForceFallbackFont: Boolean;
PreviewOnly: Boolean;
CancellationToken: IPdfCancellationToken;
class function Default: TPdfStyledEditOptions; static;
end;
TPdfStyledEditPlan= record
SourceSha256: string;
SourceBytes: TBytes;
Spans: TPdfStyledSpans;
Replacements: TPdfStyledReplacements;
end;
TPdfStyledObjectChange= record
PageIndex, ObjectIndex: Integer;
BeforeText, AfterText: WideString;
BeforeBounds, AfterBounds: TPdfRectangle;
HorizontalScale: Double;
FontFallback: Boolean;
end;
TPdfStyledObjectChanges= array of TPdfStyledObjectChange;
TPdfStyledEditReport= record
Succeeded, Cancelled, PreviewOnly: Boolean;
AppliedReplacementCount, FontFallbackCount, ScaledObjectCount: Integer;
SourceSha256, OutputSha256, ErrorMessage: string;
Changes: TPdfStyledObjectChanges;
end;
function PlanStyledPdfRegexReplacements(Pdf: TPdf;
const Pattern, Replacement: WideString; Engine: IPdfRegexEngine;
const Options: TPdfStyledEditOptions): TPdfStyledEditPlan;
function ExecuteStyledPdfReplacements(Pdf: TPdf;
const Plan: TPdfStyledEditPlan; const Options: TPdfStyledEditOptions;
out PreviewPdf: TBytes; out Report: TPdfStyledEditReport): Boolean;