Skip to main content

Pembuatan PDF di PHP dengan FPDF dan HTML2FPDF

Untuk membuat pdf dengan menggunakan php, kita bisa menggunakan fpdf yang berbasis class. Sedangkan html2fpdf digunakan untuk mengubah html menjadi pdf. Dengan hanya menggunakan fpdf, kita harus menentukan semua hal yang mengatur tampilannya berbasis code sesuai dengan aturan dan fungsi yang disediakan class tersebut. Dengan menggunakan html2fpdf, kita cuma perlu membuat sebuah file html dan tampilannya langsung diubah menjadi sebuah file pdf, tentu dengan beberapa keterbatasan dan perubahan tampilan. Saat ini, fpdf terbaru pada versi 1.6 sedangkan html2fpdf versi 3.

Instalasi:
+ Ekstrak file fpdf dan html2fpdf. Sebenarnya html2fpdf merupakan inheritance dari class fpdf, tapi class di fpdf yang disdertakan di paket html2fpdf telah dimodifikasi dari aslinya sesuai dengan kebutuhan konversi tersebut. Class original dari fpdf akan kita pakai untuk pembuatan pdf secara manual, bukan dari html.
+ Ganti nama file fpdf.php misalkan menjadi fpdf16.php. Karena untuk bebrapa versi instalasi php terbaru sudah menyertakan fpdf secara default sebagai salah satu plugin. Misalkan, paket xampp meletakannya di w:\xampplite\php\pear\fpdf.php. Apabila tidak diganti namanya, pada saat proses include atau require, yang terpanggil adalah fpdf.php dari sistem php. Penggunaan fpdf yang biasanya tidak sesuai dengan versi yang kita inginkan akan selalu menyebabkan kesalahan. Beberapa perbaikan tersebut adalah: perbaikan alamat include, error loading css dan gambar, gif parser error, penambahan spasi yang tidak perlu yang menyebabkan error Header.
+ Lakukan modifikasi pada beberapa file php, karena kita sudah melakukan penggantian nama. Selain itu entah kenapa masih ada beberapa bug didalamnya yang harus diperbaiki secara manual. Sebenarnya bisa dengan melakukan pelacakan sendiri pada saat terjadi kesalahan. Sebenarnya pengin dijelasin satu persatu, tapi daripada rumit, silakan download saja arsip fpdf dan html2fpdf yang sudah dimodifikasi dan diberi beberapa perbaikan dibagian bawah, kemudian lakukan ekstraksi. Sehingga susunannya menjadi seperti contoh sebagai berikut:

W:\xampplite\htdocs\
pdf\
pdf\fpdf16\
fpdf16.php
pdf\fpdf16\doc\
pdf\fpdf16\font\
pdf\fpdf16\font\makefont\
pdf\fpdf16\tutorial\
pdf\try\
index1.php
index3.php
test1.html
index4.php
index5.php
index2.php
pdf\html2fpdf\
htmltoolkit.php
source2doc.php
html2fpdf.php
no_img.gif
fpdf16.php
gif.php
pdf\html2fpdf\font\
pdf\html2fpdf\font\makefont\

Sekarang kita mulai contohnya :
1. Hello World!, tentunya contoh paling sederhana.
2. Menggunakan class fpdf. Manual yang disertakan sudah lengkap, jadi bisa dipelajari sendiri. Pada versi 1.6 sudah mendukung penggunaan gif sebagai gambar. Setiap teks dan gambar yang akan kita masukkan dalam file pdf berasal dari barisan kode dengan parameter letak koordinat, ukuran, tampilan, beserta teks atau gambar tersebut. Pada contoh ini juga ada pengambilan file text untuk menjadi pdf. (TXT2PDF)
3. Mengambil dan melakukan konversi file html menjadi pdf. (HTML2PDF).
4. Mengambil dan mengubah file php. Tentu harus berasal dari server yang sama karena menggunakan perintah include untuk pengambilannya. (PHP2PDF).
5. Mengambil dan mengubah sebuah lokasi web (URL2PDF). Menggunakan CURL untuk mengambil content web, tapi ternyata hasilnya berantakan. Hal yang sama terjadi pada saat dicoba menggunakan get_content(). Penyebabnya sih karena pada contoh ini memanggil cms phpnuke yang entah kenapa tidak bisa mengambil css eksternal yang didefinisikan sehingga semuanya menjadi tidak beraturan tanpa aturan css. Ada yang punya saran?

1. Hello World!

2. TXT2PDF

3. HTML yang diubah

3. HTML2PDF

4. PHP yang diubah

4. PHP2PDF

5. URL yang diubah

5. URL2PDF

////////////////////index1.php//////////////////////
<?php
require('../fpdf16/fpdf16.php');

$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World!');
$pdf->Output('doc.pdf','I');
?>


///////////////////index2.php//////////////////////


<?php
require('../fpdf16/fpdf16.php');

