Teknik Makale

Delphi HotPDF Hello World: İlk PDF Programınız

Her PDF kütüphanesi bir "merhaba dünya (hello world)" ile birlikte gelir ve HotPDF'ninki üzerinde yavaşlamaya değerdir, çünkü herhangi bir şey yapan en küçük program sizi daha sonraki her belgede tekrarlayacağınız iki kararı vermeye zorlar: Hangi yazı tipinin (font) ayarlanacağı ve metnin sayfada nereye yerleşeceği. Bu ikisini doğru yaptığınızda API'nin geri kalanı bir temanın varyasyonları (çeşitlemeleri) olacaktır. Okuyucuyu bir düzineye yakın dilde selamlayan tek bir sayfa yazan konsol programı olan tüm her şey burada:

program HelloWorld;

{$APPTYPE CONSOLE}

uses
  Winapi.Windows,   // for DEFAULT_CHARSET; on pre-XE2 Delphi use plain Windows
  HPDFDoc;          // HotPDF main unit

procedure CreateHelloWorld(const FileName: string);
var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := FileName;
    Pdf.Compression := cmFlateDecode;   // shrink the content streams
    Pdf.FontEmbedding := True;          // embed the face so it renders anywhere
    Pdf.BeginDoc;

    // One face covering many scripts. The 4th argument is the Windows charset;
    // DEFAULT_CHARSET lets the system pick glyphs per string.
    Pdf.CurrentPage.SetFont('Arial Unicode MS', [], 14, DEFAULT_CHARSET);

    // TextOut measures from the BOTTOM-LEFT corner, in points, Y growing upward.
    Pdf.CurrentPage.TextOut(72, 760, 0, 'Hello, Delphi PDF world!');     // English
    Pdf.CurrentPage.TextOut(72, 730, 0, 'Hola, mundo Delphi PDF!');      // Spanish
    Pdf.CurrentPage.TextOut(72, 700, 0, 'Hallo, Delphi PDF Welt!');      // German
    Pdf.CurrentPage.TextOut(72, 670, 0, 'Bonjour, monde PDF Delphi!');   // French
    Pdf.CurrentPage.TextOut(72, 640, 0, 'Ciao, mondo Delphi PDF!');      // Italian
    Pdf.CurrentPage.TextOut(72, 610, 0, 'Olá, mundo Delphi PDF!');       // Portuguese
    Pdf.CurrentPage.TextOut(72, 580, 0, 'Здравствуйте, Delphi PDF мир!'); // Russian
    Pdf.CurrentPage.TextOut(72, 550, 0, 'こんにちは、Delphi PDFの世界!');    // Japanese
    Pdf.CurrentPage.TextOut(72, 520, 0, 'Merhaba, Delphi PDF dünyası!');  // Turkish
    Pdf.CurrentPage.TextOut(72, 490, 0, '你好,Delphi PDF世界');           // Chinese
    Pdf.CurrentPage.TextOut(72, 460, 0, '여보세요, Delphi PDF 세계!');      // Korean

    Pdf.EndDoc;
  finally
    Pdf.Free;
  end;
end;

begin
  CreateHelloWorld('HelloWorld.pdf');
  Writeln('Wrote HelloWorld.pdf');
end.

Delphi'deki HotPDF bileşeni tarafından üretilen Çok Dilli Hello World PDF'si

İşte örneğin tamamı. try/finally ... Free ile eşleştirilen THotPDF.Create(nil) sıradan Delphi sahiplik modelidir (ownership pattern) ve PDF bunu değiştirmez. İçeride dikkat edilmesi gereken dört adımlı omurgadır: özellikleri ayarla, BeginDoc, çiz, EndDoc. Bu sıralama birbiriyle değiştirilemez

BeginDoc öncesi belge özelliklerini ayarlama

