1

我正在尝试使用 VB.NET 和 shell 从现有且格式良好的“output.ps”文件生成“c:\output.pdf”到当前目录中的 gswin32c.exe。

但我显然无法正确编写 shell 命令:

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”

什么是不正确的以及如何让它工作?

4

2 回答 2

1
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 位于同一文件夹中。

于 2013-09-03T23:11:48.163 回答
0

我做了一些更多的测试,发现通过在命令字符串中使用引号,它需要长文件名就可以了。

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
于 2013-09-09T05:40:35.503 回答