class PDF extends FPDF
{
function Header()
{
global $title;

//Arial bold 15
$this->SetFont('Arial','B',15);
//Calculate width of title and position
$w=$this->GetStringWidth($title)+6;
$this->SetX((210-$w)/2);
//Colors of frame, background and text
$this->SetDrawColor(0,80,180);
$this->SetFillColor(230,230,0);
$this->SetTextColor(220,50,50);
//Thickness of frame (1 mm)
$this->SetLineWidth(1);
//Title
$this->Cell($w,9,$title,1,1,'C',true);
//Line break
$this->Ln(10);
}

function Footer()
{
//Position at 1.5 cm from bottom
$this->SetY(-15);
//Arial italic 8
$this->SetFont('Arial','I',8);
//Text color in gray
$this->SetTextColor(128);
//Page number
$this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
}

function ChapterTitle($num,$label)
{
//Arial 12
$this->SetFont('Arial','',12);
//Background color
$this->SetFillColor(200,220,255);
//Title
$this->Cell(0,6,"Chapter $num : $label",0,1,'L',true);
//Line break
$this->Ln(4);
}

function ChapterBody($file)
{
//Read text file
$f=fopen($file,'r');
$txt=fread($f,filesize($file));
fclose($f);
//Times 12
$this->SetFont('Times','',12);
//Output justified text
$this->MultiCell(0,5,$txt);
//Line break
$this->Ln();
//Mention in italics
$this->SetFont('','I');
$this->Cell(0,5,'(end of excerpt)');
}

function PrintChapter($num,$title,$file)
{
$this->AddPage();
$this->ChapterTitle($num,$title);
$this->ChapterBody($file);
}
}

$pdf=new PDF();
$title='20000 Leagues Under the Seas';
$pdf->SetTitle($title);
$pdf->SetAuthor('Jules Verne');
$pdf->PrintChapter(1,'A RUNAWAY REEF','text.txt');
$pdf->Output('doc.pdf','I');
?>


///////////////////////index3.php////////////////////////


<?
require("../html2fpdf/html2fpdf.php");
$htmlFile = "test1.html";
$file = fopen($htmlFile,"r");
$size_of_file = filesize($htmlFile);
$buffer = fread($file, $size_of_file);
fclose($file);

$pdf=new HTML2FPDF();
$pdf->AddPage();
$pdf->WriteHTML($buffer);
$pdf->Output('doc.pdf','I');
?>

//////////////////////index4.php/////////////////////////


<?php
ob_start();
include "../../Files/index.php";
$htmlbuffer=ob_get_contents();
ob_end_clean();
require('../html2fpdf/html2fpdf.php');
$pdf=new HTML2FPDF();
$pdf->AddPage();
$pdf->WriteHTML($htmlbuffer);
$pdf->Output('doc.pdf','I');
?>

////////////////////index5.php//////////////////////////

