【发布时间】:2015-11-03 20:49:39
【问题描述】:
我正在使用Ghostscript.NET,这是一个方便的用于 Ghostscript 功能的 C# 包装器。我有一批从客户端发送的 PDF 文件被转换为 ASP .NET WebAPI 服务器上的图像并返回给客户端。
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 会有帮助吗?提前致谢。
【问题讨论】:
-
您可以在
pageAsImage上拨打Dispose在Add之后吗?不,线程不会帮助解决这个内存问题。是的,在 64 位进程中运行可能会有所帮助。如果这些都没有帮助,那么可能需要显式调用GC.Collect()(尽管这确实是一个糟糕的 hack)。 -
@ChrisO 谢谢,但处理它会使其在返回的对象中无法访问。尝试使用 64 位 dll 时出现此错误“您正在使用在 32 位进程中为 64 位系统编译的本机 Ghostscript 库 (gsdll64.dll)。您需要使用 gsdll32.dll。”知道为什么它是 32 位进程吗?我正在通过 Visual Studio 2015 中的调试运行 ASP .NET WebAPI。
-
Tools | Options | Projects and Solutions | Web Projects | Use the 64 bit version of IIS Express但我自己没有用 VS2015 尝试过。 -
自从切换到64位后,我没有遇到内存不足的异常。
-
太棒了,很高兴听到它。
标签: c# asp.net out-of-memory ghostscript ghostscript.net