2013-02-14 3 views
7

다음 명령은 pdf 파일에서 ghostscript를 실행합니다. 실행 후 bboxR 스크립트가 자동화 된 경우 다른 결과

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

가 다음 문자열을 포함합니다 (pdf_file 변수는 PDF 경로를 포함).

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 2,544 248 2,825) 절연 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 redirection is treated as a file by ghostscript

, 당신은 cmd /c으로 명령을 앞에해야합니다 나는 프로세스 생성을보고 procmon을 사용 stderr, 이고'2> & 1'은 stderr을 stdout으로 재 지정합니다. 하지만이 구문은 Windows에서 인식되지 않습니다. –

+0

Windows 명령 프로세서에서 인식하지만 명령 셸에서 실행되지 않으므로 리디렉션이 수행되지 않습니다. – KenS

+0

'pdf_file'은 PDF의 전체 경로를 포함합니까? – robertklep

답변

6

2>&1 당신은 고스트 스크립트 인터프리터로 전송되는 명령의 끝에 추가하지 껍질. Ghostscript interprets it a file이므로 오류가 발생합니다.바운딩 박스에 기록이

> 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

, 오류가 stderr에 것입니다. 터미널에서 이것은 분명히 터미널로 전송되어 함께 표시됩니다. 두 번째 경우에는 분명히 그렇지 않고 stdout이 누락 될 것입니다.

오류 메시지가 표시되면서 (2> & 1) 이는 그리 놀라운 일이 아닙니다. 이것은 stdout을 파일로 재지향하는 것처럼 보이지만 2 가지 문제점이 있습니다. 먼저 출력을 보낼 파일 이름을 제공하지 않았고 두 번째로 명령 셸에서 실행하지 않기 때문에 명령 프로세서는 리디렉션을 수행하지 않습니다.

나는 R에 대해 아무것도 모른다. 그래서 어떻게해야하는지 알려줄 수는 없지만 어쨌든 '2> & 1'을 제거해야한다. 4 세 미만의 Ghostscript 버전 사용을 고려할 수도 있습니다. 현재 버전은 9.07이며 방금 출시되었습니다.

+0

gs 9.06에서 같은 문제가 발생하여 이전 버전을 시도하기 시작했습니다. –

+0

'2> & 1'을 제거해도 도움이되지 않습니다. –

+0

도움이되지 않습니다. 단지 오류를 없애줍니다. 출력이 stdout으로 보내지는 동안 stderr를 캡처하고있는 것으로 보이는 문제가 있습니다. stdout을 캡처하거나 stdout을 stderr (명령 셸에서 & 2> 1이하는 것)로 리디렉션하거나 stdout을 파일로 리디렉션하여 읽어야합니다. – KenS

1

시도해보십시오.

세트 environmental variable

그런 다음 상기 링크에 기초 %의 ENVVAR %의 표기를 사용하여 출력 파일은 파일 이름 금요일로 대체 될 % 오늘날 % 일 것이다. -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%"