Aggiungere FPdfStyledEdit e fornire un IPdfRegexEngine per pianificare ed eseguire sostituzioni sugli oggetti di testo nativi di primo livello
PlanStyledPdfRegexReplacements acquisisce uno snapshot riproducibile della sorgente, concatena i glifi Unicode reali nell'ordine di pagine e oggetti e riconduce le corrispondenze ad ancore stabili degli oggetti; esclude spazi e interruzioni di riga generati dall'estrazione
ExecuteStyledPdfReplacements verifica SHA-256 dello snapshot, identità sorgente attuale, ancore e intervalli non sovrapposti prima di modificare un documento caricato indipendentemente
L'identità sorgente usa una serializzazione riproducibile, con timestamp e identificatori normalizzati, anziché i byte del file originale; il piano conserva i veri byte dello snapshot e il relativo SHA-256
Font nativo, dimensione del testo, colore e matrice vengono riutilizzati quando possibile; sostituzioni tra oggetti o pagine mantengono lo stile del primo oggetto ed eliminano i caratteri consumati da quelli successivi, conservando testo residuo e ordine delle pagine
FallbackFontName sceglie esplicitamente un font PostScript standard quando l'Unicode nativo non è riproducibile; ForceFallbackFont richiede direttamente questa strada
Il fallback mantiene ordine di disegno, matrice, modalità di rendering e attributi di riempimento e tratto; oggetti con clipping, trasparenza, marked content o tag sono rifiutati anziché perdere silenziosamente la semantica grafica
Il testo più largo dei limiti sorgente può essere compresso orizzontalmente se la matrice è diritta e senza shear; MinHorizontalScale vale 0.5 per impostazione predefinita e il testo sostitutivo più stretto mantiene la matrice originale
Questo flusso supporta testo sostitutivo su una sola riga e adattamento orizzontale entro limiti; non attraversa Form XObject annidati, non riscrive la semantica Tagged PDF e non ridispone i paragrafi
Documenti firmati o cifrati e XFA sono rifiutati; annullamento, piani non aggiornati, UTF-16 non valido, font non supportati e limiti esauriti lasciano invariato il documento del chiamante
PreviewOnly restituisce in PreviewPdf il risultato riaperto indipendentemente senza sostituire il documento del chiamante; un commit riuscito lo sostituisce solo dopo aver verificato estrazione dei glifi e numero delle pagine a seguito di salvataggio e riapertura
Tutte le corrispondenze vengono assemblate nel testo finale degli oggetti prima di modificarli; adattamento e scala minima sono controllati una sola volta rispetto ai limiti originali, evitando che corrispondenze ripetute accumulino un restringimento eccessivo
Una sostituzione vuota elimina un oggetto di testo interamente consumato dopo tutte le modifiche ancorate; più sostituzioni vengono eseguite a ritroso per conservare validi gli offset sorgente precedenti
I limiti predefiniti sono 256 MiB di byte del documento, 10,000 pagine, 100,000 oggetti di testo, 16,777,216 unità UTF-16 e 100,000 sostituzioni; il limite del lavoro di scansione è 67,108,864 visite a caratteri nativi e unità di copia UTF-16 nella pianificazione
I massimi rigidi mantengono i limiti di pagine, oggetti, caratteri e sostituzioni, consentono 512 MiB di byte del documento e 1,073,741,824 visite di scansione e limitano il nome del font di fallback a 1,024 byte
Il report include SHA-256 sorgente e output, conteggi di sostituzioni applicate, fallback e adattamenti di scala e testo e limiti originali e finali di ogni oggetto in punti nello spazio utente PDF; indici di pagina e oggetto sono quelli sorgente a base zero
Una sostituzione non costituisce un flusso di redazione di sicurezza; per eliminare contenuti sensibili e dati associati del documento usare le API dedicate alla redazione
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;