Archive for the ‘Programmering’ Category

PDF med php

torsdag, oktober 16th, 2008

På jobbet har vi under en längre tid pratat om att skapa offerter och beställningar direkt på nätet. Dessa ska användas vid försäljning av produkter och tjänster. Självklart vill man kunna skicka en offert i pdf-format till en kund.

Vi beslutade att sätta igång med dett arbete igår. Så jag tänkte dela med mig av hur man installerar detta på en debian server med php5.

Jag hittade två alternativ att med PHP dynamiskt skapa PDF-dokument. Den enklaste vägen är via FPDF som är en PHP-class som man laddar upp på servern och sen inkluderar i sitt script.

<?php
require(’fpdf.php’);

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

Detta verkade lite för enkelt :). Näe om sanning ska fram så upptäckte jag efter några timmar att det var så lätt.

Jag började med att installera PDFLib som är ett API som kan användas till flera olika språk, bla PHP. API-dokumentation för PDFLib-php är lite knaper och det var även PDFLib egna sida. Så efter mycket googlande och många olika installationsförsök lyckades jag installera.

För att få PDFLib att fungera för alla användare krävs root-rättigheter på servern.

  1. En C-kompilator behövs (apt-get install g++)
  2. apt-get install php-pear
  3. apt-get install php5-dev
  4. Ladda ner den senaste version av PDFLib. I dagens läge är version 7 den senaste. Obs ladda ner C-version, inte PHP-version, för Linux.
  5. Ladda upp tar-bollen till servern i lämplig katalog.
  6. untar -zxvf PDFlib-Lite-7.0.x.tar.gz
  7. cd PDFlib-Lite-7.0.x
  8. ./configure
  9. make
  10. make install
  11. pecl install pdflib (På frågan install dir välj  /usr/local)

Med dessa steg skapas det .so tillägg, i /usr/local/lib, för PHP så nu är det bara att lägga till den extension i php.ini . Sökvägen dit är vanligtvis path/php5/apache2/php.ini, se till att skapa en kopia innan du redigerar den filen. Jag brukar lägga till extensioner längst ner i filen

extension=pdf.so

Nu är det bara att reloada apachen

/etc/init.d/apache2 reload

Klart! Ivrigt laddade jag upp ett php-pdf-exempel för att se om det fungerade. Yes, inga problem, trodde jag. Jag testade även att lägga till en bild via ett annat php-pdf-exempel, inte heller detta exempel skapade några problem.

Det var när jag började skriva svenska tecken som det vart problem. Jag testade att ladda nya fonter, jag skapade nya fonter. Jag gav upp testade med FPDF istället. Men inget fungerade.

Ca 4 timmar senare innan jag hittade ett exempel som hade följande rader:

$pdf->set_text_pos(100,100);
$pdf->show(utf8_decode(”ÅÄÖåäö”));

uft8_decode var lösningen. Detta borde jag givetvis ha testat först med det slog inte förrän jag visste lösningen.  Så encodingen winansi som anges i exemplen fungerar alldeles utmärkt.

Om någon undrar över att det i en del exempel står PDF_ framför en funktion och andra inte. Så kan detta API användas på två olika sätt.

$pdf = new PDFLib();
PDF_begin_page_ext($pdf,595,842,”");//A4-format

Det andra sättet innebär ett snyggare och mer objekt-orienterat sätt (och snyggare).

$pdf = new PDFLib();
$pdf->begin_page_ext(595,842,”");//A4-format

I exempelkoden ovan tar man bort $pdf-objektet som första argument till funktionen och har den framför istället.

Hoppas att detta hjälper någon.