Artikel Teknis

Hello World HotPDF Delphi: Program PDF Pertama Anda

Setiap library PDF menyertakan sebuah "hello world", dan milik HotPDF layak dicermati pelan-pelan, karena program terkecil yang melakukan sesuatu pun sudah memaksa dua keputusan yang akan Anda ulangi di setiap dokumen sesudahnya: font mana yang disetel, dan di mana teks mendarat pada halaman. Benarkan keduanya dan sisa API-nya hanyalah variasi dari tema yang sama. Inilah keseluruhannya, sebuah program konsol yang menulis satu halaman yang menyapa pembaca dalam hampir selusin bahasa:

Diagram alur program Hello World HotPDF empat panggilan di Delphi dengan titik asal PDF di kiri bawah dan dua jebakan senyap yang disorot
Create, begin, draw, end adalah seluruh tulang punggungnya, dan titik asal di kiri bawah menjelaskan mengapa baris berikutnya memakai nilai Y yang lebih kecil
program HelloWorld;

{$APPTYPE CONSOLE}

uses
  Winapi.Windows,   // untuk DEFAULT_CHARSET; di Delphi pra-XE2 pakai Windows biasa
  HPDFDoc;          // unit utama HotPDF

procedure CreateHelloWorld(const FileName: string);
var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := FileName;
    Pdf.Compression := cmFlateDecode;   // ciutkan content stream
    Pdf.FontEmbedding := True;          // sematkan face agar terrender di mana pun
    Pdf.BeginDoc;

    // Satu face yang mencakup banyak aksara. Argumen ke-4 adalah charset Windows;
    // DEFAULT_CHARSET membiarkan sistem memilih glyph per string.
    Pdf.CurrentPage.SetFont('Arial Unicode MS', [], 14, DEFAULT_CHARSET);

    // TextOut mengukur dari sudut KIRI-BAWAH, dalam poin, Y bertambah ke atas.
    Pdf.CurrentPage.TextOut(72, 760, 0, 'Hello, Delphi PDF world!');     // Inggris
    Pdf.CurrentPage.TextOut(72, 730, 0, 'Hola, mundo Delphi PDF!');      // Spanyol
    Pdf.CurrentPage.TextOut(72, 700, 0, 'Hallo, Delphi PDF Welt!');      // Jerman
    Pdf.CurrentPage.TextOut(72, 670, 0, 'Bonjour, monde PDF Delphi!');   // Prancis
    Pdf.CurrentPage.TextOut(72, 640, 0, 'Ciao, mondo Delphi PDF!');      // Italia
    Pdf.CurrentPage.TextOut(72, 610, 0, 'Olá, mundo Delphi PDF!');       // Portugis
    Pdf.CurrentPage.TextOut(72, 580, 0, 'Здравствуйте, Delphi PDF мир!'); // Rusia
    Pdf.CurrentPage.TextOut(72, 550, 0, 'こんにちは、Delphi PDFの世界!');    // Jepang
    Pdf.CurrentPage.TextOut(72, 520, 0, 'Merhaba, Delphi PDF dünyası!');  // Turki
    Pdf.CurrentPage.TextOut(72, 490, 0, '你好,Delphi PDF世界');           // Tionghoa
    Pdf.CurrentPage.TextOut(72, 460, 0, '여보세요, Delphi PDF 세계!');      // Korea

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

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

PDF Hello World multibahasa yang dihasilkan komponen HotPDF Delphi di Delphi

Itulah keseluruhan contohnya. THotPDF.Create(nil) yang dipasangkan dengan try/finally ... Free adalah pola kepemilikan Delphi biasa, dan PDF tidak mengubahnya. Yang pantas diperhatikan adalah tulang punggung empat langkah di dalamnya: setel properti, BeginDoc, gambar, EndDoc. Urutannya tidak bisa ditukar

Setel properti dokumen sebelum BeginDoc

BeginDoc adalah saat HotPDF mengunci struktur dokumen, jadi apa pun yang memengaruhi keseluruhan berkas harus disetel sebelum itu. Compression := cmFlateDecode menyalakan FlateDecode untuk content stream, yang menjadi pembeda antara berkas ringkas dan berkas yang membengkak tanpa perlu. FontEmbedding := True mengemas font yang Anda pakai menggambar ke dalam berkas, sehingga tampilannya sama di mesin yang belum pernah memasang Arial Unicode MS seperti di mesin Anda. Berikan salah satunya setelah BeginDoc dan ia diam-diam tidak melakukan apa pun pada dokumen yang sedang berjalan, tanpa error yang memperingatkan Anda

SetFont, lalu TextOut, dan awasi titik asalnya

Dua hal tentang panggilan menggambar menjebak semua orang di halaman pertamanya. Yang pertama adalah urutan: SetFont harus dijalankan sebelum TextOut mana pun yang bergantung padanya, dan harus diulangi setelah setiap AddPage, karena font aktif tidak bertahan melewati pergantian halaman. Yang kedua adalah sistem koordinatnya. TextOut mengukur dari sudut kiri bawah halaman, bukan kiri atas, dengan Y bertambah saat Anda bergerak ke atas, dalam poin (1/72 inci). Itulah sebabnya baris-baris di sini berbaris turun dari 760, masing-masing 30 poin di bawah yang sebelumnya. Siapa pun yang datang dari grafik layar mengandaikan kebalikannya lalu menulis baris pertama tepat di luar tepi bawah

Satu font, banyak aksara

Alasan satu SetFont dapat membawa Latin, Kiril, Jepang, dan Tionghoa pada halaman yang sama adalah face-nya sendiri: Arial Unicode MS memaketkan glyph untuk hampir setiap aksara ke dalam satu berkas. Argumen keempat untuk SetFont adalah character set Windows, dan memberikan DEFAULT_CHARSET membiarkan sistem memilih glyph per string alih-alih memaku semuanya ke satu code page lawas. Dua peringatan menyertai kemudahan itu. Font-nya harus ada di mesin yang membangun PDF, karena HotPDF menyematkan apa pun yang diresolusi OS dari nama itu; jika Arial Unicode MS tidak ada, Windows diam-diam menukarnya dengan pengganti dan teks CJK Anda bisa keluar sebagai kotak kosong. Dan ia tidak mencakup setiap aksara secara setara: untuk tulisan kanan-ke-kiri seperti Arab dan Ibrani, atau apa pun yang memerlukan shaping kompleks, Anda beralih ke font khusus yang dimuat dengan RegisterUnicodeTTF beserta panggilan teks kanan-ke-kiri, yang merupakan topik tersendiri

Jalankan dan Anda mendapat HelloWorld.pdf di direktori kerja: satu halaman, beberapa baris teks multibahasa, terkompresi, dengan font tersemat. Langkah berikutnya yang jelas adalah memberi teks itu ukuran, gaya, dan rotasi, serta menempatkan lebih dari satu blok secara sengaja, keduanya ditelusuri oleh contoh TextOut. Ketika Anda ingin menggambar garis, kotak, dan gambar alih-alih sekadar teks, objek halaman yang sama juga menampung panggilan-panggilan itu

Panggilan TextOut, SetFont, dan panggilan dokumen yang ditunjukkan di sini adalah bagian dari HotPDF Delphi Component untuk Delphi dan C++Builder