如何使用GhostScript.NET阅读整个PDF

时间:2015-05-14 21:12:57

标签: asp.net ghostscript.net

我有一个向用户显示图像的网页。显示屏旨在确认用户已上传了正确的文档。由于安全性要求,我决定将图像嵌入到html中(这允许所有图像具有相同的URL)。我的应用程序允许使用几种不同类型的文件,但我的问题是使用pdf文件。

我正在使用Ghostscript.NET和Ghostscript来阅读我的pdf并将它们转换为图像,以便我可以嵌入它们。我的Ghostscript实现正在读取文件,但我只能显示第一页。我的问题:如何在一个页面或多个页面上显示整个pdf?

我试过了:

do
            {
                img = _rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber);
                img.Save(ms, ImageFormat.Png);
                imageBytes = ms.ToArray();
                returnString += Convert.ToBase64String(imageBytes);
                pageNumber++;

            } while (pageNumber <= _rasterizer.PageCount);

            _rasterizer.Close();
            ms.Close();

            return returnString;

上面的实现会生成一个非常大的字符串,但是,“图像已损坏”。图标显示在网页上。

        do
        {
            img = _rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber);
            img.Save(ms, ImageFormat.Png);
            imageBytes = ms.ToArray();
            Session["NextPage"] = Convert.ToBase64String(imageBytes);

            if (pageNumber > 1)
            {                  
                Response.Write("<script>");
                Response.Write("window.open('ImageDisplayMultiPage.aspx')");
                Response.Write("<" + "/script>");
            }
            else
            {
                Image3.ImageUrl = "data:image/png;base64," + Session["NextPage"];
            }

            pageNumber++;

        } while (pageNumber <= _rasterizer.PageCount);

        _rasterizer.Close();
        ms.Close();

此实现成功打开等于文档中页面数量的窗口,但在除一个网页外的所有页面上显示pdf的第一页。剩下的网页会显示“已损坏的图片”&#39;图标。仅供参考此方法打开使用的网页:

Image3.ImageUrl = "data:image/png;base64," + Session["NextPage"];

写入正确设置的页面。

同样,目标是将整个pdf转换为base64字符串。它可以显示在多个页面上,也可以显示在一个页面上。你知道怎么做吗?

上传到5mb时文件大小有限,我猜最大的pdf将是5页,但这并不是一个问题。

1 个答案:

答案 0 :(得分:0)

我最终不得不在循环结束时关闭光栅化器并在循环开始时重新打开它。这个实现正在运行:

        List<string> pagesOfPDF = new List<string>();

        MemoryStream ms = new MemoryStream();
        _rasterizer.Open(inputPdfPath, localDllInfo, false);
        int numberOfPages = _rasterizer.PageCount;
        _rasterizer.Close();

        for (int pageNumber = 1; pageNumber <= numberOfPages; pageNumber++)
        {
            _rasterizer.Open(inputPdfPath, localDllInfo, false);
            ms = new MemoryStream();
            img = null;
            string returnString;
            img = _rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber);
            img.Save(ms, ImageFormat.Png);
            imageBytes = ms.ToArray();

            returnString = Convert.ToBase64String(imageBytes);
            pagesOfPDF.Add(returnString);
            ms.Close();
            _rasterizer.Close();
        }

        foreach (string image in pagesOfPDF)
        {
            imageDisplay.Controls.Add(new HtmlImage()
            {
                Src = "data:image/png;base64," + image,
                Alt = ""
            });
        }

        ms.Close();