Я пытаюсь использовать Ghostscript, чтобы получить количество страниц в PDF-файле. Я получаю эту ошибку:
Select-Object : Exception getting "StandardOutput": "StandardOut has not been redirected or the process hasn't started yet."
At C:\Temp\Gainesville\EHADocumentExtractor\EHA_Extractor_ghostscript.ps1:156 char:101
+ ... Window -PassThru | Select-Object -wait -ExpandProperty StandardOutput
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidResult: (System.Diagnostics.Process (gswin64c):PSObject) [Select-Object], GetValueInvocationException
+ FullyQualifiedErrorId : PropertyEvaluationExpand,Microsoft.PowerShell.Commands.SelectObjectCommand
Ниже мой сценарий
$gsPath = "C:\Program Files\gs\gs9.53.3\bin\gswin64c.exe"
$pdfPath = "C:\Temp\Test.pdf"
$gsCommands = @"
-q -dNODISPLAY -c \"($pdfPath) (r) file runpdfbegin pdfpagecount = quit\"
"@
#$pageCount = & $gsPath -c $gsCommand 2>&1
$pageCount = Start-Process -FilePath $gsPath -ArgumentList $gsCommands -NoNewWindow -PassThru | Select-Object -wait -ExpandProperty StandardOutput
Write-Host $pageCount
Я не уверен, как решить эту проблему. В программе на C# я могу просто изменить RedirectStandardOutput
объекта Process, но не знаю, как решить эту проблему в PowerShell.
Не пойму популярности старт-процесса.
Вы пытаетесь получить количество страниц из удаленного PDF-файла. Вы используете старые предложения (надеюсь, не от чат-бота).
Artifex пришлось изменить некоторые возможности командной строки, чтобы уменьшить вероятность использования мошеннических эксплойтов PDF. Таким образом, вам необходимо убедиться, что папка находится в списке разрешений. Кроме того, обычным требованием к именам файлов является регистр и постскриптум. (/ or \\)
Таким образом, самая короткая текущая командная строка программы через оболочку Windows будет выглядеть так:
gs.lnk -q -Ic:\temp -dNODISPLAY -c "(c:/temp/test.pdf) (r) file runpdfbegin pdfpagecount = quit"
or
gs.lnk -q -Ic:\temp -dNODISPLAY -c "(c:\\temp\\test.pdf) (r) file runpdfbegin pdfpagecount = quit"
Где gs.lnk — это мой путь к GSWIN32C.exe. Таким образом, минимальный ожидаемый результат
1
При запуске cmd из консоли PowerShell все будет точно так же, но с префиксом Shell> cmd /r.
Чтобы перенаправить вывод в файл, а не в консоль, мы можем использовать
PS > cmd /r gs.lnk -q -Ic:\temp -dNODISPLAY -c "(c:/temp/test.pdf) (r) file runpdfbegin pdfpagecount = quit" 1>c:\temp\count.txt
PS > cmd /r type c:\temp\count.txt
1
PS >
Будьте осторожны, в некоторых версиях вам потребуются дополнительные параметры PowerShell, чтобы получить результат, соответствующий тому, который указан непосредственно в собственном CMD в качестве conout. Мне пришлось возиться с этим перенаправлением, поскольку в моей версии PowerShell оно было повреждено до UTF16.
Однако вы упомянули об использовании С#, и поэтому самая короткая строка программы должна быть
int page_number = m_ghostscript.GetPageCount("my_document.pdf");
Согласно документации https://ghostscript.readthedocs.io/en/latest/LanguageBindingsCSharp.html#getpagecount
Я как бы использовал ваш ответ, использовал строку cmd и выполнил обработку через командный файл. Не элегантно, но работает
Start-Process
, к сожалению, перенаправляет только на файл. однако в данном случае, похоже, вам это даже не нужно, вы можете просто вызвать свой двоичный файл синхронно с оператором вызова:& $gsPath -q -dNODISPLAY -c "($pdfPath) (r) file runpdfbegin pdfpagecount = quit"
(это может сработать)