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
Другие вопросы по тегам