Gå til innhold

Generering av PDF dokumenter i PHP


Anbefalte innlegg

Jeg har installert WAMP5, og satt opp en PHP & MySQL side. I WAMP har jeg aktivert noe som heter php_pdf - Jeg tror dette er det samme som PHPLib.

 

Målet mitt her er å kunne generere PDF dokumenter utifra MySQL queries.

 

Nedenfor er en kode som genererer et PDF dokument med to linjer tekst, og en strek oppe og nede i dokumentet:

<?php
// Opprett pdf dokumentet
$pdf = pdf_new();

// Åpne pdf dokumentet
pdf_open_file($pdf,"c:\adobedok.pdf");

// Sett info
pdf_set_info($pdf, "Author", "Mitt navn");
pdf_set_info($pdf, "Title", "Test");
pdf_set_info($pdf, "Creator", "Test");
pdf_set_info($pdf, "Subject", "Test");

// Opprett en A4 side
pdf_begin_page($pdf, 595, 842);

// Sett skrifttype
$font = PDF_load_font($pdf, "Courier","iso8859-1", "");

// Lag linje øverst på siden
pdf_setfont($pdf, $font, 10);
pdf_moveto($pdf, 20, 780);
pdf_lineto($pdf, 575, 780);
pdf_stroke($pdf);

// Setter logo i venstre hjørne
//$logo = pdf_open_image_file($pdf, "bmp", "logo.bmp", "", 0);
//PDF_fit_image($pdf, $logo, 50, 785, "scale 0.5")

// Tekst
pdf_show_xy($pdf, "Linje 1", 50, 750);
pdf_show_xy($pdf, "Linje 2", 50, 730);

// Lag linje på bunnen av siden
pdf_moveto($pdf, 20, 50);
pdf_lineto($pdf, 575, 50);
pdf_stroke($pdf);

// Avslutt og lagre filen
pdf_end_page($pdf);
pdf_close($pdf);
pdf_delete($pdf);
?>

 

Denne fungerer, men dersom jeg f.eks. har lyst til å erstatte "Linje 2" med en linje fra MySQL databasen så har jeg forsøkt å erstatte pdf_show_xy($pdf, "Linje 2", 50, 730); med pdf_show_xy($pdf, $row['adresse']);. Da får jeg følgende feil;

Fatal error: Uncaught exception 'PDFlibException' with message 'pdf_show_xy() expects exactly 4 parameters, 2 given' in C:\Wamp\www\badehuset\createpdf.php:32 Stack trace: #0 C:\Wamp\www\badehuset\createpdf.php(32): pdf_show_xy(Resource id #2, NULL) #1 {main} thrown in C:\Wamp\www\badehuset\createpdf.php on line 32

 

 

Jeg kan ikke så mye PHP, så jeg har holdt på i et ukjent antall timer og prøvd meg frem med koder jeg har funnet på google. Denne tråden er bare resultat av jeg begynner å gå utrolig lei, og ønsker litt bistand - min prøv-og-feil strategi hjelper meg svært lite.

 

 

Så jeg hadde satt utrolig stor pris på litt hjelp her, vet ikke om det er så mange som har testet ut PHP&MySQL&PDF - tipper det ikke er så mange, men prøver alikevel :)

Lenke til kommentar
Videoannonse
Annonse
Du burde lære deg å lese feilmeldinger
Fatal error: Uncaught exception 'PDFlibException' with message 'pdf_show_xy() expects exactly 4 parameters, 2 given

 

Sjekk på php.net etter hva som må være med

Men det er det jeg ikke skjønner, hvorfor må det være fire argumenter? Finner ikke noe på php.net ved å søke på feilmeldingen, hva skal jeg søke etter?

Endret av f00b
Lenke til kommentar

Du skal ikke søke på feilmeldingen

Du skal søke etter funksjonen.

Som i dette tilfellet da er pdf_show_xy()

 

EDIT:

Tok meg nettopp 10 sekunder å finne svaret

PDF_show_xy ( resource $p , string $text , float $x , float $y )

 

Du har kun resource og string.

 

men du sier ikke hvor du vil ha string ;)

 

dermed x og y

Endret av AlecTBM
Lenke til kommentar

Ehh ... æhh ... Har du tatt en titt på hva du selv skriver? I eksempelet markert med blå skrift gir du fire parametre, hvor de to siste representerer x- og y-kordinater. I eksempelet markert med rød tekst gir du kun to parametre og får feilmelding. Hva kan dette bety? Du spør hvorfor det må være fire argumenter. Er det ikke åpenbart? Du kan ikke tegne på en overflate uten å oppgi hvor du skal tegne.

 

