XML'den PDF'e Dönüşüm: Veriden Belgeye

Kerem Aydın·11 Temmuz 2026·⏱5 dk

XML, görsel sunumdan ziyade yapılandırılmış verileri depolamak için kullanılan bir formattır. Bundan okunabilir bir PDF belgesi elde etmek için bir stil katmanı veya programlı işleme uygulamak gerekir. Karmaşık raporlar için en güvenilir yöntem XSL-FO kullanımıdır, hızlı mizanpaj için ara HTML dönüşümü tercih edilir, tam özelleştirme için ise Python, Java veya C# ile kod aracılığıyla üretim yapılması uygundur.

Yöntem seçimi, mizanpajın karmaşıklığına ve teknik yığınınıza bağlıdır. Aşağıda, uygulama örnekleriyle birlikte üç temel yaklaşım incelenmiştir.

Kısa cevap: Hızlı ve şık bir sonuç istiyorsanız, XML'i HTML'e (XSLT veya bir betik aracılığıyla), ardından HTML'i PDF'e (headless tarayıcı aracılığıyla) dönüştürün. Sıkı basım standartları (kitaplar, faturalar) gerekiyorsa XSL-FO kullanın.

Neden sadece "PDF olarak kaydet" diyemezsiniz

XML dosyası yalnızca veri (etiketler, öznitelikler, metin) içerir ancak bunların nasıl görüneceğini bilmez. İçinde yazı tipleri, girintiler, sayfa sonları veya arka plan rengi hakkında bilgi bulunmaz. Bu nedenle dönüşüm süreci her zaman iki aşamadan oluşur:

  1. Dönüşüm: Ham verilerin, oluşturucunun anlayabileceği bir formata dönüştürülmesi (örneğin, mizanpaj talimatlarının eklenmesi).
  2. Oluşturma (Rendering): Bu talimatlara dayalı olarak ikili PDF dosyasının oluşturulması.

Yöntem 1: HTML Üzerinden Ara Dönüşüm (Önerilen)

Bu, modern web geliştirmede en popüler yöntemdir. Belgeyi biçimlendirmek için alışkın olduğunuz CSS stillerini kullanmanıza olanak tanır.

Algoritma:

  1. XML, XSLT veya bir sunucu betiği yardımıyla HTML'e dönüştürülür.
  2. Elde edilen HTML, headless bir tarayıcıda (Chrome, Puppeteer, Playwright) veya özel bir araçta (WeasyPrint, wkhtmltopdf) açılır.
  3. Tarayıcı sayfayı PDF olarak "yazdırır".

Avantajlar

  • CSS aracılığıyla kolay tasarım ayarı.
  • Modern yazı tipleri ve grafik desteği.
  • Hızlı prototip geliştirme.

Python Örneği (lxml + WeasyPrint)

from lxml import etree
from weasyprint import HTML

# 1. XML ayrıştırma ve XSLT uygulama
xml_doc = etree.parse('data.xml')
xslt_doc = etree.parse('style.xsl')
transform = etree.XSLT(xslt_doc)
result_html = transform(xml_doc)

# 2. HTML dizesini PDF'e dönüştürme
html_string = str(result_html)
HTML(string=html_string).write_pdf('output.pdf')

Python'da Kiril alfabesi ve karmaşık tablolar için daha iyi destek almak amacıyla, eski wkhtmltopdf'ye kıyasla modern CSS standartlarıyla daha iyi çalışan WeasyPrint veya Playwright kütüphanelerinin kullanılması önerilir.

Yöntem 2: XSL-FO (Basılı Ürünler İçin Standart)

XSL-FO (Extensible Stylesheet Language Formatting Objects), sayfa düzenini tanımlamak üzere özel olarak oluşturulmuş bir işaretleme dilidir. Faturaların, hukuki belgelerin ve kitapların üretilmesi için endüstri standardıdır.

Algoritma:

  1. XML, XSLT kullanılarak bir XSL-FO dosyasına dönüştürülür.
  2. Özel bir işlemci (örneğin Apache FOP) FO dosyasını PDF'e derler.

Ne Zaman Kullanılır

  • Sayfa sonları üzerinde hassas kontrol gerektiğinde.
  • Karmaşık üstbilgiler/altbilgiler, sayfa numaralandırma, içerik tabloları gerektiğinde.
  • Belgenin arşivleme standartlarına (PDF/A) uygun olması gerektiğinde.

Araçlar

  • Apache FOP (Java) — En popüler açık kaynaklı işlemci.
  • RenderX XEP — Gelişmiş desteğe sahip ticari çözüm.

Yöntem 3: Programlı Üretim (Kütüphaneler)

Belge yapısı çok dinamikse veya veriler çıktılanmadan önce karmaşık işleme mantığı gerektiriyorsa, ara işaretleme formatlarını atlayarak PDF'i doğrudan koddan üretmek daha kolaydır.

