2010-12-02 71 views
13

因此,我使用的是Matthew Ephraim's GhostscriptSharp,它是我的ASP.Net MVC项目中的非托管Win32 Ghostscript DLL的简单C#包装。一些背景:什么导致Ghostscript返回-100的错误?

我想要做的是有一个用户上传PDF文件,然后将该文件转换成一个图像,然后我可以保存到我选择的任何目录(以及做一些其他OOP绑定那个新的图像到我的网站)。

我决定使用Ephraim先生的包装类(GhostscriptSharp),因为它使用起来很简单,它使我能够相对干净地访问DLL的API。

为了测试它,我创建了一个虚拟的C#控制台应用程序,以确保我可以加载DLL,访问它,在本地磁盘上传递PDF文件,然后让它将JPG写入同一本地磁盘。经过一些学习经历,我获得了成功。我会把它交给C:\ INPUT.pdf,它会交给我C:\ OUTPUT.jpg。

但是,将我在控制台应用程序中使用的GhostScriptSharp代码集成到我的ASP.NET MVC项目中,并将其与P/invoke调用DLL的位置相集成后,Ghostscript将返回int/error代码-100 ,这是一个致命错误(在GhostScript源代码中称为E_Fatal)。我通过HTML表单上传的文件获得了相同的结果,并且如果我将它用于我的工作控制台应用程序中使用的完全相同的硬编码路径,则会得到相同的结果。

作为参考,该引发异常的线在GhostScriptSharp.cs 93-97(这是在CallApi功能):

int result = InitAPI(gsInstancePtr, args.Length, args); 

if (result < 0) { 
    throw new ExternalException("Ghostscript conversion error", result); 
} 

显然抛出异常因为result-100

当InitAPI被调用时,实例ptr是一个有效的int(虽然我不知道GS的实例是否正确),args的长度为20(是string[])有效的GhostScript选项包括正确转义的输入文件路径&)。

长话短说,我做错了什么?错误代码-100看起来像一个全面的,因为没有文件说明什么可能会在这里出错。

任何帮助非常感谢,提前谢谢。

回答

3

因此,最终成为了一个ID10T错误,在这个特定的实例中,这个错误让我在这里出轨。

在Matthew Ephraim的GhostscriptSharp代码中,他使用了几个枚举来定义为Ghostscript设置的选项,其中两个特别是GhostscriptDevicesGhostscriptPageSizes枚举。问题是,他们编写的方式Resharper(Jetbrains Visual Studio插件)具有用于命名Enum成员的默认规则。没有想到,我解决了所有这些定义,请Resharper没有意识到这些是直接传递给Ghostscript,所以a7代替-sPAPERSIZE GS代替A7-sDEVICE代替jpeg代替。

目前,权限对我来说不是问题,但只是因为我在Visual Studio中运行了Cassini Web Dev测试服务器。

感谢@MarkRedman和@tvanfosson提供了有用的建议!

3

运行Web应用程序的进程很可能没有写入您正在使用的目录的权限。我建议为要使用的应用程序创建一个特定的目录,并使用本地ID来运行应用程序池,然后为该ID提供足够的权限来读取/写入您创建的目录。

+0

一,我听说如果我用ASP.Net开发服务器运行Web应用程序,它使用我本地用户的权限运行,我在本地计算机上管理员,这就是文件所在的位置。二,在使用GhostscriptSharp之前,在应用程序的早期阶段,我的应用程序会创建PDF和JPG进入的特定目录,这样也会表明它具有适当的写入权限,对吗? – Mattygabe 2010-12-02 22:10:54

+0

@Mattygabe - 只要你在卡西尼跑步,这就是真的。不知道可能是什么问题。 – tvanfosson 2010-12-02 22:15:02

10

-100错误是GhostScript中的通用“致命错误”。

有几件事情要检查:

1)权限(人操作需要的文件访问)

2)适用范围,要在GS bin文件夹添加到PATH变量

3)考虑不要直接从asp调用GhostScript。净,GS可以是非常CPU的密集型,而是在一个单独的服务处理文件

我也创建了一个包装,给我发一封电子邮件(地址在配置文件),我会把它发送给你。它允许一个传入GS bin文件夹,这有助于。

相关问题