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