Verktygs- och hjälparklasser
Verktygs- och hjälparklasser
Denna guide visar hur man använder de små, fokuserade hjälparklasserna som Aspose.PDF FOSS för .NET levererar för vanliga låg-nivå-uppgifter: heltalsmatematik som används av säkerhetsprimitiver, regex-sökkonfiguration, PostScript funktionsutvärdering, extern teckensnittsupptäckt, vektorundervägsextraktion, fysisk textmätning, buffrade innehållsströmsredigeringar, stora minnesströmmar och rapportering av biblioteksversion. Dessa klasser är inte självständiga ingångspunkter, men de stödjer högre nivåers dokument-, text- och renderingsoperationer i hela API.
Hjälparklasser för heltalsmatematik
MathExtensions är en liten statisk hjälparfunktion som används internt av bibliotekets säkerhetsprimitiver, men den är tillgänglig för allmänt bruk när du behöver en modulooperation som alltid returnerar ett icke-negativt resultat.
// Unlike the C# % operator, Mod never returns a negative value.
int wrapped = MathExtensions.Mod(-3, 5); // 2Regex-sökkonfiguration
RegexManager är en statisk klass som konfigurerar regex-motorn som används av textsökoperationer såsom TextFragmentAbsorber. Ställ in MatchTimeout för att begränsa hur länge ett mönster får köras, och aktivera NonBacktracking för att använda den icke-backtracking regex-motorn för prestandakänsliga sökningar.
using var doc = Document.Open(pdfBytes);
// Guard against runaway regex patterns.
RegexManager.MatchTimeout = TimeSpan.FromSeconds(5);
RegexManager.NonBacktracking = true;
var absorber = new TextFragmentAbsorber(@"\d{3}-\d{4}", true);
doc.Pages[1].Accept(absorber);Utvärdera PostScript funktioner
PostScriptEvaluator är en statisk klass som utvärderar Type 4 PDF-funktioner (PDF32000 §7.10.5) — PostScript kalkylatorprogram inbäddade i en PDF, såsom de som används i vissa färgrymds- och skuggdefinitioner.
double[] inputs = { 0.5 };
// Evaluate a PostScript calculator program against the input array.
var outputs = PostScriptEvaluator.Evaluate("{ 2 mul }", inputs);Externa teckensnittssökvägar
ExternalFontCache hanterar de mappar som söks efter externa (icke-inbäddade) TrueType/OpenType-ansikten under rendering och konvertering. Använd Instance för att nå singletonen, GetDefaultFontsFolders för att inspektera de inbyggda sökplatserna, och SetFontsFolders för att lägga till eller ersätta dem.
var cache = ExternalFontCache.Instance;
var defaultFolders = cache.GetDefaultFontsFolders();
// reset: false appends to the existing search paths instead of replacing them.
cache.SetFontsFolders(new[] { @"C:\Fonts\Custom" }, reset: false);Extrahering av vektorsubvägar
GraphicsAbsorber besöker en sida och extraherar dess målade vektorsubvägar som SubPath-element, var och en med sin egen sidrymds avgränsande Rectangle. Detta är användbart för att inspektera eller mäta vektorillustrationer utan att manuellt parsra innehållsströmmen.
using var doc = Document.Open(pdfBytes);
var absorber = new GraphicsAbsorber();
absorber.Visit(doc.Pages[1]);
Console.WriteLine($"Elements found: {absorber.Elements.Count}");
foreach (var element in absorber.Elements)
{
if (element is SubPath subPath)
{
Rectangle bounds = subPath.Rectangle;
Console.WriteLine($"Sub-path bounds: [{bounds.LLX}, {bounds.LLY}, {bounds.URX}, {bounds.URY}]");
}
}Mätning av fysiska textsegment
PhysicalTextSegment är sidrymdens projektion av en absorberad TextSegment. Nå den via TextSegment.PhysicalSegment för att mäta en sekvens av tecken eller läsa dess lösta TextState.
using var doc = Document.Open(pdfBytes);
var absorber = new TextFragmentAbsorber();
doc.Pages[1].Accept(absorber);
foreach (TextFragment fragment in absorber.TextFragments)
{
foreach (TextSegment segment in fragment.Segments)
{
PhysicalTextSegment physical = segment.PhysicalSegment;
var width = physical.MeasureSegment(segment.StartCharIndex, segment.EndCharIndex, true);
TextState state = physical.TextState;
}
}Buffring av redigeringar av innehållsström
ContentsAppender, nås via Page.ContentsAppender, buffrar operatörer för att föra in eller lägga till i en sidas innehållsström och committerar dem i ett pass med UpdateData.
using var doc = Document.Open(pdfBytes);
Page page = doc.Pages[1];
page.ContentsAppender.AppendToBegin(new GSave());
page.ContentsAppender.AppendToEnd(new GRestore());
page.ContentsAppender.UpdateData();Stora minnesströmmar
OptimizedMemoryStream är en expanderbar minnesström som kan överskrida 2 GB-gränsen för en enda array i MemoryStream genom att lagra data i fasta segment. Den härstammar från Stream, så den stödjer de vanliga läs-, skriv- och sökoperationerna.
using var stream = new OptimizedMemoryStream();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes("large payload");
stream.Write(buffer, 0, buffer.Length);
bool canSeek = stream.CanSeek;
byte[] allBytes = stream.ToArray();Biblioteksversionsinformation
BuildVersionInfo är en statisk klass som exponerar bibliotekets produktnamn och versionsnummer vid körning — användbart för diagnostik och supportförfrågningar.
Console.WriteLine(BuildVersionInfo.Product);
Console.WriteLine(BuildVersionInfo.AssemblyVersion);
Console.WriteLine(BuildVersionInfo.FileVersion);Tips och bästa praxis
- Ställ in
RegexManager.MatchTimeoutinnan du kör sökningar över opålitliga eller användargenererade mönster för att undvika catastrophic backtracking. - Anropa
ExternalFontCache.SetFontsFoldersmedreset: truenär du vill helt ersätta standard-sökvägarna i stället för att lägga till dem. - Föredra
OptimizedMemoryStreamframförMemoryStreamnär du buffrar mycket stora dokument eller bilddata som kan överstiga 2 GB. - Avsluta alltid ett parti
ContentsAppender-redigeringar medUpdateData()— buffrade operatorer kommittas inte till innehållsströmmen förrän dess. GraphicsAbsorber.Elementskan innehållaGraphicElement-instanser förutomSubPath; kontrollera typen innan du castar.
Vanliga problem
| Problem | Orsak | Lösning |
|---|---|---|
| Regex-sökning hänger på komplexa mönster | Ingen timeout konfigurerad på RegexManager | Ställ in RegexManager.MatchTimeout innan du kör TextFragmentAbsorber sökningar |
Ändringar av content-stream från ContentsAppender visas inte i den sparade filen | UpdateData() anropades aldrig | Anropa UpdateData() efter det sista AppendToBegin/AppendToEnd-anropet |
| Användade typsnitt plockas inte upp under rendering | Typsnittsmappen registrerades inte, eller reset: true rensade förväntade standardvärden | Anropa ExternalFontCache.SetFontsFolders med rätt mapplista och reset-värde |
OutOfMemoryException vid buffring av mycket stor utdata | MemoryStream nådde sin 2 GB enkellista-gräns | Använd OptimizedMemoryStream, som lagrar data i fasta storleksblock |
FAQ
Varför skiljer sig MathExtensions.Mod från C# %-operatorn?
MathExtensions.Mod returnerar alltid en icke-negativ rest, medan den inbyggda %-operatorn kan returnera ett negativt värde när dividend är negativ.
Hur stoppar jag en regex-baserad textsökning från att köra för länge?
Ställ in RegexManager.MatchTimeout till en TimeSpan innan du konstruerar eller kör en TextFragmentAbsorber som använder ett regex-mönster.
Ersätter SetFontsFolders eller lägger till de befintliga sökvägarna?
Det beror på argumentet reset: skicka true för att ersätta den aktuella mapp-listan, eller false för att lägga till de nya mapparna i den.
Vad extraherar GraphicsAbsorber egentligen?
Den extraherar de målade vektor-undervägarna på en sida som SubPath-element, var och en med en sidrymds avgränsande Rectangle, via GraphicsAbsorber.Visit.
När bör jag använda OptimizedMemoryStream istället för MemoryStream?
När den buffrade datan kan närma sig eller överstiga 2 GB, eftersom MemoryStream stöds av en enda array med den hårda gränsen.
API Reference Sammanfattning
| Klass / Metod | Beskrivning |
|---|---|
MathExtensions.Mod | Icke-negativ heltals-modulohjälp som används av säkerhetsprimitiver |
RegexManager.MatchTimeout | Timeout som tillämpas på regex-baserade textsökningar |
RegexManager.NonBacktracking | Aktiverar den icke-backtracking-regex-motorn |
PostScriptEvaluator.Evaluate | Utvärderar en typ 4 PDF PostScript kalkylatorfunktion |
ExternalFontCache.Instance | Singleton-åtkomst till den externa teckensnittscachen |
ExternalFontCache.GetDefaultFontsFolders | Returnerar standardmapparna för extern teckensnittssökning |
ExternalFontCache.SetFontsFolders | Lägger till eller ersätter externa teckensnittssökmappar |
GraphicsAbsorber.Visit | Extraherar vektorgrafikelement från en sida |
GraphicsAbsorber.Elements | Samling av extraherade GraphicElement/SubPath-objekt |
SubPath.Rectangle | Sidrymdens avgränsningsrektangel för en extraherad delväg |
PhysicalTextSegment.MeasureSegment | Mäter ett teckenintervall för ett fysiskt textsegment |
PhysicalTextSegment.TextState | Upplöst formateringsstatus för ett fysiskt textsegment |
ContentsAppender.AppendToBegin | Buffrar en operator för att prefixa sidans innehållsström |
ContentsAppender.AppendToEnd | Buffrar en operator för att lägga till i sidans innehållsström |
ContentsAppender.UpdateData | Skriver de buffrade operatorerna till innehållsströmmen |
OptimizedMemoryStream | Expanderbar minnesström bortom 2 GB MemoryStream-gränsen |
BuildVersionInfo.Product | Produktnamn för det körande biblioteket |
BuildVersionInfo.AssemblyVersion | Assemblerversion av det körande biblioteket |
BuildVersionInfo.FileVersion | Filversion av det körande biblioteket |