Мне нравится Ghostscript. Вы можете использовать его для преобразования PDF в графические файлы, разделения и/или объединения файлов 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, _
<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" (или "\ Windows\SysWOW64" на 64-разрядной машине) или в той же папке, что и ваша сборка. Это не тип 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: путь\файл .pdf" в порядке, "c: путь \\file.pdf" не является)
- Не используйте переключатель Ghostscript "-o"; используйте "sOutputFile ="