2011-11-17 80 views
0

我使用Rubyvis来生成SVG图,然后允许用户直接保存到SVG,或使用RMagick保存到其他一些格式。如何在使用RMagick/ImageMagick将SVG转换为PDF时提高质量?

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

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 

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