Page Nav

HIDE

Grid

GRID_STYLE

Breaking News

latest

Membuat Auto Wrap Content pada Tabel dengan FPDF dan PHP

Semalem saya dapet pertanyaan dari salah satu pengunjung website ini terkait dengan tutorial  membuat laporan PDF dengan FPDF  yang pernah s...

Semalem saya dapet pertanyaan dari salah satu pengunjung website ini terkait dengan tutorial membuat laporan PDF dengan FPDF yang pernah saya posting. Dia sudah mencobanya namun saat isi data pada suatu kolom melebihi lebar dari kolom tersebut, maka tulisannya akan kepotong alias ga keliatan. Saya juga sering mendapatkan pertanyaan serupa baik dari beberapa mahasiswa, pengunjung website achmatim.net, kawan-kawan di facebook maupun follower di twitter. Sehingga saya mencoba untuk membuat contoh program PHP sederhana mengenai membuat auto wrap content pada tabel ini.

Bagi Anda yang belum pernah menggunakan library FPDF sebaiknya mencoba tutorial dasarnya terlebih dahulu sebelum mencoba tutorial ini. Dan untuk menyederhanakan tutorial, data yang ditampilkan diambil dari sebuah array. Anda dapat memodifikasinya dengan mudah jika ingin dikoneksikan dengan sebuah database.Contoh Program PHP pada tutorial ini menggunakan library FPDF versi 1.7 yang dapat Anda download di situs resminya.

Source Code Program

