Ghostscript.net 多线程问题
Posted
技术标签:
【中文标题】Ghostscript.net 多线程问题【英文标题】:Ghostscript.net multiThreaded issue 【发布时间】:2015-06-05 15:19:56 【问题描述】:我有一个 Sharepoint 应用程序,它使用 Ghostscript.net 包装器将 pdf 文档光栅化为 png。现在我正在使用他们site 中的示例。但我遇到的问题是当我尝试同时转换为 pdf 时。使用此代码一次只能工作一个。但是当我尝试同时转换 2 个 pdf 时,出现错误“调用 'gsapi_new_instance' 时发生错误:-100”。
using (MemoryStream pdfStream = new MemoryStream(pdfbyte))
using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer())
rasterizer.Open(pdfStream, version, false);
for (int i = 1; i <= rasterizer.PageCount; i++)
using (MemoryStream ms = new MemoryStream())
DrawImage img = rasterizer.GetPage(dpi, dpi, i);
img.Save(ms, ImageFormat.Png);
ms.Close();
output = "data:image/png;base64," + Convert.ToBase64String((byte[])ms.ToArray());
rasterizer.Close();
否则,如果我使用rasterizer.Open(pdfStream, version, true);
,则会出现错误“算术运算导致溢出”
我应该改用 GhostscriptProcessor 还是 Viewer 实例?有人有这个代码的好例子吗?
【问题讨论】:
【参考方案1】:所以我弄清楚了问题所在。我必须为 3.5 编译 Ghostscript.net,因为我在 Sharepoint 2010 站点中使用它。当我这样做时,我搞砸了 DynamicNativeLibrary.cs 文件中的这行代码。
string procName = Marshal.PtrToStringAnsi((IntPtr)(byte*)(thunkData) + 2);
当我将其更改为以下内容时,它现在似乎可以正常工作了。
IntPtr a = (IntPtr)(byte*)(thunkData);
string procName = Marshal.PtrToStringAnsi(new IntPtr(a.ToInt64() + 2));
【讨论】:
很高兴知道您找到了答案。我正在使用 Unity 开发 HoloLens 应用程序,VS 中的解决方案说目标框架是 .net 3.5。我可以在 Unity 编辑器中使用 gsdll64 没有问题,但是当我尝试在 UWP 应用程序 (gsdll32) 中导入 Dll 时,它返回一个 dllnotfound 异常。我在想这是因为幽灵脚本 dll 与 UWP 应用程序不兼容?不断研究这个以发现明确的答案。只是希望能和你联系,看看你是怎么做到的。谢谢! 我下载了源代码并将目标框架从 4.x 更改为 3.5。然后我修复了由于 4.x 特定代码而出现的所有错误。我认为这是唯一一个稍微难以修复的问题。 明白了。我最终获得了一个为 WinRT 编译的 gsdll32。不过感谢您的回复! 我忘了补充一点,当我尝试使用 Ghostscript NET 而不是 Ghostscript 时,它返回了大量错误,所以我只好放弃了以上是关于Ghostscript.net 多线程问题的主要内容,如果未能解决你的问题,请参考以下文章
如何获得有效的 x64 THREADSAFE Ghostscript DLL
如何使用 Ghostscript 和 Ghostscript .NET 通过嵌入 IIC 配置文件生成正确的 PDF/A