Segéd- és segédosztályok

Segéd- és segédosztályok

Segédprogramok és Segédosztályok

Ez az útmutató bemutatja, hogyan kell használni a kis, célzott segédosztályokat, amelyeket a Aspose.PDF FOSS a .NET számára biztosít a gyakori alacsony szintű feladatokhoz: a biztonsági primitívek által használt egész számú matematikához, regex keresés konfigurációjához, PostScript függvény kiértékeléséhez, külső betűtípusok felfedezéséhez, vektor alútvonalak kinyeréséhez, fizikai szöveg méréséhez, pufferelt tartalomfolyam szerkesztésekhez, nagy memóriában tárolt adatfolyamokhoz és a könyvtár verziójelentéséhez. Ezek az osztályok nem önálló belépési pontok, hanem támogatják a magasabb szintű dokumentum-, szöveg- és renderelési műveleteket a API során.


Egész számú matematikai segédprogramok

MathExtensions egy kis statikus segéd, amelyet a könyvtár biztonsági primitívei belsőleg használnak, de általános használatra is elérhető, amikor olyan modulo műveletre van szükség, amely mindig nem negatív eredményt ad.

// Unlike the C# % operator, Mod never returns a negative value.
int wrapped = MathExtensions.Mod(-3, 5); // 2

Regex keresés konfigurációja

RegexManager egy statikus osztály, amely beállítja a szövegkeresési műveletekhez, például a TextFragmentAbsorber által használt reguláris kifejezés motorját. Állítsd be a MatchTimeout értékét, hogy korlátozd, mennyi ideig futhat egy minta, és engedélyezd a NonBacktracking használatát a nem visszalépő regex motorhoz a teljesítménykritikus keresésekhez.

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

A PostScript függvények kiértékelése

PostScriptEvaluator egy statikus osztály, amely kiértékeli a Type4 PDF függvényeket (PDF32000 §7.10.5) — PostScript kalkulátor programok beágyazva egy PDF-be, például bizonyos színtér- és árnyalási definíciókban használtakat.

double[] inputs = { 0.5 };

// Evaluate a PostScript calculator program against the input array.
var outputs = PostScriptEvaluator.Evaluate("{ 2 mul }", inputs);

Külső betűkészlet keresési útvonalak

ExternalFontCache kezeli azokat a mappákat, amelyeket a külső (nem beágyazott) TrueType/OpenType felületek keresésére használnak renderelés és konverzió során. Használd Instance-t a singleton eléréséhez, GetDefaultFontsFolders-t a beépített keresési helyek megtekintéséhez, és SetFontsFolders-t azok hozzáadásához vagy cseréjéhez.

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

Vektor alútvonalak kinyerése

GraphicsAbsorber egy oldalt felkeres és kinyeri annak festett vektor al-útvonalait SubPath elemekként, amelyek mindegyike saját oldal-területi határoló Rectangle-t hordoz. Ez hasznos a vektoros grafika ellenőrzéséhez vagy méréséhez anélkül, hogy kézzel kellene feldolgozni a tartalomfolyamot.

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}]");
    }
}

Fizikai szövegszegmens mérés

PhysicalTextSegment egy oldal-területi vetület egy elnyelt TextSegment esetén. Érd el a TextSegment.PhysicalSegment segítségével, hogy karaktercsoportot mérj vagy elolvasd a feloldott TextState-t.

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;
    }
}

Tartalomfolyam-szerkesztések pufferelése

ContentsAppender, a Page.ContentsAppender révén elérhető, puffereli az operátorokat, hogy előre vagy utólag fűzzék egy oldal tartalomfolyamához, és egy lépésben elkötelezi őket a UpdateData használatával.

using var doc = Document.Open(pdfBytes);

Page page = doc.Pages[1];
page.ContentsAppender.AppendToBegin(new GSave());
page.ContentsAppender.AppendToEnd(new GRestore());
page.ContentsAppender.UpdateData();

Nagy memóriában lévő adatfolyamok

OptimizedMemoryStream egy növelhető memóriában lévő adatfolyam, amely a MemoryStream 2GB egyetlen tömbös korlátját meghaladhatja, ha az adatot rögzített méretű darabokban tárolja. A Stream osztályból származik, így támogatja a szokásos olvasási, írási és keresési műveleteket.

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();

Könyvtár verzióinformációk

BuildVersionInfo egy statikus osztály, amely a futásidőben elérhetővé teszi a könyvtár terméknevét és verziószámait — hasznos a diagnosztikához és a támogatási kérésekhez.

Console.WriteLine(BuildVersionInfo.Product);
Console.WriteLine(BuildVersionInfo.AssemblyVersion);
Console.WriteLine(BuildVersionInfo.FileVersion);