Du skal for øvrig søke etter funksjonsnavn. Da får dokumentasjon som omhandler problemet ditt.

 

http://no2.php.net/pdf_show_xy

 

pdf_show_xy($pdf, $row['adresse'], 50, 730);

Endret av Jonas
Lenke til kommentar

Skjønner logikken nå ;) Har faktisk prøvd dette også tidligere, den klarte da å generere dokumentet uten feil - men på pdf dokumentet som hadde blitt generert så var ikke dataene som ligger i 'adresse' i mysql databasen med.

 

Jeg har imidlertid fått løst problemet nå :)

 

<?php 
// Hent konfig for tilkobling til database
session_start();
include "includes/config.php";
$result = mysql_query("SELECT * FROM database");
?>

<?php
// Opprett pdf dokumentet
$pdf = pdf_new();

// Åpne pdf dokumentet
pdf_open_file($pdf,"c:\pdfdokument.pdf");

// Sett info
pdf_set_info($pdf, "Author", "Test");
pdf_set_info($pdf, "Title", "Test");
pdf_set_info($pdf, "Creator", "Test");
pdf_set_info($pdf, "Subject", "Test");

// Opprett en A4 side
pdf_begin_page($pdf, 595, 842);

// Sett skrifttyper
$font1 = PDF_load_font($pdf, "Courier-Bold","iso8859-1", "");
$font2 = PDF_load_font($pdf, "Courier","iso8859-1", "");

// Lag linje øverst på siden
pdf_moveto($pdf, 20, 780);
pdf_lineto($pdf, 575, 780);
pdf_stroke($pdf);

// Setter logo i venstre hjørne
//$logo = pdf_open_image_file($pdf, "bmp", "logo.bmp", "", 0);
//PDF_fit_image($pdf, $logo, 50, 785, "scale 0.5")

// Statisk overskrift
pdf_setfont($pdf, $font1, 12);
PDF_set_parameter($pdf, "underline","true");
pdf_show_xy($pdf, "Generell info", 50, 750);

// Statisk tekst
pdf_setfont($pdf, $font1, 10);
PDF_set_parameter($pdf, "underline","false");
pdf_show_xy($pdf, "Navn:", 50, 730);
pdf_show_xy($pdf, "Telefon:", 50, 710);
pdf_show_xy($pdf, "Kontakt:", 50, 690);

// Dynamisk tekst
pdf_setfont($pdf, $font2, 10);
while($row = mysql_fetch_array( $result )) {
pdf_show_xy($pdf, $row['navn'], 150, 730);
pdf_show_xy($pdf, $row['tlf'], 150, 710);
pdf_show_xy($pdf, $row['kontakt'], 150, 690);
} 

// Lag linje på bunnen av siden
pdf_moveto($pdf, 20, 50);
pdf_lineto($pdf, 575, 50);
pdf_stroke($pdf);

// Avslutt og lagre filen
pdf_end_page($pdf);
pdf_close($pdf);
pdf_delete($pdf);
?>

 

 

Jeg lurer på en annen ting, dette har jeg søkt mye etter uten å finne noenting på - så jeg vet ikke om det er mulig. Men er det mulig å legge inn en kode som åpner pdf dokumentet etter den er ferdig generert?

Lenke til kommentar
readfile($pdf);

 

??

Du er god ;) Det er litt problemer da, når jeg generer pdf filen i firefox så fungerer det, men dersom jeg bruker internet explorer (7), så viser den bare teksten som om den var åpnet i notepad.

%PDF-1.4 %äãÏÒ 3 0 obj <> stream xœe‘ANÃ0E÷>Å,Ã&;uj±#eÃá ei [NȽÇEuÙ–Æž÷¿õ5 ac>…Þè©râU4V¬¶RíÅ£ßË~„fxmJø\Wü”nQòE—„Èñ±Œ±Å³(žÈÓ‘œƒÁ÷‡;»KöísM•48išSö{ßžý}TäœÔ‘»#ù@ǃ“Wñûåÿ>vm8Ì‘Ú$›‡sGŽ¡E¿Æü›õ7D…WĺÞn±ÕVÎÊkÄ¢i;ú8ÀÒr[™Œ½oA\â¡*y+D3'þÓU±Á3T3¥9ë4æ?¢ðx endstream endobj 4 0 obj 243 endobj 2 0 obj <> endobj 7 0 obj <> >> endobj 8 0 obj <> endobj 5 0 obj <> endobj 9 0 obj <> endobj 6 0 obj <> endobj 9 0 obj <> endobj 1 0 obj <> endobj 10 0 obj <> endobj xref 0 11 0000000000 65535 f 0000001687 00000 n 0000000349 00000 n 0000000015 00000 n 0000000330 00000 n 0000000762 00000 n 0000001227 00000 n 0000000452 00000 n 0000000543 00000 n 0000001307 00000 n 0000001741 00000 n trailer <<0DD026D2DDDA76AC016E4BFEE11D8DCB>] >> startxref 1789 %%EOF

 

