18

因此,我正在使用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/error code -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);
}

显然抛出异常是因为resultis -100

调用 InitAPI 时,实例 ptr 是有效的int(尽管我不知道 GS 的实例是否正确), argsstring[]的有效 GhostScript 选项的长度为 20(是 a )(包括正确转义的路径到我的输入和输出文件)。

长话短说,我做错了什么?错误代码-100似乎是一个包罗万象的东西,因为没有文档说明这里可能出现的问题。

任何帮助都非常感谢,在此先感谢您。

4

3 回答 3

13

-100 错误是 GhostScript 中的一般“致命错误”。

需要检查的几件事:

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

2) 范围,你想把 GS bin 文件夹添加到 PATH 变量中

3) 考虑不要直接从 asp.net 调用 GhostScript,GS 可能会占用大量 CPU,而是在单独的服务中处理文件

我还创建了一个包装器,给我发一封电子邮件(个人资料上的地址),我会发给你。它允许一个人通过有帮助的 GS bin 文件夹。

于 2010-12-02T22:14:26.083 回答
4

所以,最终成为一个 ID10T 错误,在这个特定的例子中让我出轨了。

在 Matthew Ephraim 的 GhostscriptSharp 代码中,他使用了几个枚举来定义为 Ghostscript 设置的选项,其中两个特别是GhostscriptDevicesGhostscriptPageSizes枚举。问题是,它们的编写方式 Resharper(Jetbrains Visual Studio 插件)具有命名枚举成员的默认规则。没想到,我修复了所有这些定义以取悦 Resharper,没有意识到这些定义是直接传递给 Ghostscript 的,所以GS 不是得到,而是得到a7了.-sPAPERSIZEA7-sDEVICEJpegjpeg

暂时权限对我来说不是问题,只是因为我在 Visual Studio 中运行 Cassini Web 开发测试服务器。

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

于 2010-12-06T17:08:00.363 回答
3

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

于 2010-12-02T22:02:46.450 回答