Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于Ghostscript Dll的简单VB.Net包装器_Vb.net_Dll_Ghostscript - Fatal编程技术网

用于Ghostscript Dll的简单VB.Net包装器

用于Ghostscript Dll的简单VB.Net包装器,vb.net,dll,ghostscript,Vb.net,Dll,Ghostscript,我喜欢鬼脚本。您可以使用它将pdf转换为图形文件、拆分和/或合并pdf文件、制作缩略图以及其他一大堆内容。而且,它是免费的开源软件 网站上有大量关于如何在各种平台上从命令行使用Ghostscript的帖子。但是,我找不到一个使用Ghostscript dll(gsdll32.dll)而不是启动进程来运行Ghostscript命令行应用程序的简单的vb.net dll包装器 所以,我想出了这个代码。我把它贴在这里,希望其他人能避免我在寻找简单而直接的东西时感到的沮丧。它避免了在某些代码中看到的那些

我喜欢鬼脚本。您可以使用它将pdf转换为图形文件、拆分和/或合并pdf文件、制作缩略图以及其他一大堆内容。而且,它是免费的开源软件

网站上有大量关于如何在各种平台上从命令行使用Ghostscript的帖子。但是,我找不到一个使用Ghostscript dll(gsdll32.dll)而不是启动进程来运行Ghostscript命令行应用程序的简单的vb.net dll包装器

所以,我想出了这个代码。我把它贴在这里,希望其他人能避免我在寻找简单而直接的东西时感到的沮丧。它避免了在某些代码中看到的那些愚蠢的字节数组对象数组。它有最小的错误处理,但可以添加以适合您的应用程序

将此代码放入名为“GhostscriptDllLib”的模块中

选项显式打开
导入System.Runtime.InteropServices
'---Ghostscript gsdll32.dll的简单VB.Net包装器
(使用Visual Studio 2010和Ghostscript 9.06进行测试)
模块GhostscriptDllLib
私有声明函数gsapi_new_实例库“gsdll32.dll”_
(ByRef实例作为IntPtr_
ByVal调用者(作为IntPtr的句柄)作为整数
专用声明函数gsapi_set_stdio Lib“gsdll32.dll”_
(ByVal实例作为IntPtr_
ByVal gsdll_stdin作为标准回调_
ByVal GSDLLu stdout作为标准回调_
ByVal gsdll_stderr作为StdIOCallBack)作为整数
带有参数库“gsdll32.dll”的私有声明函数gsapi_init__
(ByVal实例作为IntPtr_
ByVal argc作为整数_
_
ByVal argv()作为字符串)作为整数
私有声明函数gsapi_exit Lib“gsdll32.dll”_
(作为IntPtr的ByVal实例)作为整数
私有声明子gsapi_delete_实例库“gsdll32.dll”_
(作为IntPtr的ByVal实例)
“---使用指定的参数运行Ghostscript
作为布尔值的公共函数梯级(ByVal ParamArray Args()作为字符串)
Dim实例HNDL作为IntPtr
作为整数的Dim NumArgs
将StdErrCallback设置为StdIOCallBack
将StdInCallback设置为StdIOCallBack
将StdOutCallback设置为StdIOCallBack
NumArgs=Args.Count
StdInCallback=InOuterCallback的地址
StdOutCallback=InOuterCallback的地址
StdErrCallback=inoutercallback的地址
'---将参数从索引1开始移位(Ghostscript要求)
ReDim保留参数(NumArgs)
System.Array.Copy(Args,0,Args,1,NumArgs)
'---启动一个新的Ghostscript实例
如果gsapi_new_实例(InstanceHndl,0)为0,则
返回错误
退出功能
如果结束
“---设置虚拟回调
gsapi_set_stdio(InstanceHndl、StdInCallback、StdOutCallback、StdErrCallback)
“---使用指定的参数运行Ghostscript
带参数的gsapi_init_(InstanceHndl,NumArgs+1,参数)
'---退出鬼脚本
gsapi_出口(实例HNDL)
'---删除实例
gsapi_delete_实例(InstanceHndl)
返回真值
端函数
'---回调的委托函数
私有委托函数StdIOCallBack(作为IntPtr的ByVal句柄_
ByVal Strz作为IntPtr,ByVal字节作为整数)作为整数
'---标准输入、标准输出和错误的伪回调
InOuterCallback中的私有函数(作为IntPtr的ByVal句柄_
ByVal Strz作为IntPtr,ByVal字节作为整数)作为整数
返回0
端函数
端模块
gsdll32.dll文件必须位于Windows可以找到它的位置,最好位于“\Windows\System32”(或64位计算机上的“\Windows\SysWOW64”)或与程序集位于同一文件夹中。它不是必须注册的dll类型(事实上,它无法注册)

然后可以使用如下参数数组运行Ghostscript(此示例将pdf文件转换为高质量png文件):

Dim PdfFilePath As String=“”
Dim PngFilePath As String=“”
横档(“-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()作为字符串={“-q”、“-dNOPAUSE”、“-dBATCH”、“-dSAFER”_
“-sDEVICE=png16m”、“-r600”、“-dDownScaleFactor=6”、“-dTextAlphaBits=4”_
“-dGraphicsAlphaBits=4”,“-sPAPERSIZE=letter”_
“-sOutputFile=“&PngFilePath,PdfFilePath}”
横档(Args)
注:

  • 请勿在创建时将输入或输出文件名(路径)括在引号中 将为命令行应用程序创建
  • 不要转义反斜杠(即“c:path\file.pdf”可以,而“c:path\\file.pdf”不能)
  • 不要使用Ghostscript“-o”开关;使用“sOutputFile=”

这应该重新格式化为问题+(自我)Answer@Oxinabox同意。但是谢谢你的例子,我真的很感激。
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
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)