Prawn PDF:如何添加使用dragonfly

时间:2015-07-08 14:54:15

标签: ruby-on-rails ruby rack prawn dragonfly-gem

我喜欢生成PDF文件,其中还包含用户上传的图像。虾宝石到目前为止工作,并且还可以嵌入位于文件系统中的图像。 我的问题是我想要包含用户上传的图像,这些图像的存储位置将来可能会发生变化(从文件系统到某些云服务)。 我使用蜻蜓宝石来处理图像,这使用机架来访问图像,有时还可以动态处理它们。

现在最简单的想法不起作用 (report是我的对象,spot_image是我的图像字段)

image report.spot_image

no implicit conversion of #<Class:0x007fc07ecf1110> into String

我还尝试使用open-uri通过http打开文件。这应该可以工作,但它会在我的开发机器上阻塞,我认为因为开发rails服务器是单线程的:

image_path = report.spot_image.remote_url
image_url = "#{view.request.protocol}\#view.request.host_with_port}
             /#{image_path.sub(/^\//,"")}"

image open(image_url)  # timeout in development-mode

它可能在生产中起作用,但即便如此,它也会产生不必要的http请求。我可以直接问蜻蜓(或架子)图像吗? prawn使用duck-typing,需要一些响应readrewind的对象作为图像。

1 个答案:

答案 0 :(得分:0)

我找到了有关dragonfly file handling的相关文档。以下不起作用: report.spot_image.data方法将图像数据作为字符串返回,但是prawn将数据识别为路径而不是图像数据。 dragonfly tempfile方法返回一个已关闭的临时文件,但是大虾无法识别它可以打开它。

我使用file方法取得了成功,该方法返回一个打开的文件句柄。目前还不清楚虾是否正在关闭此文件。所以我使用块样式方法来确保文件已关闭:

   report.spot_image.file do |f|
       image f
   end

到目前为止这是有效的。 (尚未通过云存储测试)