在流星星系的网络拍摄pdf中渲染图像
Rendering images in a webshot pdf on Meteor's Galaxy
我有一个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的人有所帮助。祝你好运!
- 如何从地图导出图像并将其插入到新的PDF文件中
- 将图像放入使用jsReport生成的pdf中
- jsPDF addHTML将低质量图像导出为PDF
- 来自HTML图像的jsPDF 会导致 pdf 为空
- 在流星星系的网络拍摄pdf中渲染图像
- 如何动态缩放 pdf 图像
- 使用javascript将图像插入pdf(Adobe Acrobat Pro)中
- PDF.js插入图像
- 使用pdfmake在angularjs中生成pdf时未显示图像
- 循环浏览 base64 图像并保存为 pdf
- “未捕获的类型错误:无法读取未定义的属性'嵌入'”在 pdfMake pdf 引擎中使用自定义图像时
- 是否可以使用图表内置方法将谷歌注释图表隐藏为 pdf/图像
- 如何确定 PDF 图像的 x/y 尺寸长度和 dpi
- 使用GraphicsMagick和Node.js将多个图像转换为多页pdf文件
- 我是否可以动态更改带有数字的图像,然后将其打印为 PDF
- 如何在显示 pdf 文件之前加载加载程序图像
- 如何将 html 页面的一部分保存到客户端 (javascript) 或服务器端 asp.net 的图像或 pdf
- 使用 pdf .js 的 pdf 图像质量很差
- 将图像打印为 pdf 文件
- 我怎样才能检测在哪里用javascript在PDF中标记图像