25 August 2008

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.

18 °C:

Anonymous said...

kok indek3 ma 4 ma 5 g bisa dijalankan

om4gus said...

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... ;->

Anonymous said...

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

Anonymous said...

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

om4gus said...

@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.

ita said...

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

om4gus said...

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

ita said...

dah bisa, makasih ya :D

i'm not said...

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

yudi said...

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

om4gus said...

@ 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

om4gus said...

@yudi
maksudnya?

didee said...

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?

om4gus said...

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

james said...

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

om4gus said...

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

Randy Septian said...

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

Berantakan banget nih hasilnya.. Thx,

Anonymous said...

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

Post a Comment