Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ghostscript.NET光栅化器内存不足_C#_Asp.net_Out Of Memory_Ghostscript_Ghostscript.net - Fatal编程技术网

C# Ghostscript.NET光栅化器内存不足

C# Ghostscript.NET光栅化器内存不足,c#,asp.net,out-of-memory,ghostscript,ghostscript.net,C#,Asp.net,Out Of Memory,Ghostscript,Ghostscript.net,我正在使用一个方便的C#包装器来实现Ghostscript功能。我从客户端发送了一批PDF,将其转换为ASP.NETWebAPI服务器上的图像并返回到客户端 public static IEnumerable<Image> PdfToImagesGhostscript(byte[] binaryPdfData, int dpi) { List<Image> pagesAsImages = new List<Image>(); Ghostscr

我正在使用一个方便的C#包装器来实现Ghostscript功能。我从客户端发送了一批PDF,将其转换为ASP.NETWebAPI服务器上的图像并返回到客户端

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;
}
公共静态IEnumerable PdfToImagesGhostscript(字节[]二进制PDFDATA,整数dpi)
{
List pagesAsImages=新列表();
GhostscriptVersionInfo gvi=新的GhostscriptVersionInfo(AppDomain.CurrentDomain.BaseDirectory+@“\bin\gsdll32.dll”);
使用(var pdfDataStream=newmemoryStream(binaryPdfData))
使用(var rasterizer=new Ghostscript.NET.rasterizer.GhostscriptRasterizer())
{
光栅化器打开(pdfDataStream,gvi,true);

对于(inti=1;i我自己对这是一个新手,在这里寻找技术

根据文档中的示例,它们显示:

for (int page = 1; page <= _rasterizer.PageCount; page++)
{
    var docName = String.Format("Page-{0}.pdf", page);
    var pageFilePath = Path.Combine(outputPath, docName);
    var pdf = _rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber);
    pdf.Save(pageFilePath);
    pagesAsImages.Add(pdf);
}

for(int page=1;page您不必在同一GhostscriptRasterizer实例中对所有页面进行光栅化。在每个页面上使用一次性光栅化器,并在列表图像或列表字节[]中收集结果。
带有Jpeg编码字节数组结果列表的示例

List<byte[]> result = new List<byte[]>();

for (int i = 1; i <= pdfPagesCount; i++)
{
    using (var pageRasterizer = new GhostscriptRasterizer())
    {
        pageRasterizer.Open(stream, gsVersion, true);

        using (Image tempImage = pageRasterizer.GetPage(dpiX, dpiY, i))
        {
            var encoder = ImageCodecInfo.GetImageEncoders().First(c => c.FormatID == System.Drawing.Imaging.ImageFormat.Jpeg.Guid);
            var encoderParams = new EncoderParameters() { Param = new[] { new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 95L) } };

            using (MemoryStream memoryStream = new MemoryStream())
            {
                tempImage.Save(memoryStream, encoder, encoderParams);
                result.Add(memoryStream.ToArray());
            }
        }
    }
}
列表结果=新列表();
for(int i=1;ic.FormatID==System.Drawing.Imaging.ImageFormat.Jpeg.Guid);
var encoderParams=new EncoderParameters(){Param=new[]{new EncoderParameter(System.Drawing.Imaging.Encoder.Quality,95L)};
使用(MemoryStream MemoryStream=new MemoryStream())
{
保存(内存流、编码器、编码器参数);
添加(memoryStream.ToArray());
}
}
}
}

如果您不知道PDF中的页数,您可以一次性调用光栅化器,并获取PageCount属性。

pageAsImage
之后,您可以调用
Dispose
上的
Dispose
?否,线程将无法解决此内存问题。是的,在64位进程中运行可能会有所帮助。如果没有这些帮助,请显式调用可能需要对GC.Collect()
进行加密(尽管这是一个很糟糕的黑客行为)。@ChrisO感谢您,但如果对其进行处理,则会使其在返回的对象中无法访问。当尝试使用64位dll时,我会收到以下错误:“您使用的是在32位进程中为64位系统编译的本机Ghostscript库(gsdl64.dll)。您需要使用gsdll32.dll。”知道为什么它是32位进程吗?我正在Visual Studio 2015中通过调试运行ASP.NET WebAPI。
工具|选项|项目和解决方案| Web项目|使用64位版本的IIS Express
,但我自己还没有在VS2015中尝试过。自从切换到64位后,我没有遇到内存不足的异常。太棒了,很高兴见到您听着。我正试图从pdf文档中获取特定页面,这是第一次,这没问题,但当我试图从该pdf文档中获取另一个页面时,内存不足
错误阻止我。两天来我一直在尝试解决它,几乎我尝试了所有的解决方案,但还没有成功。任何帮助都将非常感谢。@metmirr-这是一份合同工作,我工作过的最好的代码段发布在这里:如果你有一台32位电脑或者你的程序使用32位插件,你能访问的最大文件大小是2GB。
private static void GhostscriptNetRaster(String fileName, String outputPath)
{
    var version = Ghostscript.NET.GhostscriptVersionInfo.GetLastInstalledVersion();
    using (var rasterizer = new Ghostscript.NET.Rasterizer.GhostscriptRasterizer())
    {
        rasterizer.Open(File.Open(fileName, FileMode.Open, FileAccess.Read), version, false);
        for (int page = 0; page < rasterizer.PageCount; page++)
        {
            var img = rasterizer.GetPage(96, 96, page);
            img.Save(outputPath);
        }
    }
}
List<byte[]> result = new List<byte[]>();

for (int i = 1; i <= pdfPagesCount; i++)
{
    using (var pageRasterizer = new GhostscriptRasterizer())
    {
        pageRasterizer.Open(stream, gsVersion, true);

        using (Image tempImage = pageRasterizer.GetPage(dpiX, dpiY, i))
        {
            var encoder = ImageCodecInfo.GetImageEncoders().First(c => c.FormatID == System.Drawing.Imaging.ImageFormat.Jpeg.Guid);
            var encoderParams = new EncoderParameters() { Param = new[] { new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 95L) } };

            using (MemoryStream memoryStream = new MemoryStream())
            {
                tempImage.Save(memoryStream, encoder, encoderParams);
                result.Add(memoryStream.ToArray());
            }
        }
    }
}