7

我确实看到了“使用 GhostScript 将 PDF 转换为图像。不必创建图像文件”,但这只是(某种程度上)回答了我的一半问题。是否可以使用 GhostScriptSharp(或常规的 GhostScript dll)将 MemoryStream 中的 pdf 转换为 MemoryStream 中的 jpg?我谈到了使用 iTextSharp 动态填写的 pdf 表单,我已经将它定向到 MemoryStream 以保存到数据库或流式传输到 http 响应,如果我真的很想避免保存到文件(以及随后的清理)能够。

我引用的答案中的唯一答案声称必须使用 GhostScript dll 来完成后一部分,但很明显我需要做大量的工作才能弄清楚这意味着什么。有没有人有一个很好的资源可以帮助我完成这个旅程?

4

2 回答 2

3

Ghostscript.Net 是 Ghostscript dll 的包装器。它现在可以接受一个流对象,并且可以返回一个可以保存到流中的图像。这是我在 ASP 页面上用来从内存流生成 PDF 的示例。我还没有完全弄清楚处理ghostscript dll的最佳方法以及在服务器上的位置。

 void PDFToImage(MemoryStream inputMS, int dpi)
    {
        GhostscriptRasterizer rasterizer = null;
        GhostscriptVersionInfo version = new GhostscriptVersionInfo(
                                                                new Version(0, 0, 0), @"C:\PathToDll\gsdll32.dll", 
                                                                string.Empty, GhostscriptLicense.GPL);

        using (rasterizer = new GhostscriptRasterizer())
        {
            rasterizer.Open(inputMS, version, false);

            for (int i = 1; i <= rasterizer.PageCount; i++)
            {

                using (MemoryStream ms = new MemoryStream())
                {
                    Image img = rasterizer.GetPage(dpi, dpi, i);
                    img.Save(ms, ImageFormat.Jpeg);
                    ms.Close();

                    AspImage newPage = new AspImage();
                    newPage.ImageUrl = "data:image/png;base64," + Convert.ToBase64String((byte[])ms.ToArray());

                    Document1Image.Controls.Add(newPage);
                }

            }

            rasterizer.Close();
        }
    }
于 2015-05-07T10:38:13.890 回答
2

问题是,与 PostScript 语言不同,PDF 语言本质上需要随机访问文件。如果您将 PDF 直接提供给标准输入或通过 PIPE,Ghostscript 会在解释 PDF 之前将其复制到临时文件中。因此,将 PDF 作为 MemoryStream(或字节数组)传递是没有意义的,因为它在被解释之前无论如何都会在磁盘上结束。

看看Ghostscript.NET和它的“内存中”输出的GhostscriptRasterizer示例。

于 2014-01-04T15:34:27.043 回答