Přidejte FPdfStyledEdit a dodejte IPdfRegexEngine pro plánování a provádění náhrad nad nativními textovými objekty nejvyšší úrovně
PlanStyledPdfRegexReplacements zachytí reprodukovatelný snapshot zdroje, spojí skutečné glyphy Unicode v pořadí stránek a objektů a mapuje shody zpět na stabilní anchors objektů; generované mezery extrakce a konce řádků vynechává
ExecuteStyledPdfReplacements před změnou nezávisle načteného dokumentu ověří SHA-256 snapshotu, aktuální identitu zdroje, anchors a nepřekrývající se intervaly
Identita zdroje používá reprodukovatelnou serializaci včetně normalizovaných timestampů a identifikátorů, nikoli původní bajty souboru; plán uchovává skutečné bajty snapshotu a jejich SHA-256
Nativní font, velikost textu, barva a matice se pokud možno znovu používají; náhrady přes objekty či stránky zachovávají styl prvního objektu a odstraní spotřebované znaky z dalších objektů při zachování zbývajícího textu a pořadí stránek
FallbackFontName explicitně vybere standardní PostScript font, pokud nelze reprodukovat nativní Unicode; ForceFallbackFont žádá tuto cestu přímo
Fallback zachovává pořadí kreslení, matici, režim vykreslení a atributy fill a stroke; objekty s clippingem, průhledností, marked content nebo tagy odmítá, místo aby potichu ztratil jejich grafickou sémantiku
Text širší než zdrojové hranice může vodorovně zmenšit, pokud je matice vzpřímená a bez shear; MinHorizontalScale má výchozí hodnotu 0.5, užší náhradní text zachová původní matici
Tento postup podporuje jednořádkový náhradní text a omezený vodorovný fitting; neprochází vnořené Form XObjects, nepřepisuje sémantiku Tagged PDF ani nepřeformátovává odstavce
Podepsané či šifrované dokumenty a XFA se odmítají; zrušení, zastaralé plány, neplatné UTF-16, nepodporovaná písma či vyčerpané rozpočty ponechají dokument volajícího beze změny
PreviewOnly vrací nezávisle znovu otevřený výsledek v PreviewPdf bez náhrady dokumentu volajícího; úspěšný Commit nahrazuje dokument až po ověření extrakce glyphů a počtu stránek po uložení a opětovném otevření
Všechny shody se skládají do konečného textu objektu před změnou nativních objektů; fitting a minimální scale se ověří jednou proti původním hranicím, aby opakované shody nehromadily přílišné zmenšení
Prázdný náhradní text po dokončení všech anchored úprav odstraní úplně spotřebovaný textový objekt; více náhrad se provádí odzadu, aby starší zdrojové offsety zůstaly platné
Výchozí limity jsou 256 MiB dokumentových bajtů, 10,000 stránek, 100,000 textových objektů, 16,777,216 jednotek UTF-16 a 100,000 náhrad; rozpočet skenování textu je 67,108,864 nativních návštěv znaků a kopírovaných jednotek plánování UTF-16
Pevná maxima zachovávají tyto limity stránek, objektů, znaků a náhrad, dovolují 512 MiB dokumentových bajtů a 1,073,741,824 návštěv skenování a omezují název fallback fontu na 1,024 bajtů
Report obsahuje SHA-256 zdroje a výstupu, počty aplikovaných náhrad, fallbacků a škálování a původní/konečný text i hranice každého objektu v bodech uživatelského prostoru PDF; indexy stránek a objektů jsou zdrojové indexy od nuly
Nahrazování textu není workflow bezpečnostní redakce; pro odstranění citlivého obsahu a souvisejících dat dokumentu použijte vyhrazená API redakce
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;