在流星星系的网络拍摄pdf中渲染图像

Rendering images in a webshot pdf on Meteor's Galaxy

本文关键字:pdf 图像 星星 流星 网络      更新时间:2023-09-26

我有一个pdf,它是使用webshot从我的Meteor应用程序中的服务器端html文件呈现的。此 pdf 显示在浏览器中,并附加到要发送给各种用户的电子邮件中。自从迁移到Meteor的Galaxy平台以来,我无法在html文件中渲染图像,并且电子邮件附件无法正常工作。我的设置在 Ubuntu 14.04 的数字海洋上完美运行,也适用于我的本地主机。它仍然可以在这两种环境中完美运行,但不适用于Galaxy。(值得注意的是,我对编程电子邮件附件了解不多,但使用了 Meteor 的电子邮件包,它基于 mailcomposer)

pdf 渲染,所以我知道 phantomjs 正在工作,而 webshot 正在截取屏幕截图并将其显示为 pdf,所以我知道 webshot 正在工作。但是,图像不会呈现,并且在附加到电子邮件时,文件已损坏/无法正确发送。我尝试记录html以确保图像文件的URL都是正确的,并且它们在部署到Galaxy时是正确的,但它们不会使用phantomjs/webshot渲染。我正在使用meteorhacks:ssr包在服务器上渲染html文件,然后再使用phantomjs读取它。

我尝试就此联系Galaxy支持,但没有得到太多帮助。还有其他人经历过吗?我什至很难查明导致问题的软件包,以便在需要时提交拉取请求。谢谢!

所以我找到了我的问题,我将与其他人分享,但我也将分享一些关于在 Galaxy 服务器上运行的应用程序中调试 webshot 的指针。

首先,webshot 默认情况下不会将错误传输到 Galaxy 的日志中,因为它运行在生成的节点.js进程中,因此您需要在"project_path/.meteor/local/isopacks/npm-container/npm/node_modules/webshot/lib/webshot.js"文件中更改这一行(注意,我还在 Meteor 1.2 上,所以这是你的 npm webshot 包所在的位置):

Webshot.js 第 201 行 - 添加 , {stdio: "inherit"} 到 spawn 方法 var phantomProc = crossSpawn.spawn(options.phantomPath, phantomArgs, {stdio: "inherit"});

这会将所有日志从生成的进程传递到控制台。除此之外,请注释掉同一文件中的以下代码:

注释掉第 234-239 行 phantomProc.stderr.on('data', function(data) { if (options.errorIfJSException) { calledCallback = true; 清除超时(超时ID); cb(新错误('' + 数据)) // } //});

执行这两个修改会将日志从 phantomjs 进程打印到 Galaxy 容器。除此之外,您还需要修改位于同一目录中的 webshot.phantom.js 脚本以打印到控制台以进行调试。这是您希望修改的脚本,但您认为适合查找问题,但 phantomjs 文档建议使用虚拟回调来调试正在加载的网页中的错误,例如:

page.onResourceError = function(resourceError) {
  console.log('Unable to load resource (#' + resourceError.id + 'URL:' + resourceError.url + ')');
  console.log('Error code: ' + resourceError.errorCode + '. Description: ' + resourceError.errorString);
};

对于我的特定问题,我遇到了SSL握手问题:

Error code: 6. Description: SSL handshake failed

为了解决这个问题,我必须将以下代码添加到我的 webshot 选项对象中:

        phantomConfig: {
          "ignore-ssl-errors": "true",
          "ssl-protocol": "any"
        },

这修复了通过https在我的pdf中加载静态图像的问题(注意:这在没有上述代码的情况下在Digital Ocean上正常工作,我不确定Galaxy容器上的SSL配置有什么不同)。

此外,我在将 pdf 正确附加到我的应用程序发送的电子邮件时遇到问题。事实证明,这是在mailcomposer attachments filePath对象中使用Meteor.absoluteUrl()正确呈现电子邮件网址的问题。我不知道为什么 Meteor.absoluteUrl() 没有在电子邮件附件中在 Galaxy 上正确呈现我的应用程序的网址,因为 Meteor.absoluteUrl() 在我的应用程序中的其他地方工作,它在 Digital Ocean 上工作,但它在这里不起作用。当我将附件对象切换到硬编码的 URL 时,它工作正常,因此如果您遇到问题,这可能值得检查。

我知道很多Meteor开发人员已经使用webshot在他们的应用程序中创建了pdf,我相信有些人将来会迁移到Galaxy,所以希望这对其他决定切换到Galaxy的人有所帮助。祝你好运!