【问题标题】:TCPDF image quality issuesTCPDF 图像质量问题
【发布时间】:2013-10-27 05:35:20
【问题描述】:

我正在使用 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 会发生什么?
  • 出现同样的质量下降。
  • 您是否启用了 GD 库和/或 imagick 扩展?

标签: image tcpdf


【解决方案1】:

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

要获得更高质量的图像,请从更大的图像开始。您可能需要进行试验,但请尝试大 1.531 倍。如果你把它做得太大,那么缩放时它可能会看起来不连贯。

我会使用 PNG。 PNG 格式更适合您使用的带有文本和纯色的图像。但如果您想使用 JPG,则尝试使用SetJPEGQuality() 方法提高图像质量。我相信默认值为 75。

缩放

如果您指定尺寸,则不使用图像比例值。如果您不想明确指定大小,请使用 setImageScale() 方法相应地设置比例因子。因此,如果您使图像比所需尺寸大 1.53 倍,请将比例设置为 1.53。

注意: 文档中对 setImageScale() 的描述具有误导性,IMO。它与将像素转换为用户单位没有任何关系。该转换由脚本在内部处理。

缩放级别

请注意,无论您做什么,图像在所有缩放级别都不会看起来不错。您可以使用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

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,之前的建议也没有对我有用。 我的救赎是THIS。秘诀是使用您的 pdf 徽标作为模板,使用 Google 徽标查看结果:

    1) 您需要 PDF 徽标 1.4 版(当前 PDF 版本are not supported)。为此,请选择高质量的 png、jpeg、etc 徽标并使用 this site 转换为 PDF 1.4。

    2) Download FPDI library.

    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 秒。
    • @KristjanO。很高兴知道。 mPDF是否可以将单元格中间的内容对齐?因为 TCPDF 只能在顶部对齐。如果是这样的话,也许我也在改变图书馆......
    • 为我迟到的回复道歉。老实说,我不知道,直到现在我才需要它。你必须谷歌它。
    • 我用这个方法,而且很漂亮。快速轻松地部署我想要的任何 pdf。所有这些都是从我在每个 pdf 中想要的上下文的简单模板生成的。
    【解决方案3】:

    好吧,我知道这是一个老问题,但如果有人像我一样偶然发现这些问题,我建议使用 150 dpi 的 PNG 图像。我可以根据我对 TCPDF 的个人经验来这么说。我通常被要求制作带有背景图像的文档,并且 PNG-150dpi 非常适合。你会得到一个更大的文件,但在我的情况下,打印质量更重要,所以文件大小不是问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2017-06-22
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      相关资源
      最近更新 更多