2012-04-06 15 views
11

Sto usando FPDF con PHP per aggiungere un'immagine a un PDF. Ma la qualità delle immagini in formato PDF è molto peggio di quanto l'immagine originale, come potete vedere qui:Come mantenere la qualità dell'immagine con FPDF e PHP?

Print screen from web pagePrint screen from PDF

codice rilevante:

$image_height = 40; 
$image_width = 40; 
$pdf = new FPDF(); 
$pdf->AddPage(); 
$start_x = $pdf->GetX(); 
$start_y = $pdf->GetY(); 
$pdf->Image('./images/ds_pexeso_ros_0_17.jpg', $pdf->GetX(), $pdf->GetY(), $image_height, $image_width); 
$pdf->Output("pexeso".date("Y-m-d"),"I"); 

L'immagine originale è 150x150 pixel.

+0

Ho anche questo problema, l'hai capito? Forse posso chiederlo in un modo diverso ... Se un'immagine è 100 pixel x 100 pixel, qual è la larghezza e l'altezza FPDF da usare per garantire che il ridimensionamento dell'immagine non avvenga? – Scott

+0

TCPDF è un'alternativa, anche se probabilmente non vuoi sentirlo! Si potrebbe provare per confrontare la qualità, tuttavia nel caso in cui non sia correlata alla libreria. –

risposta

8

Ho affrontato lo stesso problema in progetti per i clienti. Immagini sfocate in un documento PDF generato anche con immagini di ingaggio.

Mi ci sono volute un paio d'ore, ma questo è quello che ha funzionato per me.

Ho un dato un'occhiata al codice e ho visto che c'era un fattore di scala viene impostato nel costruttore del documento PDF:

//Scale factor 
if($unit=='pt') 
    $this->k=1; 
elseif($unit=='mm') 
    $this->k=72/25.4; 
elseif($unit=='cm') 
    $this->k=72/2.54; 
elseif($unit=='in') 
    $this->k=72; 
else 
    $this->Error('Incorrect unit: '.$unit); 

Lo ScaleFactor dipende valore dato nel costruttore il documento pdf:

function FPDF($orientation='P',$unit='mm',$format='A4') 

Il valore predefinito è 'mm'. Nella maggior parte dei miei documenti Io inizio di un documento pdf come:

$pdf = new PDF('P'); 

Questo significa che ci sarà uno ScaleFactor di 72/25,4 = 2,83 utilizzata. Quando ho fatto l'immagine prima ho appena usato:

$this->Image('path/to/file', 0, 0); 

In questo modo ho ottenuto le immagini sfocate. E 'anche possibile dare la larghezza dell'immagine nel comando

$this->Image('path/to/file', 0, 0, 200); // for a image width 200 

Questo mi ha dato un'immagine che era troppo grande. Ma - e qui viene il trucco - quando si divide la larghezza reale dal ScaleFactor (nel mio caso 2,83) e mettere questo in questa informativa dà un'immagine perfettamente nitida:

$this->Image('path/to/file', 0, 0, 71); // for a image width 200/2.83 = app 71 

Spero che questo funziona anche per te !

0

Credo che il problema potrebbe essere legato a:

$image_height = 40; 
$image_width = 40; 

Con queste due istruzioni vostro stanno impostando le dimensioni dell'immagine avrà nel PDF.

Ma se l'immagine originale è più grande di 40x40 la scala dell'immagine può causare problema di qualità.

Allora, cosa ti suggerisco:

  • fare una corretta ridimensionamento dell'immagine (PHP fornisce libreria GD). Ridimensiona a 40x40. La funzione GD imagecopyresampled è tuo amico: ridimensiona e ricampiona l'immagine! riferimento completo: http://www.php.net/manual/en/function.imagecopyresampled.php
  • Inserire ora l'immagine in pdf
+0

Grazie per il suggerimento. Il fatto è che voglio mantenere la larghezza e l'altezza originali (150x150 px). Quali valori per $ image_height e $ image_width I dovrebbero essere impostati per mantenere larghezza e altezza originali? – chejnik

+0

Bene se nel tuo pdf vuoi l'immagine 150x150 poi cambia le prime due righe del tuo file: con $ image_height = 150; $ image_width = 150; –

+0

Le unità utilizzate in fdpf non mi sono chiare. Come si dice nel manuale, ad esempio per la larghezza - Larghezza dell'immagine nella pagina. Vi sono tre casi: Se il valore è positivo, rappresenta la larghezza nell'unità utente Se il valore è negativo, il valore assoluto rappresenta la risoluzione orizzontale in dpi Se il valore non è specificato o uguale a zero, viene automaticamente calcolato. Non sono sicuro di come impostare la mia unità utente in pixel o quale risoluzione utilizzare per non ridimensionare le immagini. Tx. – chejnik

0

FPDF con una dichiarazione come questa per impostare l'unità utente su mm $ pdf = nuovo FPDF ('P', 'mm', 'Lettera');

<?php 

    require_once('fpdf.php'); 
    $image_height = 40; 
    $image_width = 40; 
    $pdf = new FPDF('P','mm','Letter'); 
    $pdf->AddPage(); 
    $start_x = $pdf->GetX(); 
    $start_y = $pdf->GetY(); 
    $pdf->Image('./images/ds_pexeso_ros_0_17.jpg',$start_x+0,$start_y-2,40); 
    $pdf->Output("pexeso".date("Y-m-d"),"I"); 
?> 

FPDF ha ottenuto un risultato molto interessante.

Problemi correlati