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

UnknownNetworkError when retreiving many SVG images from S3 when using wkhtmltopdf with Rails

对于我正在进行的项目,我在 rails 应用程序中使用 pdfkit/wkhtmltopdf 生成包含许多图像的 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

但是,我能够成功生成 PDF 运行,图像数量少于 600 张。

是否有人能够提供有关此处可能发生的情况的见解?

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

一些版本信息。

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

我设法弄清楚了这里的问题。

事实证明 wkhtmltopdf 版本 0.12.5 中存在一个已知错误,在 this GitHub thread.

上被提及和讨论

事实证明,该问题会影响所有图像资源,而不仅仅是 SVG 图像。我在尝试使用 SVG 图像时才注意到它的原因是因为 JPEG 图像错误是 ignored/silenced。当 运行 带有 --debug-javascript 标志的工具时,我能够进一步研究这种细微差别。

根据 GitHub 线程,此问题也存在于 wkhtmltopdf 的最新版本中,版本 0.12.6

解决方法

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