2012-04-06 349 views
11

Estoy usando FPDF con PHP para agregar una imagen a un PDF. Pero la calidad de la imagen en el PDF es mucho peor que la imagen original, como se puede ver aquí:¿Cómo mantener la calidad de imagen con FPDF y PHP?

Print screen from web pagePrint screen from PDF

código relevante:

$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"); 

La imagen original es de 150x150 píxeles.

+0

También tengo este problema, ¿lo resolvió? Tal vez puedo preguntarlo de otra manera ... Si una imagen es de 100 píxeles x 100 píxeles, ¿cuál es el ancho y la altura del FPDF que se utilizarán para garantizar que no se produzca la escala de la imagen? – Scott

+0

TCPDF es una alternativa, ¡aunque probablemente no quiera escuchar eso! Sin embargo, podría intentar comparar la calidad en caso de que no esté relacionada con la biblioteca. –

Respuesta

8

que enfrenta el mismo problema en los proyectos de los clientes. Imágenes borrosas en un documento pdf generado incluso con imágenes de alquileres.

Me tomó un par de horas, pero esto es lo que funcionó para mí.

Tengo un dado un vistazo al código y vio que había un factor de escala que se establece en el constructor 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); 

El factor de escala es en función del valor dado en el constructor de el documento pdf:

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

El valor predeterminado es 'mm'. En la mayoría de mis documentos se inicio un documento PDF como:

$pdf = new PDF('P'); 

Esto significa que habrá un factor de escala de 72/25,4 = 2,83 utilizado. Cuando coloqué una imagen antes de que acabo de utilizar:

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

De esta manera Tengo las imágenes borrosas. También es posible dar a la anchura de la imagen en el comando

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

Esto me dio una imagen que era demasiado grande. Pero - y aquí viene el truco - cuando se divide el ancho real por el factor de escala (en mi caso 2.83) y poner esto en esta declaración que da una imagen perfectamente nítida:

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

Espero que esto funcione para usted también !

0

Creo que el problema podría estar relacionado con:

$image_height = 40; 
$image_width = 40; 

Con estas dos instrucciones de su están estableciendo las dimensiones que tendrá la imagen en el pdf.

Pero si la imagen original es mayor que 40x40, la escala de la imagen puede causar problemas de calidad.

Así que lo que sugieren:

  • Hacer un cambio de tamaño correcto de la imagen (PHP proporciona librería GD). Cambiar el tamaño a 40x40. La función de GD imagecopyresampleada es su amigo: cambie el tamaño y remuestree la imagen! referencia completa: http://www.php.net/manual/en/function.imagecopyresampled.php
  • Inserte ahora la imagen en el pdf
+0

Gracias por su sugerencia. El hecho es que quiero mantener el ancho y la altura originales (150x150 px). ¿Qué valores para $ image_height y $ image_width debo configurar para mantener el ancho y el alto originales? – chejnik

+0

Bueno, si en su pdf quiere la imagen 150x150, cambie las primeras dos líneas de su archivo: con $ image_height = 150; $ image_width = 150; –

+0

Las unidades utilizadas en fdpf no son claras para mí. Como se dice en el manual, por ejemplo, para el ancho - Ancho de la imagen en la página. Hay tres casos: Si el valor es positivo, representa el ancho en la unidad de usuario Si el valor es negativo, el valor absoluto representa la resolución horizontal en dpi Si el valor no se especifica o es igual a cero, es automáticamente calculado. No estoy seguro de cómo configurar mi unidad de usuario en píxeles o qué resolución usar para lograr no escalar imágenes. Tx. – chejnik

0

FPDF con una declaración como esta para establecer la unidad de usuario en mm $ pdf = new FPDF ('P', 'mm', 'Letter');

<?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 hizo un muy buen resultado.

Cuestiones relacionadas