Araç ve Yardımcı Sınıflar
Araç ve Yardımcı Sınıflar
Bu kılavuz, Aspose.PDF FOSS for .NET tarafından sağlanan, ortak düşük seviyeli görevler için kullanılan küçük, odaklı yardımcı sınıfların nasıl kullanılacağını gösterir: güvenlik ilkelileri tarafından kullanılan tam sayı matematiği, regex arama yapılandırması, PostScript işlev değerlendirmesi, dış yazı tipi keşfi, vektör alt-yolu çıkarımı, fiziksel metin ölçümü, tamponlu içerik-akışı düzenlemeleri, büyük bellek içi akışlar ve kütüphane sürüm raporlaması. Bu sınıflar kendi başlarına giriş noktaları değildir, ancak API boyunca daha yüksek seviyeli belge, metin ve renderleme işlemlerine destek olur.
Tam sayı matematik yardımcıları
MathExtensions, kütüphanenin güvenlik ilkelileri tarafından dahili olarak kullanılan küçük bir statik yardımcıdır, ancak her zaman negatif olmayan bir sonuç döndüren modulo işlemi gerektiğinde genel kullanım için de mevcuttur.
// Unlike the C# % operator, Mod never returns a negative value.
int wrapped = MathExtensions.Mod(-3, 5); // 2Regex arama yapılandırması
RegexManager, TextFragmentAbsorber gibi metin arama işlemlerinde kullanılan düzenli ifade motorunu yapılandıran statik bir sınıftır. MatchTimeout‘yi, bir desenin ne kadar süre çalışabileceğini sınırlamak için ayarlayın ve performans duyarlı aramalar için geri izlemeyen regex motorunu kullanmak üzere NonBacktracking‘ü etkinleştirin.
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);PostScript işlevlerini değerlendirme
PostScriptEvaluator tip 4 PDF fonksiyonlarını (PDF32000 §7.10.5) değerlendiren statik bir sınıftır — PostScript bir PDF’ye gömülü hesap makinesi programları, örneğin bazı renk uzayı ve gölgelendirme tanımlarında kullanılanlar.
double[] inputs = { 0.5 };
// Evaluate a PostScript calculator program against the input array.
var outputs = PostScriptEvaluator.Evaluate("{ 2 mul }", inputs);Harici yazı tipi arama yolları
ExternalFontCache, renderleme ve dönüşüm sırasında dış (gömülü olmayan) TrueType/OpenType yüzleri için aranan klasörleri yönetir. Tek örneğe ulaşmak için Instance‘i, yerleşik arama konumlarını incelemek için GetDefaultFontsFolders‘yi ve onları eklemek ya da değiştirmek için SetFontsFolders‘ü kullanın.
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);Vektör alt-yollarını çıkartma
GraphicsAbsorber, bir sayfayı ziyaret eder ve boyanmış vektör alt-yollarını SubPath öğeleri olarak çıkarır; her biri kendi sayfa-uzayı sınırlayıcı Rectangle‘ye sahiptir. Bu, içerik akışını elle ayrıştırmadan vektör sanat eserini incelemek veya ölçmek için yararlıdır.
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}]");
}
}Fiziksel metin segmenti ölçümü
PhysicalTextSegment, emilen bir TextSegment‘in sayfa-uzayı izdüşümüdür. Karakter dizisini ölçmek ya da çözülmüş TextState‘ünü okumak için ona TextSegment.PhysicalSegment aracılığıyla ulaşın.
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;
}
}İçerik akışı düzenlemelerinin tamponlanması
ContentsAppender, Page.ContentsAppender aracılığıyla ulaşılan, bir sayfanın içerik akışına ön ekleme veya ekleme yapan operatörleri tamponlar ve bunları UpdateData ile tek seferde işleme alır.
using var doc = Document.Open(pdfBytes);
Page page = doc.Pages[1];
page.ContentsAppender.AppendToBegin(new GSave());
page.ContentsAppender.AppendToEnd(new GRestore());
page.ContentsAppender.UpdateData();Büyük bellek içi akışlar
OptimizedMemoryStream, sabit boyutlu parçacıklar halinde veri depolayarak MemoryStream‘in 2 GB tek-dizi sınırını aşabilen büyütülebilir bir bellek içi akıştır. Stream‘den türetilmiştir, bu nedenle geleneksel okuma, yazma ve konumlandırma (seek) işlemlerini destekler.
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ütüphane sürüm bilgileri
BuildVersionInfo, çalışma zamanında kütüphanenin ürün adını ve sürüm numaralarını ortaya çıkaran statik bir sınıftır — tanılama ve destek talepleri için faydalıdır.
Console.WriteLine(BuildVersionInfo.Product);
Console.WriteLine(BuildVersionInfo.AssemblyVersion);
Console.WriteLine(BuildVersionInfo.FileVersion);İpuçları ve En İyi Uygulamalar
- Kötü niyetli veya kullanıcı tarafından sağlanan desenler üzerinde arama çalıştırmadan önce
RegexManager.MatchTimeout‘i ayarlayın, böylece felaket geri izlemeyi önlersiniz. - Varsayılan arama yollarını eklemek yerine tamamen değiştirmek istediğinizde
ExternalFontCache.SetFontsFolders‘ireset: trueile çağırın. - Çok büyük belgeleri veya 2 GB’yi aşabilecek görüntü verilerini tamponlarken
OptimizedMemoryStream‘ıMemoryStream‘in yerine tercih edin. - Her zaman bir
ContentsAppenderdüzenleme topluluğunuUpdateData()ile tamamlayın — tamponlanmış operatörler o zamana kadar içerik akışına işlenmez. GraphicsAbsorber.Elements,SubPathdışındakiGraphicElementörnekleri içerebilir; dönüştürmeden önce türü kontrol edin.
Yaygın Sorunlar
| Sorun | Neden | Düzeltme |
|---|---|---|
| Regex araması karmaşık desenlerde takılıyor | RegexManager üzerinde zaman aşımı yapılandırılmadı | TextFragmentAbsorber aramalarını çalıştırmadan önce RegexManager.MatchTimeout ayarlayın. |
ContentsAppender tarafından yapılan içerik akışı düzenlemeleri kaydedilen dosyada görünmüyor | UpdateData() hiç çağrılmadı | Son AppendToBegin/AppendToEnd çağrısından sonra UpdateData() çağırın |
| Özel yazı tipleri renderlama sırasında alınamıyor | Yazı tipi klasörü kaydedilmedi veya reset: true beklenen varsayılanları temizledi | Doğru klasör listesi ve reset değeriyle ExternalFontCache.SetFontsFolders‘ı çağırın |
OutOfMemoryException çok büyük çıktı tamponlarken | MemoryStream 2 GB tek-dizi sınırına ulaştı | OptimizedMemoryStream‘ı kullanın, bu veri sabit boyutlu parçalar halinde depolar |
FAQ
MathExtensions.Mod, C# % operatöründen neden farklıdır?
MathExtensions.Mod her zaman negatif olmayan bir kalan döndürür, oysa yerleşik % operatörü, bölünen negatif olduğunda negatif bir değer döndürebilir.
Regex tabanlı bir metin aramasının çok uzun sürmesini nasıl durdurabilirim?
Regex deseni kullanan bir TextFragmentAbsorber oluştururken veya çalıştırmadan önce RegexManager.MatchTimeout‘ı bir TimeSpan olarak ayarlayın.
SetFontsFolders mevcut arama yollarını değiştiriyor mu yoksa ekliyor mu?
Bu, reset argümanına bağlıdır: mevcut klasör listesini değiştirmek için true‘ı, yeni klasörleri eklemek için ise false‘ı geçirin.
GraphicsAbsorber aslında neyi çıkarıyor?
Bir sayfanın boyanmış vektör alt-yollarını SubPath öğeleri olarak çıkarır, her biri sayfa-uzayı sınırlayıcı Rectangle‘a sahiptir ve GraphicsAbsorber.Visit aracılığıyla yapılır.
OptimizedMemoryStream’ı MemoryStream yerine ne zaman kullanmalıyım?
Tamponlanan veri 2 GB’ye yaklaşabilir veya aşabilir, çünkü MemoryStream bu katı sınıra sahip tek bir diziyle desteklenir.
API Reference Özeti
| Sınıf / Yöntem | Açıklama |
|---|---|
MathExtensions.Mod | Güvenlik ilkelileri tarafından kullanılan negatif olmayan tamsayı modulo yardımcı programı |
RegexManager.MatchTimeout | Regex tabanlı metin aramalarına uygulanan zaman aşımı |
RegexManager.NonBacktracking | Geri izleme yapılmayan regex motorunu etkinleştirir |
PostScriptEvaluator.Evaluate | Bir Type 4 PDF PostScript hesaplayıcı işlevini değerlendirir |
ExternalFontCache.Instance | Harici font önbelleğine Singleton erişimi |
ExternalFontCache.GetDefaultFontsFolders | Varsayılan harici yazı tipi arama klasörlerini döndürür |
ExternalFontCache.SetFontsFolders | Harici yazı tipi arama klasörlerini ekler veya değiştirir |
GraphicsAbsorber.Visit | Bir sayfadan vektör grafik öğelerini çıkarır |
GraphicsAbsorber.Elements | Çıkarılan GraphicElement/SubPath öğelerinin koleksiyonu |
SubPath.Rectangle | Çıkarılan alt yolun sayfa uzayındaki sınırlayıcı dikdörtgeni |
PhysicalTextSegment.MeasureSegment | Fiziksel bir metin segmentinin karakter aralığını ölçer |
PhysicalTextSegment.TextState | Fiziksel bir metin segmentinin çözümlenmiş biçimlendirme durumu |
ContentsAppender.AppendToBegin | Bir sayfanın içerik akışının başına eklemek üzere bir operatörü tamponlar |
ContentsAppender.AppendToEnd | Sayfanın içerik akışına eklemek için bir operatörü tamponlar |
ContentsAppender.UpdateData | Tamponlanan operatörleri içerik akışına işler |
OptimizedMemoryStream | 2 GB MemoryStream sınırını aşan genişletilebilir bellek içi akış |
BuildVersionInfo.Product | Çalışmakta olan kütüphanenin ürün adı |
BuildVersionInfo.AssemblyVersion | Çalışan kütüphanenin derleme sürümü |
BuildVersionInfo.FileVersion | Çalışan kütüphanenin dosya sürümü |