Как сохранить качество изображения с помощью FPDF и PHP?

Я использую FPDF с PHP для добавления изображения в PDF. Но качество изображения в PDF намного хуже исходного изображения, как вы можете видеть здесь:

Print screen from web pagePrint screen from PDF

Соответствующий код:

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

Исходное изображение - 150x150 пикселей.

Ответ 1

Я столкнулся с такой же проблемой в проектах для клиентов. Размытые изображения в сгенерированном PDF-документе даже с изображениями нанимателей.

Мне понадобилось пару часов, но это то, что сработало для меня.

Я просмотрел код и увидел, что в конструкторе 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);

Масштабный фактор зависит от значения, указанного в конструкторе документа PDF:

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

Значение по умолчанию - "мм". В большинстве моих документов я начинаю документ в формате pdf, например:

$pdf = new PDF('P');

Это означает, что будет использоваться масштабный коэффициент 72/25,4 = 2,83. Когда я разместил изображение до того, как просто использовал:

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

Таким образом, я получил размытые изображения. Также можно указать ширину изображения в команде

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

Это дало мне изображение, которое было слишком большим. Но... и вот трюк - когда вы делите реальную ширину на scalefactor (в моем случае 2,83) и поместите это в это утверждение, он дает совершенно четкое изображение:

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

Я надеюсь, что это сработает и для вас!

Ответ 2

Я думаю, что проблема может быть связана с:

 $image_height = 40;
 $image_width = 40;

С помощью этих двух инструкций вы задаете размеры, которые будет иметь изображение в pdf.

Но если исходное изображение больше 40х40, масштабирование изображения может вызвать проблемы с качеством.

Итак, что я предлагаю:

  • Сделайте правильный размер изображения (php предоставляет библиотеку GD). Измените его размер до 40x40. Функция GD imagecopyresampled - ваш друг: измените размер и повторите выбор изображения! Полная ссылка: http://www.php.net/manual/en/function.imagecopyresampled.php
  • Вставьте изображение в формате pdf

Ответ 3

FPDF с таким утверждением, чтобы установить пользовательский блок на мм $ pdf = новый 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 сделал очень хороший результат.