因此,我使用Matthew Ephraim's GhostscriptSharp,它是我的Win32 MVC项目中非托管ASP.Net Ghostscript DLL的一个简单的C#包装器。一些背景知识:
我尝试做的是让用户上传PDF,然后将该文档转换为图像,然后我可以将其保存到我选择的任何目录中(以及执行其他OOP以将新图像绑定到我的站点)。
我决定使用Ephraim先生的包装器类(GhostscriptSharp),因为它足够简单易用,而且它让我能够相对干净地访问DLL的API。
为了测试它,我创建了一个虚拟的C#控制台应用程序,以确保我可以加载、访问它,将本地磁盘上的一个C#文件交给它,然后让它将一个JPG写入相同的本地磁盘。经过几次学习经历,我取得了成功。我会递给它,它会递给我C:\OUTPUT.jpg。
但是,在将控制台应用程序中的GhostScriptSharp代码集成到Ghostscript项目中并使用P/invoke调用ASP.NET时,GhostScript返回了int/error代码-100,这是一个致命错误(在GhostScript源代码中称为E_Fatal )。对于通过HTML表单上传的文件和在工作控制台应用程序中使用的完全相同的硬编码路径,我都得到了相同的结果。
作为参考,抛出异常的行是GhostScriptSharp.cs (在CallApi函数中)中的93-97行:
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似乎是一个包罗万象的东西,因为这里没有说明可能出错的文档。
任何帮助都是非常感谢的,提前谢谢你。
发布于 2010-12-07 01:08:00
所以,最终是一个ID10T错误,在这个特定的例子中让我脱轨了。
在Matthew Ephraim的GhostscriptSharp代码中,他使用两个枚举来定义为Ghostscript设置的选项,其中两个是GhostscriptDevices和GhostscriptPageSizes枚举。问题是,它们的编写方式Resharper (Jetbrains Visual Studio插件)有命名Enum成员的默认规则。不假思索,我修复了所有这些定义,以取悦Resharper,因为我没有意识到这些定义是直接传递给Ghostscript的,所以-sPAPERSIZE GS的a7不是A7,而是-sDEVICE的Jpeg而不是jpeg。
就目前而言,权限对我来说不是问题,但只是因为我在Visual Studio中运行Cassini web dev测试服务器。
感谢@MarkRedman和@tvanfosson的有用建议!
发布于 2010-12-03 06:14:26
-100错误是GhostScript中常见的“致命错误”。
需要检查的几件事:
1)权限(所有操作都需要文件访问权限)
2)作用域中,您希望将GS bin文件夹添加到PATH变量
3)考虑不要直接从asp.net调用GhostScript,GS可能非常占用CPU资源,而是在单独的服务中处理文件
我还创建了一个包装器,给我一个电子邮件(地址在个人资料),我会把它发送给你。它允许一个在GS bin文件夹中传递,这很有帮助。
发布于 2010-12-03 06:02:46
最有可能的情况是,运行web应用程序的进程没有权限写入您正在使用的目录。我建议为应用程序创建一些特定的目录,并使用一个本地id来运行应用程序池,然后给该id足够的权限来读/写你创建的目录。
https://stackoverflow.com/questions/4340407
复制相似问题