使用RMagick / ImageMagick从SVG转换为PDF时,如何提高质量?

时间:2011-11-17 19:21:42

标签: ruby pdf svg imagemagick rmagick

我使用Rubyvis生成SVG图,然后允许用户直接保存到SVG,或者使用RMagick保存到其他格式。

SVG图具有设置大小,该大小在SVG文件中指定。在我看来,转换为相同大小的PDF应该是微不足道的。

不幸的是,情况似乎并非如此。我可以用这种方式生成PDF,但是如果我首先在inkscape中打开SVG然后以PDF格式打印到文件,它会比生成的PDF大得多(尺寸方面)。

更糟糕的是,PDF图像质量很差。

我错过了Magick的一些指示吗?这是代码:

image = Magick::Image::from_blob(svg_string_data) { self.format = 'SVG' }
image[0].format = 'PDF'
image[0].to_blob

然后我将返回的值(PDF blob)直接写入文件。

1 个答案:

答案 0 :(得分:1)

The answer comes to you based on a tip from cptjazz on github.

首先,documentation for RMagick经常出错。我怀疑这是一个版本问题,因为ImageMagick托管的文档是v2.12.0,我使用的是v2.13.1。无论哪种方式,这都是您需要知道的。

文档声称您可以使用image[0]['pdf', 'use-cropbox'] = true,因为true.to_s会产生字符串'true'。实际上,它需要一个显式字符串,[]=方法只需要一个键,而不是两个键。

我没有试验pdf:use-trimbox,主要是因为我想要一个也适用于postscript的选项。对于postscript,您应该只能稍微修改它,并将ps:use-cropbox设置为'true',但RMagick的文档不清楚如何在PS,PS2或PS3上正确设置几何。 (通常在ImageMagick中,人们会将密度设置为'300x300',几何设置为'24%'。)由于某种原因,PS3格式的输出文件不能像RMagick生成的PDF那样扩展。但我离题了。

以下是我用于PDF的内容:

image = Magick::Image::from_blob(svg_string) { self.format = 'SVG' }
image[0].format = 'PDF'
image[0]["use-cropbox"] = 'true'
image[0].to_blob

以下是我用于PS的内容:

image = Magick::Image::from_blob(svg_string) { self.format = 'SVG' }
page  = image[0].page.dup
image[0]["use-cropbox"] = 'true'
image[0].format = 'PS3'
image[0].density = '100x100'
image[0].page = page
image[0].to_blob

出于某种原因,设置更高的密度会使图像变小。为什么这应该是一个谜。