Araç ve Yardımcı Sınıflar

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

Regex 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‘i reset: true ile ç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 ContentsAppender düzenleme topluluğunu UpdateData() ile tamamlayın — tamponlanmış operatörler o zamana kadar içerik akışına işlenmez.
  • GraphicsAbsorber.Elements, SubPath dışındaki GraphicElement örnekleri içerebilir; dönüştürmeden önce türü kontrol edin.

Yaygın Sorunlar

SorunNedenDüzeltme
Regex araması karmaşık desenlerde takılıyorRegexManager ü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üyorUpdateData() 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ıyorYazı tipi klasörü kaydedilmedi veya reset: true beklenen varsayılanları temizlediDoğru klasör listesi ve reset değeriyle ExternalFontCache.SetFontsFolders‘ı çağırın
OutOfMemoryException çok büyük çıktı tamponlarkenMemoryStream 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öntemAçıklama
MathExtensions.ModGüvenlik ilkelileri tarafından kullanılan negatif olmayan tamsayı modulo yardımcı programı
RegexManager.MatchTimeoutRegex tabanlı metin aramalarına uygulanan zaman aşımı
RegexManager.NonBacktrackingGeri izleme yapılmayan regex motorunu etkinleştirir
PostScriptEvaluator.EvaluateBir Type 4 PDF PostScript hesaplayıcı işlevini değerlendirir
ExternalFontCache.InstanceHarici font önbelleğine Singleton erişimi
ExternalFontCache.GetDefaultFontsFoldersVarsayılan harici yazı tipi arama klasörlerini döndürür
ExternalFontCache.SetFontsFoldersHarici yazı tipi arama klasörlerini ekler veya değiştirir
GraphicsAbsorber.VisitBir 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.MeasureSegmentFiziksel bir metin segmentinin karakter aralığını ölçer
PhysicalTextSegment.TextStateFiziksel bir metin segmentinin çözümlenmiş biçimlendirme durumu
ContentsAppender.AppendToBeginBir sayfanın içerik akışının başına eklemek üzere bir operatörü tamponlar
ContentsAppender.AppendToEndSayfanın içerik akışına eklemek için bir operatörü tamponlar
ContentsAppender.UpdateDataTamponlanan operatörleri içerik akışına işler
OptimizedMemoryStream2 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ü

Ayrıca Bakınız

 Türkçe