Laporan PDF cantik, Auto Wrap Content Table dengan FPDF
Pernah gak sih, pas lagi bikin laporan dengan FPDF
, ternyata hasilnya tidak sesuai harapan?
Saat isi data pada suatu kolom melebihi
lebar dari kolom tersebut, maka tulisannya akan kepotong
alias gak keliatan
. Hehe…
Kebetulan tadi sore saya sendiri mengalaminya, biar gak lupa mending catet aja di blog.
Perkenalan sedikit, FPDF adalah library PHP
yang bisa kita manfaatkan untuk membuat file PDF
(bikin laporan).
Bagi anda yang belum pernah menggunakan library FPDF, silahkan bermain-main dengan tutorial dasarnya terlebih dahulu.
Disini saya hanya akan memberikan snippet code
, berbagi cara agar output tabel file PDF menjadi rapi nan cantik.
Berikut ini adalah contoh output masalah yang saya hadapi tadi sore :
Terlihat jelas, kolom pesan terlalu panjang isinya sehingga terpotong, ini terjadi karena saya hanya menggunakan fungsi $pdf->Cell
. Berikut saya lampirkan snippet code
-nya :
while($hasil=mysqli_fetch_array($data)){
$pdf->SetFillColor(255,255,255);
$pdf->Cell(1,0.8,$no++,1,0,'C',true);
$pdf->Cell(4,0.8,$hasil['tanggal'],1,0,'L',true);
$pdf->Cell(20,0.8,$hasil['pesan'],1,0,'L',true);
$pdf->Cell(3,0.8,$hasil['pengirim'],1,0,'L',true);
$pdf->Ln();
}
Kemudian seperti biasa, saya bertanya kepada mbah dukun terhebat saya, Stackoverflow
, ketemulah diskusi disini, solusinya menyarankan untuk menggunakan fungsi $pdf->MultiCell
.
Gak pake lama, langsung saya coba dan hasilnya :
Haduuuhhh kok malah jadi berantakan, berikut snippet code
-nya :
while($hasil=mysqli_fetch_array($data)){
$pdf->SetFillColor(255,255,255);
$pdf->Cell(1,0.8,$no++,1,0,'C',true);
$pdf->Cell(4,0.8,$hasil['tanggal'],1,0,'L',true);
$pdf->MultiCell(20,0.8,$hasil['pesan'],1,'L');
$pdf->Cell(3,0.8,$hasil['pengirim'],1,0,'L',true);
$pdf->Ln();
}
Tapi kalo dilihat-lihat dan agak sedikit dipikir, hhmmm… sepertinya gak bisa main copy-paste
nih macam tugas kampus, rasanya tidak menghargai Tuhan kalo saya tidak memanfaatkan otak untuk berfikir, padahal sudah dikasih gratis
sejak lahir, hehehe…
Merenung sejenak, try-error-learn
berulang-ulang muter otak sampe semedi nongkrong di kamar mandi, dan akhirnya… taraaaa…
Maka, benar sabda Kakek Bijak
:
Usaha
Tidak Akan PernahMengkhianati Hasil
, MakaJangan Pernah Menyerah
!
berikut snippet code
beserta penjelasan tiap barisnya :
while($hasil=mysqli_fetch_array($data)){
$cellWidth=20; //lebar sel
$cellHeight=1; //tinggi sel satu baris normal
//periksa apakah teksnya melibihi kolom?
if($pdf->GetStringWidth($hasil['pesan']) < $cellWidth){
//jika tidak, maka tidak melakukan apa-apa
$line=1;
}else{
//jika ya, maka hitung ketinggian yang dibutuhkan untuk sel akan dirapikan
//dengan memisahkan teks agar sesuai dengan lebar sel
//lalu hitung berapa banyak baris yang dibutuhkan agar teks pas dengan sel
$textLength=strlen($hasil['pesan']); //total panjang teks
$errMargin=5; //margin kesalahan lebar sel, untuk jaga-jaga
$startChar=0; //posisi awal karakter untuk setiap baris
$maxChar=0; //karakter maksimum dalam satu baris, yang akan ditambahkan nanti
$textArray=array(); //untuk menampung data untuk setiap baris
$tmpString=""; //untuk menampung teks untuk setiap baris (sementara)
while($startChar < $textLength){ //perulangan sampai akhir teks
//perulangan sampai karakter maksimum tercapai
while(
$pdf->GetStringWidth( $tmpString ) < ($cellWidth-$errMargin) &&
($startChar+$maxChar) < $textLength ) {
$maxChar++;
$tmpString=substr($hasil['pesan'],$startChar,$maxChar);
}
//pindahkan ke baris berikutnya
$startChar=$startChar+$maxChar;
//kemudian tambahkan ke dalam array sehingga kita tahu berapa banyak baris yang dibutuhkan
array_push($textArray,$tmpString);
//reset variabel penampung
$maxChar=0;
$tmpString='';
}
//dapatkan jumlah baris
$line=count($textArray);
}
//tulis selnya
$pdf->SetFillColor(255,255,255);
$pdf->Cell(1,($line * $cellHeight),$no++,1,0,'C',true); //sesuaikan ketinggian dengan jumlah garis
$pdf->Cell(4,($line * $cellHeight),$hasil['tanggal'],1,0); //sesuaikan ketinggian dengan jumlah garis
//memanfaatkan MultiCell sebagai ganti Cell
//atur posisi xy untuk sel berikutnya menjadi di sebelahnya.
//ingat posisi x dan y sebelum menulis MultiCell
$xPos=$pdf->GetX();
$yPos=$pdf->GetY();
$pdf->MultiCell($cellWidth,$cellHeight,$hasil['pesan'],1);
//kembalikan posisi untuk sel berikutnya di samping MultiCell
//dan offset x dengan lebar MultiCell
$pdf->SetXY($xPos + $cellWidth , $yPos);
$pdf->Cell(3,($line * $cellHeight),$hasil['pengirim'],1,1); //sesuaikan ketinggian dengan jumlah garis
}