Lägg till FPdfStyledEdit och tillhandahåll en IPdfRegexEngine för att planera och utföra ersättningar mot nativa textobjekt på toppnivå
PlanStyledPdfRegexReplacements fångar en reproducerbar källögonblicksbild, sammanfogar faktiska Unicode-glyfer i sid- och objektordning och mappar träffar tillbaka till stabila objektankare; genererade extraktionsmellanslag och radbrytningar undantas
ExecuteStyledPdfReplacements validerar ögonblicksbildens SHA-256, aktuell källidentitet, ankare och överlappningsfria intervall innan ett oberoende inläst dokument ändras
Källidentiteten använder reproducerbar serialisering, inklusive normaliserade tidsstämplar och identifierare, i stället för originalfilens byte; planen lagrar de faktiska ögonblicksbildsbytena och deras SHA-256
Nativt teckensnitt, textstorlek, färg och matris återanvänds där det är möjligt; ersättningar som spänner över objekt eller sidor behåller första objektets stil och tar bort förbrukade tecken från senare objekter, samtidigt som kvarvarande text och sidordning bevaras
FallbackFontName väljer explicit ett standard PostScript-teckensnitt när nativ Unicode inte kan återskapas; ForceFallbackFont begär den vägen direkt
Fallback bevarar målarens ordning, matris, renderingsläge och fyllnads- och streckattribut; utklippta, transparenta, märkta eller taggade objekt avvisas i stället för att tyst tappa sin grafiksemantik
Text som är bredare än sina källgränser får krympa horisontellt när dess matris är upprätt och oskevad; MinHorizontalScale har 0.5 som standard, och smalare ersättningstext behåller den ursprungliga matrisen
Detta arbetsflöde stödjer ersättningstext på en rad och avgränsad horisontell anpassning; det går inte igenom kapslade Form XObjects, skriver inte om Tagged PDF-semantik och utför ingen styckesreflow
Signerade eller krypterade dokument samt XFA avvisas; avbrytning, inaktuella planer, ogiltig UTF-16, teckensnitt som inte stöds och förbrukade budgetar lämnar anroparens dokument oförändrat
PreviewOnly returnerar det oberoende återöppnade resultatet i PreviewPdf utan att ersätta anroparens; en lyckad commit ersätter dokumentet först efter att glyfextraktion och sidantal har verifierats efter sparning och återöppning
Alla träffar sammanställs till slutlig objekttext innan nativa objekt ändras; anpassning och minsta skala kontrolleras en gång mot de ursprungliga gränserna, vilket hindrar upprepade träffar från att ackumulera överdriven krympning
Tom ersättningstext tar bort ett fullständigt förbrukat textobjekt efter alla förankrade ändringar; flera ersättningar körs baklänges så att tidigare källoffset förblir giltiga
Standardgränserna är 256 MiB dokumentbyte, 10,000 sidor, 100,000 textobjekt, 16,777,216 UTF-16-enheter och 100,000 ersättningar; textskanningsarbetsbudgeten är 67,108,864 nativa teckenbesök och UTF-16-planeringskopienheter
Hårda maxgränser behåller sid-, objekt-, tecken- och ersättningsgränserna, tillåter 512 MiB dokumentbyte och 1,073,741,824 skanningsbesök, och begränsar ett fallback-teckensnittsnamn till 1,024 byte
Rapporten innehåller käll- och utdata-SHA-256-värden, antal tillämpade ersättningar, typsnittsfall tillbaka och skalningar, samt per objekt ursprunglig/slutlig text och gränser i PDF-användarrymdens punkter; sid- och objektindex är nollbaserade källindex
En ersättningsoperation är inte ett säkerhetsarbetsflöde för svartning; använd de dedikerade svartnings-API:erna för att ta bort känsligt innehåll och tillhörande dokumentdata
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;