2017-02-06 3 views
0

Попытка выяснить, как взять memoryStream и вернуть изображения, используя Ghost Script. Вот код, а также ошибки я получаю когда я исполняю rasterizer.Open:GhostScript unrecoverable error: undefined имя файла

public static System.Drawing.Image PDFToImage(MemoryStream inputMS) 
    { 
     GhostscriptRasterizer rasterizer = null; 
     GhostscriptVersionInfo version = null; 
     if (Environment.Is64BitProcess) 
      version = new GhostscriptVersionInfo(
       new Version(0, 0, 0), @"C:\Program Files\gs\gs9.20\bin\gswin64.exe", 
       string.Empty, GhostscriptLicense.GPL); 
     else 
      version = new GhostscriptVersionInfo( 
       new Version(0, 0, 0), @"C:\Program Files (x86)\gs\gs9.20\bin\gswin32.exe", 
       string.Empty, GhostscriptLicense.GPL); 

     int dpi = 96; 
     System.Drawing.Image img = null; 

     using (rasterizer = new GhostscriptRasterizer()) 
     { 
      rasterizer.Open(inputMS, version, true); 

      for (int i = 1; i <= rasterizer.PageCount; i++) 
      { 

       using (MemoryStream ms = new MemoryStream()) 
       { 
        img = rasterizer.GetPage(dpi, dpi, i); 
        img.Save(ms, ImageFormat.Jpeg); 
        ms.Close(); 
       } 

      } 
      rasterizer.Close(); 
     } 
     return img; 
    } 

GhostScriptConsole

ответ

1

Проблема в том, что вы указываете на exe-файл вместо dll. Когда вы заменяете «gswin64.exe» на «gsdll64.dll» (то же самое для 32-битного verion), ваш код должен работать.

+1

Спасибо за ответ Habjan. Теперь он конвертирует PDF в изображение! – Crumblenautjs

1

Ну, Ghostscript говорит вам, что не может открыть файл «/ конфигурации: C: \ Users \ Sean.McNary \ ApexRemington \ .vs \ config \ applicationhosts.config ', потому что (не совсем неудивительно с таким искаженным именем файла), он не может найти файл.

Я предполагаю, что вы используете какую-то оболочку вокруг Ghostscript (которая является DLL, написанной на C), потому что вы, по-видимому, используете C#, это поможет, если вы хотите указать, что вы там используете.

Он похож на «какую бы оболочку вы ни использовали, он ожидает, что будет предоставлен входной файл, и просто передаст это Ghostscript. Хотя можно передавать данные из памяти в Ghostscript и возвращать полученный результат в память, вы должны знать, что если вход является файлом PDF, вы ничего не сохраняете, потому что Ghostscript будет генерировать весь ввод в временный файл перед его обработкой. Вам нужно искать файл PDF, поэтому вам нужно иметь произвольный доступ, поэтому его выписать в виде файла.

Вам придется отлаживать свою оболочку и посмотреть, что она делает.

+0

Hey @KenS. Я использую GhostScript.NET. То, что я пытаюсь выполнить, - передать в поток памяти этого PDF-документа и вернуть изображение. Затем я хочу преобразовать это изображение обратно в поток, где я добавлю его в очередь потока и распечатаю все потоки. Причина, по которой я не просто конвертировать PDF в поток напрямую и делать stream.enqueue (PDF), потому что, когда я это делаю, я получаю общую ошибку GDI +. Исходная очередь потоков - это изображения. Если вы знаете лучший способ сделать это, то я все для этого. – Crumblenautjs

+0

Вы должны добавить тег Ghostscript.net на свой вопрос, таким образом автор может заметить и прокомментировать. Я не программист на C#, поэтому я понятия не имею, чего вы действительно пытаетесь достичь. Боюсь, я не понимаю ваших объяснений :-(Мое главное было то, что передача PDF-файла в память означает только что Ghostscript записывает его как временный файл, он не спасет вас от этого. Если вы хотите распечатать PDF-файл на принтере, Ghostscript уже может это сделать с помощью устройства mswinpr2, вероятно, лучше, потому что оно будет отображаться на разрешение принтера. – KenS

+0

Ghostscript.NET не работает с ghostscript exe. Вы должны указать его на ghostscript dll. – HABJAN