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); // 2Regex 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.SetFontsFoldersfüggvényt areset: trueargumentummal, ha a alapértelmezett keresési útvonalakat teljesen fel szeretné cserélni, ahelyett, hogy hozzáadná őket. - Előnyben részesítse a
OptimizedMemoryStreamhasználatát aMemoryStreamhelyett, amikor nagyon nagy dokumentumokat vagy akár 2GB-t meghaladó képadatokat pufferel. - Mindig fejezze be a
ContentsAppenderszerkesztések egy csomagját aUpdateData()használatával — a pufferelt operátorok addig nem kerülnek a tartalomfolyamra. - A
GraphicsAbsorber.ElementstartalmazhatGraphicElementpéldányokat is aSubPathkivételével; ellenőrizze a típust a konvertálás előtt.
Általános problémák
| Probléma | Oka | Javítás |
|---|---|---|
| A regex keresés elakad összetett minták esetén | Nincs 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ájlban | A UpdateData() soha nem lett meghívva | Hí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án | A betűtípus mappát nem regisztrálták, vagy a reset: true törölte a várt alapértelmezéseket | Hívja meg a ExternalFontCache.SetFontsFolders a megfelelő mappalistával és a reset értékkel |
OutOfMemoryException nagyon nagy kimenet pufferelésekor | MemoryStream elérte a 2GB egyetlen tömb korlátját | Haszná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ódus | Leírás |
|---|---|
MathExtensions.Mod | Nemnegatív egész szám modulo segédfüggvény, amelyet biztonsági primitívek használnak |
RegexManager.MatchTimeout | Időtúllépés a regex-alapú szövegkeresésekhez |
RegexManager.NonBacktracking | Engedélyezi a nem visszalépő regex motort |
PostScriptEvaluator.Evaluate | Kiértékeli a Type 4 PDF PostScript kalkulátor függvényt |
ExternalFontCache.Instance | Singleton hozzáférés a külső betűtípus-gyorsítótárhoz |
ExternalFontCache.GetDefaultFontsFolders | Visszaadja az alapértelmezett külső betűtípus-keresési mappákat |
ExternalFontCache.SetFontsFolders | Hozzáad vagy felülírja a külső betűtípus-keresési mappákat |
GraphicsAbsorber.Visit | Kivonja a vektoros grafikai elemeket egy oldalról |
GraphicsAbsorber.Elements | Kivont GraphicElement/SubPath elemek gyűjteménye |
SubPath.Rectangle | Az oldaltérben lévő körülhatároló téglalap egy kinyert alúthoz |
PhysicalTextSegment.MeasureSegment | Méri egy karaktertartományt egy fizikai szövegszegmensben |
PhysicalTextSegment.TextState | A fizikai szövegszegmens feloldott formázási állapota |
ContentsAppender.AppendToBegin | Pufferel egy operátort, amelyet a lap tartalmi adatfolyamához kell előre illeszteni |
ContentsAppender.AppendToEnd | Puffereli az operátort, hogy egy oldal tartalomfolyamához hozzáfűzze |
ContentsAppender.UpdateData | Elkötelezi a pufferelt operátorokat a tartalomfolyamra |
OptimizedMemoryStream | Bővíthető memóriában tárolt adatfolyam a 2GB MemoryStream határ felett |
BuildVersionInfo.Product | A futó könyvtár termékneve |
BuildVersionInfo.AssemblyVersion | A futó könyvtár assembly verziója |
BuildVersionInfo.FileVersion | A futó könyvtár fájlverziója |