2013-02-14 29 views
7

Lệnh sau thực thi ghostscript trên tệp pdf. (Biến pdf_file chứa đường dẫn đến pdf mà)Kết quả khác nhau khi tập lệnh R được tự động

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

Sau khi thực hiện bbox bao gồm các chuỗi ký tự sau đây.

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 

Chuỗi này sau đó được xử lý để kích thước BoundingBox (36 2544 248 2825) được tách biệt và được sử dụng để xén tệp pdf. Cho đến nay tất cả mọi thứ hoạt động ok. Tuy nhiên, khi tôi lên lịch tập lệnh này trong Trình quản lý Tác vụ (sử dụng Rscript.exe hoặc Rcmd.exe BATCH), hoặc khi tập lệnh nằm trong một đoạn R và tôi nhấn knit HTML, bbox nhận chuỗi ký tự sau thiếu BoundingBox thông tin và không sử dụng được:

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 

Làm cách nào để vượt qua vấn đề này và chạy tập lệnh tự động?

(Kịch bản xuất phát từ câu trả lời chấp nhận that question)

+0

Hộp bounding được ghi vào stderr, và '2> & 1' chuyển hướng stderr thành stdout. Nhưng cú pháp này dường như không được Windows nhận diện. –

+0

Nó được công nhận bởi bộ xử lý lệnh Windows, nhưng điều này không được thực thi dưới dạng lệnh shell, do đó việc chuyển hướng sẽ không diễn ra. – KenS

+0

Có 'pdf_file' chứa đường dẫn đầy đủ của PDF không? – robertklep

Trả lời

6

Các 2>&1 bạn thêm vào cuối của lệnh được gửi đến người phiên dịch GhostScript, không vỏ. Ghostscript interprets it a file, do đó lỗi.Tôi đã từng ProcMon nhìn vào việc tạo ra quá trình:

stderr redirection is treated as a file by ghostscript

Để làm vỏ giải thích nó, bạn phải thêm tiền tố lệnh với cmd /c, như thế này

> 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

Đầu ra của thiết bị sẽ bị xuất chuẩn, sai số sẽ thiết bị lỗi chuẩn. Trong thiết bị đầu cuối này rõ ràng là cả hai được gửi đến các thiết bị đầu cuối và hiển thị cùng nhau, trong trường hợp thứ hai họ rõ ràng không và stdout sẽ mất tích.

Điều này không quá bất ngờ vì bạn đang nhận được thông báo lỗi trên (2> & 1). Điều này có vẻ như nó đang chuyển hướng stdout sang một tệp, nhưng có 2 vấn đề. Trước hết bạn chưa cung cấp tên tệp cho đầu ra được gửi đến, và thứ hai, bạn không chạy trong trình bao lệnh, do đó bộ xử lý lệnh không thực hiện chuyển hướng.

Tôi không biết gì về R, vì vậy tôi không thể cho bạn biết cách thực hiện điều đó, nhưng bạn nên bắt đầu bằng cách xóa '2> & 1' khỏi dòng lệnh. Bạn cũng có thể muốn cân nhắc sử dụng phiên bản Ghostscript dưới 4 tuổi. Phiên bản hiện tại là 9.07 và vừa được phát hành.

+0

Tôi đã gặp vấn đề tương tự với gs 9.06, vì vậy tôi bắt đầu thử các phiên bản cũ hơn. –

+0

Xóa '2> & 1' không giúp được –

+0

Nó sẽ không giúp ích gì, nó sẽ loại bỏ lỗi. Vấn đề của bạn dường như là bạn đang chụp stderr, trong khi đầu ra đang được hướng đến stdout. Bạn cần phải capture stdout, hoặc chuyển hướng stdout thành stderr (đó là những gì & 2> 1 hiện trong shell lệnh), hoặc chuyển hướng stdout tới một tập tin và đọc nó. – KenS

1

hãy thử điều này.

Set file xuất sử dụng một environmental variable

Sau đó sử dụng các ký hiệu%% envvar, mà dựa vào liên kết ở trên sẽ là% TODAY% mà sẽ được thay thế bằng tên tập tin thứ sáu. Các -f là không cần thiết, nhưng không nên làm tổn thương. Nếu bạn muốn định tuyến đầu ra, hãy đặt biến env thứ hai và định tuyến nó>% outenv%.

Bằng cách này bạn có thể thực hiện cuộc gọi hệ thống đơn giản (xem liên kết cho việc sử dụng biến chứ không phải là chuỗi cố định),

Sys.setenv(envvar= "pdf.file") 
Sys.setenv(outenv= "out.file") 
"C:/gs/gs8.64/bin/gswin32c.exe -sDEVICE=bbox -dNOPAUSE -dBATCH %envvar% >%outenv%" 
Các vấn đề liên quan