Hyperlink PDF adalah anotasi URI: sebuah persegi panjang yang mencakup area halaman tertentu, dan ketika diklik, memberi tahu viewer untuk membuka URL. Anotasi dan teks di bawahnya adalah objek yang sepenuhnya independen. PrintHyperlink milik HotPDF menggabungkan keduanya dalam satu panggilan, menggambar teks dan menghitung persegi panjang anotasi dari metrik teks yang dirender. Kenyamanan ini menyembunyikan detail yang perlu dipahami sebelum Anda menulis kode produksi
AddURILink dapat menempatkan hotspot di atas konten apa pun yang sudah digambar, sedangkan AddGoToLink menangani navigasi ke halaman internal. Keduanya melengkapi PrintHyperlink, yang hanya menggabungkan teks dan anotasi URI dalam satu panggilan
Cara kerja PrintHyperlink
PrintHyperlink berada di THPDFPage dan menerima empat argumen: koordinat X dan Y (dalam poin, asal kiri-bawah, Y bertambah ke atas), string label yang akan digambar, dan target URL. Secara internal ia memanggil TextOut dalam warna hyperlink saat ini, kemudian segera menghitung persegi panjang anotasi dari TextWidth dan TextHeight pada metrik font saat ini. Itu berarti font dan ukuran harus diatur sebelum panggilan, dan keduanya tidak boleh berubah di antara menggambar label dan menempatkan anotasi, karena keduanya diselesaikan dalam panggilan yang sama
Warna default adalah clBlue. SetRGBHyperlinkColor mengubahnya hanya untuk panggilan berikutnya; ia tidak memperbarui anotasi yang sudah ditulis secara retroaktif. Jika Anda memerlukan warna berbeda untuk grup tautan berbeda di halaman yang sama, panggil SetRGBHyperlinkColor sebelum setiap grup dan atur ulang setelahnya
Berikut adalah dokumen minimal yang menulis tiga tautan dengan dua warna berbeda:
procedure CreateLinkedReport(const FileName: string);
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := FileName;
Pdf.BeginDoc;
Pdf.CurrentPage.SetFont('Arial', [], 11);
// Default blue for informational links
Pdf.CurrentPage.TextOut(50, 750, 0, 'Reference links:');
Pdf.CurrentPage.PrintHyperlink(50, 720, 'Product page', 'https://www.loslab.com/en-us/pdf-library/delphi-pdf-component.html');
Pdf.CurrentPage.PrintHyperlink(50, 695, 'Online manual', 'https://www.loslab.com/en-us/pdf-library/delphi-pdf-component.html');
// Red for the action link
Pdf.CurrentPage.SetRGBHyperlinkColor(clRed);
Pdf.CurrentPage.PrintHyperlink(50, 660, 'Purchase license', 'https://www.loslab.com/en-us/buy-hotpdf-fastspring.html');
Pdf.CurrentPage.SetRGBHyperlinkColor(clBlue); // restore default
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
Jebakan koordinat
HotPDF menggunakan asal kiri-bawah dengan Y bertambah ke atas, dalam poin (1/72 inci). Halaman A4 berukuran 595 x 842 pt; halaman US Letter berukuran 612 x 792 pt. Y=750 berada di dekat bagian atas halaman A4, dan Y=50 akan berada di dekat margin bawah. Siapa pun yang datang dari grafis layar atau HTML berasumsi sebaliknya dan menempatkan baris tautan pertama langsung di luar area yang terlihat
Persegi panjang anotasi yang dihitung PrintHyperlink menggunakan sistem koordinat yang sama. Jika Anda kemudian memutar halaman, menskalanya, atau mengubah ukuran halaman tanpa menghitung ulang nilai X/Y Anda, teks yang terlihat dan persegi panjang yang dapat diklik akan bergeser. Tautan "berfungsi" dalam arti bahwa mengklik di suatu tempat dekat teks memicu URL, tetapi zona aktif tidak lagi sesuai dengan yang dilihat pembaca. Uji pada ukuran halaman dan tingkat zoom yang sebenarnya Anda kirimkan, bukan hanya di mesin pengembangan pada 100%
Satu kasus di mana pergeseran dijamin terjadi: jika Anda memanggil PrintHyperlink dengan koordinat yang sesuai untuk halaman A4 lalu beralih ke halaman format sempit khusus tanpa menyesuaikan nilai X/Y, anotasi dapat berakhir di luar halaman sepenuhnya. Objek anotasi tetap ditulis ke dalam PDF; sebagian besar viewer memotongnya secara diam-diam, sehingga tautan menghilang tanpa pesan kesalahan apa pun
Teks label versus target URL
Argumen Text dan Link bersifat independen. Anda dapat menggambar "Download invoice PDF" sementara targetnya adalah URL HTTPS lengkap dengan parameter kueri. Pemisahan ini disengaja; label yang terlihat harus mudah dibaca manusia dan URL bisa panjang atau dibuat secara dinamis
Yang menjadi masalah adalah ketika label adalah URL mentah itu sendiri, terutama yang panjang. Jika URL secara visual membungkus dua baris tetapi persegi panjang anotasi dihitung untuk string satu baris, hanya baris pertama yang dapat diklik. PrintHyperlink tidak menangani aliran multi-baris; buat label cukup pendek agar muat dalam satu baris pada ukuran font dan lebar halaman saat ini, atau gunakan label deskriptif singkat dengan URL lengkap sebagai target
Untuk dokumen yang akan diarsipkan atau didistribusikan tanpa koneksi internet aktif, pertimbangkan juga apakah URL itu sendiri harus muncul dalam bentuk tercetak di suatu tempat dalam badan dokumen, tidak hanya sebagai metadata anotasi. Pembaca yang mencetak PDF di atas kertas tidak mendapat manfaat apa pun dari anotasi URI
Contoh pembuatan dokumen lengkap
Pola di bawah ini menunjukkan skenario yang lebih realistis: membuat laporan singkat dengan bagian header, teks isi, dan baris tautan footer, semuanya dari kode daripada dari form dengan field TEdit:
procedure GenerateProductSheet(
const FileName, ProductName, ProductURL, SupportURL: string);
var
Pdf: THotPDF;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := FileName;
Pdf.Compression := cmFlateDecode;
Pdf.BeginDoc;
// Header
Pdf.CurrentPage.SetFont('Arial', [fsBold], 16);
Pdf.CurrentPage.TextOut(50, 750, 0, WideString(ProductName));
// Body paragraph placeholder
Pdf.CurrentPage.SetFont('Arial', [], 11);
Pdf.CurrentPage.TextOut(50, 710, 0, 'See the links below for full documentation.');
// Footer links
Pdf.CurrentPage.SetFont('Arial', [], 10);
Pdf.CurrentPage.TextOut(50, 80, 0, 'Links:');
Pdf.CurrentPage.PrintHyperlink(50, 60, 'Product page', ProductURL);
Pdf.CurrentPage.PrintHyperlink(200, 60, 'Support', SupportURL);
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
Perhatikan bahwa SetFont dipanggil sebelum setiap grup panggilan teks. Font tidak bertahan melewati AddPage, dan jika Anda lupa mengaturnya sebelum PrintHyperlink di halaman baru, persegi panjang anotasi akan dihitung berdasarkan metrik default halaman, yang mungkin berbeda dari yang Anda harapkan
Perbedaan penanganan anotasi di berbagai viewer
Anotasi URI PDF didefinisikan dalam ISO 32000-1 §12.6.4.7, dan setiap viewer yang sesuai harus mengikutinya. Dalam praktiknya, beberapa perilaku berbeda antar viewer. Adobe Acrobat menampilkan prompt keamanan pada klik pertama untuk URL yang tidak ada dalam daftar domain tepercaya; banyak browser dan reader ringan tidak demikian. Beberapa viewer PDF perusahaan di lingkungan yang dikunci menonaktifkan anotasi URI sepenuhnya berdasarkan kebijakan, sehingga klik tidak melakukan apa pun tanpa pesan kesalahan yang terlihat. Aplikasi PDF seluler bervariasi dalam hal apakah mereka membuka tautan di dalam tampilan web aplikasi atau meneruskannya ke browser sistem
Tidak satu pun dari ini adalah bug yang dapat Anda perbaiki dari sisi pembuatan; itu adalah keputusan kebijakan viewer. Yang dapat Anda lakukan adalah menulis label tautan yang membuat URL terlihat dalam badan dokumen juga, sehingga pembaca di lingkungan yang dibatasi masih dapat menyalin alamat secara manual. Anotasi adalah kenyamanan; teks adalah cadangan
Satu detail lagi yang perlu diketahui: anotasi URI PDF tidak membawa garis bawah visual secara default. Garis bawah yang Anda lihat di sebagian besar viewer digambar oleh viewer itu sendiri berdasarkan jenis anotasi, bukan oleh glif dalam aliran konten. Jika Anda memerlukan garis bawah fisik yang bertahan pada rendering ke non-interaktif atau konversi PDF-ke-gambar, gambarlah secara eksplisit dengan LineTo dan Stroke pada offset Y yang tepat di bawah garis dasar teks. Itu adalah operasi gambar terpisah, bukan sesuatu yang ditangani PrintHyperlink untuk Anda
API hyperlink yang ditampilkan di sini adalah bagian dari HotPDF Component untuk Delphi dan C++Builder