2012-04-06 73 views
11

我使用FPDF和PHP將圖像添加到PDF。但在PDF中的圖像質量比原始圖像更糟糕,因爲你可以在這裏看到:如何使用FPDF和PHP維護圖像質量?

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

原始圖像是150×150像素。

+0

我也有這個問題,你知道嗎?也許我可以問一個不同的方式...如果圖像是100像素×100像素,FPDF寬度和高度用於確保圖像縮放不會發生? – Scott 2013-09-28 01:20:48

+0

TCPDF是一種替代方案 - 儘管您可能不想聽到!你可以嘗試比較質量,但如果它不是庫相關的。 – 2014-03-19 14:07:57

回答

8

我的項目,爲客戶所面臨的同樣的問題。 即使在僱用圖像的情況下,也會生成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') 

默認值是'mm'。在大多數我的文檔的我開始喜歡一個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 

這給了我,這是過於龐大的圖像。但是 - 這裏來了絕招 - 當您通過尺度因子除以實際寬度(以我爲例2.83),並把這個在此聲明,它提供了完美清晰的圖像:

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

我希望這也適用於你!

0

我想問題可能涉及:

$image_height = 40; 
$image_width = 40; 

有了這兩個指令,您將可以設置尺寸圖像將在PDF格式。

但是,如果原始圖像大於40x40,圖像的縮放會導致質量問題。

所以我建議:

+0

謝謝您的建議。事實是,我想保持原來的寬度和高度(150x150像素)。 $ image_height和$ image_width的值應該設置爲保持原始寬度和高度? – chejnik 2012-04-06 07:40:14

+0

那麼,如果在你的pdf中你想要圖像150x150,那麼改變你的文件的前兩行:$ image_height = 150; $ image_width = 150; – 2012-04-06 07:41:51

+0

fdpf中使用的單位對我來說不是很清楚。正如手冊中所述,例如width - 頁面中圖像的寬度。有三種情況: 如果該值爲正數,則表示用戶單位的寬度 如果該值爲負數,則絕對值表示以dpi爲單位的水平分辨率 如果該值未指定或等於零,則會自動計算。我不知道如何將我的用戶單位設置爲像素或使用什麼分辨率來實現不縮放圖像。 TX。 – chejnik 2012-04-06 08:05:15

0

帶有像這樣的語句的FPDF將用戶單位設置爲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取得了非常好的效果。