PDF из PS через Shell с gswin32c
Я пытаюсь создать "c:\output.pdf" из существующего и правильно сформированного файла "output.ps" с VB.NET и оболочкой для gswin32c.exe, который находится в текущем каталоге.
Но я, очевидно, не могу правильно написать команду оболочки:
If LCase(p_printer).Contains("ghostscript") Then
' to not show old one
IO.File.Delete(OutputPDF)
If IO.File.Exists(InputPS) Then
Dim commandString As String = """gswin32c.exe -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -dQUIET -sOUTPUTFILE=" & OutputPDF & " " & InputPS & """"
Debug.Print(commandString)
Shell(commandString, AppWinStyle.NormalFocus)
If IO.File.Exists(OutputPDF) And bln_showpdf Then
'show PDF
Start(OutputPDF)
End If
Else
MsgBox(InputPS + " do NOT exists.", MsgBoxStyle.Critical)
End If
End If
Из окна cmd эти команды регулярно выдают "output.pdf"
Что не так и как заставить его работать?
2 ответа
Dim InputPS as String = "C:\Temp\output.ps" 'must use 8.3 file naming convention
Dim OutputPDF as String = "C:\Temp\output.pdf" 'must use 8.3 file naming convention
Dim CommandString as String = "C:\GS\gswin32c.exe -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -dQUIET -sOUTPUTFILE=" & OutputPDF & " " & InputPS
Debug.Print(CommandString)
Shell(CommandString, AppWinStyle.NormalFocus)
На самом деле командная строка не нуждается в кавычках, я тестировал ее без них. Вы должны использовать соглашение о присвоении имен 8.3. Обратите внимание, что в этом коде имена входных и выходных файлов не начинаются и не заканчиваются кавычками; Вот почему вы должны использовать соглашение об именах файлов 8.3, чтобы добиться успеха. И никаких пробелов в именах файлов или путях.
Ваша проблема в том, что он не может найти файл; полагаться на текущий активный каталог не очень хорошая практика, так как это может вызвать проблемы. Решение состоит в том, чтобы предоставить полный путь и имя файла без пробелов и использовать соглашение об именах файлов 8.3 для пути и имени файла.
Также убедитесь, что GSDLL32.DLL находится в той же папке, что и GSWin32C.exe.
Я провел еще какое-то тестирование и обнаружил, что с помощью кавычек в командной строке он отлично подходит для длинных имен файлов.
Public Function ConvertToPDF(ByVal svPsFileName, ByVal svPDFName)
'check for file
If Not IO.File.Exists(svPsFileName) Then
Throw New ApplicationException(svPsFileName & " cannot be found")
End If
'check for file
If IO.File.Exists(svPDFName) Then
Throw New ApplicationException(svPDFName & " already exists")
End If
'convert
Dim myProcInfo As New ProcessStartInfo
myProcInfo.FileName = "C:\Program Files\GhostScript\GSWIN32C.EXE"
myProcInfo.Arguments = "-sDEVICE=pdfwrite -q -dSAFER -dNOPAUSE -sOUTPUTFILE=""" & svPDFName & """ -dBATCH """ & svPsFileName & """"
Debug.Print(myProcInfo.Arguments)
'do the conversion
Dim myProc As Process = Process.Start(myProcInfo)
'wait for finish (no more than 20 seconds)
myProc.WaitForExit(20000)
'delete PS
If IO.File.Exists(svPDFName) Then IO.File.Delete(svPsFileName)
End Function