Dillere Göre Kütüphane Karşılaştırması

DilKütüphaneÖzellikler
PythonReportLab, FPDF2Kod aracılığıyla tam kontrol. Tabloları HTML'deki kadar kolay mizanpajlamak zordur.
JavaiText 7, OpenPDFKurumsal çözümler için güçlü araçlar. iText'in sıkı bir lisansı vardır (AGPL).
C# / .NETQuestPDF, iTextSharpQuestPDF, modern fluent-API ve mükemmel oluşturma sunar.
Node.jsPDFKit, PuppeteerPDFKit basit belgeler için iyidir, Puppeteer karmaşık HTML düzenleri için uygundur.

Uygulama Adım Adım Planı

Dönüşümün uygulanması sırasında hatalardan kaçınmak için bu kontrol listesini takip edin:

  1. XML yapısının analizi. Hangi verilerin zorunlu, hangilerinin isteğe bağlı olduğunu belirleyin. İç içe geçmiş listelerin veya tabloların varlığını kontrol edin.
  2. Aracın seçimi.
    • Web ve hızlı raporlar için → HTML/CSS yaklaşımı.
    • Sıkı matbaa işleri için → XSL-FO.
    • Karmaşık iş mantığı için → Kod kütüphaneleri.
  3. Şablon hazırlığı. Bir XSLT stil sayfası veya HTML şablonu oluşturun. Boş değerlerin (null/boş düğümler) işlenmesine dikkat edin.
  4. Yazı tipi ayarı. Kullanılan yazı tiplerinin Kiril alfabesini (gerekiyorsa) desteklediğinden ve PDF'e gömülü olduğundan veya oluşturma sistemi tarafından erişilebilir olduğundan emin olun.
  5. Sınır durumlarında test etme. Çok uzun dizeler, çok sayıda sayfa ve veri eksikliği içeren dosyalarda üretimi kontrol edin.

Sık yapılan hata: Kodlamayı göz ardı etmek. Tüm iş akışının (XML ayrıştırıcı → XSLT işlemcisi → PDF oluşturucu) UTF-8'de çalıştığından emin olun. Aksi takdirde Rusça karakterler "bozuk karakterlere" dönüşür.

Dönüşüm Sırasında Sık Yapılan Hatalar

  • Anlam kaybı. HTML'e dönüştürürken tablolar için <thead>, <th> etiketlerinin kullanılması unutulur, bu da ekran okuyucuların ve arama motorlarının belge yapısını doğru okuyamamasına neden olur.
  • Dosya boyutunun şişmesi. Yüksek çözünürlüklü görüntülerin sıkıştırılmadan eklenmesi, PDF boyutunu 100 KB'tan 10 MB'a çıkarabilir. Eklerken JPEG/PNG sıkıştırması kullanın.
  • Hatalı sayfa sonları. Metin satırın veya tablonun ortasında kesilebilir. CSS'de bölünmemesi gereken bloklar için break-inside: avoid; özelliklerini kullanın.
  • Meta veri eksikliği. Hazır PDF, başlık, yazar ve oluşturma tarihini içermelidir. Bu, dosyaların aranması ve sıralanması için önemlidir.

SSS

Programlama olmadan XML'i çevrimiçi olarak PDF'e dönüştürmek mümkün mü? Evet, çevrimiçi dönüştürücüler mevcuttur ancak verilerin tam olarak nasıl yerleştirileceğini bilmedikleri için genellikle kötü sonuç verirler. Tek seferlik görevler için XML'i tarayıcıda açıp basit bir CSS stili uygulayabilir ve sayfayı PDF olarak yazdırabilirsiniz (Ctrl+P -> PDF olarak kaydet).

Hangisi daha iyi: XSL-FO mu yoksa HTML-to-PDF mi? HTML-to-PDF, bakım ve tasarım açısından daha kolaydır. XSL-FO, karmaşık ızgaraya sahip çok sayfalı belgeler (örneğin kitap mizanpajı) için daha öngörülebilir sonuçlar verir.

Aranabilir PDF (Searchable PDF) nasıl yapılır? Metin görüntüleri yerine vektörel yazı tipleri kullanın. Çoğu modern kütüphane (iText, WeasyPrint, FOP) varsayılan olarak bir metin katmanı oluşturur. Sayfaları görüntüye rasterleştirmekten kaçının.

PDF/A standardı XML'i destekler mi? PDF/A, uzun vadeli arşivleme için bir formattır. XML, görünür bir öğe olarak PDF/A'ya "gömülmez", ancak XML'deki veriler içeriğin üretilmesi için kullanılır. Üretim sırasında, dosyanın PDF/A standardına uygun olması için tüm yazı tiplerinin gömülü (embedded) olduğundan ve renk profillerinin doğru olduğundan emin olun.