SVG Form XObject İçe Aktarımı
THotPDF.ImportSVGFormXObject, SVG'yi bir kez parse eder ve tek bir yeniden kullanılabilir PDF Form XObject kaydeder; THPDFPage.DrawSVGFormXObject ise onu istenen boyutta yerleştirir ve isteğe bağlı olarak sayfa link annotation'ları oluşturur
Bildirim
function ImportSVGFormXObject(const Input: TBytes): AnsiString; overload;
function ImportSVGFormXObject(
const Input: TBytes;
out Statistics: THPDFSVGImportStatistics
): AnsiString; overload;
procedure DrawSVGFormXObject(
const FormName: AnsiString;
X, Y, W, H: Single;
AddLinks: Boolean = True
);
Vektör profil
- Geometri; eliptik arc'lı path'ler, dikdörtgenler, köşeleri yuvarlatılmış dikdörtgenler, daireler, elipsler, çizgiler, polyline'lar, polygon'lar, transform'lar, gruplar, symbol'ler ve yalnızca fragment'a işaret eden
usereferanslarını içerir - Paint; düz RGB renkleri, fill ve stroke opacity'si, fill kuralları, line cap ve join'ler, kalıtılan dash dizileri ve offset'ler, miter limit'leri, linear ve radial gradient vektör band'ları, renkli tiling pattern'lerle desteklenen gradient stroke'lar ve clip path'leri içerir
- Nesne ve grup opacity'si izole vektör saydamlık Form'ları kullanır; böylece örtüşen alt öğeler, kendilerini saran opacity uygulanmadan önce bileştirilir
- Mask'ler, PDF Alpha veya Luminosity soft mask'li saydamlık-grup Form kaynaklarına dönüşür; maske bölgesi kırpma,
maskUnits,maskContentUnitsve sınırlı iç içe maske referansları dahildir - CSS; gömülü type, class, ID ve compound selector'ları, presentation attribute'ları, inline stilleri, specificity'i, kaynak sırasını ve
!important'ı içerir - Belge import'ları, native yazma motoru üzerinden Unicode font alt kümelerini ve
ToUnicodeharitalarını gömer, yapılandırılan font fallback zincirlerini kullanır, fallback dizilerini ortak bir alfabetik baseline'a hizalar ve text anchoring'i gerçek glyph ilerlemelerinden hesaplar - Gömülü PNG ve JPEG image'ler yeniden kullanılabilir Image XObject'lere dönüşür, PNG alpha'yı soft mask olarak korur ve
preserveAspectRatio="none", ortalanmışmeetve ortalanmışslicedestekler - HTTP, HTTPS ve mail bağlantıları, yerleştirme duyarlı PDF link annotation'ları olarak korunur ve yeniden kullanılabilir Form stream'inin parçası olmaz
Metin ve paint sınırları
Metin; düz fill, bold ve italic varyantları, font boyutu, transform'lar, anchoring, opacity ve geometrik kırpma destekler. Gradient metin paint'i fail closed davranır ve her metin veya tspan node'ı eksiksiz bir SVG metin-akış layout motoru yerine bağımsız konumlanan bir dizi olarak kalır
Belge metni import'ları, stil duyarlı glyph denetimleri ve fallback yerleşimi üzerinden seçilen bold ve italic yüzü korur, ölçülen mürekkep sınırlarını saklar ve gerçekten çözülemeyen glyph'leri reddeder
UTF-8 metin ve onaltılık veya ondalık XML karakter referansları, UTF-16 vekil çiftleriyle temsil edilen tamamlayıcı skalerler dahil aynı Unicode skalerlerini Delphi ve FPC üzerinde korur
Metin builder'ı olmayan bağımsız HPDFBuildSVGFormData overload'ı, ölçülmüş Helvetica, Times ve Courier Base 14 ilerlemelerini kullanır ve soru işaretiyle değiştirmek yerine WinAnsi dışındaki karakterleri reddeder; THPDFSVGTextRunBuilder alan overload'ı ise çağıranın sağladığı gömülü metin formlarını ve metrikleri kabul eder
Gradient'ler sınırlı vektör-bant yaklaşımını korur; saydam kaynaklar PDF 1.4 gerektirir ve PDF/A-1 strict profili tarafından reddedilir
Stroke stilleri
stroke-dasharray, stroke-dashoffset ve stroke-miterlimit; presentation attribute'leri, gömülü CSS, inline stiller ve kalıtım üzerinden, gruplar ve yalnızca fragment'a işaret eden use instance'ları dahil çalışır
Dash dizileri virgül veya boşlukla ayrılmış sayıları ve desteklenen uzunlukları kabul eder; yüzdeler sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2) olarak hesaplanan normalize viewport köşegenini kullanır
Tek sayıda elemanlı diziler çift uzunluklu bir desen oluşturacak şekilde tekrarlanır, her alt yol deseni yeniden başlatır ve pozitif veya negatif offset'ler eksiksiz desenin çevresinde döner; none ve tamamen sıfır diziler düz stroke üretir
Sıfır uzunluklu boyalı dash'ler yuvarlak veya kare uç işaretlerini korur; sıradan düz stroke'lar, gradient stroke pattern'leri, kırpma, mask'ler ve izole opacity grupları seçilen stroke ayarlarını paylaşır
Varsayılan miter limit'i 4'tür; SVG 2'nin 0 ile 1 arasındaki değerleri kabul edilir ve miter limit'i aşacağı yerlerde bevel join kullanır, gradient ve saydamlık kaynak sınırları ise seçilen limit içinde keskin join'leri korur
Native render, sınırlı dash geometrisiyle offset'leri, kesirli uzunlukları ve GDI kalem sınırından uzun dizileri korur; uyarlanabilir eğri düzleştirme ve segment sınırları boyunca sürekli boyalı join'ler kullanır
pathLength ile dash kalibrasyonu bu profilin dışında kalır; düz olmayan bir dash dizisini pathLength ile birleştiren şekiller, kalibre edilmemiş uzunlukları sessizce kullanmak yerine fail closed davranır
Stroke semantiği, aşağıda açıklanan parser ve renderer bütçeleri içinde SVG 2 stroke modelini izler
Metin shaping yapılandırması
Gömülü SVG metni, import eden belgenin ShapingFeatures, AutoShapeArabic, AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam ve AutoShapeHanifiRohingya ayarlarını, GSUB script ve dil seçimleriyle font fallback zincirlerini birlikte kullanır
Bu ayarlar, çağıranın yapılandırmasını değiştirmeden hem ölçülen ilerlemeler hem de üretilen metin görünümleri sırasında uygulanır; shaping opt-in kalır ve istenen glyph'leri ve OpenType tablolarını sağlayan bir font gerektirir
Her üretilen metin görünümü en fazla 256 farklı shaping font seçimini ve 64 MiB kümülatif ham font verisini kabul eder; desteklenmeyen font verisi veya aşılan bir sınır import'u atomik olarak başarısız kılar
Nesne ve grup opacity'si
opacity, node'unun eksiksiz boyalı sonucuna bir kez uygulanır ve alt öğelere kalıtılmaz; fill-opacity ve stroke-opacity ayrı kalıtılan paint değerlerini korur
<g opacity="0.5"> içindeki iki örtüşen opak kırmızı dikdörtgen örtüşmelerinde eşit yarı saydam kalır; bağımsız olarak yarı saydam iki dikdörtgen ise örtüştükleri yerde koyulaşır
İç içe gruplar sırayla bileştirilir: 0.5'lik iki saran opacity, opak bir alt öğe üzerinde etkin 0.25 verir ve bir alt öğenin 1'lik açık opacity'si kendisini saran grubu geçersiz kılmaz
Kök SVG node'ları, kapsayıcılar, link'ler, fragment referansları, metin, image'ler ve şekiller aynı nesne-opacity yolunu kullanır; yalnızca fragment'a işaret eden use referansları hem instance'ın hem referans verilen node'un stillerini korur
Fill ve stroke alpha bağımsız kalır; yarı saydam bir nesnenin içinde örtüştükleri noktada da böyledir. Gradient stop alpha'sı, nesne bileştirmesinden önce ilgili paint alpha'sıyla birleşir
Clip ve maske etkileri alt öğelere paint ayarı olarak kalıtılmak yerine node'larına aittir; link geometrisi yerleştirme duyarlı kalır ve izole Form sınırları dönüştürülmüş stroke'ları ve uçları ihtiyatla korur
Importer, vektör operator'lerini, gömülü metin Form'larını, image kaynaklarını, pattern'leri ve mask'leri izole gruplar içinde tutar; tüm SVG'yi bir bitmap'e düzleştirmez
Desteklenen davranış, SVG nesne ve grup opacity modelini izler; bu sayfadaki diğer sınırlı metin, gradient ve geometri kısıtları geçerli kalır
Güvenlik ve bütçeler
Importer, 8 MiB'ye kadar düz veya gzip ile sıkıştırılmış SVG kabul eder; açılmış girdiyi 32 MiB ile, ana, pattern, maske ve grup operator'lerinin birleşimini 16 MiB ile, node sayısını 4,096 ile, iç içe geçmeyi 64 seviye ile, CSS kurallarını 256 ile ve path değerlerini 100,000 ile sınırlar
Gömülü image'ler yalnızca katı Base64 data:image/png;base64, ve data:image/jpeg;base64, payload'larını kabul eder; en fazla 128 image, boyut başına 16,384 piksel ve tüm image'ler toplamında 16,777,216 çözülen piksel sınırı vardır. Boyutlar native decoding'ten önce denetlenir
Metin 128 text run ve run başına 65,536 UTF-16 birimi ile sınırlıdır; gradient stroke pattern'leri, mask'ler ve izole opacity grupları her biri 128 kaynakla sınırlıdır. Özyinelemeli maske referansları fail closed davranır
Dash dizileri, tek sayı dizi açılımından önce en fazla 64 kaynak girdisi içerir; pozitif girdiler en az 0,000001 kullanıcı birimi olmalıdır, tekil uzunluklar ve normalize döngü 1.000.000.000'u aşmamalıdır, mutlak offset'ler 1.000.000.000'u aşmamalıdır ve miter limit'leri 0 ile 1.000.000 arasında kalmalıdır
Gerçekten iç içe saydamlık etkileri, SVG ağaç derinlik sınırından bağımsız olarak native renderer'a uymak için sekiz düzeyle sınırlıdır; saydamlık etkisi olmayan sıradan iç içe kapsayıcılar bu hakkı tüketmez
Sayıdamlık-etki sınırları sonlu olmalı ve her koordinat 1.000.000.000 mutlak değer içinde kalmalıdır; bu sınırlı koordinat profilinin dışındaki import'lar grup veya maske kaydından önce başarısız olur
Başarısız import'lar, üretilen nesneleri, gömülü metin Form'larını, registry girdilerini ve sürüm ile aygıt rengi durumunu geri alır; böylece çağıranlar aynı belgeyi yeniden kullanabilir ve saran bir graph transaction'ı koruyabilir
Script'ler, event handler'lar, DTD'ler, foreignObject, desteklenmeyen data medya türleri, JavaScript URL'leri ve harici paint veya image kaynak URL'leri fail closed davranır
url(#gradient), url(#clip) ve href="#symbol" gibi fragment referansları parse edilen belgenin içinde kalır ve asla dosya veya ağ erişimi tetiklemez
İstatistikler
THPDFSVGImportStatistics; node, CSS kuralı, gradient, gradient stroke, mask, image, link ve text run sayılarını, GroupCount üzerinden izole opacity gruplarını ve ana, pattern, maske ve grup operator'lerinin birleşik üretilen baytlarını raporlar
HPDFBuildSVGFormData, sınırlı parser'ı THPDFSVGFormData ve THPDFSVGLinkInfo üzerinden ayrı olarak sunar; kayıt öncesinde Form içeriğine, kendine özgü boyutlara, opacity kaynaklarına, image payload'larına, pattern ve maske stream'lerine, metin kaynak adlarına veya link meta verisine ihtiyaç duyan çağıranlar içindir. Groups, izole grup operator stream'lerini ve ihtiyatlı Form sınırlarını sağlar
Örnek
Document.BeginDoc;
FormName := Document.ImportSVGFormXObject(SVGBytes, Statistics);
if FormName = '' then
raise Exception.Create('SVG import failed');
Document.CurrentPage.DrawSVGFormXObject(
FormName,
36,
72,
240,
120,
True
);
Document.CurrentPage.DrawSVGFormXObject(
FormName,
320,
72,
120,
60,
False
);
Ayrıca bkz.: THotPDF.ImportSVGFormXObject, THPDFPage.DrawSVGFormXObject, HTML5 Paged-Media Import