Berikut ini contoh program beserta penjelasan singkatnya:


  1. <?php






  2. /**



  3.  * @author Achmad Solichin



  4.  * @website http://achmatim.net



  5.  * @email achmatim@gmail.com



  6.  */



  7. require_once("fpdf17/fpdf.php");






  8. class FPDF_AutoWrapTable extends FPDF {



  9. private $data = array();



  10. private $options = array(



  11. 'filename' => '',



  12. 'destinationfile' => '',



  13. 'paper_size'=>'F4',



  14. 'orientation'=>'P'



  15. );






  16. function __construct($data = array(), $options = array()) {



  17. parent::__construct();



  18. $this->data = $data;



  19. $this->options = $options;



  20. }






  21. public function rptDetailData () {



  22. //



  23. $border = 0;



  24. $this->AddPage();



  25. $this->SetAutoPageBreak(true,60);



  26. $this->AliasNbPages();



  27. $left = 25;






  28. //header



  29. $this->SetFont("", "B", 15);



  30. $this->MultiCell(0, 12, 'PT. ACHMATIM DOT NET');



  31. $this->Cell(0, 1, " ", "B");



  32. $this->Ln(10);



  33. $this->SetFont("", "B", 12);



  34. $this->SetX($left); $this->Cell(0, 10, 'LAPORAN DATA KARYAWAN', 0, 1,'C');



  35. $this->Ln(10);






  36. $h = 13;



  37. $left = 40;



  38. $top = 80;



  39. #tableheader



  40. $this->SetFillColor(200,200,200);



  41. $left = $this->GetX();



  42. $this->Cell(20,$h,'NO',1,0,'L',true);



  43. $this->SetX($left += 20); $this->Cell(75, $h, 'NIP', 1, 0, 'C',true);



  44. $this->SetX($left += 75); $this->Cell(100, $h, 'NAMA', 1, 0, 'C',true);



  45. $this->SetX($left += 100); $this->Cell(150, $h, 'ALAMAT', 1, 0, 'C',true);



  46. $this->SetX($left += 150); $this->Cell(100, $h, 'EMAIL', 1, 0, 'C',true);



  47. $this->SetX($left += 100); $this->Cell(100, $h, 'WEBSITE', 1, 1, 'C',true);



  48. //$this->Ln(20);






  49. $this->SetFont('Arial','',9);



  50. $this->SetWidths(array(20,75,100,150,100,100));



  51. $this->SetAligns(array('C','L','L','L','L','L'));



  52. $no = 1; $this->SetFillColor(255);



  53. foreach ($this->data as $baris) {



  54. $this->Row(



  55. array($no++,



  56. $baris['nip'],



  57. $baris['nama'],



  58. $baris['alamat'],



  59. $baris['email'],



  60. $baris['website']



  61. ));



  62. }






  63. }






  64. public function printPDF () {






  65. if ($this->options['paper_size'] == "F4") {



  66. $a = 8.3 * 72; //1 inch = 72 pt



  67. $b = 13.0 * 72;



  68. $this->FPDF($this->options['orientation'], "pt", array($a,$b));



  69. } else {



  70. $this->FPDF($this->options['orientation'], "pt", $this->options['paper_size']);



  71. }






  72. $this->SetAutoPageBreak(false);



  73. $this->AliasNbPages();



  74. $this->SetFont("helvetica", "B", 10);



  75. //$this->AddPage();






  76. $this->rptDetailData();






  77. $this->Output($this->options['filename'],$this->options['destinationfile']);



  78. }






  79. private $widths;



  80. private $aligns;






  81. function SetWidths($w)



  82. {



  83. //Set the array of column widths



  84. $this->widths=$w;



  85. }






  86. function SetAligns($a)



  87. {



  88. //Set the array of column alignments



  89. $this->aligns=$a;



  90. }






  91. function Row($data)



  92. {



  93. //Calculate the height of the row



  94. $nb=0;



  95. for($i=0;$i<count($data);$i++)



  96. $nb=max($nb,$this->NbLines($this->widths[$i],$data[$i]));



  97. $h=10*$nb;



  98. //Issue a page break first if needed



  99. $this->CheckPageBreak($h);



  100. //Draw the cells of the row



  101. for($i=0;$i<count($data);$i++)



  102. {



  103. $w=$this->widths[$i];



  104. $a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';



  105. //Save the current position



  106. $x=$this->GetX();



  107. $y=$this->GetY();



  108. //Draw the border



  109. $this->Rect($x,$y,$w,$h);



  110. //Print the text



  111. $this->MultiCell($w,10,$data[$i],0,$a);



  112. //Put the position to the right of the cell



  113. $this->SetXY($x+$w,$y);



  114. }



  115. //Go to the next line



  116. $this->Ln($h);



  117. }






  118. function CheckPageBreak($h)



  119. {



  120. //If the height h would cause an overflow, add a new page immediately



  121. if($this->GetY()+$h>$this->PageBreakTrigger)



  122. $this->AddPage($this->CurOrientation);



  123. }






  124. function NbLines($w,$txt)



  125. {



  126. //Computes the number of lines a MultiCell of width w will take



  127. $cw=&$this->CurrentFont['cw'];



  128. if($w==0)



  129. $w=$this->w-$this->rMargin-$this->x;



  130. $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;



  131. $s=str_replace("\r",'',$txt);



  132. $nb=strlen($s);



  133. if($nb>0 and $s[$nb-1]=="\n")



  134. $nb--;



  135. $sep=-1;



  136. $i=0;



  137. $j=0;



  138. $l=0;



  139. $nl=1;



  140. while($i<$nb)



  141. {



  142. $c=$s[$i];



  143. if($c=="\n")



  144. {



  145. $i++;



  146. $sep=-1;



  147. $j=$i;



  148. $l=0;



  149. $nl++;



  150. continue;



  151. }



  152. if($c==' ')



  153. $sep=$i;



  154. $l+=$cw[$c];



  155. if($l>$wmax)



  156. {



  157. if($sep==-1)



  158. {



  159. if($i==$j)



  160. $i++;



  161. }



  162. else



  163. $i=$sep+1;



  164. $sep=-1;



  165. $j=$i;



  166. $l=0;



  167. $nl++;



  168. }



  169. else



  170. $i++;



  171. }



  172. return $nl;



  173. }



  174. } //end of class






  175. //contoh penggunaan



  176. $data = array(





  177. 'nip' => '0111500382',



  178. 'nama' => 'ACHMAD SOLICHIN',



  179. 'alamat' => 'Jalan Ciledug Raya No 99, Petukangan Utara, Jakarta Selatan 12260, DKI Jakarta',



  180. 'email' => 'achmatim@gmail.com',



  181. 'website' => 'http://achmatim.net'



  182. ),





  183. 'nip' => '0411500101',



  184. 'nama' => 'CHOTIMATUL MUSYAROFAH',



  185. 'alamat' => 'Komplek Japos RT 002/015 Kelurahan Peninggilan, Kec. Ciledug, Tangerang',



  186. 'email' => 'chotimatul.musyarofah@gmail.com',



  187. 'website' => 'http://contohprogram.info'



  188. ),





  189. 'nip' => '1111500200',



  190. 'nama' => 'MUHAMMAD LINTANG',



  191. 'alamat' => 'Jl. Raya Caplin, Kec. Ciledug, Tangerang, Banten',



  192. 'email' => 'achmatim@yahoo.com',



  193. 'website' => 'http://ebook.achmatim.net'



  194. )



  195. );






  196. //pilihan



  197. $options = array(



  198. 'filename' => '', //nama file penyimpanan, kosongkan jika output ke browser



  199. 'destinationfile' => '', //I=inline browser (default), F=local file, D=download



  200. 'paper_size'=>'F4', //paper size: F4, A3, A4, A5, Letter, Legal



  201. 'orientation'=>'P' //orientation: P=portrait, L=landscape



  202. );






  203. $tabel = new FPDF_AutoWrapTable($data, $options);



  204. $tabel->printPDF();



  205. ?>



