Membuat Auto Wrap Content pada FPDF


Di dalam FPDF terdapat fungsi MultiCell, MultiCell merupakan fungsi dari class FPDF yang berfungsi untuk membuat satu kotak untuk diisi kata/kalimat, yang ukuran tingginya dapat kita sesuaikan, berbeda dengan Cell, Cell hanya bisa mengatur ukuran lebar saja.

Lebih umum disebut juga Wrap Text, digunakan pada tabel cell karena dalam tabel cell mengandung kata yang panjang. Untuk pembuatan wrap text ini silahkan ikuti langkah dibawah ini.
<?php

error_reporting(0);

require_once("fpdf/fpdf.php");

class FPDF_AutoWrapTable extends FPDF {
      private $data = array();
      private $options = array(
          'filename' => '',
          'destinationfile' => '',
          'paper_size'=>'F4',
          'orientation'=>'P'
      );

    function __construct($data = array(), $options = array()) {
        parent::__construct();
        $this->data = $data;
        $this->options = $options;
    }

    public function rptDetailData () {
        $border = 0;
        $this->AddPage();
        $this->SetAutoPageBreak(true,60);
        $this->AliasNbPages();
        $left = 25;

        //header
        $this->Image('img/kominfo.png',65,25,40,40);
        $this->SetFont("", "B", 15);
        $this->SetX($left); $this->Cell(0, 20, 'PT. NAMA PERUSAHAAN', 0, 1,'C');
        $this->SetFont("", "", 9);
        $this->SetX($left); $this->Cell(0, 20, 'Alamat: Jl. Purbalingga No.30 Sarilamak, Kecamatan Harau, Kabupaten Lima Puluh Kota', 0, 1,'C');
        $this->SetFont("", "", 15);
        $this->SetX($left); $this->Cell(0, 1, '________________________________________________________________', 0, 1,'C');
        $this->SetX($left); $this->Cell(0, 2, '________________________________________________________________', 0, 1,'C');
        $this->Ln(10);
        $this->Ln(10);
        $this->SetFont("", "B", 12);
        $this->SetX($left); $this->Cell(0, 20, 'LAPORAN DATA PEGAWAI', 0, 1,'C');
        $this->Ln(10);

        $h = 18;
        $left = 40;
        $top = 80;

        #tableheader
        $this->SetFillColor(200,200,200);   
        $left = $this->GetX();
        $this->SetFont("", "B", 10);
        $this->Cell(23,$h,'NO',1,0,'L',true);
        $this->SetX($left += 23); $this->Cell(75, $h, 'NIP', 1, 0, 'C',true);
        $this->SetX($left += 75); $this->Cell(100, $h, 'NAMA', 1, 0, 'C',true);
        $this->SetX($left += 100); $this->Cell(150, $h, 'ALAMAT', 1, 0, 'C',true);
        $this->SetX($left += 150); $this->Cell(100, $h, 'EMAIL', 1, 0, 'C',true);
        $this->SetX($left += 100); $this->Cell(100, $h, 'WEBSITE', 1, 1, 'C',true);
        //$this->Ln(20);

        $this->SetFont('Arial','',9);
        $this->SetWidths(array(23,75,100,150,100,100));
        $this->SetAligns(array('C','L','L','L','L','L'));
        $no = 1; $this->SetFillColor(255);

        #data dari database
        mysql_connect("localhost","root","");
        mysql_select_db("db_pegawai");

        $sql = mysql_query("select * from pegawai");
        while($data = mysql_fetch_array($sql))
        {
          $this->Row(
            array($no++,
            $data['nip'],
            $data['nama'],
            $data['alamat'],
            $data['email'],
            $data['website']
          ));
        }

        # untuk menuliskan nama bulan dengan format Indonesia
        $bln = array(
          '01' => 'Januari',
          '02' => 'Februari',
          '03' => 'Maret',
          '04' => 'April',
          '05' => 'Mei',
          '06' => 'Juni',
          '07' => 'Juli',
          '08' => 'Agustus',
          '09' => 'September',
          '10' => 'Oktober',
          '11' => 'November',
          '12' => 'Desember'
        );

        #tabel footer
        $this->Ln(20);
        $this->SetFont("", "", 9);
        $this->SetX(400); $this->Cell(0, 15, 'Payakumbuh Barat, '.date('d').' '.$bln[date('m')].' '.date('Y').'', 0, 1,'C');
        $this->SetX(400); $this->Cell(0, 15, 'DIREKTUR', 0, 1,'C');
        $this->Ln(40);
        $this->SetX(400); $this->Cell(0, 20, 'ARIE, S.Kom, M.Kom', 0, 1,'C');
    }

    public function printPDF () {
        if ($this->options['paper_size'] == "F4") {
            $a = 8.3 * 72; //1 inch = 72 pt
            $b = 13.0 * 72;
            $this->FPDF($this->options['orientation'], "pt", array($a,$b));
        } else {
            $this->FPDF($this->options['orientation'], "pt", $this->options['paper_size']);
        }

        $this->SetAutoPageBreak(false);
        $this->AliasNbPages();
        $this->SetFont("helvetica", "B", 10);
        //$this->AddPage();

        $this->rptDetailData();
        $this->Output($this->options['filename'],$this->options['destinationfile']);
      }

