2013-10-18 23 views
8

Tôi đang sử dụng TCPDF để tạo tài liệu PDF và tôi đang cố gắng thêm biểu trưng vào tiêu đề, nhưng tôi gặp vấn đề với chất lượng hình ảnh và sau này cũng được phát hiện.Các vấn đề về chất lượng hình ảnh TCPDF

Các hình ảnh được chèn vào tài liệu PDF với TCPDF chịu sự cố về chất lượng và kích thước. Tôi không quan tâm nhiều đến kích thước bởi vì tôi có thể thay đổi nó, nhưng tôi không thể khôi phục lại chất lượng hình ảnh.

Những gì tôi đã cố gắng:

  • TCPDF scaling and quality issue
  • tcpdf: poor image quality
  • Tôi cũng đã chuyển đổi tiêu đề vào mã HTML, suy thoái giống chất lượng occurrs.
  • Đã xóa tất cả các tùy chọn khác cho $pdf->Image() và để mọi thứ theo mặc định - hình ảnh kích thước tăng lên (có lẽ) kích thước ban đầu với cùng vấn đề về chất lượng.

Đây là mã tôi đang sử dụng để chèn một hình ảnh:

$this->Image("../images/logo.jpg", 8, 10, 35, '', 'JPG', '', 'T', false, 0, '', false, false, 0, false, false, false); 

Và đây là sự khởi đầu của createPDF() chức năng:

$pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 
$pdf->SetCreator('PHP TC-PDF Generator'); 
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); 
$pdf->SetMargins(8, 50, 8); // page margins 
$pdf->SetAutoPageBreak(TRUE, 30); 
$pdf->setImageScale(1); 
$pdf->setFontSubsetting(true); 
$pdf->SetFont('helvetica', '', 12, '', true); 
$pdf->AddPage(); 
$pdf->setTextShadow(array('enabled'=>false)); 

Bất kỳ khuyến cáo khác?

Phương án thay thế: Tôi sẵn sàng thay đổi TCPDF bằng bất kỳ trình tạo PDF nào khác, nếu nó hỗ trợ các bảng HTML và có thể chèn hình ảnh với chất lượng tốt hơn.

Trợ giúp của bạn sẽ được đánh giá cao.

+0

Tôi thực sự ngạc nhiên khi TCPDF đang thực hiện việc này. Ngoài sự tò mò, điều gì sẽ xảy ra nếu bạn chuyển đổi JPG sang PNG và thêm tệp PNG thay vì JPG? – JamesG

+0

Cùng một sự xuống cấp về chất lượng xảy ra. –

+0

Bạn có bật thư viện GD và/hoặc tiện ích mở rộng tưởng tượng không? – JamesG

Trả lời

7

Để làm cho hình ảnh lớn hơn, hãy tăng chiều rộng được xác định. Dường như bạn đang sử dụng các đơn vị mặc định là mm để bạn chỉ định chiều rộng là 35 mm. Nếu bạn muốn có một hình ảnh lớn hơn, hãy thay đổi số đó thành chiều rộng mong muốn.

Để có hình ảnh chất lượng tốt hơn, hãy bắt đầu bằng hình ảnh lớn hơn. Bạn có thể phải thử nghiệm, nhưng hãy thử 1,53 lần lớn hơn. Nếu bạn làm cho nó quá lớn, sau đó nó có thể trông choppy khi thu nhỏ.

Tôi sẽ sử dụng PNG. Định dạng PNG phù hợp hơn với hình ảnh có văn bản và màu sắc chắc chắn như bạn có ở đó. Nhưng nếu bạn muốn sử dụng JPG, sau đó hãy thử tăng chất lượng hình ảnh bằng phương pháp SetJPEGQuality(). Tôi tin mặc định là 75.

Scaling

Nếu bạn chỉ định một chiều, thì giá trị quy mô hình ảnh không được sử dụng. Nếu bạn không muốn chỉ định kích thước một cách rõ ràng, hãy đặt hệ số tỷ lệ tương ứng với phương thức setImageScale(). Vì vậy, nếu bạn làm cho hình ảnh của bạn lớn gấp 1,53 lần kích thước mong muốn, hãy đặt tỷ lệ thành 1,53.

Lưu ý: Mô tả trong tài liệu cho setImageScale() gây hiểu lầm, IMO. Nó không thực sự liên quan đến việc chuyển đổi pixel sang đơn vị người dùng. Chuyển đổi đó được xử lý bởi tập lệnh nội bộ.

Mức thu phóng

Lưu ý rằng hình ảnh sẽ không đẹp ở tất cả các mức thu phóng, bất kể bạn làm gì. Bạn có thể đặt mức thu phóng ban đầu bằng phương pháp SetDisplayMode(). TCPDF mặc định là chiều rộng trang, sẽ lớn hơn 100% trên hầu hết các máy tính để bàn và máy tính xách tay hiện đại.

Kích thước

Các kích thước truyền cho phương thức Image() sử dụng các đơn vị sử dụng được xác định (mặc định là mm). Mặc dù có một số khác biệt về kỹ thuật giữa dpi và ppi, chúng chỉ áp dụng cho việc in.

Vì vậy, mục đích của chúng tôi:

72 pixels = 72 points = 1 inch = 2.54 cm = 25.4 mm 