Her er koden jeg bruker

<?php
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="dokument.pdf"');
readfile('c:\dokument.pdf');
?>
Endret av f00b
Lenke til kommentar

kan være fordi at fila heter .php

microsoft liker jo filendelser

 

kan fikse et lite .htaccess script

 

EDIT:

<FilesMatch "c:\dokument.pdf$">
SetHandler application/x-httpd-php
</FilesMatch>

 

og prøv å sett

echo $pdf;

før

pdf_delete($pdf);

 

!!WARNING!!

Har ikke testa dette

Endret av AlecTBM
Lenke til kommentar
kan være fordi at fila heter .php

microsoft liker jo filendelser

 

kan fikse et lite .htaccess script

 

EDIT:

<FilesMatch "c:\dokument.pdf$">
SetHandler application/x-httpd-php
</FilesMatch>

 

og prøv å sett

echo $pdf;

før

pdf_delete($pdf);

 

!!WARNING!!

Har ikke testa dette

Puh, da har jeg fått laget en .htaccess og lagt den under '.$_SERVER['DOCUMENT_ROOT']; (c:\wamp\www), jeg har skrevet inn scriptet du ga meg. Men er jeg nødt til å definere at den skal hente .htaccess filen på slutten av php scriptet? Det skjer iallefall ingenting annet enn at den sier Resource id #5 nå. Det er "echo $pdf;" som gjør at denne meldingen kommer.

Lenke til kommentar

readfile() skal fungerer, mulig IE7 bare trenger et par ekstra headers. Bruker selv følgende headers i et attachment-system jeg har. Kan samtidig være lurt å sette filesize, slik at du få en progressbar i nettleseren du laster ned med.

 

header ( 'Content-Description: File Transfer' );
header ( 'Content-Type: application/octet-stream' );
header ( 'Content-Transfer-Encoding: binary' );
header ( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
header ( 'Content-Disposition: attachment; filename="' . $filename . '";' );
header ( 'Content-Length: ' . filesize ( $filepath ) );

Endret av Jonas
Lenke til kommentar
ok

Drit i echo $pdf; da

Uten da?

Det fungerte ikke heller :(

 

 

readfile() skal fungerer, mulig IE7 bare trenger et par ekstra headers. Bruker selv følgende headers i et attachment-system jeg har. Kan samtidig være lurt å sette filesize, slik at du få en progressbar i nettleseren du laster ned med.

 

header ( 'Content-Description: File Transfer' );
header ( 'Content-Type: application/octet-stream' );
header ( 'Content-Transfer-Encoding: binary' );
header ( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
header ( 'Content-Disposition: attachment; filename="' . $filename . '";' );
header ( 'Content-Length: ' . filesize ( $filepath ) );

Dette derimot, løste problemet! :D Tusen takk!
Lenke til kommentar

Et spørsmål til :blush:

 

Jeg har plassert en link på siden, som peker til php scriptet jeg har laget som genererer PDF dokumentet - tingen er at når jeg trykker på denne så genererer den alt innholdet i hele databasen.

 

Så jeg prøvde følgende:

$result = mysql_query("SELECT * FROM database WHERE id=1");

Ved å gjøre dette så tar den kun med innholdet i posten med id 1, så det jeg prøver å få til er at den skal finne ut hvilken id jeg er på, slik at jeg f.eks. da kan skrive f.eks. $current_id istedenfor "1".

 

Jeg forsøkte å legge til dette:

$current_id=$_GET['id'];

$result = mysql_query("SELECT * FROM database WHERE id=$current_id");

Men da ser det ikke ut til at den klarer å hente noe data idetheletatt. PDF dokumentet skriver kun den statiske teksten, men ingenting av dataene i MySQL basen.

Endret av f00b
Lenke til kommentar
prøv ' rundt variabelen

$current_id=$_GET['id'];

$result = mysql_query("SELECT * FROM 'database' WHERE 'id'='$current_id'");

 

Fungerer heller ikke :(

Endret av f00b
Lenke til kommentar
Hva trur du jeg gjorde?

bytta ut $_GET['id'] med 1

 

$current_id=$_GET['id'];

prøv den nå

Prøvde det samtidig, vet at du gjorde det bare for å sjekke om definisjonen fungerte. Det gjør den, men $_GET['id'] fungerer ikke.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...