我有一个PHP循环,可以执行以下操作:
- 通过 CURL 登录网页
- 需要登录的捕获和内部页面
- 将页面的 HTML 保存到本地文件
- 使用 WKHTMLTOPDF,将页面呈现为 PDF
我遇到的问题是每隔一段时间(可能是~30%的时间),图像就不会在PDF中呈现。如果我打开其中一个保存的HTML文件,我会发现我需要进入并手动刷新页面才能显示图像。
关于如何务实地确保图像加载的任何想法?我尝试过的事情:
- 每行之间的
sleep(n)
- 将
--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。