2016-11-17 5 views
1

Я использую ghostscript 9.19 в системе Windows. Когда я запускаю 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 \ AdobeRGB1998.icc, как указано в командной строке.

+0

Вы используете косую черту в '/ PDFA_def.ps', которая не является обычным разделителем путей Windows. Попробуйте заменить это на обратную косую черту. Другое дело, что переменные окружения могут быть разными при запуске из программы, но не зная, какая программа запускает его, каким образом это было бы трудно понять. –

ответ

2

Перемещение косой черты не имеет значения, Ghostscript может обрабатывать любой тип или оба в одном и том же пути, как здесь (хотя я согласен, что по крайней мере разумно придерживаться того или другого).

Фактическая проблема заключается в том, что он не может найти файл «AdobeRGB1998.icc» (в PostScript undefinedfilename означает, что интерпретатор не может найти файл), и, не видя содержимого файла PDFA_def.ps, невозможно сказать, почему именно (потому что файл открыт в PDFA_def.ps)

Однако вероятным предположением было бы то, что в одном случае вы выполняете Ghostscript из папки d: \ my_ps_files, поэтому файл профиля ICC находится в текущем каталоге, тогда как в в другом случае вы выполняете Ghostscript из «некоторого другого» каталога, поэтому файл не находится в текущем каталоге. Очевидно, вы изменили имя файла там, поскольку это не имя по умолчанию, но похоже, что вы не указали полный путь.

«как указано в командной строке» относится к совершенно другому вызову, в этом случае вы используете AdobeRGB1998.icc в качестве OutputICCProfile, однако PDFA_def.ps должен использовать его для установки файла DestOutptuPro в словаре OutputIntent , что совсем другое и не, указанное в командной строке. Это связано с тем, что невозможно создать объект словаря в командной строке, поэтому это нужно сделать в PostScript, и поскольку создание словаря должно выполняться в PostScript, так же как и создание его содержимого, и один из них является DestOutputProfile, и поскольку это прочитано из файла, вам нужно указать это в PostScript.

Вы должны поместить спецификацию полного пути в профиль ICC в формате PDFA_def.ps вместо того, чтобы просто оставить ее как неявно текущей рабочей директорией.

Обрати внимание, что DestOutputProfile и OutputICCProfile разных вещей, вы не необходимости указывать OutputICCProfile для вывода высокого уровня, это управление для рендеринга, она не имеет никакого влияния здесь, и я бы уронить его.

Причина, по которой вы получаете ошибку вообще в своем командном файле, состоит в том, что '>' - это командная оболочка, поэтому, если вы поместите ее в пакетный файл, она не будет работать, она будет передана Ghostscript в виде команды линейный аргумент. К счастью для вас это происходит после завершения обработки, поэтому он не имеет вредных эффектов. В любом случае, это ничего не содержало бы, так как вы перенаправили stdout в файл.

Не устанавливайте -dNUUTERSAVE, если у вас нет веской причины, а не просто фольклора (есть веская причина для его установки, но вы, похоже, не используете его таким образом). Если не применяются определенные конкретные условия, это будет не более чем потенциально замедлить обработку (по сложным причинам, связанным с сбором мусора).

+0

Я задаю это как ответ. Установка полного пути в PDFA_def.ps заставила работать. Удаление -dNUUTERSAVE показало разницу в производительности. Вы знаете свои вещи. Узнали ли вы его на твердой дороге опыта или есть конкретная ссылка, которую вы можете использовать (кроме интернет-запросов)? – infowanna

+0

Опыт, я думаю, я один из разработчиков команды Ghostscript (shh, не позволяйте всем знать ... ;-) – KenS

+0

, если я не задаю полный путь в PDFA_def.PS, будет поиск Ghostscript через все пути в пути Переменная окружения? – infowanna