首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ghostscript.NET光栅化器内存不足

Ghostscript.NET光栅化器内存不足
EN

Stack Overflow用户
提问于 2015-11-04 04:49:39
回答 2查看 2.9K关注 0票数 4

我使用的是Ghostscript.NET,一个方便的C#包装器,用于Ghostscript功能。我有一批的PDF是从客户端发送,以转换为图像上的ASP .NET WebAPI服务器,并返回给客户端。

代码语言:javascript
复制
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;
}

这通常工作得很好(我通常使用500dpi,我知道这很高,但即使降到300,我也可以重现这个错误)。但是,如果我从客户端给它许多PDF(例如,150个1页PDF),它经常会在Ghostscript.NET光栅化器中遇到内存不足的异常。我该如何克服这个问题呢?这应该被线程化吗?如果是这样的话,它是如何工作的?使用64位版本的GhostScript会有帮助吗?提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2015-12-23 06:14:26

我自己也是新手,在这里寻找技术。

根据documentation here中的示例,它们显示:

代码语言:javascript
复制
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);
}

看起来你没有保存你的文件。

我仍然在努力让类似的东西在我这一端也能工作。目前,我有两个方法要尝试,首先使用GhostscriptProcessor

代码语言:javascript
复制
private static void GhostscriptNetProcess(String fileName, String outputPath)
{
    var version = Ghostscript.NET.GhostscriptVersionInfo.GetLastInstalledVersion();
    var source = (fileName.IndexOf(' ') == -1) ? fileName : String.Format("\"{0}\"", fileName);
    var gsArgs = new List<String>();
    gsArgs.Add("-q");
    gsArgs.Add("-dNOPAUSE");
    gsArgs.Add("-dNOPROMPT");
    gsArgs.Add("-sDEVICE=pdfwrite");
    gsArgs.Add(String.Format(@"-sOutputFile={0}", outputPath));
    gsArgs.Add(source);
    var processor = new Ghostscript.NET.Processor.GhostscriptProcessor(version, false);
    processor.Process(gsArgs.ToArray());
}

下面的版本与你的类似,我开始使用的版本,直到我开始寻找其他代码示例:

代码语言:javascript
复制
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);
        }
    }
}

这对你有什么帮助吗?

票数 0
EN

Stack Overflow用户

发布于 2020-05-22 21:49:46

您不必栅格化同一GhostscriptRasterizer实例中的所有页面。在每个页面上使用一次性光栅化器,并在List Image或List byte[]中收集结果。Jpeg编码字节数组结果列表的示例。

代码语言:javascript
复制
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());
            }
        }
    }
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33508801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档