Tippek és bevált gyakorlatok

  • Állítsa be a RegexManager.MatchTimeout értékét, mielőtt nem megbízható vagy felhasználó által megadott mintákon keresést végezne, a katasztrofális backtracking elkerülése érdekében.
  • Hívja meg a ExternalFontCache.SetFontsFolders függvényt a reset: true argumentummal, ha a alapértelmezett keresési útvonalakat teljesen fel szeretné cserélni, ahelyett, hogy hozzáadná őket.
  • Előnyben részesítse a OptimizedMemoryStream használatát a MemoryStream helyett, amikor nagyon nagy dokumentumokat vagy akár 2GB-t meghaladó képadatokat pufferel.
  • Mindig fejezze be a ContentsAppender szerkesztések egy csomagját a UpdateData() használatával — a pufferelt operátorok addig nem kerülnek a tartalomfolyamra.
  • A GraphicsAbsorber.Elements tartalmazhat GraphicElement példányokat is a SubPath kivételével; ellenőrizze a típust a konvertálás előtt.

Általános problémák

ProblémaOkaJavítás
A regex keresés elakad összetett minták eseténNincs időkorlát konfigurálva a RegexManagerÁllítsa be a(z) RegexManager.MatchTimeout értékét, mielőtt TextFragmentAbsorber kereséseket futtatna.
A ContentsAppender tartalomfolyam-szerkesztései nem jelennek meg a mentett fájlbanA UpdateData() soha nem lett meghívvaHívja meg a UpdateData() a legutolsó AppendToBegin/AppendToEnd hívás után
Az egyedi betűtípusok nem kerülnek felhasználásra a renderelés soránA betűtípus mappát nem regisztrálták, vagy a reset: true törölte a várt alapértelmezéseketHívja meg a ExternalFontCache.SetFontsFolders a megfelelő mappalistával és a reset értékkel
OutOfMemoryException nagyon nagy kimenet pufferelésekorMemoryStream elérte a 2GB egyetlen tömb korlátjátHasználja a OptimizedMemoryStream-t, amely rögzített méretű darabokban tárolja az adatokat

FAQ

Miért tér el a MathExtensions.Mod a C# % operátortól?

A MathExtensions.Mod mindig nem negatív maradékot ad vissza, míg a beépített % operátor negatív értéket is visszaadhat, ha a osztandó negatív.

Hogyan állíthatom meg, hogy egy regex-alapú szövegkeresés túl sokáig fusson?

Állítsa be a RegexManager.MatchTimeout értékét egy TimeSpan értékre, mielőtt létrehozná vagy futtatná a TextFragmentAbsorber -t, amely regex-mintát használ.

A SetFontsFolders felülírja vagy hozzáadja a meglévő keresési útvonalakat?

Az reset argumentumtól függ: adja meg a true értéket a jelenlegi mappalista helyettesítéséhez, vagy a false értéket az új mappák hozzáfűzéséhez.

Mit von ki valójában a GraphicsAbsorber?

Kivonja egy oldal festett vektor al-útvonalait SubPath elemekként, mindegyikhez oldal-koordinátájú határoló Rectangle tartozik, a GraphicsAbsorber.Visit segítségével.

Mikor kellene a OptimizedMemoryStream használni a MemoryStream helyett?

Amikor a pufferelt adat közelítheti vagy meghaladhatja a 2GB-ot, mivel a MemoryStream egyetlen tömbön alapul, amelynek ez a szigorú korlátja van.


API Reference Összefoglaló

Osztály / MetódusLeírás
MathExtensions.ModNemnegatív egész szám modulo segédfüggvény, amelyet biztonsági primitívek használnak
RegexManager.MatchTimeoutIdőtúllépés a regex-alapú szövegkeresésekhez
RegexManager.NonBacktrackingEngedélyezi a nem visszalépő regex motort
PostScriptEvaluator.EvaluateKiértékeli a Type 4 PDF PostScript kalkulátor függvényt
ExternalFontCache.InstanceSingleton hozzáférés a külső betűtípus-gyorsítótárhoz
ExternalFontCache.GetDefaultFontsFoldersVisszaadja az alapértelmezett külső betűtípus-keresési mappákat
ExternalFontCache.SetFontsFoldersHozzáad vagy felülírja a külső betűtípus-keresési mappákat
GraphicsAbsorber.VisitKivonja a vektoros grafikai elemeket egy oldalról
GraphicsAbsorber.ElementsKivont GraphicElement/SubPath elemek gyűjteménye
SubPath.RectangleAz oldaltérben lévő körülhatároló téglalap egy kinyert alúthoz
PhysicalTextSegment.MeasureSegmentMéri egy karaktertartományt egy fizikai szövegszegmensben
PhysicalTextSegment.TextStateA fizikai szövegszegmens feloldott formázási állapota
ContentsAppender.AppendToBeginPufferel egy operátort, amelyet a lap tartalmi adatfolyamához kell előre illeszteni
ContentsAppender.AppendToEndPuffereli az operátort, hogy egy oldal tartalomfolyamához hozzáfűzze
ContentsAppender.UpdateDataElkötelezi a pufferelt operátorokat a tartalomfolyamra
OptimizedMemoryStreamBővíthető memóriában tárolt adatfolyam a 2GB MemoryStream határ felett
BuildVersionInfo.ProductA futó könyvtár termékneve
BuildVersionInfo.AssemblyVersionA futó könyvtár assembly verziója
BuildVersionInfo.FileVersionA futó könyvtár fájlverziója

Lásd még:

 Magyar