Do đó, nếu bạn muốn có một hình ảnh rộng 40 mm, hãy thử tạo một hình ảnh rộng 173 pixel.

40 mm * 72 px/25.4 mm * 1.53 scale factor 

Vector hình ảnh

Nếu chất lượng hình ảnh là thực sự quan trọng, bạn nên xem xét sử dụng một trong những định dạng vector. Kiểm tra hướng dẫn TCPDF cho các phương thức ImageSvg() hoặc ImageEps().


Chú thích

  1. Tôi đã phát hiện ra rằng ở 100% zoom, có một sự cải tiến đáng kể về chất lượng khi hình ảnh ban đầu lớn hơn kích thước mong muốn 1,53 lần. Khi tôi lần đầu tiên bắt đầu nghịch với TCPDF và chất lượng hình ảnh, tôi đã xem qua số lượng 1,53 nhiều lần. Tuy nhiên, không bao giờ có bất kỳ lời giải thích nào về số lượng đó đến từ đâu. Tôi tin rằng cuối cùng tôi đã tìm ra điều đó. Adobe Reader sử dụng độ phân giải 110 ppi theo mặc định và TCPDF tạo tài liệu 72 dpi. 110/72 = 1.53
1

Tôi đã gặp vấn đề tương tự và không có đề xuất nào trước đó phù hợp với tôi. Sự cứu rỗi của tôi là THIS. Bí quyết là để sử dụng logo pdf của bạn như mẫu, xem kết quả bằng cách sử dụng biểu tượng của Google:

enter image description here

1) Bạn cần một phiên bản biểu tượng PDF 1.4 (phiên bản PDF hiện are not supported). Để làm như vậy, hãy chọn biểu tượng png, jpeg, etc chất lượng cao và chuyển đổi sang PDF 1.4 bằng cách sử dụng this site.

2)Download FPDI library.

3) Thực hiện theo các hướng dẫn từ các liên kết đầu tiên, và rằng tôi đang sao chép ở đây:

<?php 
// just require TCPDF instead of FPDF 
require_once('tcpdf.php'); 
require_once('fpdi.php'); 

class PDF extends FPDI 
{ 
/** 
* "Remembers" the template id of the imported page 
*/ 
var $_tplIdx; 

/** 
* Draw an imported PDF logo on every page 
*/ 
function Header() 
{ 
    if (is_null($this->_tplIdx)) { 
     $this->setSourceFile("logo.pdf"); 
     $this->_tplIdx = $this->importPage(1); 
    } 
    $size = $this->useTemplate($this->_tplIdx, 130, 5, 60); 

    $this->SetFont('freesans', 'B', 20); 
    $this->SetTextColor(0); 
    $this->SetXY(PDF_MARGIN_LEFT, 5); 
    $this->Cell(0, $size['h'], 'TCPDF and FPDI'); 
} 

function Footer() 
{ 
    // emtpy method body 
} 
} 

// initiate PDF 
$pdf = new PDF(); 
$pdf->SetMargins(PDF_MARGIN_LEFT, 40, PDF_MARGIN_RIGHT); 
$pdf->SetAutoPageBreak(true, 40); 
$pdf->setFontSubsetting(false); 

// add a page 
$pdf->AddPage(); 

// get external file content 
$utf8text = file_get_contents('examples/data/utf8test.txt', true); 

$pdf->SetFont('freeserif', '', 12); 
// now write some text above the imported page 
$pdf->Write(5, $utf8text); 

$pdf->Output(); 
+0

Cảm ơn bạn đã nhập. Tôi không biết làm thế nào tôi sắp xếp vấn đề này trở lại sau đó, nhưng sau đó tôi cũng chuyển từ TCPDF sang mPDF. Nó nhanh hơn nhiều và xử lý HTML và CSS tốt hơn nhiều so với TCPDF. Ví dụ về tốc độ: Tôi đã có một báo cáo với một vài trăm hàng bên trong một bảng, TCPDF cần nhiều hơn một phút để tạo PDF, mPDF mất dưới 10 giây. –

+0

@KristjanO. Rất vui được biết. Bởi bất kỳ cơ hội nào mPDF có thể căn chỉnh nội dung ở giữa ô? Bởi vì TCPDF chỉ có thể căn chỉnh ở trên cùng. Nếu đúng như vậy, có lẽ tôi đang thay đổi thư viện ... – carla

+0

Xin lỗi vì đã trả lời muộn của tôi. Thành thật mà nói, tôi không biết, tôi không bao giờ cần nó cho đến bây giờ. Bạn sẽ phải sử dụng Google. –

0

Vâng, tôi biết đây là một câu hỏi cũ, nhưng trong trường hợp ai đó vấp xung quanh này, như tôi, tôi khuyên bạn nên sử dụng hình ảnh PNG với 150 dpi. Tôi có thể nói điều này từ kinh nghiệm cá nhân của tôi với TCPDF. Tôi thường được yêu cầu tạo các tài liệu có hình nền và PNG-150dpi phù hợp một cách độc đáo.Bạn nhận được một tập tin lớn hơn, nhưng trong trường hợp của tôi, chất lượng in là quan trọng hơn, do đó, các tập tin không phải là một vấn đề.

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