Utility- en Helperklassen
Utility- en Helperklassen
Deze gids laat zien hoe u de kleine, gerichte helperklassen die Aspose.PDF FOSS voor .NET levert, kunt gebruiken voor veelvoorkomende low-level taken: integer-wiskunde gebruikt door beveiligingsprimitieven, regex-zoekconfiguratie, PostScript functie-evaluatie, externe lettertype-ontdekking, vector-subpad-extractie, fysieke tekstmeting, gebufferde content-stream-bewerkingen, grote in-memory streams, en bibliotheekversierapportage. Deze klassen vormen geen zelfstandige toegangspunten, maar ondersteunen hogere-niveau document-, tekst- en renderbewerkingen door het hele API.
Integer-wiskunde helpers
MathExtensions is een kleine statische helper die intern door de beveiligingsprimitieven van de bibliotheek wordt gebruikt, maar hij is beschikbaar voor algemeen gebruik wanneer u een modulo-operatie nodig heeft die altijd een niet-negatief resultaat oplevert.
// Unlike the C# % operator, Mod never returns a negative value.
int wrapped = MathExtensions.Mod(-3, 5); // 2Regex-zoekconfiguratie
RegexManager is een statische klasse die de reguliere-expressie-engine configureert die wordt gebruikt door tekstaandzoekbewerkingen zoals TextFragmentAbsorber. Stel MatchTimeout in om te beperken hoe lang een patroon mag draaien, en schakel NonBacktracking in om de non-backtracking regex-engine te gebruiken voor prestatie-gevoelige zoekopdrachten.
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);Evalueren van PostScript functies
PostScriptEvaluator is een statische klasse die Type4 PDF-functies evalueert (PDF32000 §7.10.5) — PostScript rekenprogramma’s ingebed in een PDF, zoals die gebruikt worden in sommige kleur-ruimte- en schaduwwerkingdefinities.
double[] inputs = { 0.5 };
// Evaluate a PostScript calculator program against the input array.
var outputs = PostScriptEvaluator.Evaluate("{ 2 mul }", inputs);Externe lettertype-zoekpaden
ExternalFontCache beheert de mappen die doorzocht worden voor externe (niet-ingesloten) TrueType/OpenType gezichten tijdens het renderen en converteren. Gebruik Instance om de singleton te bereiken, GetDefaultFontsFolders om de ingebouwde zoeklocaties te inspecteren, en SetFontsFolders om ze toe te voegen of te vervangen.
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);Vector-subpaden extraheren
GraphicsAbsorber bezoekt een pagina en extraheert de geschilderde vector-subpaden als SubPath-elementen, elk met een eigen pagina-ruimte begrenzende Rectangle. Dit is nuttig om vector-illustraties te inspecteren of te meten zonder de content-stroom handmatig te parseren.
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}]");
}
}Fysieke tekstsegmentmeting
PhysicalTextSegment is de pagina-ruimteprojectie van een geabsorbeerde TextSegment. Bereik het via TextSegment.PhysicalSegment om een reeks tekens te meten of om de opgeloste TextState te lezen.
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;
}
}Bufferen van content-streambewerkingen
ContentsAppender, bereikt via Page.ContentsAppender, buffert operatoren om voor of achter de inhoudsstroom van een pagina te plaatsen en commit ze in één stap met 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();Grote streams in het geheugen
OptimizedMemoryStream is een uitbreidbare in-memory-stream die de 2GB limiet voor één array van MemoryStream kan overschrijden door gegevens op te slaan in blokken van vaste grootte. Het is afgeleid van Stream, dus ondersteunt het de gebruikelijke lees-, schrijf- en zoekbewerkingen.
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();Informatie over de bibliotheekversie
BuildVersionInfo is een statische klasse die de productnaam en versienummers van de bibliotheek beschikbaar stelt tijdens runtime — handig voor diagnostiek en ondersteuningsverzoeken.
Console.WriteLine(BuildVersionInfo.Product);
Console.WriteLine(BuildVersionInfo.AssemblyVersion);
Console.WriteLine(BuildVersionInfo.FileVersion);Tips en beste praktijken
- Stel
RegexManager.MatchTimeoutin voordat je zoekopdrachten uitvoert op niet-vertrouwde of door gebruikers geleverde patronen om catastrofale backtracking te voorkomen. - Roep
ExternalFontCache.SetFontsFoldersaan metreset: truewanneer je de standaard zoekpaden volledig wilt vervangen in plaats van eraan toe te voegen. - Geef de voorkeur aan
OptimizedMemoryStreambovenMemoryStreambij het bufferen van zeer grote documenten of afbeeldingsgegevens die groter dan 2GB kunnen zijn. - Rond een batch van
ContentsAppender-bewerkingen altijd af metUpdateData()— gebufferde operatoren worden pas dan aan de content-stroom bevestigd. GraphicsAbsorber.ElementskanGraphicElement-instanties bevatten die anders zijn danSubPath; controleer het type vóór het casten.
Veelvoorkomende problemen
| Probleem | Oorzaak | Oplossing |
|---|---|---|
| Regex-zoekopdracht loopt vast bij complexe patronen | Geen time-out geconfigureerd op RegexManager | Stel RegexManager.MatchTimeout in voordat u TextFragmentAbsorber zoekopdrachten uitvoert |
Bewerkingen van de content-stream van ContentsAppender verschijnen niet in het opgeslagen bestand | UpdateData() werd nooit aangeroepen | Roep UpdateData() aan na de laatste AppendToBegin/AppendToEnd-aanroep |
| Aangepaste lettertypen worden niet opgepikt tijdens het renderen | Lettertypemap was niet geregistreerd, of reset: true heeft de verwachte standaardwaarden gewist | Roep ExternalFontCache.SetFontsFolders aan met de juiste maplijst en de reset waarde |
OutOfMemoryException bij het bufferen van zeer grote output | MemoryStream heeft zijn 2GB enkele-array limiet bereikt | Gebruik OptimizedMemoryStream, die gegevens opslaat in vaste-grootte blokken |
FAQ
Waarom verschilt MathExtensions.Mod van de C# %-operator?
MathExtensions.Mod geeft altijd een niet-negatieve rest terug, terwijl de ingebouwde %-operator een negatieve waarde kan teruggeven wanneer het dividend negatief is.
Hoe voorkom ik dat een regex-gebaseerde tekstzoekopdracht te lang duurt?
Stel RegexManager.MatchTimeout in op een TimeSpan voordat je een TextFragmentAbsorber construeert of uitvoert die een regex-patroon gebruikt.
Vervangt SetFontsFolders de bestaande zoekpaden of voegt het er extra paden aan toe?
Het hangt af van het reset-argument: geef true door om de huidige maplijst te vervangen, of false om de nieuwe mappen eraan toe te voegen.
Wat extraheert GraphicsAbsorber eigenlijk?
Het extraheert de geschilderde vector-subpaden van een pagina als SubPath-elementen, elk met een paginaruimte begrenzende Rectangle, via GraphicsAbsorber.Visit.
Wanneer moet ik OptimizedMemoryStream gebruiken in plaats van MemoryStream?
Wanneer de gebufferde data mogelijk nadert of 2GB overschrijdt, aangezien MemoryStream wordt ondersteund door één enkele array met die harde limiet.
API Reference Samenvatting
| Klasse / Methode | Beschrijving |
|---|---|
MathExtensions.Mod | Niet-negatieve integer modulo-helper die door beveiligingsprimitieven wordt gebruikt |
RegexManager.MatchTimeout | Time-out toegepast op regex-gebaseerde tekstzoekopdrachten |
RegexManager.NonBacktracking | Schakelt de non-backtracking regex-engine in |
PostScriptEvaluator.Evaluate | Evalueert een Type4 PDF PostScript rekenfunctie |
ExternalFontCache.Instance | Singleton-toegang tot de externe lettertypecache |
ExternalFontCache.GetDefaultFontsFolders | Retourneert de standaard externe lettertype-zoekmappen |
ExternalFontCache.SetFontsFolders | Voegt externe lettertype-zoekmappen toe of vervangt ze |
GraphicsAbsorber.Visit | Extraheert vector-grafische elementen uit een pagina |
GraphicsAbsorber.Elements | Collectie van geëxtraheerde GraphicElement/SubPath-items |
SubPath.Rectangle | Begrenzende rechthoek in paginaruimte van een geëxtraheerd subpad |
PhysicalTextSegment.MeasureSegment | Meet een tekenbereik van een fysiek tekstsegment |
PhysicalTextSegment.TextState | Opgeloste opmaakstatus van een fysiek tekstsegment |
ContentsAppender.AppendToBegin | Buffert een operator die aan het begin van de contentstream van een pagina wordt geplaatst |
ContentsAppender.AppendToEnd | Buffer een operator om toe te voegen aan de inhoudsstroom van een pagina |
ContentsAppender.UpdateData | Voert gebufferde operators uit naar de inhoudsstroom |
OptimizedMemoryStream | Uitbreidbare in-memory-stroom voorbij de 2GB MemoryStream limiet |
BuildVersionInfo.Product | Productnaam van de draaiende bibliotheek |
BuildVersionInfo.AssemblyVersion | Assembly-versie van de lopende bibliotheek |
BuildVersionInfo.FileVersion | Bestandsversie van de actieve bibliotheek |