TCPDF图像质量问题

8
我正在使用TCPDF生成PDF文档,我试图在页眉中添加一个徽标,但是我遇到了图像质量的问题,后来发现还有缩放问题。
使用TCPDF插入PDF文档的图像会出现质量损失和大小问题。我不太关心大小,因为我可以更改它,但我无法恢复图像的质量。
我尝试过以下方法:
  • TCPDF scaling and quality issue
  • tcpdf: poor image quality
  • 我还将页眉转换为HTML代码,但同样会出现质量下降的问题。
  • 删除$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));

还有其它推荐吗?

替代方案: 如果支持HTML表格并且能够插入更高质量的图像,我愿意改用任何其他PDF生成器替换TCPDF。

非常感谢您的帮助。


我非常惊讶TCPDF会这样做。出于好奇,如果你将JPG转换为PNG并添加PNG文件而不是JPG,会发生什么? - JamesG
同样的质量降低会发生。 - Kristjan O.
您是否启用了GD库和/或Imagick扩展? - JamesG
3个回答

10

要使图片更大,增加定义的宽度。您似乎正在使用默认单位毫米,因此指定了35毫米的宽度。如果您想要更大的图像,请将数字更改为所需的宽度。

为了获得更好的图像质量,请从更大的图像开始。你可能需要尝试一下,但是可以尝试放大1.53倍。如果放得太大,则缩小时可能会看起来很模糊。

我会使用PNG格式。 PNG格式更适合具有文本和纯色的图像,就像您在那里所拥有的一样。但是,如果您想使用JPG,则可以使用SetJPEGQuality()方法尝试提高图像质量。我相信默认值为75。

缩放

如果您指定了一个维度,那么图像缩放值将不会被使用。如果您不想显式地指定大小,则可以使用setImageScale()方法相应地设置比例因子。因此,如果您希望将图像放大1.53倍,以达到所需的大小,请将比例设置为1.53。
注意:我认为setImageScale()文档中的描述是误导性的。它实际上与将像素转换为用户单位没有任何关系。该转换由脚本内部处理。
缩放级别
请注意,无论您做什么,图像在所有缩放级别下都不会看起来很好。您可以使用SetDisplayMode()方法设置初始缩放级别。TCPDF默认为页面宽度,在大多数现代台式机和笔记本电脑上超过100%。
图像大小 Image()方法传递的尺寸使用定义的用户单位(默认为毫米)。虽然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()方法。


注释

  1. 我发现在100%的缩放比例下,当原始图像比所需大小大1.53倍时,质量有明显提高。当我开始调整TCPDF和图像质量时,我多次遇到了数字1.53。然而,从来没有任何解释这个数字是从哪里来的。我相信我终于找到了答案。Adobe Reader默认使用110 ppi的分辨率,而TCPDF创建的文档为72 dpi。110/72 = 1.53

1
我遇到了同样的问题,之前的建议都没有对我有用。我的救星是这个。秘诀在于使用你的PDF标志作为模板,看看使用Google标志的结果:

enter image description here

1) 你需要一个PDF标志版本1.4(当前的PDF版本不受支持)。为此,请选择高质量的png、jpeg、等等标志,并使用此网站转换为PDF 1.4。

2) 下载FPDI库

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

感谢您的输入。我不知道当时是如何解决这个问题的,但后来我也从TCPDF切换到了mPDF。它比TCPDF更快,并且可以更好地处理HTML和CSS。例如,在速度方面:我有一个包含几百行表格的报告,TCPDF需要超过一分钟才能生成PDF,而mPDF只需要不到10秒钟。 - Kristjan O.
@KristjanO。很高兴知道这个消息。不知道mPDF是否可以将内容对齐到单元格中间?因为TCPDF只能在顶部对齐。如果是这种情况,也许我需要更换库... - carla
抱歉回复晚了。老实说,我不知道,直到现在我都没有需要过。你需要去谷歌一下。 - Kristjan O.
1
我使用这种方法,它非常优美。快速轻松地部署我想要的任何PDF文件。所有内容都从一个简单的模板生成,以便在每个PDF中保持上下文一致。 - levi

0

嗯,我知道这是一个老问题,但如果有人像我一样碰巧遇到了这个问题,我建议使用150 dpi的PNG图像。这是基于我在使用TCPDF时的个人经验。通常我会被要求制作带有背景图像的文档,而PNG-150dpi非常适合。文件大小会变大,但在我看来,打印质量更重要,所以文件大小并不是什么问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接