我正在使用Ghostscript.NET,这是一个方便的Ghostscript功能的C#包装器。我有一批从客户端发送的PDF文件被转换为ASP .NET WebAPI服务器上的图像并返回给客户端。Ghostscript.NET光栅器内存不足
public static IEnumerable<Image> PdfToImagesGhostscript(byte[] binaryPdfData, int dpi)
{
List<Image> pagesAsImages = new List<Image>();
GhostscriptVersionInfo gvi = new GhostscriptVersionInfo(AppDomain.CurrentDomain.BaseDirectory + @"\bin\gsdll32.dll");
using (var pdfDataStream = new MemoryStream(binaryPdfData))
using (var rasterizer = new Ghostscript.NET.Rasterizer.GhostscriptRasterizer())
{
rasterizer.Open(pdfDataStream, gvi, true);
for (int i = 1; i <= rasterizer.PageCount; i++)
{
Image pageAsImage = rasterizer.GetPage(dpi, dpi, i); // Out of Memory Exception on this line
pagesAsImages.Add(pageAsImage);
}
}
return pagesAsImages;
}
这通常工作正常(我通常使用500 dpi,我知道是高的,但即使降到300我可以重现此错误)。但是,如果我从客户端提供很多PDF(例如,150页的1页PDF),它通常会遇到Ghostscript.NET Rasterizer中的“内存不足”异常。我该如何克服这一点?这应该通过?如果是这样会如何工作?它有助于使用64位版本的GhostScript吗?提前致谢。
你可以在'add'后调用'pageAsImage'上的Dispose吗?不,线程不会帮助解决这个内存问题。是的,在64位进程中运行可能会有所帮助。如果没有这些帮助,那么显式调用'GC.Collect()'可能是必要的(尽管这真是一个糟糕的破解)。 –
@ChrisO谢谢,但处置它使得它在返回的对象中无法访问。当试图使用64位DLL时,我得到这个错误“您正在使用原生Ghostscript库(gsdll64.dll)在32位进程中为64位系统编译,您需要使用gsdll32.dll。”任何想法为什么这是一个32位的过程?我在Visual Studio 2015中通过调试运行ASP .NET WebAPI。 –
'Tools |选项|项目和解决方案| Web项目|使用64位版本的IIS Express,但我没有尝试过VS2015。 –