将 wkhtmltopdf 与 Rails 一起使用时,从 S3 检索许多 SVG 图像时出现 UnknownNetworkError

问题描述

对于我正在处理的项目,我在 pdfkit 应用程序中使用 wkhtmltopdf/rails 生成包含许多图像的 PDF 文档。在这种情况下,“许多”意味着 750+。图片资源相对较小,每个大约 4kb。

代码的人为版本如下所示。

- (1..750).each do |i|
  img src="https://bucket.s3.com/prefix/to/image-#{i}/image.jpeg"

这适用于一组 JPEG 图像(S3 允许大量读取)。我还有一组同名的 SVG 图像。我正在尝试使用 SVG 来减小图像资产的大小。

运行相同的 PDF 转换时,我遇到了以下错误

Exit with code 1 due to network error: UnkNownNetworkError
[633b88d9-25e7-41a5-a6f6-325829cf2be8]    (0.7ms)  ROLLBACK  ...
[633b88d9-25e7-41a5-a6f6-325829cf2be8] Command Failed (exitstatus=1): /Users/harrylewis/.rbenv/versions/2.6.6/bin/wkhtmltopdf --quiet --page-size Letter --margin-top 0.5in --margin-right 0.5in --margin-bottom 0.5in --margin-left 0.5in --encoding UTF-8 --dpi 1000 --orientation Landscape --print-media-type --zoom 1.3 - report.pdf
[633b88d9-25e7-41a5-a6f6-325829cf2be8] method=GET path=/report format=json controller=ReportsController action=report status=500 error='PDFKit::ImproperWkhtmltopdfExitStatus: Command Failed (exitstatus=1): /Users/harrylewis/.rbenv/versions/2.6.6/bin/wkhtmltopdf --quiet --page-size Letter --margin-top 0.5in --margin-right 0.5in --margin-bottom 0.5in --margin-left 0.5in --encoding UTF-8 --dpi 1000 --orientation Landscape --print-media-type --zoom 1.3 - document.pdf' duration=9034.00 view=0.00 db=8.59
[633b88d9-25e7-41a5-a6f6-325829cf2be8]
PDFKit::ImproperWkhtmltopdfExitStatus - Command Failed (exitstatus=1): /Users/harrylewis/.rbenv/versions/2.6.6/bin/wkhtmltopdf --quiet --page-size Letter --margin-top 0.5in --margin-right 0.5in --margin-bottom 0.5in --margin-left 0.5in --encoding UTF-8 --dpi 1000 --orientation Landscape --print-media-type --zoom 1.3 - document.pdf

但是,我能够在图像数量小于 600 的情况下成功运行 PDF 生成

是否有人能够就这里可能发生的情况提供见解?

我尝试过的一些故障排除步骤。

  • 确保我尝试访问的所有图像实际上都可以访问并存在,方法是将它们显示在应用程序的网页上。

一些版本信息。

  • pdfkit - 0.8.4.2
  • rails - 5.2.4.4
  • wkhtmltopdf - 0.12.5 (with patched qt)

如果我能提供更多信息,请告诉我。

解决方法

我设法在这里找出问题所在。

事实证明,wkhtmltopdf 版本 0.12.5 中存在一个已知错误,该错误在 this GitHub thread 上讨论过。

事实证明,该问题会影响所有图像资产,而不仅仅是 SVG 图像。我只在尝试使用 SVG 图像时注意到它的原因是因为 JPEG 图像错误被忽略/消除。在运行带有 --debug-javascript 标志的工具时,我能够进一步调查这种细微差别。

根据 GitHub 帖子,此问题在最新版本的 wkhtmltopdf,版本 0.12.6 中也存在。

解决方法

GitHub 线程中提到的一种解决方法,在我的案例中有效,是在图像 URL 中使用 HTTP 协议代替 HTTPS。这会带来一些安全问题,因此您可能会也可能不会这样做。