9

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

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

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

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

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

#1 让它变得更糟,而 #2 什么也没做。

谢谢!

4

5 回答 5

1

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

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

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

于 2012-05-11T16:19:13.857 回答
1

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

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

于 2013-01-11T19:59:58.407 回答
0

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

于 2012-05-11T14:15:45.537 回答
0

您不能将 onLoad 添加到您需要知道正在加载的图像中吗?就像是

<img src='foo.jpg' onLoad='callbackFuncion();'/>
于 2012-07-20T00:18:12.533 回答
0

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

于 2012-12-01T12:08:24.410 回答