BeginDoc, HotPDF'in belgenin yapısını işlediği andır, bu nedenle tüm dosyayı etkileyen her şeyin öncesinde ayarlanması gerekir. Compression := cmFlateDecode içerik akışları (content streams) için FlateDecode'u açar; bu, sıkı bir dosya ile gereksiz yere şişirilmiş bir dosya arasındaki farktır. FontEmbedding := True, çizim yaptığınız yazı tipini dosyanın içine paketler, böylece daha önce hiç Arial Unicode MS yüklenmemiş bir makinede de sizinkinde göründüğü gibi görünür. BeginDoc'tan sonra bunlardan herhangi birini atarsanız, halihazırda işlemde olan belgeye sessizce hiçbir şey yapmaz ve sizi uyaracak bir hata vermez

Önce SetFont, sonra TextOut ve başlangıç noktasını izleyin

Çizim çağrılarıyla (drawing calls) ilgili iki şey ilk sayfalarında herkesin dikkatini çeker. İlki sıralamadır: SetFont, kendisine bağlı herhangi bir TextOut işleminden önce çalıştırılmalıdır ve her AddPage'den sonra tekrarlanmalıdır, çünkü mevcut yazı tipi (font) sayfa sonundan sonra hayatta kalmaz. İkincisi koordinat sistemidir. TextOut sayfanın sol üst köşesinden değil, sol alt köşesinden, nokta (1/72 inç) cinsinden, Y yukarı doğru hareket ettikçe artarak (increasing as you move up) ölçer. Buradaki çizgilerin 760'tan itibaren her biri bir öncekinin 30 nokta aşağısında olmak üzere aşağı doğru (downward) yürümesinin nedeni budur. Ekran grafiklerinden (screen graphics) gelen herkes tam tersini varsayar ve ilk satırı doğrudan alt kenarın dışına (straight off the bottom edge) yazar

Tek yazı tipi, birçok alfabe

Tek bir SetFont'un aynı sayfada Latin, Kiril, Japonca ve Çinceyi taşıyabilmesinin nedeni yazı tipinin kendisidir: Arial Unicode MS, neredeyse her alfabe için glifleri tek bir dosyada bir araya getirir. SetFont'un dördüncü argümanı Windows karakter setidir ve DEFAULT_CHARSET iletmek, sistemin her şeyi tek bir eski kod sayfasına (legacy code page) sabitlemek yerine her dizi (string) için glif seçmesine izin verir. İki uyarı, bu kolaylıkla birlikte gelir. Yazı tipi PDF'yi oluşturan makinede bulunmalıdır, çünkü işletim sistemi adı neye çözümlerse HotPDF onu gömer; eğer Arial Unicode MS eksikse Windows sessizce bir yedek ile değiştirir ve CJK metniniz boş kutular olarak çıkabilir. Ayrıca her alfabeyi aynı ölçüde kapsamaz: Arapça ve İbranice gibi sağdan sola (right-to-left) yazılar veya karmaşık şekillendirme (complex shaping) gerektiren herhangi bir şey için, RegisterUnicodeTTF ile yüklenen özel (dedicated) bir yazı tipine ve başlı başına bir konu olan sağdan sola metin çağrılarına (text calls) ulaşırsınız

Bunu çalıştırdığınızda çalışma dizininde HelloWorld.pdf'i elde edersiniz: tek sayfa, birkaç satır çok dilli metin, sıkıştırılmış, gömülü yazı tipi ile. Açık bir sonraki adım, o metne boyut, stil ve döndürme (rotation) vermek ve TextOut örneğinin (sample) üzerinde çalıştığı birden fazla bloğu kasıtlı (deliberately) olarak yerleştirmektir. Sadece metin değil de cetveller (rules), kutular (boxes) ve resimler (images) çizmek istediğinizde de aynı sayfa nesnesi bu çağrıları tutar

Burada gösterilen TextOut, SetFont ve belge çağrıları, Delphi ve C++Builder için HotPDF Bileşeninin (Component) bir parçasıdır