我正在使用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。 –