2016-11-17 136 views
1

我在Windows系統上使用ghostscript 9.19。 當我從批處理文件運行ghostscript時,它創建pdf。 當ghostscript從程序計劃時,它會創建一個沒有內容的pdf - 只有一個空白頁面。 的命令行是在兩種情況下是相同的(一個龍線,下面分裂由於格式化):從未被創建ghostscript轉換爲pdf-a-icc文件是否正確?

gswin32c.exe -sstdout=d:\my_data\gs_stdout.log 
     -dPDFA=1 -dBATCH -dNOPAUSE -dNOOUTERSAVE 
     -sColorConversionStrategy=/RGB 
     -sOutputICCProfile=d:\my_ps_files\AdobeRGB1998.icc 
     -sDEVICE=pdfwrite 
     -sOutputFile=d:\my_data\my_hopeful_pdfa_pdfa.pdf 
     -dPDFACompatibilityPolicy=1 "d:\my_ps_files/PDFA_def.ps" "d:\my_data\my_hopeful_pdfa_pdfa.ps" 
     > d:\my_data\my_hopeful_pdfa_gs_out.log 

my_hopefule_pdfa_gs_out.log。但gs_stdout.log確實被創建。

無論是PDF格式被創建似乎關係到* .icc文件是否不存在的目錄中ghostscript的運行。

我得到的stdout.log文件不同的輸出。

當它工作,我得到:

GPL Ghostscript 9.19 (2016-03-23) 
Copyright (C) 2016 Artifex Software, Inc. All rights reserved. 
This software comes with NO WARRANTY: see the file PUBLIC for details. 
Error: /undefinedfilename in (>) 
Operand stack: 
    false 
Execution stack: 
    %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 
Dictionary stack: 
    --dict:1201/1684(ro)(G)-- --dict:0/20(G)-- --dict:80/200(L)-- 
Current allocation mode is local 
Last OS error: Invalid argument 

當它失敗的錯誤日誌:

GPL Ghostscript 9.19 (2016-03-23) 
Copyright (C) 2016 Artifex Software, Inc. All rights reserved. 
This software comes with NO WARRANTY: see the file PUBLIC for details. 
Error: /undefinedfilename in --file-- 
Operand stack: 
    --nostringval-- --nostringval-- (AdobeRGB1998.icc) (r) 
Execution stack: 
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1967 1 3 %oparray_pop 1966 1 3 %oparray_pop 1950 1 3 %oparray_pop 1836 1 3 %oparray_pop --nostringval-- %errorexec_pop .runexec2 --nostringval-- --nostringval--  --nostringval-- 2 %stopped_push --nostringval-- 
Dictionary stack: 
    --dict:1201/1684(ro)(G)-- --dict:0/20(G)-- --dict:79/200(L)-- 
Current allocation mode is local 
Last OS error: No such file or directory 
Current file position is 818 

有人可以幫我解釋這個輸出。 AdobeRGB1988.icc在這兩種情況下駐留在d:\ my_ps_files \ Adob​​eRGB1998.icc作爲在命令行指定。

+0

您在'/ PDFA_def.ps'處使用正斜槓,該斜槓不是正常的Windows路徑分隔符。嘗試用反斜槓代替它。另一點是,從程序啓動時,環境變量可能會有所不同,但不知道程序以什麼方式啓動它,這很難說。 –

回答

2

正斜槓是無關的,可以的Ghostscript在相同的方式來處理兩種類型,或兩者兼而有之,如在這裏(雖然我同意這樣做至少是明智的堅持一個或其他)。

實際的問題是,它找不到文件'AdobeRGB1998.icc'(在PostScript中的undefinedfilename意味着解釋器找不到文件),並且沒有看到PDFA_def.ps文件的內容,它不可能說明爲什麼(因爲該文件在PDFA_def.ps中打開)

然而,合理的猜測是,在一種情況下,您正在執行文件夾d:\ my_ps_files中的Ghostscript,因此ICC配置文件文件位於當前目錄中,而在另一種情況是您從「其他」目錄執行Ghostscript,因此該文件不在當前目錄中。顯然你在那裏修改了文件名,因爲這不是默認名稱,但看起來你沒有指定一個完整的路徑。

'在命令行中指定'是指完全不同的調用,在這種情況下,您使用AdobeRGB1998.icc作爲OutputICCProfile,但是,PDFA_def.ps需要使用它來設置OutputIntent字典中的DestOutptuProfile ,這是一個不同的東西完全並且是命令行上指定。這是因爲沒有辦法在命令行上創建字典對象,所以它必須在PostScript中完成,並且由於字典的創建必須在PostScript中完成,其內容的創建也是如此,其中之一是DestOutputProfile,因爲它是從文件中讀取的,所以你需要在PostScript中指定它。

你應該把完整的路徑規範的ICC配置文件中PDFA_def.ps,而不是僅僅把它當作隱含的當前工作目錄。

注意,DestOutputProfile和OutputICCProfile是不同的東西,你不需要指定爲高電平輸出一個OutputICCProfile,這對渲染控制,在這裏有沒有影響,我會放棄它。

你在批處理文件中出現錯誤的原因是'>'是一個shell命令,所以如果你把它放在一個批處理文件中,它將不起作用,它會作爲命令傳遞給Ghostscript在線參數。幸運的是,處理完成後會發生這種情況,所以它沒有不良影響。它不會包含任何東西,因爲你已經將stdout重定向到一個文件。

不要設置-dNOOUTERSAVE,除非你有一個很好的理由,而不是簡單的民間傳說(有一個很好的理由來設置它,但你似乎沒有以這種方式使用它)。除非某些特定條件適用,否則這隻會造成處理速度減慢(與垃圾收集相關的複雜原因)。

+0

我將此設置爲答案。在PDFA_def.ps中設置完整路徑得到了工作。刪除-dNOOUTERSAVE在性能上有所不同。你知道你的東西。您是從經驗的艱辛之路中學習的嗎?還是您有一個具體的參考資料(除了Internet查詢)? – infowanna

+0

經驗,我想我是Ghostscript開發團隊之一(噓,別讓大家知道...... ;-) – KenS

+0

如果我沒有在PDFA_def.PS中設置完整路徑,那麼Ghostscript會通過全部搜索路徑中的路徑環境變量? – infowanna