2012-04-06 39 views
11

Tôi đang sử dụng FPDF với PHP để thêm hình ảnh vào PDF. Tuy nhiên, chất lượng hình ảnh trong PDF là tồi tệ hơn nhiều so với hình ảnh ban đầu, như bạn có thể xem tại đây:Làm thế nào để duy trì chất lượng hình ảnh với FPDF và PHP?

Print screen from web pagePrint screen from PDF

đang liên quan:

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

ảnh gốc là 150x150 pixel.

+0

Tôi cũng có vấn đề này, bạn đã tìm ra? Có lẽ tôi có thể hỏi nó một cách khác ... Nếu một hình ảnh là 100 pixel x 100 pixel, chiều rộng và chiều cao FPDF để sử dụng để đảm bảo mở rộng hình ảnh không xảy ra là gì? – Scott

+0

TCPDF là một lựa chọn thay thế - mặc dù bạn có thể không muốn nghe điều đó! Bạn có thể thử nó để so sánh chất lượng tuy nhiên trong trường hợp nó không phải là thư viện liên quan. –

Trả lời

8

tôi phải đối mặt với cùng một vấn đề trong các dự án cho khách hàng. Làm mờ hình ảnh trong tài liệu pdf được tạo ngay cả khi thuê hình ảnh.

Tôi mất một vài giờ, nhưng đây là những gì hiệu quả đối với tôi.

Tôi đã một lấy một cái nhìn vào mã và thấy rằng có một yếu tố quy mô đang được thiết lập trong constructor của tài liệu 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); 

Các scalefactor là tùy thuộc vào giá trị được đưa ra trong các nhà xây dựng của tài liệu pdf:

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

Giá trị mặc định là 'mm'. Trong hầu hết các tài liệu của tôi, tôi bắt đầu một tài liệu pdf như:

$pdf = new PDF('P'); 

Điều này có nghĩa là máy tính tỷ lệ 72/25.4 = 2.83 được sử dụng. Khi tôi đặt một hình ảnh trước khi tôi vừa mới sử dụng:

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

Bằng cách này tôi có hình ảnh mờ. Nó cũng có thể cung cấp cho chiều rộng của hình ảnh trong lệnh

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

này đã cho tôi một hình ảnh đó là quá lớn. Nhưng - và ở đây có sự lừa - khi bạn chia chiều rộng thực tế do các scalefactor (trong trường hợp của tôi 2,83) và đặt này trong bản Tuyên Bố này nó mang lại một hình ảnh hoàn hảo sắc nét:

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

Tôi hy vọng công trình này cho bạn quá !

0

Tôi nghĩ rằng vấn đề có thể liên quan đến:

$image_height = 40; 
$image_width = 40; 

Với hai hướng dẫn các bạn đang thiết lập kích thước hình ảnh sẽ có trong pdf.

Nhưng nếu hình ảnh gốc lớn hơn 40x40 thì tỷ lệ hình ảnh có thể gây ra vấn đề về chất lượng.

Vì vậy, những gì tôi đề nghị:

  • Thực hiện thay đổi kích thước chính xác của các hình ảnh (php cung cấp thư viện GD). Thay đổi kích thước nó thành 40x40. Các chức năng GD imagecopyresampled là bạn của bạn: thay đổi kích thước và resample hình ảnh! Toàn bộ tài liệu tham khảo: http://www.php.net/manual/en/function.imagecopyresampled.php
  • Chèn nay là hình ảnh trong pdf
+0

Cảm ơn bạn đã đề xuất. Thực tế là tôi muốn duy trì chiều rộng và chiều cao ban đầu (150x150 px). Giá trị nào cho $ image_height và $ image_width tôi nên đặt để duy trì chiều rộng và chiều cao ban đầu? – chejnik

+0

Vâng, nếu trong pdf của bạn, bạn muốn hình ảnh 150x150 sau đó thay đổi hai dòng đầu tiên của tệp của bạn: với $ image_height = 150; $ image_width = 150; –

+0

Các đơn vị được sử dụng trong fdpf không rõ ràng với tôi. Như được nói trong sách hướng dẫn, ví dụ về chiều rộng - Chiều rộng của hình ảnh trong trang. Có ba trường hợp: Nếu giá trị dương, biểu thị chiều rộng theo đơn vị người dùng Nếu giá trị âm, giá trị tuyệt đối thể hiện độ phân giải ngang trong dpi Nếu giá trị không được chỉ định hoặc bằng 0, giá trị này sẽ tự động được tính toán. Tôi không chắc chắn cách đặt đơn vị người dùng thành pixel hoặc độ phân giải để sử dụng cho hình ảnh không co giãn. Tx. – chejnik

0

FPDF với tuyên bố như thế này để đặt đơn vị người dùng thành 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 có kết quả rất đẹp.

Các vấn đề liên quan