AskalotLearnalot Ответов: 4

Как использовать ghostscript для преобразования PDF в tif


Я попытался конвертировать PDF в tif-изображения с помощью ImageMagick, но он работает очень медленно с большими файлами. Теперь я попробовал использовать ghostscript, он отлично работает из power-shell, но не выполняется с c# asp.vet VS19.
Вот команда, которая работает:
gswin64c.exe -dNOPAUSE -r300 -sDEVICE=tiffscaled24 -sCompression=lzw -dBATCH -sOutputFile="C:\Users\name\Desktop\images\Result\ %d.tif" "C:\Users\name\Desktop\images\DropHere\New folder\name.pdf" 

для этого вам понадобится папка ghostscript exe и intallatipm.
Но мой c# не работает. Никакой ошибки или чего-то еще, он просто проходит через метод шаг за шагом, ничего не происходит.

Что я уже пробовал:

  public void ExtracImagesFromPdf(string fileName, string fileNameResultDirectory)
        {
string ghostScriptPath = @"C:\Program Files\gs\gs9.50\bin\gswin64.exe";
            String ars = " - dNOPAUSE -sDEVICE=jpeg -r102.4 -o" + "C:\\Users\\syousif\\Desktop\\images" + "%d.jpg -sPAPERSIZE=a4 " + fileNameResultDirectory;
            Process proc = new Process();
            proc.StartInfo.FileName = ghostScriptPath;
            proc.StartInfo.Arguments = ars;
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            proc.Start();
            proc.WaitForExit();
}

ОПЕРАЦИОННАЯ
//  System.Environment.CurrentDirectory = @"C:\Program Files\gs\gs9.50\bin\";

           // String ars = "-dNOPAUSE -r300 -sDEVICE=tiffscaled24 -sCompression=lzw -dBATCH -sOutputFile=\"" + fileNameResultDirectory + "\" -%d.tif \"" + fileName + "\"";
           // string line = ".\\c:\\gswin64c.exe " + ars;

           //var  res = System.Diagnostics.Process.Start("gswin64c.exe", ars);

Я тоже попробовал этот способ:

 public void ExtracImagesFromPdf(string fileName, string inputpath)
        {
GhostscriptPngDevice img = new GhostscriptPngDevice(GhostscriptPngDeviceType.Png16m);
            img.GraphicsAlphaBits = GhostscriptImageDeviceAlphaBits.V_4;
            img.TextAlphaBits = GhostscriptImageDeviceAlphaBits.V_4;
            img.ResolutionXY = new GhostscriptImageDeviceResolution(200, 200);
            img.InputFiles.Add(inputpath); 
            //img.Pdf.FirstPage = 1; 
            //img.Pdf.LastPage = 1;
            img.PostScript = string.Empty;
            img.OutputPath = @"C:\Users\name\Desktop\images\Result";
            img.Process();
}

Но я получаю эту ошибку:
An error occured when call to 'gsapi_init_with_args' is made: -100 at the last line

4 Ответов

Рейтинг:
10

AskalotLearnalot

Вот решение, которое использует другой подход, но работает или, по крайней мере, еще не столкнулось с ошибкой.
1) Установите GhosotScript в свой проект из NuGet.
2) Установите GhostScript на свой CP :
версия 9.26 отсюда https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs926/gs926aw32.exe,
Более новая версия имела ошибку в PageCount (всегда = 0 )
3)примените этот код:

public void ExtracImagesFromPdf(string fileName, string fileNameResultDirectory)
       {
           var xDpi = 300; //set the x DPI
           var yDpi = 300; //set the y DPI

           using (var rasterizer = new GhostscriptRasterizer()) //create an instance for GhostscriptRasterizer
           {

               rasterizer.Open(fileName); //opens the PDF file for rasterizing
               int PdfPages = rasterizer.PageCount;
               for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
               {
                   //set the output image(png's) complete path
                   string outputPNGPath = Path.Combine(fileNameResultDirectory, "00" + pageNumber.ToString() + ".tif");


                   //converts the PDF pages to png's
                   Image pdf2PNG = rasterizer.GetPage(xDpi, yDpi, pageNumber);

                   //save the png's
                   pdf2PNG.Save(outputPNGPath, ImageFormat.Tiff);
               }



           }

Идите оттуда :)
Кредит:
Конвертируйте PDF в PNG с помощью Ghostscript.NET - DotNetFunda.com[^]
GhostscriptRasterizer, В Ghostscript.Нет.Прорисовки На C# (Используется CSharp) Примеры Кода - HotExamples[^]
Себя


