内存流(pdf)转换为Ghostscript,再转换为内存流(jpg)

7
我看到了 "使用GhostScript将PDF转换为图像。无需创建图像文件", 但那只回答了我的问题的一半。是否有可能使用GhostScriptSharp(或常规GhostScript dll)将位于MemoryStream中的pdf转换为位于MemoryStream中的jpg? 我指的是一个动态填充的pdf表单,使用iTextSharp,我已经将其定向到MemoryStream以保存到数据库或流式传输到http响应,并且如果可能的话,我真的很想避免保存到文件(和随后的清理)。
在我引用的答案中,唯一的答案声称必须进入GhostScript dll 执行后半部分,但显然我需要做大量的工作才能弄清楚那意味着什么。是否有任何好资源可以帮助我完成这段旅程?

尝试将PDF打印成图像。我希望能给出答案,但我曾经大量使用PDF,甚至动态地填充图像,但由于每个操作都需要编码,因此在这里给出答案可能不仅需要编码工作,还需要了解您在PDF方面的情况。“使用iTextSharp动态填充的PDF表单”您是否将PDF压平?即使这也可能改变解决方案... - Pawel Cioch
请尝试使用https://dev59.com/SGkw5IYBdhLWcg3wHW7n。 - Pawel Cioch
你把PDF文件压平了吗?是的。 - Adam Miller
据我所知,在Ghostscript中没有办法将其输入设置为内存流,也无法直接将其输出到内存流中。您需要修改Ghostscript的源代码来实现这一点。 - yms
请注意,在商业闭源应用程序中免费使用Ghostscript可能是不合法的。 - yms
显示剩余2条评论
2个回答

4
PDF语言与PostScript语言不同,天生需要对文件进行随机访问。如果您直接将PDF提供给标准输入或通过管道传输,则Ghostscript在解释PDF之前会将其复制到临时文件中。因此,将PDF作为MemoryStream(或字节数组)传递毫无意义,因为它在被解释之前肯定会先存储到磁盘上。
请参考Ghostscript.NET及其GhostscriptRasterizer示例以获取“内存”输出。

2
在我看来,随机访问与此问题无关,因为您可以在内存流上进行随机访问。尽管我承认Ghostscript是一款很棒的软件,但它缺乏允许使用内存缓冲区作为输入/输出的API始终是一个缺点。 - yms

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();
        }
    }

如果不分离页面会怎样? - Emin Hasanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接