2012-12-21 62 views
1

我想要完成的是使用bbox中描述的输出裁剪我的PostScript文件,名为example.ps。我正在批处理中执行此操作,其中bbox对于某些文件可能会有所不同。我看了pdfcrop并看到它使用了类似的方法。这里是我现在用来裁剪的命令。GhostScript使用bbox来裁剪Postscript文件

gs -o cropped.pdf \ 
    -sDEVICE=pdfwrite \ 
    -dDEVICEWIDTHPOINTS=160 \ 
    -dDEVICEHEIGHTPOINTS=840 \ 
    -dFIXEDMEDIA \ 
    -c "0 0 translate 0 0 160 840 rectclip" \ 
    -f example.ps 

该命令的问题是我必须指定要使用的宽度和高度。我想要发生的是如何首先调用bbox,然后通过代码或通过使用某些命令行重定向来调用此语句。

+0

是简单的解析输入文件,读取BB线和煮了相应的GS命令。具体情况取决于您想使用哪种语言。 – agentp

+0

postscipt中的bbox行不正确,所以我需要使用bbox命令来查找正确的bbox。然后根据bbox的输出创建gs命令。 –

+0

这是Windows cmd.exe的shell?我可以帮助bash和awk,但我不知道目前的窗户。 –

回答

3

首先,请注意,并非来自多页PostScript文件的每个页面都会显示完全相同的“边界框”值(实际上,这很少见)。所以你可能想找出所有可能的边界框(其中包括它们全部)上的公分母

其次,你在控制台窗口中查看运行是标准输入标准输出输出通道的混合。但是,您所查看的信息是stderr。如果将命令输出重定向到文件,则捕获的是stdout,而不是stderr!要压制一些版本和调试信息去stderr-q加到命令行。

所以为了得到的包围盒“干净*输出的所有网页,你必须重新定向标准错误通道第一,然后您可以在文件info.txt捕捉。所以像这样运行(或类似)的命令:

gs    \ 
    -dBATCH  \ 
    -dNOPAUSE  \ 
    -q   \ 
    -sDEVICE=bbox \ 
    example.ps \ 
2>&1   \ 
| tee info.txt 

,甚至这一点,你应该不需要对HiResBoundingBox的信息:

gs    \ 
    -dBATCH  \ 
    -dNOPAUSE  \ 
    -q   \ 
    -sDEVICE=bbox \ 
    example.ps \ 
2>&1   \ 
| grep ^%%Bound \ 
| tee info.txt 

另外,顺便说一句,注意可以确定边界框PostScript以及PDF输入文件。

这应该给像下面这样,每一行代表输入文件的网页,在第一行开始第1页你输出:

%%BoundingBox: 36 18 553 802 
%%BoundingBox: 37 18 553 804 
%%BoundingBox: 36 18 553 802 
%%BoundingBox: 37 668 552 803 
%%BoundingBox: 40 68 532 757 

最后,你可能需要阅读起来在下面的答案中找到关于Ghostscript的bbox设备的一些背景信息。您还可以找到的种植工作有一些可供选择的PostScript代码:

+0

我使用Windows,所以我无法使用grep和tee命令重定向stderr –

+0

@ user1864948:在Windows上,而不是grep,您可以使用'findstr“%% Bound”'。您可以使用正常的重定向,而不是'tee':'1> info.txt'。 –