1

現在のディレクトリにある gswin32c.exe に、VB.NET とシェルを使用して、既存の整形式の「output.ps」ファイルから「c:\output.pdf」を生成しようとしています。

しかし、私は明らかにシェルコマンドを適切に書くことができません:

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

コマンドウィンドウから、これらのコマンドは定期的に「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

I did some more testing and found that by using quotation marks in the command string, it takes long file names just fine.

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 に答える