PDFium Delphi Component Docs

Sostituzione transazionale del testo mantenendo lo stile

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);

Dichiarazioni pubbliche

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;