PDFium Component Docs

Transakcyjne zastępowanie tekstu ze stylem

Dodaj FPdfStyledEdit i dostarcz IPdfRegexEngine, aby planować i wykonywać podstawienia wobec natywnych obiektów tekstowych najwyższego poziomu

PlanStyledPdfRegexReplacements pobiera odtwarzalną migawkę źródła, skleja rzeczywiste glify Unicode w kolejności stron i obiektów oraz mapuje dopasowania z powrotem na stabilne kotwice obiektów; wygenerowane spacje i łamania linii z ekstrakcji są wykluczane

ExecuteStyledPdfReplacements waliduje SHA-256 migawki, bieżącą tożsamość źródła, kotwice i nakładające się na siebie interwały przed zmianą niezależnie wczytanego dokumentu

Tożsamość źródła używa odtwarzalnej serializacji, w tym znormalizowanych znaczników czasu i identyfikatorów, zamiast oryginalnych bajtów pliku; plan przechowuje rzeczywiste bajty migawki i ich SHA-256

Natywna czcionka, rozmiar tekstu, kolor i macierz są ponownie używane, gdzie to możliwe; podstawienia obejmujące wiele obiektów lub stron zachowują styl pierwszego obiektu i usuwają skonsumowane znaki z dalszych obiektów, zachowując pozostały tekst i kolejność stron

FallbackFontName jawnie wybiera standardową czcionkę PostScript, gdy natywnego Unicode nie da się odtworzyć; ForceFallbackFont żąda tej ścieżki bezpośrednio

Fallback zachowuje kolejność malarza, macierz, tryb renderowania oraz atrybuty wypełnienia i konturu; obiekty przycinane, przezroczyste, oznaczone lub tagowane są odrzucane, zamiast po cichu tracić swoją semantykę graficzną

Tekst szerszy niż granice źródła może zostać przeskalowany poziomo, gdy jego macierz jest pionowa i bez ścinania; MinHorizontalScale domyślnie wynosi 0.5, a węższy tekst zastępczy zachowuje oryginalną macierz

Ten przepływ obsługuje jednolinijkowy tekst zastępczy i ograniczone dopasowanie poziome; nie przechodzi przez zagnieżdżone Form XObject, nie przepisuje semantyki Tagged PDF ani nie wykonuje reflow akapitów

Dokumenty podpisane lub szyfrowane oraz XFA są odrzucane; anulowanie, nieaktualne plany, nieprawidłowe UTF-16, nieobsługiwane czcionki i wyczerpane budżety pozostawiają dokument wywołującego bez zmian

PreviewOnly zwraca niezależnie otwarty wynik w PreviewPdf bez podmiany dokumentu wywołującego; udane zatwierdzenie podmienia dokument dopiero po zweryfikowaniu ekstrakcji glifów i liczby stron po zapisie i ponownym otwarciu

Wszystkie dopasowania są składane w finalny tekst obiektu przed zmianą obiektów natywnych; dopasowanie i minimalna skala są sprawdzane raz wobec pierwotnych granic, co zapobiega kumulowaniu nadmiernego zmniejszenia przy powtórzonych dopasowaniach

Pusty tekst zastępczy usuwa w pełni skonsumowany obiekt tekstowy po wszystkich zakotwiczonych edycjach; wielokrotne podstawienia działają od tyłu, aby wcześniejsze offsety źródła pozostały ważne

Domyślne limity to 256 MiB bajtów dokumentu, 10,000 stron, 100,000 obiektów tekstowych, 16,777,216 jednostek UTF-16 i 100,000 podstawień; budżet pracy skanowania tekstu to 67,108,864 wizyt natywnych znaków i jednostek kopii planowania UTF-16

Twarde maksima zachowują te limity stron, obiektów, znaków i podstawień, pozwalają na 512 MiB bajtów dokumentu i 1,073,741,824 wizyt skanowania oraz ograniczają nazwę czcionki zapasowej do 1,024 bajtów

Raport zawiera wartości SHA-256 źródła i wyjścia, liczniki zastosowanych podstawień, fallbacków i skalowań oraz per obiekt oryginalny/końcowy tekst i granice w punktach przestrzeni użytkownika PDF; indeksy stron i obiektów są liczone od zera według źródła

Operacja podstawienia nie jest przepływem redakcji bezpieczeństwa; do usuwania wrażliwej treści i powiązanych danych dokumentu użyj dedykowanych API redakcji

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

Public declarations

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;