GhostScript 不可恢复的错误:未定义的文件名

Posted

技术标签:

【中文标题】GhostScript 不可恢复的错误:未定义的文件名【英文标题】:GhostScript unrecoverable error: undefined file name 【发布时间】:2017-02-06 20:40:39 【问题描述】:

试图弄清楚如何使用 Ghost 脚本获取 memoryStream 并返回图像。这是执行 rasterizer.Open 后出现的代码和错误:

 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;
    

【问题讨论】:

【参考方案1】:

问题是您指向的是 exe 文件而不是 dll。当您将“gswin64.exe”替换为“gsdll64.dll”(32 位版本相同)时,您的代码应该可以工作。

【讨论】:

感谢 Habjan 的回复。它现在确实将 PDF 转换为图像!【参考方案2】:

好吧,Ghostscript 告诉您它无法打开文件 '/config:C:\Users\Sean.McNary\ApexRemington\.vs\config\applicationhosts.config' 因为(对于这样一个乱码文件名并不完全不足为奇),它找不到文件。

我认为您在 Ghostscript(这是一个用 C 编写的 DLL)周围使用了某种包装器,因为您显然使用的是 C#,如果您要说明您在其中使用的内容会有所帮助。

无论您使用什么包装器,它都“看起来像”,它期望得到一个输入文件名,然后简单地将其传递给 Ghostscript。虽然可以将数据从内存传递到 Ghostscript,并将渲染结果返回到内存中,但您应该注意,如果输入是 PDF 文件,您不会保存任何内容,因为 Ghostscript 会将整个输入假脱机到一个处理之前的临时文件您必须在 PDF 文件中四处寻找,因此您需要随机访问,因此将其写为文件。

你将不得不调试你的包装器,看看它在做什么。

【讨论】:

嘿@KenS。我正在使用 GhostScript.NET。我想要完成的是传入这个 PDF 的内存流,并返回一个图像。然后我想将这个图像转换回一个流,我将把它添加到一个流队列中,并打印所有的流。我不只是将 PDF 直接转换为流并执行 stream.enqueue(PDF) 的原因是因为当我这样做时,我得到一个 GDI+ 通用错误。流的原始队列是图像。如果您知道更好的方法来做到这一点,那么我完全赞成。 您应该将 Ghostscript.net 标签添加到您的问题中,这样作者可能会注意到并发表评论。我不是 C# 程序员,所以我不知道你真正想要实现什么,恐怕我不明白你的解释:-(我的主要观点是在内存中传递一个 PDF 文件只意味着Ghostscript 将其作为临时文件写入,它不会为您节省任何时间。如果您正在考虑将 PDF 文件打印到打印机,Ghostscript 已经可以使用 mswinpr2 设备执行此操作,可能会更好,因为它会在打印机分辨率。 Ghostscript.NET 不适用于 ghostscript exe。您应该将其指向 ghostscript dll。

以上是关于GhostScript 不可恢复的错误:未定义的文件名的主要内容,如果未能解决你的问题,请参考以下文章

手动编码 Postscript 时,Ghostscript 会产生未定义的错误

鬼脚本 |不可恢复的错误,退出代码 1

修复不可读的 ghostscript 字体

使用反应成帧器类型'()=> void'的打字稿错误不可分配给类型'未定义'

尝试在 Macintosh 上构建 Ghostscript 9.0.1 时出错

VMware Workstation 不可恢复错误: (vcpu-1) Exception 0xc0000005 (access violation) has occurred终极解决方案