PDF İşleme Motoru İç Yapısı

PDF İşleme Motoru İç Yapısı

PDF İşleme Motoru İç Yapısı

Document, Page ve Annotation sınıfları, günlük PDF işleme için kullandığınız, daha düşük seviyeli bir aspose_pdf.engine paketinin üzerine bir dış yüzdür. Motor, gerçek PDF mekaniklerini uygular: her PDF dosyasının temeli olan COS (Carousel Object Structure) nesne modeli, COS nesneleri ile PDF baytları arasında dönüşüm yapan ayrıştırıcı ve yazar, yorum görünüm sentezi, sayfa rasterleştirme, font ve görüntü codec iç detayları ve belge şifreleme ile dijital imzaların arkasındaki kriptografik temel öğeler. Çoğu uygulama aspose_pdf.engine‘den doğrudan içe aktarmaya ihtiyaç duymaz — ancak özel araçlar, adli PDF incelemesi ya da üst düzey API’nin sunmadığı davranışlar gerektiğinde bakılacak doğru yerdir.


Tek Bir Yorum İçin Görünüm Oluşturma

Kare, daire ve damga gibi etkileşimli yorumlar otomatik olarak normal bir görünüm akışı (/AP /N) taşımaz. Annotation.generate_appearance çağrısı, motorun görünüm sentezi iç işlevlerini devreye sokarak, yorumun özelliklerinden talep üzerine bir görünüm oluşturur.

from aspose_pdf import Document

doc = Document()
doc.pages.add()
ann = doc.pages[0].annotations.add(
    "Square", (100, 100, 200, 200), "", properties={"C": [1, 0, 0], "IC": [0, 1, 0]}
)

print(ann.has_appearance)  # False -- no appearance stream yet
ann.generate_appearance()
print(ann.has_appearance)  # True -- the engine synthesised one
print(b"1 0 0 RG" in ann.appearance_normal)  # True -- red stroke operator
print(b"0 1 0 rg" in ann.appearance_normal)  # True -- green fill operator

Sayfalar ve Belgeler Boyunca Toplu Görünüm Oluşturma

AnnotationCollection.generate_appearances, bir sayfadaki tüm uygun yorumlar için tek bir çağrıda görünüm sentezler, motorun nasıl render edeceğini bilmediği alt tipleri (örneğin Text) atlayarak:

from aspose_pdf import Document

doc = Document()
doc.pages.add()
page = doc.pages[0]
page.annotations.add("Square", (0, 0, 50, 50), "")
page.annotations.add("Circle", (60, 0, 110, 50), "")
page.annotations.add("Text", (0, 60, 20, 80), "")  # unsupported subtype -> skipped

print(page.annotations.generate_appearances())  # 2

Document.generate_appearances, belge içindeki her sayfada aynı işlemi yapar ve idempotenttir — görünüm zaten mevcutsa ikinci bir çağrı hiçbir etkisi olmayan bir işlem olur:

from aspose_pdf import Document

doc = Document()
doc.pages.add()
doc.pages.add()
doc.pages[0].annotations.add("Square", (0, 0, 50, 50), "")
doc.pages[1].annotations.add(
    "Line", (0, 0, 50, 50), "", properties={"L": [0, 0, 50, 50]}
)

print(doc.generate_appearances())  # 2 -- one per page
print(doc.generate_appearances())  # 0 -- already generated, no-op

Anotasyonları Durağan Sayfa İçeriğine Düzleştirme

Document.flatten(), her anotasyonun görünümünü doğrudan sayfasının içerik akışına (Do XObject çağrısı olarak) çizer ve ardından anotasyon nesnesini kendisini kaldırır, böylece sayfa anotasyonları tamamen yok sayan görüntüleyicilerde aynı şekilde görüntülenir:

from aspose_pdf import Document

doc = Document()
doc.pages.add()
doc.pages[0].annotations.add(
    "Square", (100, 100, 200, 200), "", properties={"C": [0, 0, 0]}
)

doc.flatten()

Bu çağrıdan sonra sayfanın içerik akışı öncekinden daha uzun olur (artık satır içi kareyi içerir) ve doc.pages[0].annotations artık düzleştirilmiş anotasyonu içermez.


Parola Tabanlı Şifreleme Anahtarlarını Türetilmesi (Revizyon 4 / AES-128)

EncryptionUtils, PDF standart güvenlik işleyicisinin anahtar türetmesini ve AES-CBC temel işlevlerini doğrudan, Document API’dan bağımsız olarak uygular. Bu, özel araçlar veya şifreli PDF’lerin adli incelemesi için yararlıdır:

import os
from aspose_pdf.engine.encryption import EncryptionUtils

file_id = os.urandom(16)
user_pwd = "mypassword"

