Utility- en Helperklassen

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

Regex-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.MatchTimeout in voordat je zoekopdrachten uitvoert op niet-vertrouwde of door gebruikers geleverde patronen om catastrofale backtracking te voorkomen.
  • Roep ExternalFontCache.SetFontsFolders aan met reset: true wanneer je de standaard zoekpaden volledig wilt vervangen in plaats van eraan toe te voegen.
  • Geef de voorkeur aan OptimizedMemoryStream boven MemoryStream bij het bufferen van zeer grote documenten of afbeeldingsgegevens die groter dan 2GB kunnen zijn.
  • Rond een batch van ContentsAppender-bewerkingen altijd af met UpdateData() — gebufferde operatoren worden pas dan aan de content-stroom bevestigd.
  • GraphicsAbsorber.Elements kan GraphicElement-instanties bevatten die anders zijn dan SubPath; controleer het type vóór het casten.

Veelvoorkomende problemen

ProbleemOorzaakOplossing
Regex-zoekopdracht loopt vast bij complexe patronenGeen time-out geconfigureerd op RegexManagerStel RegexManager.MatchTimeout in voordat u TextFragmentAbsorber zoekopdrachten uitvoert
Bewerkingen van de content-stream van ContentsAppender verschijnen niet in het opgeslagen bestandUpdateData() werd nooit aangeroepenRoep UpdateData() aan na de laatste AppendToBegin/AppendToEnd-aanroep
Aangepaste lettertypen worden niet opgepikt tijdens het renderenLettertypemap was niet geregistreerd, of reset: true heeft de verwachte standaardwaarden gewistRoep ExternalFontCache.SetFontsFolders aan met de juiste maplijst en de reset waarde
OutOfMemoryException bij het bufferen van zeer grote outputMemoryStream heeft zijn 2GB enkele-array limiet bereiktGebruik 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 / MethodeBeschrijving
MathExtensions.ModNiet-negatieve integer modulo-helper die door beveiligingsprimitieven wordt gebruikt
RegexManager.MatchTimeoutTime-out toegepast op regex-gebaseerde tekstzoekopdrachten
RegexManager.NonBacktrackingSchakelt de non-backtracking regex-engine in
PostScriptEvaluator.EvaluateEvalueert een Type4 PDF PostScript rekenfunctie
ExternalFontCache.InstanceSingleton-toegang tot de externe lettertypecache
ExternalFontCache.GetDefaultFontsFoldersRetourneert de standaard externe lettertype-zoekmappen
ExternalFontCache.SetFontsFoldersVoegt externe lettertype-zoekmappen toe of vervangt ze
GraphicsAbsorber.VisitExtraheert vector-grafische elementen uit een pagina
GraphicsAbsorber.ElementsCollectie van geëxtraheerde GraphicElement/SubPath-items
SubPath.RectangleBegrenzende rechthoek in paginaruimte van een geëxtraheerd subpad
PhysicalTextSegment.MeasureSegmentMeet een tekenbereik van een fysiek tekstsegment
PhysicalTextSegment.TextStateOpgeloste opmaakstatus van een fysiek tekstsegment
ContentsAppender.AppendToBeginBuffert een operator die aan het begin van de contentstream van een pagina wordt geplaatst
ContentsAppender.AppendToEndBuffer een operator om toe te voegen aan de inhoudsstroom van een pagina
ContentsAppender.UpdateDataVoert gebufferde operators uit naar de inhoudsstroom
OptimizedMemoryStreamUitbreidbare in-memory-stroom voorbij de 2GB MemoryStream limiet
BuildVersionInfo.ProductProductnaam van de draaiende bibliotheek
BuildVersionInfo.AssemblyVersionAssembly-versie van de lopende bibliotheek
BuildVersionInfo.FileVersionBestandsversie van de actieve bibliotheek

Zie ook

 Nederlands