7

2つ以上のPostScriptファイルを1つにマージしようとしています。連結を試しましたが、ポストスクリプトファイルごとにリソースヘッダーが異なる可能性があるため、機能しません。

誰かがこれを以前にやったことがありますか?そこにライブラリ(商用またはオープンソース)はありますか?私はC++、C#、さらにはJavaライブラリを気にしません。

編集 済みこれらは大きなポストスクリプトファイル(200 Mb以上)であり、その目的はカラー印刷のみです(オンライン表示用ではありません)。

結論

  1. ps2writeはDSCをサポートしていないため、答えではありません。
  2. リーダーpipitasが正しく指摘したpswriteは、L1出力を生成します。ソルトンではありません。
  3. pdfwriteの使用は実行可能です。このオプションでは、2つのpsをPDFに変換してから、マージされたPDFをpsに変換します。変換中に一部の情報が失われる可能性があるため、このソリューションには問題がある可能性があります。追加の変換手順に加えて、追加のリソースと時間がかかります。
  4. 出力ファイルを表示する必要がない場合は、2つのpostscriptファイルを、ファイル間に挿入された次の行「false0startjobpop」と一緒に連結することも解決策です。(このリンクも参照してください)

結論として、2つのPostScriptファイルをマージするための暫定的な解決策はオプション3または4です。

4

6 に答える 6

13

次に、Ghostscriptコマンドラインの例を示します。これは、2つ(またはそれ以上)のPostScriptファイルを一度に1つの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の場合もあります。

于 2010-08-10T00:24:39.573 に答える
4

もちろん、さまざまな入力ファイル(PS、PDF、またはそれらの組み合わせ)を1つのPostScriptファイルにマージすることもできます。次のコマンドラインの例にさらにいくつかの調整パラメーターを含めます。これにより、GhostscriptのRAM許容量が800 Mb増加します(これだけのメモリを搭載したマシンがある場合)。

 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

どのアプリケーションがPostScriptを作成したか、およびどのような設定で作成したかを指定する必要があります。そうして初めて、より具体的なアドバイスを期待できます。PostScriptには高解像度の画像(1200dpiなど)が含まれている場合がありますが、印刷デバイスは600dpiしか使用できない場合があります。その場合、600dpiにダウンサンプリングすると、必ずしも品質のペナルティを課すことなく、ファイルがかなり小さくなります。

于 2010-08-10T01:09:36.487 に答える
2

参考までに、これが正しく機能しない場合があることがわかりました。最初のファイル以外のファイルにリンクが含まれている場合、最終的にマージされたPDFでは正しく機能しません。特に、2番目のPDFに2番目のページへのリンクがある場合、それはマージされたドキュメントの2番目のページへのリンクになりますが、これは正しくありません...

pdftk(無料でダウンロードできます)がリンクを正しく取得することに注意してください。

于 2011-03-10T18:02:14.303 に答える
1

Linux上のGhostScriptには、 (ディレクトリpsmergeにインストールされている)というシェルスクリプトが付属しています。/usr/binいくつかの簡単な試行の後、このプログラムはリソース定義を考慮に入れているようです。これは、PostScriptプログラムがAdobeDSCに厳密に準拠しているという事実に依存しています。ライセンスを考慮してここに複製されたマージスクリプトの内容:

©AngusJCDuggan 1991–1995

#!/usr/bin/perl
eval 'exec perl -S $0 "$@"'
    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;
}
于 2010-08-10T03:26:40.523 に答える
1

%% Begin Document / %%EndDocumentとfalse0startjob popメソッドの両方を使用して、100以上のpostscriptファイル(1500以上のページ)を正常にマージすることができました。

私が抱えている問題は、マージされたファイルを印刷するときに、プリンターがマージされたファイル間で20〜45秒間一時停止することです。

誰かが同様の問題を抱えていましたか?

于 2011-01-05T21:14:01.363 に答える
1

OPが質問の結論で述べたように、ファイルを次の行に連結します

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

ただし、質問には、これは印刷(またはPDF変換)にのみ役立つと記載されているため、ビューアは最初のpsファイル以外のすべてを表示できない可能性があります。詳細については、こちらをご覧ください

于 2016-04-01T07:57:52.027 に答える