是什么导致Ghostscript返回-100的错误?
所以,我使用的是Matthew Ephraim的GhostscriptSharp ,它是我的ASP.Net MVC项目中非托管Win32 Ghostscript DLL的简单C#包装器。 一些背景:
我试图做的是让用户上传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 /错误代码-100
,这是致命错误(在GhostScript源代码中称为E_Fatal
)。 我通过HTML表单上传的文件得到了相同的结果,如果我把它与我在工作控制台应用程序中使用的完全相同的硬编码路径。
作为参考,抛出exception的行在GhostScriptSharp.cs中是93-97(在CallApi
函数中):
int result = InitAPI(gsInstancePtr, args.Length, args); if (result < 0) { throw new ExternalException("Ghostscript conversion error", result); }
显然抛出了exception,因为result
是-100
。
当调用InitAPI时,实例ptr是一个有效的int
(虽然我不知道GS的实例是否正确),args的长度为20(是一个string[]
)的有效GhostScript选项(包括正确转义到我的输入和输出文件的路径)。
长话短说,我做错了什么? 错误代码-100
似乎是一个全能,因为没有文档说明这里可能出错的地方。
非常感谢任何帮助,谢谢你提前。
-100错误是GhostScript中的一般“致命错误”。
要检查的一些事项:
1)权限(al操作需要文件访问)
2)范围,您要将GS bin文件夹添加到PATH变量
3)考虑不直接从asp.net调用GhostScript,GS可能非常占用CPU,而是在单独的服务中处理文件
我还创建了一个包装器,给我发一封电子邮件(个人资料上的地址),我会发给你。 它允许一个人传入GS bin文件夹,这有助于。
很可能运行Web应用程序的进程没有写入您正在使用的目录的权限。 我建议为要使用的应用程序创建一些特定目录,并使用本地ID来运行应用程序池,然后为该id提供足够的权限来读取/写入您创建的目录。
所以,在这个具体的例子中,最终出现了ID10T错误,这个问题让我失望了。
在Matthew Ephraim的GhostscriptSharp代码中,他使用了几个枚举来定义为Ghostscript设置的选项,其中两个特别是GhostscriptDevices
和GhostscriptPageSizes
枚举。 问题是,他们编写的方式Resharper(Jetbrains Visual Studio插件)具有命名Enum成员的默认规则。 没想到,我修复了所有这些定义以取悦Resharper没有意识到这些定义直接传递给Ghostscript,所以没有得到a7
-sPAPERSIZE
GS得到了A7
,而-sDEVICE
得到了Jpeg
而不是jpeg
。
目前,权限不是我的问题,只是因为我在Visual Studio中运行Cassini Web开发测试服务器。
感谢@MarkRedman和@tvanfosson提供的有用建议!