2010-08-09 84 views
7

我想將兩個或多個postscript文件合併成一個。我嘗試了連接,但它不起作用,因爲每個postscript文件可能有不同的資源頭。如何將兩個postscript文件合併在一起?

有沒有人做過這個?那裏有任何圖書館(商業或開源)嗎?我不介意C++,C#甚至Java庫。

編輯 這些都是大的PostScript文件(大於200 MB)和他們的目的僅僅是用於彩色打印(不適用於在線觀看)。

結論

  1. ps2write並不像 不支持DSC答案。
  2. pswrite正如讀者pipitas已經正確指出的那樣產生了L1輸出。這不是解決方案。
  3. 使用pdfwrite是可行的。在這個選項中,我們將兩個ps轉換爲PDF,然後將合併的PDF轉換爲ps。此解決方案可能存在問題,因爲轉換過程中可能會丟失一些信息。除額外的轉換步驟外,還需要額外的資源和時間。
  4. 如果我們不需要查看輸出文件,將兩個postscript文件連接在一起並在文件之間插入以下行「false 0 startjob pop」也是一個解決方案。 (也this link見)

總之,臨時解決方案合併兩個PostScript文件是選項3或4

回答

11

下面是一個例子Ghostscript的命令行,這將轉換和合並兩個(或更多) PostScript文件到一個PDF中一氣呵成:

gswin32c.exe^
    -o c:/path/to/output.pdf^
    -sDEVICE=pdfwrite^
    -dPDFSettings=/Screen^
    [...more desired parameters (optional)...]^
    /path/to/first.ps^
    /path/to/second.ps^
    /path/to/third.pdf 

編輯:我第一槍就錯誤地假定PDF輸入文件。它當然也適用於PostScript(或者甚至是PS/PDF的混合)......並且輸出也可能是PS。

+0

嗨皮皮塔斯。感謝提示(我給你1分),但是我不能使用pdf方法,因爲它需要我將postscript轉換爲pdf,然後在將合併的pdf轉換爲postscript之前將pdf合併回postscript。我以前走過這條路,速度非常慢(過程沒有完成,6小時後我停下了)。注意:我有很大的postscript文件。你知道純後記appraoch? – Syd 2010-08-10 00:35:09

+1

這裏有很多「轉換」:*需要我將postscript轉換爲pdf,然後再將pdf合併到postscript,然後再將合併的pdf轉換爲postscript *? - 這也取決於您的打印服務提供商。有時候,這些傢伙** DO **更喜歡PDF(因爲它被壓縮,所以PDF更小),有時他們甚至有打印機使用PDF(不是PostScript)。 - 如果你的程序沒有完成,你不知道開關調整Ghostscript的性能和更高的RAM容差? – 2010-08-10 00:50:39

+0

@papitas ..我以前的評論錯別字。 pdf的方法是 1)將每個後記轉換爲pdf 2)將pdf合併成一個pdf 3)將合併的pdf轉換爲postscript。 – Syd 2010-08-10 00:58:19

3

當然,您還可以將各種輸入文件(PS,PDF或它們的混合)合併到一個PostScript文件中。我會包括一些更多的調整參數到下面的例子命令行,這將是800 MB的增加是Ghostscript RAM津貼(只要你有一臺機器有這麼大的內存):

gswin32c.exe^
    -o c:/path/to/output.ps^
    -sDEVICE=ps2write^
    -c "800000000 setvmthreshold"^
    [...more desired parameters (optional)...]^
    /path/to/first.ps^
    /path/to/second.ps^
    /path/to/third.ps 

您應該註明哪些應用程序確實創建了您的PostScripts以及什麼樣的設置。只有這樣你才能期待更具體的建議。你的PostScripts可能是f.e.包括高分辨率圖片(例如1200dpi),而您的打印設備可能只有600dpi。在這種情況下,將採樣降低到600dpi將使文件變得相當小,而不必施加質量懲罰。

+0

謝謝皮皮塔斯。用ps2write而不是pswrite查看你的答案。爲第二個答案增加一個點給你。我會在下次方便時嘗試。 糟糕。關於你的問題,產生postscript的應用程序是第三方供應商產品。 – Syd 2010-08-10 01:29:00

+0

@papitas - 在下面添加了我的評論。 – Syd 2010-08-10 02:50:23

1

Linux上的GhostScript附帶一個名爲psmerge(安裝在/usr/bin目錄中)的shell腳本。經過一些簡單的試驗後,看起來這個程序考慮了資源定義。它確實依賴於您的PostScript程序嚴格符合Adobe DSC的事實。合併腳本的內容轉載此處考慮許可證:

©Angus J.C。杜根1991 – 1995年

#!/usr/bin/perl 
eval 'exec perl -S $0 "[email protected]"' 
    if $running_under_some_shell; 

# psmerge: merge PostScript files produced by same application and setup 
# usage: psmerge [-oout.ps] file1.ps file2.ps ... 
# 
# Copyright (C) Angus J. C. Duggan 1991-1995 
# See file LICENSE for details. 

use strict; 
$^W = 1; 
my $prog = ($0 =~ m,([^/\\]*)$,) ? $1 : $0; 
my $outfile = undef; 

usage() unless @ARGV; 

