如何确保在生成 PDF 之前加载图像


How to ensure images load before generating PDF?

我有一个PHP循环,可以执行以下操作:

  1. 通过 CURL 登录网页
  2. 需要登录的捕获和内部页面
  3. 将页面的 HTML 保存到本地文件
  4. 使用 WKHTMLTOPDF,将页面呈现为 PDF

我遇到的问题是每隔一段时间(可能是~30%的时间),图像就不会在PDF中呈现。如果我打开其中一个保存的HTML文件,我会发现我需要进入并手动刷新页面才能显示图像。

关于如何务实地确保图像加载的任何想法?我尝试过的事情:

  1. 每行之间的sleep(n)
  2. --javascript-delay 30000添加到我的WKHTMLTOPDF调用中,以确保它有足够的时间来加载任何图像。
#

1 使情况变得更糟,#2 什么也没做。

谢谢!

在示例的步骤 3 和 4 之间,您可能需要考虑解析所有图像链接的 HTML 文件并使用 curl 单独下载它们,将它们保存在本地,然后更新保存的 HTML 文件中的链接以指向新的本地图像资源而不是远程资源。

这应该会大大缩短将 HTML 呈现为 PDF 时图像的加载时间。

如果在使用 cURL 抓取 html 后,让 php 循环遍历每个 img 元素并读取图像文件二进制数据并将图像 src url 属性替换为打开的图像文件的 base64 编码值,例如:

'<img src="data:image/jpg;base64,'. base64_encode($imagedata) . '"/>'

如果 base64 图像数据被硬编码到页面中,那么这将为您提供一种编程方法来验证所有图片是否已"加载"并防止在所有图片下载之前开始出现 PDF 转换问题......

我从来没有这样做过,但也许你可以通过迭代调用curl_getinfo()然后读出CURLINFO_SIZE_DOWNLOAD的值来找出下载是否完成 - 直到该值不再改变?

您不能将onLoad添加到您需要知道正在加载的图像中吗? 类似的东西

<img src='foo.jpg' onLoad='callbackFuncion();'/>

也许您可以处理下载的 HTML,搜索 img 标签,然后将图像下载到本地存储并替换 src 属性。这样,您应该在所有图像可用后生成pdf。