所以,我正在使用 马修·埃弗拉姆(Matthew Ephraim)的《幽灵》, ,这是我的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, ,这是一个致命的错误(称为 E_Fatal 在Ghostscript源代码中)。通过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插件)具有命名成员的默认规则。不考虑,我修复了所有这些定义,以取悦重音器,没有意识到这些定义直接传递给了幽灵,所以没有得到 a7 为了 -sPAPERSIZE GS得到了 A7, ,和 -sDEVICE 它得到了 Jpeg 代替 jpeg.

目前,权限并不是我的问题,但这仅仅是因为我在Visual Studio中运行Cassini Web Dev Test Server。

感谢@markredman和@tvanfosson的有益建议!

其他提示

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

需要检查的几件事:

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

2)范围,您想将GS bin文件夹添加到路径变量

3)考虑不直接从ASP.NET调用ghostscript,GS可以非常密集,而是在单独的服务中处理文件

我还创建了一个包装器,给我发送电子邮件(个人资料上的地址),我会向您发送。它允许一个人传递到GS bin文件夹中,这有助于。

运行Web应用程序的过程很可能无权写入您使用的目录。我建议创建一些特定目录供应用程序使用,并使用本地ID来运行应用程序池,然后赋予该ID足够的特权来读取/编写您创建的目录。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top