TCPDF:如何将图像放入 HTML 块中?

Posted

技术标签:

【中文标题】TCPDF:如何将图像放入 HTML 块中?【英文标题】:TCPDF: How can I place an image into an HTML block? 【发布时间】:2012-03-17 00:54:39 【问题描述】:

我已经使用 TCPDF 工作了几个月了;断断续续地。它对我的大多数 html 模板都非常有效,但我总是在将图像放入 PDF 时遇到问题。图像通常放置在正文中,而不是标题中。我的位置要么是左上角的固定位置,要么是相对于文档底部的位置。无论哪种情况,我都有问题。当 HTML 中的文本发生变化时,我必须重新定位图像。多个列表会使事情变得更加困难。注意:“类 pdf 扩展了 TCPDF”。

$this->pdf->AddPage();
$this->pdf->writeHTML($pdf_html);
$cur_page = $this->pdf->getPage();
$x_pos = $this->pdf->GetX();
$y_pos = $this->pdf->GetY();
// Place image relative to end of HTML
$this->pdf->SetXY($x_pos, $y_pos - 54);
$this->pdf->Image('myimage.png');

有谁知道将图像放入由 HTML 生成的 PDF 的万无一失的方法。我想过将 HTML 分成两部分,但我不确定它是否也能正常工作。

【问题讨论】:

【参考方案1】:

我正在使用 html img 标签,它运行良好。

$toolcopy = ' my content <br>';
$toolcopy .= '<img src="/images/logo.jpg"   >';
$toolcopy .= '<br> other content';

$pdf->writeHTML($toolcopy, true, 0, true, 0);

【讨论】:

不幸的是,我正在向 PDF 文档添加内容敏感图像(签名)。我无法通过路径将图像拉入文档中。 即使图像是动态生成的,您也可以包含在 pdf 中。我有 pdf,其中一些图像始终存在,而一些图像是在创建 pdf 之前生成的,一旦生成 pdf,它们就会被删除。我不明白你 - “我不能用路径将图像拉到文档中。”那么图像在哪里? 它不能是基于网络的参考路径。我从本地文件路径中提取图像。相对于前面的html写的底部好像是最适合我的情况了。 当使用 标签时 - 有没有办法让图像溢出文本或溢出图像? @henna @jjwdesign 意味着从位于网站根目录下方的文件路径中提取图像 - 浏览器不可见。我只是尝试做同样的事情,但这不起作用。看来您的方法确实有效,但仅适用于可从 webroot 及更高版本访问的文件。在某些情况下,您不想放置可从网页访问的信息。微妙的信息甚至不应该写在临时文件中。很遗憾,因为使用 &lt;img /&gt; 标签比 tcpdf 的 Image() 方法更容易使用。【参考方案2】:

抱歉,我知道您的答案已被接受。但是,它似乎并没有真正回答您关于网络级别的图像的问题。

您是否考虑过使用 file_get_contents();以及简单的渲染 base_64 字符串。通过这种方式,您可以从任何级别使用图像,而不必担心它会被公开访问。

例如:

$imageLocation = '/var/www/html/image.png';
$ext = end(explode(".", $imageLocation);
$image = base64_encode(file_get_contents($imageLocation));
$pdf->writeHTML("<img src='data:image/$ext;base64,$image'>");

或者,不依赖 HTML 解析器。从经验来看,这会大大减慢您可以使用的结果 PDF 的渲染速度:

$image = file_get_contents('/var/www/html/image.png');
$pdf->Image('@'.$image);

编辑

为了完整起见,也是为了回应罗兰。你当然可以使用 SplFileObject。

$image = new SplFileObject('/var/www/html/image.png', 'r');
$imageContents = $image->fread($image->getSize());
$imageExtension = $image->getExtension();
$pdf->writeHTML("<img src='data:image/$imageExtension;base64,$imageContents'>");

【讨论】:

或者把这个改写成SplFileObject?那么就不需要explode(),只是因为文件的扩展名。 在这里,我的 PDF 包含一个 &lt;img&gt; 标签,所以我不能做第二个选项。不过,我不希望 TCPDF 出现在网络统计数据中,无论如何这很愚蠢。 你可以使用 SplFileObject 但它并没有让它变得更干净。添加了一个 SplFileObject 示例来回答。 不知何故,某些 TCPDF 版本只需要 img src 中的 base64 字符串,前缀为“@”。所以:$pdf-&gt;writeHTML("&lt;img src='@$imageContents'&gt;"); 我刚刚通过这个答案发现了这一点:***.com/a/54520065/3090890(这是我唯一可行的解​​决方案) 传奇人物,你!【参考方案3】:

Answer is here

请确保 HTML 属性有双引号。

$html = "<img src='...' />"; // This will not work

$html = '<img src="..." />'; // This will work

$pdf->writeHTML($html, true, false, true, false, '');

【讨论】:

以上是关于TCPDF:如何将图像放入 HTML 块中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 HTML 数据放入 tcpdf 的标题中?

CMYK 图像使用 TCPDF 变为负片

如何创建块图像?

如何将活动图像中心保持在光滑滑块中?

TCPDF 错误:[图像] 无法获取图像

如果没有上传图像,如何将默认图像放入 multer?