【问题标题】:GhostscriptRasterizer.PageCount always returns zeroGhostscriptRasterizer.PageCount 始终返回零
【发布时间】:2019-08-29 11:39:35
【问题描述】:

这里已经讨论过这个问题:GhostscriptRasterizer Objects Returns 0 as PageCount value 但是这个问题的答案并没有帮助我解决问题。

就我而言,从 kat 到旧版本的 Ghostscript 并没有帮助。 26 和 25。我的 PageCount = 0,如果版本低于 27,我会收到错误“未找到本机 Ghostscript 库。”

private static void PdfToPng(string inputFile, string outputFileName)
            {
                var xDpi = 100; //set the x DPI
                var yDpi = 100; //set the y DPI
                var pageNumber = 1; // the pages in a PDF document

                 using (var rasterizer = new GhostscriptRasterizer()) //create an instance for GhostscriptRasterizer
                 {

                         rasterizer.Open(inputFile); //opens the PDF file for rasterizing

                        //set the output image(png's) complete path
                        var outputPNGPath = Path.Combine(outputFolder, string.Format("{0}_Page{1}.png", outputFileName,pageNumber));

                        //converts the PDF pages to png's 
                        var pdf2PNG = rasterizer.GetPage(xDpi, yDpi, pageNumber);

                        //save the png's
                        pdf2PNG.Save(outputPNGPath, ImageFormat.Png);

                        Console.WriteLine("Saved " + outputPNGPath);
                 }


            }

【问题讨论】:

    标签: c# ghostscript.net


    【解决方案1】:

    我在同样的问题上苦苦挣扎,最后使用iTextSharp 只是为了获取页数。下面是来自生产代码的 sn-p:

    using (var reader = new PdfReader(pdfFile))
    {
        //  as a matter of fact we need iTextSharp PdfReader (and all of iTextSharp) only to get the page count of PDF document;
        //  unfortunately GhostScript itself doesn't know how to do it
        pageCount = reader.NumberOfPages;
    }
    

    不是一个完美的解决方案,但这正是解决我的问题的原因。我把那条评论留在那里提醒自己,我必须以某种方式找到更好的方法,但我从来没有费心回来,因为它工作得很好......

    PdfReader 类在iTextSharp.text.pdf 命名空间中定义。

    我使用Ghostscript.NET.GhostscriptPngDevice 而不是GhostscriptRasterizer 来栅格化PDF 文档的特定页面。

    这是我将页面光栅化并将其保存到 PNG 文件的方法

    private static void PdfToPngWithGhostscriptPngDevice(string srcFile, int pageNo, int dpiX, int dpiY, string tgtFile)
    {
        GhostscriptPngDevice dev = new GhostscriptPngDevice(GhostscriptPngDeviceType.PngGray);
        dev.GraphicsAlphaBits = GhostscriptImageDeviceAlphaBits.V_4;
        dev.TextAlphaBits = GhostscriptImageDeviceAlphaBits.V_4;
        dev.ResolutionXY = new GhostscriptImageDeviceResolution(dpiX, dpiY);
        dev.InputFiles.Add(srcFile);
        dev.Pdf.FirstPage = pageNo;
        dev.Pdf.LastPage = pageNo;
        dev.CustomSwitches.Add("-dDOINTERPOLATE");
        dev.OutputPath = tgtFile;
        dev.Process();
    }
    

    希望对您有所帮助...

    【讨论】:

    • 事实上,当我自己指定 pageNumber = 1 时,GetPage (xDpi, yDpi, pageNumber) 方法不仅不能为我确定页数,而且对我有效。
    • 很抱歉,我不太确定我是否完全理解您。你能澄清一下 - 你的代码行 var pdf2PNG = rasterizer.GetPage(xDpi, yDpi, pageNumber); 是否与 pageNumber == 1 一起工作?
    • 好吧,显然我误解了你最初的问题。我认为你的问题是你总是从 rasterizer.PageCount 获得 0,如所提到的主题 (stackoverflow.com/questions/56205425/…) 中所述,我刚刚检查了我的代码,似乎我也遇到了 rasterizer.GetPage(xDpi, yDpi, pageNumber 调用的问题。可能这就是我最终使用Ghostscript.NET.GhostscriptPngDevice 而不是GhostscriptRasterizer 的原因。
    • 我将更新我的答案,并在其中包含我的名为PdfToPngWithGhostscriptPngDevice 的方法,该方法显然完全符合您的目标。希望这会有所帮助...
    • Alexander,如何使用 GhostscriptPngDevice 将 pdf 文件的页面转换为内存,即不将生成的 png 文件保存到磁盘,例如获取字节数组?
    猜你喜欢
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2019-09-10
    • 2020-09-10
    相关资源
    最近更新 更多