# Derive the owner (O) and user (U) key material for Revision 4 (128-bit AES)
o_value = EncryptionUtils.compute_owner_key_v4("owner", user_pwd, 16, 4)
u_value, enc_key = EncryptionUtils.compute_user_key_v4(
    user_pwd, o_value, -4, file_id, 16, 4
)

# Encrypt data with the derived file-encryption key
plaintext = b"Confidential PDF content"
ciphertext = EncryptionUtils.encrypt_aes_cbc(enc_key, plaintext)

# Re-derive the key from the password before trusting it to decrypt
verified_key = EncryptionUtils.verify_password_v4(
    user_pwd, u_value, o_value, -4, file_id, 16, 4
)
print(verified_key is not None)  # True -- password matches

decrypted = EncryptionUtils.decrypt_aes_cbc(verified_key, ciphertext)
print(decrypted == plaintext)  # True

AES-CBC ile Ham İçeriği Şifreleme

Daha düşük seviyeli ihtiyaçlar için, EncryptionUtils.encrypt_aes_cbc() ve decrypt_aes_cbc() hiçbir parola tabanlı anahtar türetmesinden geçmeden doğrudan herhangi bir 16, 24 veya 32 baytlık anahtar üzerinde çalışır:

import os
from aspose_pdf.engine.encryption import EncryptionUtils

key = os.urandom(32)  # AES-256; 16 and 24-byte keys are also accepted
plaintext = b"Hello, PDF AES 256!"

ciphertext = EncryptionUtils.encrypt_aes_cbc(key, plaintext)
decrypted = EncryptionUtils.decrypt_aes_cbc(key, ciphertext)
print(decrypted == plaintext)  # True

İpuçları ve En İyi Uygulamalar

  • Günlük belge işleme için yüksek seviyeli Document, Page ve Annotation arabirimini tercih edin. aspose_pdf.engine paketi, bu sınıfların üzerine inşa edildiği dahili uygulamadır — yalnızca özel araçlara, adli incelemeye veya arabirimin sunmadığı davranışlara ihtiyaç duyduğunuzda kullanın.
  • revision argümanını hedeflediğiniz güvenlik işleyicisiyle eşleştirin: compute_owner_key_v4/compute_user_key_v4 Revizyon 2–4 (40 ve 128 bit RC4/AES) kapsamındadır, compute_hash_v5 ise AES-256 tarafından kullanılan Revizyon 5/6 algoritmasını uygular. Revizyonları ve anahtar uzunluklarını karıştırmak sessizce yanlış bir anahtar üretir.
  • Document.generate_appearances ve AnnotationCollection.generate_appearances idempotenttir — kendinizin oluşturmadığı bir belgeyi render etmeden veya düzleştirmeden önce savunmacı bir şekilde çağırın.
  • Document.flatten() yıkıcıdır: sayfa içeriğine eklediği tüm açıklamaları kaldırır. Önce diğer açıklama düzenlemelerini tamamlayın veya bir kopya üzerinde çalışın.
  • Her açıklama alt türünün yerleşik bir görünüm sentezleyicisi yoktur — Text ve Popup yaygın örneklerdir. generate_appearance()’ü çağırdıktan sonra has_appearance’yi kontrol edin, başarılı olduğunu varsaymayın.

Yaygın Sorunlar

SorunNedenÇözüm
EncryptionUtils.encrypt_aes_cbc/decrypt_aes_cbc “AES key must be 16, 24, or 32 bytes” hatasını verirGeçersiz uzunlukta bir anahtar sağlandıAnahtarı os.urandom(16), os.urandom(24) veya os.urandom(32) ile oluşturun
EncryptionUtils.verify_password_v4 hata fırlatmak yerine None döndürürSağlanan şifre, belgenin türetilmiş U/O değerleriyle eşleşmiyorSonucu decrypt_aes_cbc‘e geçirmeden önce None‘ı açıkça kontrol edin
Annotation.generate_appearance False‘i döndürürEk açıklamanın alt tipi yerleşik bir görünüm sentezleyicisine sahip değildir (örneğin Text veya Popup)Kendi appearance_normal baytlarınızı sağlayın ya da görüntüleyicinin varsayılan render’ını kabul edin
Document.generate_appearances‘a ikinci çağrı 0‘i döndürürÇağrı idempotenttir — has_appearance == True‘a zaten sahip olan ek açıklamalar atlanırBeklenen davranış, hata değil

FAQ

Günlük belge işleme için aspose_pdf.engine’dan içe aktarmam gerekiyor mu?

Hayır. Document, Page ve Annotation sınıfları standart belge iş akışlarını kapsar. Motor katmanı, bu sınıfların davranışının uygulandığı yerdir ve özel araçlar için ya da PDF iç yapısını doğrudan incelemek için en faydalıdır.

Annotation.generate_appearance ile AnnotationCollection.generate_appearances arasındaki fark nedir?

