如何从 C# 程序执行 ghostscript

Posted

技术标签:

【中文标题】如何从 C# 程序执行 ghostscript【英文标题】:How do I execute ghostscript from C# program 【发布时间】:2014-05-30 14:57:20 【问题描述】:

我正在尝试从我的 C# 程序中调用 ghost 脚本,将一些参数传递给它以裁剪 PDF 文件的页脚,然后用新的修改版本覆盖临时文件。

我认为我错误地调用了 gs.exe。有没有人看到我传递给 start(gs) 的字符串不起作用的原因?

跟踪脚本时,到达System.Diagnostics.Process.Start(gs);时触发catch

这是在 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();
        
    

【问题讨论】:

在命令提示符处运行字符串中的命令会发生什么? 它执行了 GhostScript 并且运行良好。 如果您将启动参数设置为只调用 gswin64c.exe 是否可以正常启动? 字符串 gsPath = "C:\\gs\\gs9.14\\bin\\swin64c.exe";也许? 如果你把字符串粘贴到dos控制台它可以工作吗? 【参考方案1】:

System.Diagnostics.Process.Start(gs); 需要 2 个参数。一个文件,然后是 args。 我不得不将代码更改为

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

【讨论】:

【参考方案2】:

我建议您为 .NET 使用 Ghostscript 包装器。

您可以在这里找到:Ghostscript.NET on GitHub

使用示例可以在这里找到:Ghostscript Processor C# Sample

还有一个示例,说明如何使用 -c 开关添加水印,您可以简单地将其替换为您的cropbox postscript:Ghostscript.NET - Passing Postscript commands(查看底部功能)

【讨论】:

以上是关于如何从 C# 程序执行 ghostscript的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 客户端应用程序执行 ebMS3 AS4 消息传递

如何在 C# 中获取当前可执行文件的名称?

如何使用 ODBC 驱动程序从 C# 调用 Progress Openedge .p 文件?

从外部更改应用程序字符串c#

C#如何从进程中检索代码然后运行它?

如何:在 C# 中执行命令行,获取 STD OUT 结果