从PS到Shell的PDF和gswin32c

时间:2013-09-03 21:37:42

标签: vb.net ghostscriptsharp

我正在尝试使用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”

什么是不正确以及如何使其正常工作?

2 个答案:

答案 0 :(得分: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 file naming convention。请注意,在此代码中,输入和输出文件名不以引号开头或结尾;这就是为什么必须使用8.3文件命名约定才能成功的原因。文件名或路径中没有空格。

你的问题是它找不到文件;依赖当前活动目录不是一个好习惯,因为它可能会导致问题。解决方案是提供没有空格的完整路径和文件名,并使用路径和文件名的8.3文件命名约定。

还要确保GSDLL32.DLL与GSWin32C.exe位于同一文件夹中。

答案 1 :(得分: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