while ($ARGV[0] =~ /^-/) { 
    $_ = shift; 
    if (/^-o(.+)/) { 
     $outfile = $1; 
    } elsif (/^-t(horough)?$/) { 
     # This doesn't do anything, but we leave it for backward compatibility. 
    } else { 
     usage(); 
    } 
} 

my $gs = find_gs(); 
if (defined $gs) 
{ 
    # Just invoke gs 
    $outfile = '/dev/stdout' unless defined $outfile; 
    exec +(qw(gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite), 
     "-sOutputFile=$outfile", '-f', @ARGV); 
    die "$prog: exec /usr/bin/gs failed\n"; 
} 
else 
{ 
    warn +("$prog: /usr/bin/gs not found; falling back to old," . 
     " less functional behavior\n"); 
} 

if (defined $outfile) 
{ 
    if (!close(STDOUT) || !open(STDOUT, ">$outfile")) { 
     print STDERR "$prog: can't open $1 for output\n"; 
     exit 1; 
    } 
} 

my $page = 0; 
my $first = 1; 
my $nesting = 0; 

my @header =(); 
my $header = 1; 

my @trailer =(); 
my $trailer = 0; 

my @pages =(); 
my @body =(); 

my @resources =(); 
my $inresource = 0; 

while (<>) { 
    if (/^%%BeginFont:/ || /^%%BeginResource:/ || /^%%BeginProcSet:/) { 
     $inresource = 1; 
     push(@resources, $_); 
    } elsif ($inresource) { 
     push(@resources, $_); 
     $inresource = 0 if /^%%EndFont/ || /^%%EndResource/ || /^%%EndProcSet/; 
     } elsif (/^%%Page:/ && $nesting == 0) { 
     $header = $trailer = 0; 
     push(@pages, join("", @body)) if @body; 
     $page++; 
     @body = ("%%Page: ($page) $page\n"); 
     } elsif (/^%%Trailer/ && $nesting == 0) { 
     push(@trailer, $_); 
     push(@pages, join("", @body)) if @body; 
     @body =(); 
     $trailer = 1; 
     $header = 0; 
     } elsif ($header) { 
     push(@trailer, $_); 
     push(@pages, join("", @body)) if @body; 
     @body =(); 
     $trailer = 1; 
     $header = 0; 
     } elsif ($trailer) { 
     if (/^%!/ || /%%EOF/) { 
     $trailer = $first = 0; 
     } elsif ($first) { 
     push(@trailer, $_); 
     } 
     } elsif (/^%%BeginDocument/ || /^%%BeginBinary/ || /^%%BeginFile/) { 
     push(@body, $_); 
     $nesting++; 
     } elsif (/^%%EndDocument/ || /^%%EndBinary/ || /^%%EndFile/) { 
     push(@body, $_); 
     $nesting--; 
     } 
} 

print @trailer; 

sub find_gs 
{ 
    my $path = $ENV{'PATH'} || ""; 
    my @path = split(':', $path); 
    foreach my $dir (@path) 
    { 
     return "$dir/gs" if -x "$dir/gs"; 
    } 
    undef; 
} 

sub usage 
{ 
    print STDERR "Usage: $prog [-oout] file...\n"; 
    exit 1; 
} 
+0

感謝您的回覆。 psmerge在Windows世界中不可用(不是ghost實用程序的一部分)。它可能在cgywin工具集中的一箇中可用。說了這些,謝謝您指出DSC格式在可以使用之前嚴格遵守(1分)。我的研究表明,許多用戶在psmerge方面沒有太大的成功。也許我用postscript文件中的「false 0 startjob pop」命令作爲臨時解決方案更好。 – Syd 2010-08-10 04:53:55

+2

@Syd:如何在每個文檔的開始處保存一個簡單的'/ saveobj save def'並在最後保存'saveobj restore'?我不確定這是否具有同等效果。 – dreamlax 2010-08-10 05:11:52

+0

它對「false 0 startjob pop」沒有任何影響。但感謝您的建議(對您的評論+1)。 – Syd 2010-08-11 22:42:09

1

我已經能夠成功合併100+ PostScript文件(1500+頁)一起使用%%都開始文檔/ %%結束文件和假0 startjob pop方法。

我遇到的問題是打印合並文件時,打印機在合併文件之間暫停20-45秒。

任何人都有類似的問題?

2

僅供參考我發現這在一種情況下無法正常工作 - 如果除第一個文件之外的任何文件都包含鏈接,它們在最終合併的PDF中將不正確。特別是,如果說第二個PDF有鏈接到第二個頁面,它將最終成爲鏈接到合併文檔的第二個頁面,這是不正確的...

請注意,pdftk(可以是免費下載)將獲得正確的鏈接。

+0

的ubuntu中獲得,感謝您分享您的經驗。 (+1給你) – Syd 2011-04-08 01:37:06

+0

+1對於pdftk。這是一個在線網站:http://www.nublue.co.uk/tools/pdftk – DaveFar 2012-02-27 13:07:01

0

由於OP在問題的結論提到,在兩者之間應該做的伎倆串聯文件與the line

false 0 startjob pop 

。所以在bash中,可以寫類似

mkdir merge 
for ps in *.ps; do 
    cat $ps >> merge/output.ps 
    echo "false 0 startjob pop" >> merge/output.ps 
done 
相關問題