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