В документации Ghostscript я не нашел аргументов для запроса размеров бумаги PDF-документа.

Я читал о файле pdf_info.ps в подкаталоге lib.

Я пробовал этот код:

private const string RutaAGhostscript = @"C:\Program Files\gs\gs9.52\bin\gswin64c.exe";

...

Process pTamaños = new Process();
pTamaños.StartInfo.FileName = RutaAGhostscript;
pTamaños.StartInfo.Arguments = " -dNODISPLAY -q -sFile=\"" + RutaSeleccionada + "\" -DumpMediaSizes \"C:\\Program Files\\gs\\gs9.52\\lib\\pdf_info.ps\"";
pTamaños.StartInfo.UseShellExecute = false;
pTamaños.StartInfo.RedirectStandardOutput = true;
pTamaños.Start();
EscribirArchivo(pTamaños.StandardOutput.ReadToEnd(), RutaResultadoTxt2);
pTamaños.WaitForExit();

Я получил такой результат в файле результатов:

Error: /invalidfileaccess in --file--
Operand stack:
   (C:\\Users\\claudio.bogado\\QGMI\\Ruben De Jes\303\272s Martinez - 2020-05 Certificado 16\\Tramo 3\\Certificado 16 Tramo 3.pdf)   (r)
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1990   1   3   %oparray_pop   1989   1   3   %oparray_pop   1977   1   3   %oparray_pop   1833   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--
Dictionary stack:
   --dict:739/1123(ro)(G)--   --dict:0/20(G)--   --dict:75/200(L)--   --dict:15/128(L)--
Current allocation mode is local
Last OS error: Permission denied
Current file position is 11770

Используя инструменты xPDF, которые я пробовал pdfinfo -box, в некоторых файлах с разными размерами страниц отображается только первая страница.

Я неправильно вменяю имя файла?

ОБНОВИТЬ:

Я попытался использовать GetShortPathName в kernel32, чтобы избавиться от пробелов. Единственная разница в выводе ошибок заключалась в имени файла, который теперь C:\\Users\\CLAUDI~1.BOG\\QGMI\\RUBEND~1\\TRAMO3~1\\CERTIF~1.PDF

Также попытался изменить обратную косую черту для косой черты, разница в том, что теперь в сообщении об ошибке отображается C:/Users/CLAUDI~1.BOG/QGMI/RUBEND~1/TRAMO3~1/CERTIF~1.PDF

Привет из Парагвая.

Клаудио Богадо Помпа.

0
Claudio Bogado Pompa 23 Июн 2020 в 01:24

1 ответ

Лучший ответ

Последние версии Ghostscript по умолчанию работают в режиме БЕЗОПАСНОСТИ, который предотвращает доступ программ PostScript (например, pdf_info.ps) к файлам в файловой системе.

В общем, Ghostscript будет пытаться сделать вывод из командной строки, когда файлы должны быть разрешены (например, имя входного файла, в случае выше pdf_info.ps), но он не может знать, что -sFile = должен быть разрешен, потому что эта часть команда просто попадает в интерпретатор PostScript.

Итак, чтобы использовать pdf_info.ps, вам нужно будет либо установить -dNOSAFER, либо добавить --permit-file-read= в вашу командную строку. -dNOSAFER отключает всю защиту, поэтому вы можете не захотеть этого делать, --permit-file-read позволяет программе PostScript читать только указанный каталог. Я рекомендую вам это сделать.

Я также предлагаю вам поэкспериментировать из командной строки, используя обычный исполняемый файл Ghostscript, и переходить к вашему приложению только тогда, когда он у вас правильный.

Если вы планируете распространять это приложение, ознакомьтесь с файлом лицензии.

0
KenS 23 Июн 2020 в 16:08