Рейтинг:
1

phil.o

string ghostScriptPath = @"C:\Program Files\gs\gs9.50\bin\gswin64c.exe";
Имя исполняемого файла не совпадает в обоих случаях.

И командные строки тоже. Версия которая работает использует -sOutputFile="...", в то время как версия C# использует что-то другое.

Кроме того, возможно, вам нужно заменить %d переменная окружения с помощью fileName параметр метода?


AskalotLearnalot

спасибо за обратную связь я попробовал это сделать:

 String ars = "-dNOPAUSE -sDEVICE=jpeg -r102.4 -o" + @"C:\Users\syousif\Desktop\images\Result\" + "%d.jpg -sPAPERSIZE=a4" + "C:\\Users\\syousif\\Desktop\\images\\DropHere\\EuroTest\\name.pdf" ;
            string ghostScriptPath = @"C:\Program Files\gs\gs9.50\bin\gswin64c.exe";

тот же вопрос

phil.o

Аргументы не кажутся правильными. Пожалуйста, отладьте и внимательно следите за содержимым этой строки; и дважды проверьте правильность ее синтаксиса.

AskalotLearnalot

Я обновил вопрос.

Рейтинг:
0

Richard MacCutchan

Скорее всего что то не такg с вашими параметрами. У тебя есть:

String ars = " - dNOPAUSE -sDEVICE=jpeg -r102.4 -o" + "C:\\Users\\syousif\\Desktop\\images" + "%d.jpg -sPAPERSIZE=a4 " + fileNameResultDirectory;

Я подозреваю, что первый символ дефиса не должен иметь пробела после него. Должно быть " -dNOPAUSE ...
Имя файла "%d.jpg вероятно, он недействителен.
Что там внутри fileNameResultDirectory ?
Быстрая проверка состоит в том, чтобы отобразить все параметры или проверить их с помощью отладчика во время выполнения программы.

Вы также можете захватить выходные данные из запущенного процесса, см. Процесс.Свойство StandardOutput (System.Диагностика) | Microsoft Docs[^].


AskalotLearnalot

спасибо за обратную связь я попробовал это сделать:

 String ars = "-dNOPAUSE -sDEVICE=jpeg -r102.4 -o" + @"C:\Users\syousif\Desktop\images\Result\" + "%d.jpg -sPAPERSIZE=a4" + "C:\\Users\\syousif\\Desktop\\images\\DropHere\\EuroTest\\name.pdf" ;            string ghostScriptPath = @"C:\Program Files\gs\gs9.50\bin\gswin64c.exe";

тот же вопрос. Первый путь-это выход, второй-вход.

Richard MacCutchan

И это приведет к появлению строки параметров типа:
-dNOPAUSE -sDEVICE=jpeg -r102.4 -oC:\Users\syousif\Desktop\images\Result\%d.jpg -sPAPERSIZE=a4C:\\Users\\syousif\\Desktop\\images\\DropHere\\EuroTest\\name.pdf

что выглядит не совсем правильно. Как я уже предлагал выше, либо распечатайте последнюю строку, либо используйте свой отладчик для ее проверки.

AskalotLearnalot

Я обновил вопрос.

Richard MacCutchan

Это сообщение ничего не значит. Вам нужно будет посмотреть документацию Ghostscript, чтобы узнать, к чему она относится.

Рейтинг:
0

MadMyche

Вы всегда можете попробовать использовать их API, который задокументирован:
Интерфейс прикладного программирования интерпретатора Ghostscript (API)[^]

Кто-то здесь даже написал статью о том, как это сделать таким образом, около десяти лет назад:
Как конвертировать PDF в Изображение с помощью Ghostscript API[^]


AskalotLearnalot

Я уже смотрел на него и не предпочитаю такой подход. Спасибо за предложение.