我正在尝试使用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”
什么是不正确以及如何使其正常工作?
答案 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