Как выполнить ghostscript из программы на C#

Я пытаюсь вызвать скрипт-призрак из моей программы на C#, передав ему несколько аргументов, чтобы обрезать нижний колонтитул PDF-файла, а затем перезаписать временный файл новой измененной версией.

Я думаю, что я вызываю gs.exe неправильно. Кто-нибудь видит причину, по которой строка, которую я передаю в начало (gs), не работает?

При трассировке скрипта он запускает перехват, когда доходит до System.Diagnostics.Process.Start(gs);

Эта строка вызывается в функции process.start (gs).

C:\gs\gs9.14\bin\gswin64c.exe -o C:\Users\myname\Desktop\assignment1\assignment1\data\temp\test.pdf -sDEVICE=pdfwrite -c "[/CropBox [24 72 559 794] /PAGES pdf mark" -f C:\Users\myname\Desktop\assignment1\assignment1\data\temp\test.pdf

Это сообщение, которое я получаю в своей консоли.

System.ComponentModel.Win32Exception (0x80004005): The system cannot find the file specified
       at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
       at System.Diagnostics.Process.Start()
       at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
       at System.Diagnostics.Process.Start(String fileName)
       at assignment1.Program.cropPDFFooter(String tempPDF) in C:\Users\tessierd\Desktop\assignment1\assignment1\Program.cs:line 78

Тогда это код для моего метода.

public static void cropPDFFooter(string tempPDF)
    {
        try
        {
            byte[] croppedPDF = File.ReadAllBytes(tempPDF);
            string gsPath = @"C:\gs\gs9.14\bin\gswin64c.exe";

            List<string> gsArgsList = new List<string>();
            gsArgsList.Add(" -o " + tempPDF);
            gsArgsList.Add(" -sDEVICE=pdfwrite");
            gsArgsList.Add(" -c \"[/CropBox [24 72 559 794] /PAGES pdfmark\"");
            gsArgsList.Add(" -f " + tempPDF);
            var gsArgs = String.Join(null, gsArgsList);

            string gs = gsPath + gsArgs; // not needed anymore (see solution)
            // * wrong code here. 
            // System.Diagnostics.Process.Start(gs);
            // * Correct code below.
            System.Diagnostics.Process.Start(gsPath, gsArgs);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
            Console.ReadLine();
        }
    }

2 ответа

Решение

System.Diagnostics.Process.Start(gs); занимает 2 парм. файл, а затем аргументы. Я должен был изменить код на

System.Diagnostics.Process.Start(gsPath, gsArgs);

Я бы посоветовал вам использовать оболочку Ghostscript для .NET.

Вы можете найти его здесь: Ghostscript.NET на GitHub

Пример использования можно найти здесь: Ghostscript Processor C# Sample

Есть также пример того, как добавить водяной знак с ключом -c, который PostScript можно просто заменить на постскрипт канизания: Ghostscript.NET - Передача команд Postscript (взгляните на нижнюю функцию)

Другие вопросы по тегам