2015-06-05 100 views
1

我有一个Sharepoint应用程序,它使用Ghostscript.net包装器将pdf文档栅格化为png。现在我正在使用site中的示例。但我遇到的问题是,当我尝试同时转换为pdf文件时。使用此代码一次只能使用一个。但是,当我尝试同时转换2个pdf时,出现错误“调用'gsapi_new_instance'时出现错误:-100”。Ghostscript.net多线程问题

   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或浏览器实例,而不是?有没有人有这个代码的好例子?

回答

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)); 
+0

很高兴知道你找到了你的答案。我正在开发一个使用Unity的HoloLens应用程序,VS中的解决方案表示目标框架是.net 3.5。我可以在Unity Editor中使用gsdll64,但是当我尝试在UWP应用程序(gsdll32)中导入Dll时,它会返回dllnotfound异常。我在想这是因为ghost script dll与UWP应用程序不兼容? 不断研究这个发现确定的答案。只希望与您联系,看看您是如何做到的。谢谢! – jtth

+0

我下载了源代码并将目标框架从4.x改为3.5。然后我修复了由于4.x特定代码而出现的所有错误。我认为这是唯一难以解决的问题。 – RobbZ

+0

Gotcha。我最终获得了为WinRT编译的gsdll32。感谢您的回复! – jtth