    private $widths;
    private $aligns;

    function SetWidths($w)
    {
        //Set the array of column widths
        $this->widths=$w;
    }

    function SetAligns($a)
    {
        //Set the array of column alignments
        $this->aligns=$a;
    }

    function Row($data)
    {
        //Calculate the height of the row
        $nb=0;
        for($i=0;$i<count($data);$i++)
        $nb=max($nb,$this->NbLines($this->widths[$i],$data[$i]));
        $h=15*$nb;

        //Issue a page break first if needed
        $this->CheckPageBreak($h);

        //Draw the cells of the row
        for($i=0;$i<count($data);$i++)
        {
            $w=$this->widths[$i];
            $a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';

            //Save the current position
            $x=$this->GetX();
            $y=$this->GetY();

            //Draw the border
            $this->Rect($x,$y,$w,$h);

            //Print the text
            $this->MultiCell($w,15,$data[$i],0,$a);

            //Put the position to the right of the cell
            $this->SetXY($x+$w,$y);
        }

        //Go to the next line
        $this->Ln($h);
    }

    function CheckPageBreak($h)
    {
        //If the height h would cause an overflow, add a new page immediately
        if($this->GetY()+$h>$this->PageBreakTrigger)
        $this->AddPage($this->CurOrientation);
    }

    function NbLines($w,$txt)
    {
        //Computes the number of lines a MultiCell of width w will take
        $cw=&$this->CurrentFont['cw'];
        if($w==0)
            $w=$this->w-$this->rMargin-$this->x;
        $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
        $s=str_replace("\r",'',$txt);
        $nb=strlen($s);
        if($nb>0 and $s[$nb-1]=="\n")
            $nb--;
        $sep=-1;
        $i=0;
        $j=0;
        $l=0;
        $nl=1;

        while($i<$nb)
        {
            $c=$s[$i];
            if($c=="\n")
            {
                $i++;
                $sep=-1;
                $j=$i;
                $l=0;
                $nl++;
                continue;
            }
            if($c==' ')
                $sep=$i;
            $l+=$cw[$c];
            if($l>$wmax)
            {
                if($sep==-1)
                {
                    if($i==$j)
                        $i++;
                }
                else
                    $i=$sep+1;
                $sep=-1;
                $j=$i;
                $l=0;
                $nl++;
            }
            else
                $i++;
        }
        return $nl;
    }
} //end of class

//pilihan
$options = array(
    'filename' => '', //nama file penyimpanan, kosongkan jika output ke browser
    'destinationfile' => '', //I=inline browser (default), F=local file, D=download
    'paper_size'=>'F4',    //paper size: F4, A3, A4, A5, Letter, Legal
    'orientation'=>'P' //orientation: P=portrait, L=landscape
);

$tabel = new FPDF_AutoWrapTable($data, $options);
$tabel->printPDF();
?>
Database dan Source Code lengkapnya dapat kamu download pada link berikut:

DOWNLOAD SOURCE CODE

Komentar

  1. kalo saya cetak pdf dari form sebelah gimana?
    saya cetak pdf sesuai datarange yang saya input

    BalasHapus
    Balasan
    1. Sebelumnya terimakasih sudah memberi komentar.

      Pemannggilan bisa dari form manasaja, lakukan pemanggilan berdasarkan tabel (database) yg ada pada form, sehingga terhubung dengan form yang dimaksud.

      ubah pada line "select * from pegawai"
      nama "pegawai" bisa di ganti dengan nama tabel yg terdapat pada form.

      Apakah jawaban ini dapat membantu anda?

      Hapus
  2. kok muncul gini ya??

    Notice: Undefined variable: data in C:\xampp\htdocs\fpdf\cetak_pegawai.php on line 223

    Fatal error: Uncaught Error: Call to undefined method FPDF_AutoWrapTable::FPDF() in C:\xampp\htdocs\fpdf\cetak_pegawai.php:98 Stack trace: #0 C:\xampp\htdocs\fpdf\cetak_pegawai.php(224): FPDF_AutoWrapTable->printPDF() #1 {main} thrown in C:\xampp\htdocs\fpdf\cetak_pegawai.php on line 98

    BalasHapus
    Balasan
    1. Sebelumnya terimakasih sudah memberi komentar.

      Apakah error_reporting(0); sudah ditambahkan pada line teratas?
      Jika sudah biasanya Notice seperti itu tidak akan dimunculkan lagi.

      Untuk Fatal error bisa jadi karna versi php yg digunakan berbeda, saya menggunakan php versi 5.6

      Untuk mengetahui lebih jelas tentang FPDF kunjungi http://www.fpdf.org/

      Apakah jawaban ini dapat membantu anda?

      Hapus
  3. Gan, tadi kan saya download source codenya
    kok pas dibuka malah blank, kosong gaada apa2
    padahal database udah di import. itu gimana ya?

    BalasHapus
    Balasan
    1. Sebelumnya terimakasih sudah memberi komentar.

      Gunakan PHP versi 5.6
      Kemudian hilangkan bagian error_reporting(0); untuk mengetahui error-nya.

      Hapus
  4. gan mau tanya klo cetak pdfnya 1 data 1 halaman bagaimana?
    *klo 10 data jadi 10 halaman dalam 1 file pdf.

    BalasHapus

Posting Komentar