7

次のコマンドは、pdf ファイルに対して Ghostscript を実行します。(pdf_file変数にはそのpdfへのパスが含まれています)

bbox <- system(paste( "C:/gs/gs8.64/bin/gswin32c.exe -sDEVICE=bbox -dNOPAUSE -dBATCH -f", pdf_file, "2>&1" ), intern=TRUE)

実行後bboxは以下の文字列が含まれます。

GPL Ghostscript 8.64 (2009-02-03)
Copyright (C) 2009 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
%%BoundingBox: 36 2544 248 2825
%%HiResBoundingBox: 36.395015 2544.659922 247.070032 2824.685914
Error: /undefinedfilename in (2>&1)
Operand stack:

Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push
Dictionary stack:
   --dict:1147/1684(ro)(G)--   --dict:1/20(G)--   --dict:69/200(L)--
Current allocation mode is local
Last OS error: No such file or directory
GPL Ghostscript 8.64: Unrecoverable error, exit code 1

次に、この文字列を操作して、BoundingBox の寸法 (36 2544 248 2825) を分離し、pdf ファイルのトリミングに使用します。これまでのところ、すべて正常に動作しています。

ただし、このスクリプトをタスク マネージャー (Rscript.exe または Rcmd.exe BATCH を使用) でスケジュールするか、スクリプトが R チャンク内にあるときに を押すknit HTMLと、bbox は BoundingBox 情報が欠落している次の文字列を取得し、それを作成します。使用不可:

GPL Ghostscript 8.64 (2009-02-03)
Copyright (C) 2009 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
Error: /undefinedfilename in (2>&1)
Operand stack:

Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push
Dictionary stack:
   --dict:1147/1684(ro)(G)--   --dict:1/20(G)--   --dict:69/200(L)--
Current allocation mode is local
Last OS error: No such file or directory

この問題を解決し、スクリプトを自動で実行するにはどうすればよいですか?

(スクリプトは、その質問に対する受け入れられた回答から来ています)

4

3 に答える 3

6

コマンドの2>&1最後に追加した は、シェルではなく、ghostscript インタープリターに送信されます。Ghostscript はそれを file と解釈するため、エラーが発生します。procmon を使用して、プロセスの作成を確認しました。

stderr リダイレクトは、ghostscript によってファイルとして扱われます

cmd /cシェルに解釈させるには、次のようにコマンドの前に を付ける必要があります

> bbox <- system(paste("cmd /c C:/Progra~1/gs/gs9.07/bin/gswin64c.exe -sDEVICE=bbox -dNOPAUSE -dBATCH -q -f",pdf_file,"2>&1"), intern=TRUE)
> print (bbox)
[1] "%%BoundingBox: 28 37 584 691"                                  "%%HiResBoundingBox: 28.997999 37.511999 583.991982 690.839979"
于 2013-02-19T04:14:31.780 に答える
2

デバイスの出力は stdout に送られ、エラーは stderr に送られます。ターミナルでは、これらは明らかに両方ともターミナルに送信され、一緒に表示されます.2番目のケースでは、明らかにそうではなく、stdoutが欠落しています。

(2>&1) でエラー メッセージが表示されるので、これはそれほど驚くべきことではありません。これは stdout をファイルにリダイレクトしているように見えますが、2 つの問題があります。まず、出力先のファイル名を指定していません。次に、コマンド シェルで実行していないため、コマンド プロセッサはリダイレクトを行いません。

私は R について何も知らないので、その方法を教えることはできませんが、とにかくコマンド ラインから '2>&1' を削除することから始めるべきです。4 年未満のバージョンの Ghostscript の使用を検討することもできます。現在のバージョンは 9.07 で、リリースされたばかりです。

于 2013-02-14T08:44:26.480 に答える
1

これを試して。

環境変数を使用して出力ファイルを設定する

次に、%envvar% 表記を使用します。これは、上記のリンクに基づいて %TODAY% になり、ファイル名 friday に置き換えられます。-f は必要ありませんが、問題はありません。出力をルーティングしたい場合は、2 番目の環境変数を設定して >%outenv% にルーティングします。

このようにして、単純なシステム コールを作成できます (固定文字列ではなく変数を使用するためのリンクを参照してください)。

Sys.setenv(envvar= "pdf.file")  
Sys.setenv(outenv= "out.file")
"C:/gs/gs8.64/bin/gswin32c.exe -sDEVICE=bbox -dNOPAUSE -dBATCH %envvar% >%outenv%"
于 2013-02-17T07:04:21.700 に答える