Penjelasan singkat program:
  • Baris 8. Menyertakan library FPDF. Pada tutorial ini, menggunakan library FPDF versi 1.7 dan diletakkan di folder /fpdf17
  • Baris 10-197. Mendefinisikan class FPDF_AutoWrapTable yang merupakan turunan dari class FPDF.
  • Baris 11-17. Mendeklarasikan variabel $data berisi data yang akan ditampilkan dan $options berisi beberapa opsi tampilan PDF seperti ukuran kertas dan orientasi kertas.
  • Baris 19-23. Konstruktor dari class yang menangkap 2 parameter yaitu $data dan $options
  • Baris 34-40. Mengatur header / judul laporan, termasuk ukuran font (baris 35 dan 38)
  • Baris 43-54. Mengatur judul tabel (kolom-kolom tabel) termasuk teks judul, lebar kolom dan perataan kolom.
  • Baris 57-70. Menampilkan data tabel dengan memanggil fungsi Row(). Pada baris 58 diatur lebar untuk setiap kolom dan pada baris 59 diatur perataan untuk setiap kolom.
  • Baris 75-93. Fungsi untuk menggenerate output PDF.
  • Baris 200-222. Setting data yang akan ditampilkan. Jika ingin dikoneksikan dengan database, ganti baris ini dengan perintah untuk mengambil data.
  • Baris 232-233. Pembentukan object class FPDF_AutoWrapTable dan pemanggilan fungsi untuk meng-generate file PDF.
Hasil dari program tersebut kurang lebih sebagai berikut:

Download dan Demo Program

Menampilkan Data MySQL ke PDF

