11

私はゴーストスクリプトが大好きです。これを使用して、pdf をグラフィックス ファイルに変換したり、pdf ファイルを分割および/またはマージしたり、サムネイルを作成したり、その他のさまざまなことを行うことができます。しかも、無料のオープンソース ソフトウェアです。

あらゆる種類のプラットフォームでコマンド ラインから Ghostscript を使用する方法について、Web サイトに多数の投稿があります。しかし、Ghostscript コマンド ライン アプリを実行するプロセスを開始する代わりに、Ghostscript dll (gsdll32.dll) を使用する単純なvb.net dll ラッパーを見つけることができませんでした。

だから、私はこのコードを思いつきました。シンプルでわかりやすいものを探している私が感じたフラストレーションを他の人が回避できることを願って、ここに投稿しています. 一部のコードで見られるバイト配列オブジェクトのばかげた配列を回避します。エラー処理は最小限ですが、アプリケーションに合わせて追加できます。

このコードを「GhostscriptDllLib」という名前のモジュールに入れます。

Option Explicit On
Imports System.Runtime.InteropServices

'--- Simple VB.Net wrapper for Ghostscript gsdll32.dll

'    (Tested using Visual Studio 2010 and Ghostscript 9.06)

Module GhostscriptDllLib

  Private Declare Function gsapi_new_instance Lib "gsdll32.dll" _
    (ByRef instance As IntPtr, _
    ByVal caller_handle As IntPtr) As Integer

  Private Declare Function gsapi_set_stdio Lib "gsdll32.dll" _
    (ByVal instance As IntPtr, _
    ByVal gsdll_stdin As StdIOCallBack, _
    ByVal gsdll_stdout As StdIOCallBack, _
    ByVal gsdll_stderr As StdIOCallBack) As Integer

  Private Declare Function gsapi_init_with_args Lib "gsdll32.dll" _
    (ByVal instance As IntPtr, _
    ByVal argc As Integer, _
    <MarshalAs(UnmanagedType.LPArray, ArraySubType:=UnmanagedType.LPStr)> _
    ByVal argv() As String) As Integer

  Private Declare Function gsapi_exit Lib "gsdll32.dll" _
    (ByVal instance As IntPtr) As Integer

  Private Declare Sub gsapi_delete_instance Lib "gsdll32.dll" _
    (ByVal instance As IntPtr)

  '--- Run Ghostscript with specified arguments

  Public Function RunGS(ByVal ParamArray Args() As String) As Boolean

    Dim InstanceHndl As IntPtr
    Dim NumArgs As Integer
    Dim StdErrCallback As StdIOCallBack
    Dim StdInCallback As StdIOCallBack
    Dim StdOutCallback As StdIOCallBack

    NumArgs = Args.Count

    StdInCallback = AddressOf InOutErrCallBack
    StdOutCallback = AddressOf InOutErrCallBack
    StdErrCallback = AddressOf InOutErrCallBack

    '--- Shift arguments to begin at index 1 (Ghostscript requirement)

    ReDim Preserve Args(NumArgs)
    System.Array.Copy(Args, 0, Args, 1, NumArgs)

    '--- Start a new Ghostscript instance

    If gsapi_new_instance(InstanceHndl, 0) <> 0 Then
      Return False
      Exit Function
    End If

    '--- Set up dummy callbacks

    gsapi_set_stdio(InstanceHndl, StdInCallback, StdOutCallback, StdErrCallback)

    '--- Run Ghostscript using specified arguments

    gsapi_init_with_args(InstanceHndl, NumArgs + 1, Args)

    '--- Exit Ghostscript

    gsapi_exit(InstanceHndl)

    '--- Delete instance

    gsapi_delete_instance(InstanceHndl)

    Return True

  End Function

  '--- Delegate function for callbacks

  Private Delegate Function StdIOCallBack(ByVal handle As IntPtr, _
    ByVal Strz As IntPtr, ByVal Bytes As Integer) As Integer

  '--- Dummy callback for standard input, standard output, and errors

  Private Function InOutErrCallBack(ByVal handle As IntPtr, _
    ByVal Strz As IntPtr, ByVal Bytes As Integer) As Integer

    Return 0

  End Function

End Module

gsdll32.dll ファイルは、Windows が見つけられる場所にある必要があります。"\Windows\System32" (64 ビット マシンでは "\Windows\SysWOW64") またはアセンブリと同じフォルダーが最適です。登録する必要があるのは dll の種類ではありません (実際には登録できません)。

次に、次のようなパラメーター配列を使用して Ghostscript を実行できます (このサンプルでは、​​pdf ファイルを高品質の png ファイルに変換します)。

Dim PdfFilePath As String = "<Your pdf file path>"
Dim PngFilePath As String = "<Your png file path>"

RunGS("-q", "-dNOPAUSE", "-dBATCH", "-dSAFER", "-sDEVICE=png16m", _
  "-r600", _"-dDownScaleFactor=6", "-dTextAlphaBits=4", "-dGraphicsAlphaBits=4", _
  "-sPAPERSIZE=letter", "-sOutputFile=" & PngFilePath, PdfFilePath)

または、次のような文字列配列を使用してコードを実行することもできます (引数が実行時に動的に生成される場合はより適切です)。

Dim PdfFilePath As String = "<Your pdf file path>"
Dim PngFilePath As String = "<Your png file path>"

Dim Args() As String = {"-q", "-dNOPAUSE", "-dBATCH", "-dSAFER", _
  "-sDEVICE=png16m", "-r600", "-dDownScaleFactor=6", "-dTextAlphaBits=4", _
  "-dGraphicsAlphaBits=4", "-sPAPERSIZE=letter", _
  "-sOutputFile=" & PngFilePath, PdfFilePath}

RunGS(Args)

ノート:

  • コマンド ライン アプリケーションの場合のように、入力または出力ファイル名 (パス) を引用符で囲まないでください。
  • バックスラッシュをエスケープしないでください (つまり、"c:path\file.pdf" は問題ありませんが、"c:path\\file.pdf" は問題ありません)。
  • Ghostscript の「-o」スイッチは使用しないでください。「sOutputFile=」を使用
4

0 に答える 0