2012-10-01 46 views
5

我想裁剪PSPDF文件的主要區域以創建沒有空白的EPS文件。 ghostrcipt,ps2pdf,epstools的命令可以將主繪圖裁剪出文檔文件。如何調整EPS文件的邊界框?

問題是,他們只能以原始形式裁剪,但我想用BoundingBox 0 0 x y創建一個EPS文件;裁剪並移動到左下角。

我們想要在PS文檔中插入生成的EPS文件時的區別。當具有BoundingBox x0 y0 x y時,PS文檔將在x0 y0點處插入EPS文件,而不是我們所在的位置。

實施例:

考慮一個簡單的PS文件作爲

%! 
/Times-Roman findfont 
11 scalefont setfont 

72 700 moveto 
(This is a test)show 

如果它與一個命令等

ps2eps test.ps test.eps 

轉換爲EPS它會產生

%!PS-Adobe-2.0 EPSF-2.0 
%%BoundingBox: 72 700 127 708 
%%HiResBoundingBox: 72.000000 700.000000 127.000000 707.500000 
%%EndComments 
% EPSF created by ps2eps 1.68 
%%BeginProlog 
save 
countdictstack 
mark 
newpath 
/showpage {} def 
/setpagedevice {pop} def 
%%EndProlog 
%%Page 1 1 
/Times-Roman findfont 
11 scalefont setfont 
72 700 moveto 
(This is a test)show 
%%Trailer 
cleartomark 
countdictstack 
exch sub { end } repeat 
restore 
%%EOF 

它已被裁剪爲其原始座標,因此生成的BoundingBox72 700 127 708。現在,如果試圖在PS文檔中插入EPS文件,它會嘗試在此座標處嵌套。

如果使用BoundingBox: 0 0 55 8創建EPS文件將很有用。當然,所有的繪圖座標(這裏moveto)必須用這個新的參考來修改。

注意:如上所述,我修復BoundingBox參考點的目的是使它在PS文檔中可導入。因此,這個問題的替代答案是:如何在PS文檔中插入一個EPS文件而不管其邊界框。

例如,如何將此EPS文件插入PS文檔的位置200 200 255 208。我嘗試用下面的代碼插入EPS,但除非BoundingBox的從0 0開始它不會工作:

200 200 translate 
save 
/showpage {} bind def 
(test.eps)run 
restore 
+0

請發佈(鏈接)您想要查看修改的樣本EPS文件。 –

+0

@KurtPfeifle這種情況很普遍,但我用例子進一步描述了我的問題。 – Googlebot

回答

2

什麼簡單 -translating?

-72 -700 translate 

無論是在的EPS本身,或在入組前的準備部分


AWKward!

下面的打字稿演示了一個awk腳本,它執行所需的修改 到eps,由DSC評論指導(就像媽媽用來做的!)。

的優點是:如果你能保證輸入足夠的EPS符合DSC提供這些標記,這種做法將是訂單數量級比傳遞文件通過 ghostscript的速度更快。

簡單性既是該程序的優點和侷限性。它掃描DSC註釋,從BoundingBox註釋中提取值,抑制HiResBoundingBox,並在頁面註釋後面添加postscript'translate'和'rectclip'通信。只要EPS確實是真正的,這應該會產生正確的結果。但在另一個答案中的ghostscript方法將產生DSC輸出文件的可靠性較差的結果(因爲它沒有采取快捷方式,它將DSC視爲註釋並完全忽略它們)。

嚴格地說,'直行夾'不應該是必要的,但問題是要求輸出「裁剪」。

592(1)11:27 AM:~ 0> cat epscrop.awk 
/%%BoundingBox: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*)/{x=$2;y=$3;w=$4-x;h=$5-y;print $1,0,0,w,h} 
!/%%BoundingBox:/&&!/%%HiRes/{print} 
/%%Page /{print -x,-y,"translate"; print 0,0,w,h,"rectclip"} 


593(1)11:27 AM:~ 0> awk -f epscrop.awk etest.eps 
%!PS-Adobe-2.0 EPSF-2.0 
%%BoundingBox: 0 0 55 8 
%%EndComments 
% EPSF created by ps2eps 1.68 
%%BeginProlog 
save 
countdictstack 
mark 
newpath 
/showpage {} def 
/setpagedevice {pop} def 
%%EndProlog 
%%Page 1 1 
-72 -700 translate 
0 0 55 8 rectclip 
/Times-Roman findfont 
11 scalefont setfont 
72 700 moveto 
(This is a test)show 
%%Trailer 
cleartomark 
countdictstack 
exch sub { end } repeat 
restore 
%%EOF 
+0

問題是我不知道每個EPS文件的BoundingBox。我的意思是我需要檢查每個EPS文件。我希望找到一個通用的方法。 – Googlebot

+1

一般的方法是讀取%% BoundingBox註釋,並在插入EPS之前正確設置CTM。將剪輯包含到BoundinBox也是常見做法(雖然這不應該是必要的),並將showpage重新定義爲空操作,但這也不應該在正確的EPS中需要。儘管如此,許多'EPS'文件並不真正符合要求。基本的觀點是EPS消費者需要閱讀評論並採取行動。 – KenS

+0

@Ali:查看我的Ghostscript命令以獲取'一般方法'。 –

3

要將其轉換爲EPS你想要的,我會用Ghostscript的,讓BoundingBox的風格的EPS做往返:EPS => PDF => EPS。

訣竅是確保PDF使用的媒體大小與BoundingBox的寬度和高度相同,即通過添加-dEPSCrop參數。

這兩個命令創建'EPS沒有白色空間'

第一步:轉換EPS爲PDF格式:

gs     \ 
    -o so#12682621.pdf \ 
    -sDEVICE=pdfwrite \ 
    -dEPSCrop   \ 
    so#12682621.eps 

第2步:轉換PDF回EPS:

gs        \ 
    -o so#12682621.roundtripped.eps \ 
    -sDEVICE=epswrite    \ 
    so#12682621.pdf 

要測試fideli你得到的EPS的TY,你可以使用ImageMagick的compare顯示的差異,在紅色像素的角度來看,作爲一個PNG文件:

compare      \ 
    -density 600    \ 
    12682621.roundtripped.eps \ 
    12682621.eps    \ 
    -compose src    \ 
    12682621.png 

導致:enter image description here

你會發現,有一些像素差異。它們是由來自%%HiResBoundingBox的707.500000的值引起的,這導致稍後的舍入誤差(PNG不能具有'半像素')。