<?php
function load($url){
if (!$curld = curl_init()) {
echo "CURL GAGAL.\n";
exit;
}

curl_setopt($curld, CURLOPT_URL, $url);
curl_setopt($curld, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($curld);
curl_close($curld);
return $output;

}
ob_start();

echo load("http://localhost/nuker/");
$htmlbuffer=ob_get_contents();
ob_end_clean();
require('../html2fpdf/html2fpdf.php');
$pdf=new HTML2FPDF();
$pdf->AddPage();
$pdf->WriteHTML($htmlbuffer);
$pdf->Output('doc.pdf','I');
?>

Download:

fpdf v1.6
html2fpdf-3.0.2b
fpdf dan html2fpdf, dengan modifikasi perbaikan dan contohnya.

Comments

  1. kok indek3 ma 4 ma 5 g bisa dijalankan

    ReplyDelete
  2. Index pertama sampai keempat udah yang saya coba bisa berhasil. Sedangkan yang kelima masih belum jalan, seperti yang sudah dijelaskan diatas, dan belum ada rencana untuk diupdate lebih lanjut dalam waktu dekat ini. Bantuin yah... ;->

    ReplyDelete
  3. terima kasih atas informasinya.. itu sangat membantu saya...

    ReplyDelete
  4. Terimakasih untuk artikelnya, semua contohnya berjalan dengan baik.
    Tapi kenapa mas ketika saya coba pake halaman php punya saya, yang menggunakan database, yang keluar di halaman pdf hanya tampilan saja, sedangkan isi databasenya tidak keluar. saya menggunakan contoh index4.php
    mohon pencerahan mas, terimakasih atas ilmunya

    ari
    coba.jr@gmail.com

    ReplyDelete
  5. @coba.jr
    Untuk isi dari database, harus dipastikan dulu apakah sudah bisa ditampilkan oleh php dengan menyertakan perintah echo. Apabila sudah bisa tampil, baru perbaiki perintah fpdf nya.

    ReplyDelete
  6. index4 dah saya coba di windows bs tampil sesuai dgn yang diharapkan , tp di linux kok tampilannya kacau seperti ini:
    %PDF-1.3 3 0 obj <> endobj 4 0 obj <> stream 2 J 0.57 w BT /F1 11.00 Tf ET 1.000 g BT /F2 11.00 Tf ET BT /F2 12.87 Tf ET [] 0 d 0.000 Tw BT /F2 12.87 Tf ET q 0 g

    apa ada setingan tersendiri atau gmn? mohon pencerahannya yah

    ReplyDelete
  7. @ ita
    Coba set type outputnya, misalkan:
    ob_start();
    header('Content-type: application/pdf');

    ReplyDelete
  8. om mau tanya... html2fpdf bisa set header sama footer nya ga..??? mohon bantuannya... terim kasih...

    ReplyDelete
  9. om4gus saya mencoba html2fpdf ini lancar dan bisa digunakan. tapi ada satu kendala bagaimana menampilkan gambar dari link tag / "img src="" width="" height=""/ yang saya simpan tag nya di database. setiap saya coba format error terus. tapi kalo menampilkan text lancar. mohon penjelasannya

    ReplyDelete
  10. @ i'm not
    Lakukan modifikasi kode untuk menggunakan function Header() dan function Footer() dari fpdf, karena html2fpdf tidak mempunyai fungsi tersebut. Hal ini bisa langsung dilakukan karena html2fpdf menggunakan class dari fpdf

    ReplyDelete
  11. apa bisa dipake untuk aplikasi cetak nilai rapor. jadi kita tinggal masukkan nomor induk siswa(NIS) 1-n. hasilnya akan cetak nilai rapor dari NIS 1-n?

    ReplyDelete
  12. @didee
    Cobalah belajar php. Bahasa paling mudah dipelajari. Setelah itu gunakan fpdf untuk mencetak pdf.

    ReplyDelete
  13. function get_magic_quotes_runtime() function ini trltak di file php mana ya pak?? thnks

    ReplyDelete
  14. @james
    itu fungsi internal php. http://php.net/manual/en/function.get-magic-quotes-runtime.php

    ReplyDelete
  15. Gan,, gimana untuk kasus nomor 5, udah ada yg solve blm ya untuk CSS nya..?

    Berantakan banget nih hasilnya.. Thx,

    ReplyDelete
  16. saya muncul error ini mas

    Fatal error: Call to undefined method HTML2FPDF::DisplayPreferences() in D:\web\htdocs\tes\pdf\html2fpdf\html2fpdf.php on line 155

    mohon pencerahan

    ReplyDelete

  17. Fatal error: Call to undefined method HTML2FPDF::DisplayPreferences() in D:\xampp\htdocs\Kota\simakda_kota\application\libraries\html2fpdf.php on line 155

    MOHON PENCERAHANNYA GAN

    ReplyDelete
  18. Fatal error: Call to undefined method HTML2FPDF::DisplayPreferences() in D:\xampp\htdocs\Kota\simakda_kota\application\libraries\html2fpdf.php on line 155

    MOHON PENCERAHANNYA GAN
    BS EMAIL ke adjiebox2014@gmail.com

    ReplyDelete

Post a Comment

Popular posts from this blog

Java-MySql: Aplikasi Database dengan Data Gambar (Updated)

Untuk update metode simpan gambar lihat di appGambar 2.0 Bagaimana caranya menyimpan data yang membutuhkan penyimpanan data gambar? Misalkan data pegawai yang membutuhkan penyimpanan gambar dari setiap pegawai. Alternatifnya ada dua, dengan kelebihan dan kekurangan masing-masing. Cara yang pertama adalah dengan membuat field dengan tipe data binary, kemudian menyimpan gambar yang dibutuhkan dalam field di database tersebut. Cara ini membutuhkan manajemen program yang lebih rumit, tapi data gambar akan terjamin, karena tersimpan didalam database yang terintegrasi dengan data lainnya. Kekurangan lainnya adalah ukuran database yang akan membesar dan lambat. Bayangkan saja, sebuah field membutuhkan gambar dengan format jpeg, 200kB. Apabila ada 200 juta record, maka ukuran field yang diperuntukan khusus untuk gambar dengan perhitungan kasar adalah 0.2 MB x 200M = 40 x 10^12 = 40 TB. Belum ditambah dengan ukuran data dari field lainnya, kalau misalkan untuk menyimpan data penduduk Indonesia.

Java: Pengiriman Parameter antar Frame

Sebenarnya konsep ini berlaku bukan hanya pada frame, tapi bisa dilakukan antar object dari class yang sifatnya umum, karena Java yang sifatnya sudah full OOP. Tapi, karena lebih sering diterapkan dalam pemrograman GUI desktop, khususnya dengan Netbeans, maka dicontohkan dengan class javax.swing.JFrame. Setiap bentuk code java harus dibentuk dalam bentuk class, biar sebagaimanapun sederhananya. Tidak seperti pemrograman lainnya yang menggunakan konsep OOP sebagai tambahan dan pengembangan dari yang sudah ada sebelumnya. Itulah sebabnya kita mengenal class di C++, Pascal, PHP, tapi masih diperbolehkan untuk tetap menggunakan konsep primitif. Sedangkan pada kasus java dan .NET, OOP merupakan inti utamanya yang harus selalu diikuti dan diterapkan. Awalnya akan sangat membingungkan, tapi sangat mudah untuk langkah pengembangan selanjutnya. Sudah lihat JavaDoc? itu adalah dokumen pemrograman yang paling aneh didunia, pada pandangan pertama. Coba bandingkan dengan MSDN-nya .NET, PHP Manual,