2013-02-14 1 views
7

Следующая команда выполняет ghostscript в pdf-файле. (Переменная pdf_file содержит путь к этому PDF)Различные результаты при автоматическом скрипте R

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 

Как решить эту проблему и запустить автоматический запуск сценария?

(сценарий исходит из принятого ответа на that question)

+0

Габаритный прямоугольник записывается в stderr, и '2> & 1' перенаправляет stderr на stdout. Но этот синтаксис, по-видимому, не распознается Windows. –

+0

Он распознается командным процессором Windows, но это не выполняется из командной оболочки, поэтому перенаправление не выполняется. – KenS

+0

Предоставляет ли 'pdf_file' полный путь PDF? – robertklep

ответ

6

2>&1 добавить в конце команды отправляется на интерпретатор Ghostscript, не оболочка. Ghostscript interprets it a file, отсюда ошибка.Я использовал ProcMon посмотреть на создание процесса:

stderr redirection is treated as a file by 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" 
2

Выход устройства будет стандартный вывод, ошибка будет стандартный вывод. В терминале они, очевидно, оба отправляются на терминал и отображаются вместе, во втором случае они явно не являются, а stdout отсутствует.

Это не слишком удивительно, так как вы получаете сообщение об ошибке en (2> & 1). Это похоже на перенаправление stdout в файл, но есть две проблемы. Во-первых, вы не указали имя файла для отправляемого вывода, а во-вторых, вы не работаете в командной оболочке, поэтому командный процессор не выполняет перенаправление.

Я ничего не знаю о R, поэтому я не могу сказать вам, как это сделать, но вы должны начать с удаления '2> & 1' из командной строки в любом случае. Вам также может понравиться использовать версию Ghostscript менее 4 лет. Текущая версия - 9.07 и только что выпущена.

+0

У меня была такая же проблема с gs 9.06, поэтому я начал стареть более старые версии. –

+0

Удаление '2> & 1' не помогает –

+0

Это не поможет, он просто избавится от этой ошибки. Ваша проблема заключается в том, что вы захватываете stderr, в то время как вывод направляется на stdout. Вам нужно захватить stdout или перенаправить stdout на stderr (это то, что и 2> 1 в командной оболочке), или перенаправить stdout в файл и прочитать это. – KenS

1

попробуйте это.

Установить выходной файл, используя environmental variable

Затем используйте% envvar% нотацию, которая на основе указанной выше ссылке будет% TODAY%, которые будут заменены на имя файла пятницу. -F не ​​нужен, но не должен болеть. Если вы хотите перенаправить вывод, установите вторую переменную env и проведите маршрут>% outenv%.

Таким образом, вы можете сделать простой системный вызов (ссылка для использования переменной, а не фиксированные строки),

Sys.setenv(envvar= "pdf.file") 
Sys.setenv(outenv= "out.file") 
"C:/gs/gs8.64/bin/gswin32c.exe -sDEVICE=bbox -dNOPAUSE -dBATCH %envvar% >%outenv%"