繁体   English   中英

在Meteor's Galaxy上以webshot pdf格式渲染图像

[英]Rendering images in a webshot pdf on Meteor's Galaxy

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

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

我曾尝试就此问题与Galaxy支持联系,但并没有太多帮助。 其他人有没有经历过? 我甚至很难找出导致该问题的软件包,如果需要的话,可以提交拉取请求。 谢谢!

因此,我找出了自己的问题,将与他人分享,但我还将分享一些有关调试在Galaxy服务器上运行的应用程序中的webshot的提示。

首先,默认情况下,webshot不会在Galaxy日志中传递错误,因为它运行在衍生的node.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”}到生成方法 var phantomProc = crossSpawn.spawn(options.phantomPath, phantomArgs, {stdio: "inherit"});

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

//注释掉第234-239行 // phantomProc.stderr.on('data',function(data){// if(options.errorIfJSException){// namedCallback = true; // clearTimeout(timeoutID); // cb (new Error(''+ data))//} //});

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

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附件 filePath对象中使用Meteor.absoluteUrl()为电子邮件正确呈现url的问题。 我不知道为什么Meteor.absoluteUrl()无法在电子邮件附件中的Galaxy上正确呈现我的应用程序的url,因为Meteor.absoluteUrl()在我的应用程序中的其他地方都可以使用,并且在Digital Ocean上也可以使用,但是它没有在这里工作。 当我将附件对象切换到硬编码的URL时,它可以正常工作,因此,如果遇到问题,可能值得检查。

我知道很多流星开发人员已经使用webshot在他们的应用程序中创建pdf,并且我相信将来会有一些人迁移到Galaxy,因此希望这对其他决定改用Galaxy的用户有所帮助。 祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM