Простой VB.Net Wrapper для Ghostscript Dll [закрыто]

Я люблю Ghostscript. Вы можете использовать его для преобразования PDFs для графических файлов, разделения и / или объединения PDF-файлов, создания эскизов и множества других вещей. И это'бесплатное программное обеспечение с открытым исходным кодом!

На веб-сайтах есть множество сообщений о том, как использовать Ghostscript из командной строки для всех видов платформ. Но я никогда не мог найтипросто Оболочка dll vb.net, которая использовала dll Ghostscript (gsdll32.dll) вместо запуска процесса для запуска приложения командной строки Ghostscript.

Итак, я придумал этот код. Я публикую это здесь в надежде, что другие могут избежать разочарования, которое я чувствовал, ища что-то простое и прямолинейное. Он избегает тех тупых массивов объектов байтового массива, которые вы видите в некотором коде. Он имеет минимальную обработку ошибок, но может быть добавлен в соответствии с вашим приложением.

Поместите этот код в модуль с именем "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, _
     _
    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" (или же "\ Windows \ SysWOW64" на 64-битной машине) или в той же папке, что и ваша сборка. Это'Это не тот тип DLL, который должен быть зарегистрирован (фактически, он не может быть зарегистрирован).

Затем вы можете запустить Ghostscript, используя массив параметров, подобный этому (этот пример преобразует PDF-файл в высококачественный PNG-файл):

Dim PdfFilePath As String = ""
Dim PngFilePath As String = ""

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

Или вы можете запустить код, используя строковый массив, подобный этому (лучше, если аргументы генерируются динамически во время выполнения):

Dim PdfFilePath As String = ""
Dim PngFilePath As String = ""

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

RunGS(Args)

Заметки:

Не заключайте имена (пути) входных или выходных файлов в кавычки, как для приложения командной строкиНе избегайте обратной косой черты (т. Е. "с: путь \ file.pdf» все в порядке "с: путь \\ file.pdf» не является)Не используйте Ghostscript »-о» переключатель; использовать "sOutputFile =»

Ответы на вопрос(0)

Ваш ответ на вопрос