Pada contoh program di atas, saya menggunakan data berupa array yang diisikan di dalam program. Anda bisa saja menggantinya dengan data yang berasal dari database seperti MySQL. Dan berhubung cukup banyak pengunjung yang bertanya mengenai bagaimana jika ingin menampilkan data dari database ke PDF, saya buatkan contoh programnya di bawah ini. Jangan lupa, siapkan terlebih dahulu database dan tabel yang diperlukan (lihat penjelasan di code program).


  1. <?php






  2. /**



  3.  * @author Achmad Solichin



  4.  * @website http://achmatim.net



  5.  * @email achmatim@gmail.com



  6.  */



  7. require_once("fpdf17/fpdf.php");






  8. class FPDF_AutoWrapTable extends FPDF {



  9. private $data = array();



  10. private $options = array(



  11. 'filename' => '',



  12. 'destinationfile' => '',



  13. 'paper_size'=>'F4',



  14. 'orientation'=>'P'



  15. );






  16. function __construct($data = array(), $options = array()) {



  17. parent::__construct();



  18. $this->data = $data;



  19. $this->options = $options;



  20. }






  21. public function rptDetailData () {



  22. //



  23. $border = 0;



  24. $this->AddPage();



  25. $this->SetAutoPageBreak(true,60);



  26. $this->AliasNbPages();



  27. $left = 25;






  28. //header



  29. $this->SetFont("", "B", 15);



  30. $this->MultiCell(0, 12, 'PT. ACHMATIM DOT NET');



  31. $this->Cell(0, 1, " ", "B");



  32. $this->Ln(10);



  33. $this->SetFont("", "B", 12);



  34. $this->SetX($left); $this->Cell(0, 10, 'LAPORAN DATA KARYAWAN', 0, 1,'C');



  35. $this->Ln(10);






  36. $h = 13;



  37. $left = 40;



  38. $top = 80;



  39. #tableheader



  40. $this->SetFillColor(200,200,200);



  41. $left = $this->GetX();



  42. $this->Cell(20,$h,'NO',1,0,'L',true);



  43. $this->SetX($left += 20); $this->Cell(75, $h, 'NIP', 1, 0, 'C',true);



  44. $this->SetX($left += 75); $this->Cell(100, $h, 'NAMA', 1, 0, 'C',true);



  45. $this->SetX($left += 100); $this->Cell(150, $h, 'ALAMAT', 1, 0, 'C',true);



  46. $this->SetX($left += 150); $this->Cell(100, $h, 'EMAIL', 1, 0, 'C',true);



  47. $this->SetX($left += 100); $this->Cell(100, $h, 'WEBSITE', 1, 1, 'C',true);



  48. //$this->Ln(20);






  49. $this->SetFont('Arial','',9);



  50. $this->SetWidths(array(20,75,100,150,100,100));



  51. $this->SetAligns(array('C','L','L','L','L','L'));



  52. $no = 1; $this->SetFillColor(255);



  53. foreach ($this->data as $baris) {



  54. $this->Row(



  55. array($no++,



  56. $baris['nip'],



  57. $baris['nama'],



  58. $baris['alamat'],



  59. $baris['email'],



  60. $baris['website']



  61. ));



  62. }






  63. }






  64. public function printPDF () {






  65. if ($this->options['paper_size'] == "F4") {



  66. $a = 8.3 * 72; //1 inch = 72 pt



  67. $b = 13.0 * 72;



  68. $this->FPDF($this->options['orientation'], "pt", array($a,$b));



  69. } else {



  70. $this->FPDF($this->options['orientation'], "pt", $this->options['paper_size']);



  71. }






  72. $this->SetAutoPageBreak(false);



  73. $this->AliasNbPages();



  74. $this->SetFont("helvetica", "B", 10);



  75. //$this->AddPage();






  76. $this->rptDetailData();






  77. $this->Output($this->options['filename'],$this->options['destinationfile']);



  78. }






  79. private $widths;



  80. private $aligns;






  81. function SetWidths($w)



  82. {



  83. //Set the array of column widths



  84. $this->widths=$w;



  85. }






  86. function SetAligns($a)



  87. {



  88. //Set the array of column alignments



  89. $this->aligns=$a;



  90. }






  91. function Row($data)



  92. {



  93. //Calculate the height of the row



  94. $nb=0;



  95. for($i=0;$i<count($data);$i++)



  96. $nb=max($nb,$this->NbLines($this->widths[$i],$data[$i]));



  97. $h=10*$nb;



  98. //Issue a page break first if needed



  99. $this->CheckPageBreak($h);



  100. //Draw the cells of the row



  101. for($i=0;$i<count($data);$i++)



  102. {



  103. $w=$this->widths[$i];



  104. $a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';



  105. //Save the current position



  106. $x=$this->GetX();



  107. $y=$this->GetY();



  108. //Draw the border



  109. $this->Rect($x,$y,$w,$h);



  110. //Print the text



  111. $this->MultiCell($w,10,$data[$i],0,$a);



  112. //Put the position to the right of the cell



  113. $this->SetXY($x+$w,$y);



  114. }



  115. //Go to the next line



  116. $this->Ln($h);



  117. }






  118. function CheckPageBreak($h)



  119. {



  120. //If the height h would cause an overflow, add a new page immediately



  121. if($this->GetY()+$h>$this->PageBreakTrigger)



  122. $this->AddPage($this->CurOrientation);



  123. }






  124. function NbLines($w,$txt)



  125. {



  126. //Computes the number of lines a MultiCell of width w will take



  127. $cw=&$this->CurrentFont['cw'];



  128. if($w==0)



  129. $w=$this->w-$this->rMargin-$this->x;



  130. $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;



  131. $s=str_replace("\r",'',$txt);



  132. $nb=strlen($s);



  133. if($nb>0 and $s[$nb-1]=="\n")



  134. $nb--;



  135. $sep=-1;



  136. $i=0;



  137. $j=0;



  138. $l=0;



  139. $nl=1;



  140. while($i<$nb)



  141. {



  142. $c=$s[$i];



  143. if($c=="\n")



  144. {



  145. $i++;



  146. $sep=-1;



  147. $j=$i;



  148. $l=0;



  149. $nl++;



  150. continue;



  151. }



  152. if($c==' ')



  153. $sep=$i;



  154. $l+=$cw[$c];



  155. if($l>$wmax)



  156. {



  157. if($sep==-1)



  158. {



  159. if($i==$j)



  160. $i++;



  161. }



  162. else



  163. $i=$sep+1;



  164. $sep=-1;



  165. $j=$i;



  166. $l=0;



  167. $nl++;



  168. }



  169. else



  170. $i++;



  171. }



  172. return $nl;



  173. }



  174. } //end of class






  175. /* contoh penggunaan dengan data diambil dari database mysql



  176.  *



  177.  * 1. buatlah database di mysql



  178.  * 2. buatlah tabel 'pegawai' dengan field: nip, nama, alamat, email dan website



  179.  * 3. isikan beberapa contoh data ke tabel pegawai tersebut.



  180.  *



  181.  * */






  182. #koneksi ke database (disederhanakan)



  183. mysql_connect ("localhost", "root", "");



  184. mysql_select_db ("demo");






  185. #ambil data dari DB dan masukkan ke array



  186. $data = array();



  187. $query = "SELECT nip, nama, alamat, email, website FROM pegawai ORDER BY nama";



  188. $sql = mysql_query ($query);



  189. while ($row = mysql_fetch_assoc($sql)) {



  190. array_push($data, $row);



  191. }






  192. //pilihan



  193. $options = array(



  194. 'filename' => '', //nama file penyimpanan, kosongkan jika output ke browser



  195. 'destinationfile' => '', //I=inline browser (default), F=local file, D=download



  196. 'paper_size'=>'F4', //paper size: F4, A3, A4, A5, Letter, Legal



  197. 'orientation'=>'P' //orientation: P=portrait, L=landscape



  198. );






  199. $tabel = new FPDF_AutoWrapTable($data, $options);



  200. $tabel->printPDF();



  201. ?>



Referensi Tutorial

Jika tutorial ini bermanfaat, berbagilah ke sebanyak-banyaknya orang maka Anda akan mendapatkan manfaat yang lebih banyak. Semoga bermanfaat dan maju terus ilmu pengetahuan Indonesia.

Sumber - Achmatim.Net

1 komentar

  1. terima kasih banyak, saya mencari kodingan ini dan akhirnya ketemu, terima kasih banyak sukses buat kamu :)

    BalasHapus