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

How to read entire PDF with 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;

上面的实现生成了一个非常大的字符串,但是 'broken image' 图标显示在网页上。

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

此实现成功打开 windows 等于文档中的页数,但在除一个网页之外的所有网页上显示 pdf 的第一页。其余网页显示 'broken image' 图标。仅供参考,此方法打开的网页使用:

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

写入其设置正确的页面。

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

上传的文件大小限制为 5mb,我猜最大的 pdf 将有 5 页,但这不是问题。

我最终不得不在循环结束时关闭光栅器,并在循环开始时重新打开它。此实施有​​效:

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