RMagick将ps转换为pdf

时间:2010-08-25 17:37:19

标签: pdf imagemagick ghostscript postscript

当我将PS文件转换为PDF时,它在本地计算机上工作正常,但在生产服务器上,它会为页面添加边距,就像我选择Scale to Fit而不是Scale:100%来自Mac OSX预览打印设置。我该如何防止这种情况?目前,我正在做:

Magick::ImageList::new('cool.ps').write('cool.pdf') # only works on local machine

更新:我解决了这个问题!请参阅下面的答案。

2 个答案:

答案 0 :(得分:1)

我不能肯定地说,但您可以通过尝试其他图片格式来确定是否从转换或将转换为pdf 是否存在问题。 Png不会有额外的边框,所以如果它在这个例子中得到它们,你知道从ps转换就是问题。

Magick::ImageList::new('cool.ps').write('cool.png')

答案 1 :(得分:0)

解决方案

system("gs -dSAFER -dBATCH -dNOPAUSE -sPAPERSIZE=letter -sDEVICE=pdfwrite \
        -sOutputFile='cool.pdf' 'cool.ps'")
  • -dSAFER(readonly)阻止输入文件被更改。
  • -dBATCH自动退出Ghostscript。
  • 每次转换页面后,
  • -dNOPAUSE会自动继续。

我意识到你也可以使用命令ps2pdf(看起来更好)而不是gs,但上面工作正常,所以我保留它,因为我有其他更重要的事情要做,而且我无法轻易部署并测试生产。

我是如何解决这个问题的

首先,我发现我可以use ghostscript to convert PostScript (PS) files to PDF

所以,我尝试使用Ghostscript但得到了相同的结果。 (事后来看,我了解到这是因为ImageMagic无论如何都会将PS和PDF格式委托给Ghostscript。)

在进一步检查生产服务器生成的PDF之后,我意识到生产服务器生成的PDF的页面大小(与我本地机器生成的PDF的页面大小相比)实际上略大一些(事后看来,我认为这是a4。)因此,导致保证金的增加,哈哈。 :)

我心想,为什么生产服务器使用不同的页面大小? ...

啊哈! Ghostscript配置文件(实际上,我很快就知道它们被称为Ghostscript initialization files。)在生产服务器上必须指定不同的默认值Ghostscript page size

好吧,谁是nincompoop决定(在生产服务器上安装Ghostscript时)将默认纸张尺寸覆盖为a4?

幸运的是,由于我没有生产访问权限,我可以使用-sPAPERSIZE=legal明确设置它,但我没有完成调查......

在我的本地计算机上,我执行了man gs,然后键入/init搜索“init”,然后输入。然后,n& N循环查看结果。我看到了gs_init.ps,所以我退出q并做了:

sudo find / -name gs_init.ps

我得到了:

/opt/local/share/ghostscript/8.71/Resource/Init/gs_init.ps
/opt/local/var/macports/software/ghostscript/8.71_3/opt/local/share/ghostscript/8.71/Resource/Init/gs_init.ps

cat了第二个结果(因为我记得用MacPorts安装ImageMagick,虽然如果我不得不再做一次,我可能会从源代码安装ImageMagick或者用HomeBrew代替)。我搜索了PAPERSIZE并找到了:

% Optionally choose a default paper size other than U.S. letter.
% The default page size for many devices is set at compile time to 
% letter, but this can be changed to A4 although this is rarely done.  
% Some devices such as bbox have a different default page size,
% and should not be set to A4 or letter.
% When ghostscript is used in countries that use the international
% standard page size A4 rather than US letter, the page size of 
% devices that default to letter or A4 can be changed by setting
% DEFAULTPAPERSIZE.
% /DEFAULTPAPERSIZE (a4) def