Untuk mengekspor lembar kerja Excel ke PDF dari Delphi atau C++Builder tanpa perlu instalasi Office, panggil SaveAsPDF pada lembar kerja atau workbook HotXLS. HotXLS adalah komponen Excel VCL asli, dan ekspor lembar kerja ke PDF merender rentang lembar kerja yang digunakan (used range) ke file PDF 1.4 mandiri, memetakan lebar kolom Excel dan teks tampilan sel ke halaman A4 dengan paginasi multi-halaman otomatis. Tidak ada salinan Excel, tidak ada driver printer, dan tidak ada DLL eksternal yang ikut serta dalam proses render
HotXLS memperlakukan PDF sebagai format presentasi data, kerabat dari jalur ekspor CSV, TSV, dan HTML-nya, dan bukan sebagai engine render yang akurat hingga tingkat piksel. Ekspor ini mereproduksi konten dan tata letak tabular: nilai yang Anda lihat di kisi, proporsi kolom, dan garis kisi di sekitar sel. Pembingkaian tersebut penting karena menetapkan ekspektasi yang jujur sejak awal, dan sisa artikel ini membahas dengan tepat di mana batas tersebut berada
Bagaimana cara mengonversi Excel ke PDF di Delphi tanpa Office?
Jalur terpendek adalah satu panggilan tunggal. TXLSWorksheet mengekspos SaveAsPDF(FileName) dan SaveAsPDF(Stream), and TXLSWorkbook mengekspos dua kelebihan beban (overload) yang sama yang diteruskan ke lembar kerja aktif. Masing-masing mengembalikan Integer, yaitu 1 untuk sukses dan -1 untuk gagal, sehingga Anda dapat membuat percabangan kode berdasarkan hasil tersebut tanpa membungkus panggilan dalam penanganan pengecualian (exception handling) Anda sendiri
uses
lxHandle;
var
Book: TXLSWorkbook;
begin
Book := TXLSWorkbook.Create;
try
Book.Open('sales-june.xlsx');
// Render the active sheet's used range straight to report.pdf.
if Book.SaveAsPDF('report.pdf') = 1 then
Writeln('PDF written');
finally
Book.Free;
end;
end;
Ketika Anda memanggil SaveAsPDF pada lembar kerja, HotXLS mengekspor UsedRange lembar kerja tersebut, yaitu kotak pembatas dari setiap sel yang terisi. Kelebihan beban workbook adalah kenyamanan yang didelegasikan ke lembar kerja aktif, sehingga laporan multi-lembar kerja dapat melakukan perulangan pada lembar kerja yang dibutuhkannya atau memilih lembar kerja aktif sebelum panggilan. Tidak ada mode seluruh workbook sekaligus (everything-in-one-pass) yang menggabungkan setiap tab: setiap panggilan merender satu lembar kerja atau satu rentang
Bagaimana HotXLS mengubah rentang yang digunakan menjadi halaman PDF?
HotXLS menelusuri rentang yang digunakan sel demi sel dan menatanya sebagai kisi berhalaman. Geometri kolom datang langsung dari Excel: setiap lebar kolom dikonversi dari satuan lebar Excel ke titik tipografi (typographic points), dengan batas minimum agar tidak ada kolom yang menciut menjadi sangat tipis. Ketika kolom-kolom tersebut secara kolektif lebih lebar dari halaman yang dapat digunakan, HotXLS memperkecil ukurannya secara seragam agar pas; ketika sudah pas, ia membiarkannya pada lebar alaminya alih-alih meregangkannya di seluruh halaman
Baris-baris kemudian mengalir turun ke halaman sampai baris berikutnya melewati margin bawah, pada titik mana HotXLS membuka halaman baru dan melanjutkannya, sehingga lembar kerja dengan seribu baris akan berhalaman dengan sendirinya tanpa pembukuan jeda halaman dari Anda. Setiap sel mencetak FormattedText-nya, yaitu string tampilan yang dihasilkan setelah format angka diterapkan, sehingga tanggal muncul seperti tanggal yang ditampilkan di lembar kerja dan sel mata uang mempertahankan pemisah ribuan dan simbolnya. Teks yang melampaui kolomnya akan dipotong sesuai lebar sel alih-alih tumpah ke sel tetangga
Mengontrol orientasi, margin, dan ukuran font
Untuk pengaturan apa pun di luar tata letak bawaan, kendalikan eksportir secara langsung. TXLSPDFExport adalah kelas di balik pembantu satu baris, dan ia mempublikasikan tiga properti: Orientation (xlsPdfPortrait atau xlsPdfLandscape, dengan portrait sebagai bawaan), Margin (titik, bawaan 40), dan FontSize (titik, bawaan 9). Atur properti tersebut sebelum Anda memanggil SaveAsPDF and seluruh dokumen akan menggunakannya
uses
lxHandle, lxPDF;
var
Book: TXLSWorkbook;
Exporter: TXLSPDFExport;
begin
Book := TXLSWorkbook.Create;
try
Book.Open('wide-ledger.xlsx');
Exporter := TXLSPDFExport.Create;
try
Exporter.Orientation := xlsPdfLandscape; // fit wide sheets on the page
Exporter.Margin := 28; // tighter page margin, in points
Exporter.FontSize := 8; // denser rows
Exporter.SaveAsPDF(Book.ActiveSheet, 'ledger.pdf');
finally
Exporter.Free;
end;
finally
Book.Free;
end;
end;
TXLSPDFExport juga menerima rentang alih-alih seluruh lembar kerja melalui SaveAsPDF(Range: IXLSRange; ...), yang merupakan cara Anda mengekspor blok ringkasan dari lembar kerja yang juga menampung perhitungan coretan. Kelebihan beban rentang tersebut adalah kelebihan beban yang sama yang diandalkan oleh pembantu lembar kerja secara internal, sehingga tata letak, penskalaan, dan paginasi berperilaku identik baik ketika Anda menyerahkan rentang penuh yang digunakan atau pilihan yang dipilih secara manual
var
Book: TXLSWorkbook;
Exporter: TXLSPDFExport;
Summary: IXLSRange;
begin
Book := TXLSWorkbook.Create;
try
Book.Open('quarter.xlsx');
// Export only the summary block, not the scratch columns beside it.
Summary := Book.Sheets[1].Range['A1', 'F20'];
Exporter := TXLSPDFExport.Create;
try
Exporter.SaveAsPDF(Summary, 'summary.pdf');
finally
Exporter.Free;
end;
finally
Book.Free;
end;
end;
Mengapa HotXLS tidak menyematkan font: kompromi Helvetica dan WinAnsi
HotXLS menulis teks dengan font Helvetica bawaan PDF dan WinAnsiEncoding, pilihan tanpa dependensi yang disengaja dengan satu batasan nyata. Karena Helvetica adalah salah satu dari 14 font standar yang sudah dimiliki oleh setiap pembaca PDF yang patuh, eksportir tidak menyematkan program font sama sekali: ukuran file tetap kecil dan dapat dibuka di mana saja, tanpa perlu lisensi atau pengiriman font tambahan bersamanya. Biaya dari pilihan tersebut adalah repertoar karakter yang dapat ditampilkan pada halaman
WinAnsiEncoding mencakup set Windows-1252, sehingga teks Latin, tanda baca umum, dan aksen Eropa Barat yang biasa dapat dirender dengan benar, dan HotXLS melipat segelintir karakter tipografi, tanda kutip kurawal, en dash dan em dash, serta simbol euro ke dalam slot CP1252 mereka. Karakter di luar rentang tersebut, seperti ideograf CJK, Sirilik, Yunani, dan Arab, akan ciut menjadi tanda tanya pada halaman. Jika lembar kerja Anda membawa teks non-Latin, eksportir ini adalah alat yang salah, dan pekerjaan yang cocok adalah renderer PDF dengan gaya penuh
Di mana batas ekspor lembar kerja ke PDF
HotXLS merender konten dan struktur, bukan gaya visual penuh dari lembar kerja. Isian sel (cell fills), gaya batas per tepi, font dan warna per sel, grafik, dan gambar tersemat berada di luar apa yang digambar oleh eksportir; apa yang Anda dapatkan adalah kisi teks dengan garis kisi yang seragam. Itu adalah kontrak yang sama dengan yang dihormati oleh eksportir HTML dan RTF, dan merupakan pilihan yang tepat untuk laporan atau serah terima data di mana angka-angka yang membawa arti dan tema visual tidak terlalu penting
Ketika tujuannya adalah dokumen bergaya dan konsisten dengan merek, pola yang biasa dilakukan adalah menyusun angka-angka dalam templat spreadsheet terlebih dahulu, yang dibahas secara mendalam dalam alur kerja pembuatan laporan berbasis templat. Dan karena semua ini tidak menyentuh COM atau instans Excel yang berjalan, pipa ini cocok dengan model otomasi bebas Office yang sama yang digunakan HotXLS secara menyeluruh: Pascal murni, dapat diterapkan di server headless, tanpa perlu lisensi interop atau pengawasan khusus
PDF mandiri, byte demi byte
HotXLS membangun struktur file PDF secara manual dan menghitung tabel referensi silang (cross-reference table) dari offset byte yang tepat, yang merupakan alasan mengapa outputnya dapat dibuka di setiap pembaca PDF. Saat menserialisasikan setiap objek, HotXLS mencatat offset awal objek tersebut sebelum menambahkan byte-nya, lalu memajukan posisi berjalan berdasarkan panjang yang baru ditulisnya, sehingga tabel xref mendarat dengan tepat pada setiap objek dan startxref menandai di mana tabel tersebut dimulai. Pembaca PDF yang menemukan offset tersebut meleset satu byte saja akan menolak seluruh file, yang menjadikan offset yang dihitung sendiri sebagai kontrak penting dari eksportir
Kontrak tersebut membawa satu konsekuensi ketat yang patut diketahui. Node Pages ditulis terlebih dahulu sebagai objek 1, tetapi daftar halaman anaknya tidak diketahui sampai setiap halaman telah dipancarkan, sehingga HotXLS mencadangkannya sebagai placeholder dan menambal elemen anak serta jumlah akhirnya sebelum lintasan offset berjalan, tidak pernah setelahnya. Setelah byte objek diukur untuk xref, mereka dibekukan: mengubah satu byte saja setelahnya akan menggeser setiap offset berikutnya dan merusak tabel. Ini adalah disiplin kecil yang menghasilkan PDF 1.4 standar yang valid tanpa pustaka tambahan di bawahnya
Metode SaveAsPDF dan kelas TXLSPDFExport yang ditunjukkan di sini didistribusikan bersama HotXLS Delphi Excel Component, di samping eksportir CSV, HTML, and RTF serta API lembar kerja lengkap untuk Delphi dan C++Builder