我正在使用TCPDF生成PDF文档,我正在尝试在标题中添加徽标,但是我的图像质量有问题,后来我发现也有缩放。
使用TCPDF插入PDF文档的图像存在质量损失和尺寸问题。我不太关心尺寸,因为我可以改变它,但我无法恢复图像的质量。
我尝试过:
$pdf->Image()
的所有其他选项,并将所有内容保留为默认值 - 图片
尺寸增加到(大概)原始尺寸,质量问题相同。这是我用来插入图片的代码:
$this->Image("../images/logo.jpg", 8, 10, 35, '', 'JPG', '', 'T', false, 0, '', false, false, 0, false, false, false);
这是createPDF()
函数的开头:
$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));
还有其他建议吗?
替代: 我愿意用任何其他PDF生成器更改TCPDF,如果它支持HTML表格并且可以插入质量更好的图像。
非常感谢您的帮助。
答案 0 :(得分:10)
要使图像更大,请增加定义的宽度。您似乎使用的默认单位为mm,因此您指定的宽度为35 mm。如果您想要更大的图像,请将该数字更改为所需的宽度。
要获得更高质量的图像,请从更大的图像开始。您可能需要进行实验,但尝试更大1.53 1 倍。如果你把它做得太大,那么在缩放时它可能看起来很不稳定。
我会使用PNG。 PNG格式更适合具有文本和纯色的图像,就像您在那里一样。但是如果你想使用JPG,那么尝试使用SetJPEGQuality()方法提高图像质量。我相信默认值是75。
如果指定尺寸,则不使用图像比例值。如果您不想明确指定大小,请使用setImageScale()方法相应地设置比例因子。因此,如果您将图像的大小设置为所需大小的1.53倍,请将比例设置为1.53。
注意: setImageScale()文档中的描述具有误导性,IMO。它与将像素转换为用户单元没有任何关系。该转换由内部脚本处理。
请注意,无论您做什么,图像在所有缩放级别都不会很好。您可以使用SetDisplayMode()方法设置初始缩放级别。 TCPDF默认为页面宽度,在大多数现代台式机和笔记本电脑上将超过100%。
传递给Image()方法的维使用定义的用户单位(默认为mm)。虽然dpi和ppi之间存在一些技术差异,但它们仅适用于打印。
因此,出于我们的目的:
72 pixels = 72 points = 1 inch = 2.54 cm = 25.4 mm
因此,如果您想要一个40毫米宽的图像,请尝试创建一个173像素宽的图像。
40 mm * 72 px / 25.4 mm * 1.53 scale factor
如果图像质量非常重要,则应考虑使用其中一种矢量格式。查看TCPDF手册中的ImageSvg()或ImageEps()方法。
<强>脚注强>
110 / 72 = 1.53
答案 1 :(得分:1)
我遇到了同样的问题,之前的建议也没有对我有用。 我的救恩是THIS。秘诀是使用您的pdf徽标作为模板,使用Google徽标查看结果:
1)您需要PDF徽标版本1.4(当前PDF版本are not supported)。为此,请选择高质量的png,jpeg,etc徽标并使用this site转换为PDF 1.4。
3)按照第一个链接中的说明操作,我在这里复制:
<?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();
答案 2 :(得分:0)
嗯,我知道这是一个老问题,但万一有人偶然发现这些,像我一样,我建议使用150 dpi的PNG图像。我可以从我个人使用TCPDF的经验中说出这一点。我经常被要求制作带有背景图像的文件,PNG-150dpi非常合适。你得到一个更大的文件,但就我而言,打印质量更重要,因此文件大小不是问题。