İlkincisi tek bir açıklama için bir görünüm akışı oluşturur ve bir bool döndürür. İkincisi ise bir koleksiyondaki (bir sayfanın açıklamaları ya da Document.generate_appearances aracılığıyla belgedeki her sayfa) her uygun açıklama için aynı işlemi yapar ve oluşturduğu görünüm sayısını döndürür.

Anahtar türetme yöntemleri neden bir revision argümanı alıyor?

PDF standard güvenlik işleyicisi ISO 32000 revizyonları boyunca evrimleşti — Revizyon 2 40-bit RC4 kullanır, Revizyon 3/4 128-bit RC4 veya AES’i destekler ve Revizyon 5/6 (AES-256 için kullanılır) tamamen farklı bir karma algoritması (compute_hash_v5) kullanır. revision argümanı, EncryptionUtils yöntemlerinin hangi türetmeyi gerçekleştireceğini seçer.

Ham PDF nesnelerini doğrudan inceleyebilir veya oluşturabilir miyim?

Evet. aspose_pdf.engine.cos, COS nesne modelini — PdfObject, PdfDictionary, PdfArray, PdfStream, PdfName ve ilgili türleri — ortaya çıkarır; bu türler PdfCosWriter ve PdfCosParser tarafından PDF baytlarına serileştirilir ve bu baytlardan ayrıştırılır.

Sayfa-görüntü renderleme nerede gerçekleşir?

Document.render_page bir RasterizedPage döndürür, bir motor-düzeyi nesne ve to_png(), to_tiff() ve save() yöntemlerine sahiptir, render edilmiş bir sayfayı bir görüntü dosyasına dönüştürmek için.


API Reference Özeti

Sınıf / MetotAçıklama
Annotation.generate_appearance(force) -> boolTalep üzerine bir ek açıklama için normal görünüm akışını sentezle
AnnotationCollection.generate_appearances(force) -> intBir sayfadaki her uygun ek açıklama için toplu olarak görünüm oluştur
Document.generate_appearances(force) -> intBelgedeki her uygun ek açıklama için toplu olarak görünüm oluştur
Document.flatten() -> DocumentEk açıklama görünümlerini sayfa içeriğine satır içi ekle ve ek açıklamaları kaldır
Document.render_page(page_index, dpi, scale, background, antialias) -> RasterizedPageMotorun renderleme boru hattı aracılığıyla bir sayfayı rasterleştir
RasterizedPagePaketlenmiş RGB formatında işlenmiş bir sayfa, to_png(), to_tiff() ve save() ile
GeneratedAppearanceGörünüm sentezinin iç sonucu: içerik baytları ve gerekli ExtGState/font kaynakları
EncryptionUtilsAES-CBC/RC4 şifreleme ve PDF standard-security-handler anahtar türetmesi (Revisions 2–6)
PdfObjectHer COS (Carousel Object Structure) nesnesi için soyut temel sınıf
PdfDictionary / PdfArray / PdfStreamDüşük seviyeli belge ağacını oluşturan somut COS kapsayıcı tipleri
PdfName / PdfNumber / PdfString / PdfBoolean / PdfNullİlkel COS değer tipleri
PdfIndirectReferenceBaşka bir nesneye yönelik bir COS dolaylı referansı (n g R)
PdfCosWriterBellekteki bir COS PdfDocument‘yi PDF baytlarına serileştirir
PdfCosParser / LazyPdfObjectStorePDF baytlarını COS nesnelerine ayrıştırır, gerektiğinde somutlaştırır
IncrementalUpdate / IncrementalWriterMevcut bir PDF’yi yeniden yazmak yerine ona artımlı bir güncelleme bölümü ekle
SimplePdfYerel-Python düşük seviyeli belge temsili, yüksek seviyeli Document API üzerine inşa edilmiştir
TextFragmentAbsorber / TextFragmentCollectionBir SimplePdf örneği üzerinde düşük seviyeli metin-parçacığı çıkarımı
ImagePlacementAbsorber / ImagePlacementBir sayfaya yerleştirilen raster görüntüleri bul, kaydet, değiştir veya gizle
SigningUtilsDijital imzalama için kendi kendine imzalanmış sertifikalar ve PKCS#7/CAdES imzaları oluştur
DssMaterial / ChainResult / RevocationResult / TimestampInfoİmza doğrulama desteği: DSS materyali, sertifika zinciri sonuçları, iptal kontrolleri ve RFC 3161 zaman damgası doğrulaması
StandardFonts14 PDF Standard fontu için metrikler ve kodlamalar
CidTextCodecKompozit (Type0) yazı tipleri için show-string’leri kodla ve kod çöz
ShadingEksenel, radyal ve fonksiyon tabanlı gölgelendirmelerde örnek RGB rengi
Color / MatrixMotorun her yerinde kullanılan düşük seviyeli renk ve 2-D affine-transform ilkelikleri

Ayrıca Bakınız

 Türkçe