GhostscriptRasterizer对象返回0作为PageCount值

时间:2019-05-19 06:50:09

标签: c# ghostscript.net

            txtStatus.Text = "";
            if (!File.Exists(txtOpenLocation.Text))
            {
                txtStatus.Text = "File Not Found";
                return;
            }

            txtStatus.Text = "File Found";



            const string DLL_32BITS = "gsdll32.dll";
            const string DLL_64BITS = "gsdll64.dll";

            //select DLL based on arch
            string NomeGhostscriptDLL;
            if (Environment.Is64BitProcess)
            {
                NomeGhostscriptDLL = DLL_64BITS;
            }
            else
            {
                NomeGhostscriptDLL = DLL_32BITS;
            }




            GhostscriptVersionInfo gvi = new GhostscriptVersionInfo(NomeGhostscriptDLL);
            var rasterizer = new GhostscriptRasterizer();
            try
            {              
                rasterizer.Open(txtOpenLocation.Text, gvi, true);

                Console.WriteLine(rasterizer.PageCount); //This line always prints 0
            } catch(Exception er)
            {
                txtStatus.AppendText("\r\nUnable to Load the File: "+ er.ToString());
                return;
            }

我已经在它上面进行了搜索,但是没有解决方案,也没有关于rasterizer.Open()函数的有用文档。

无论我加载哪个pdf文件,Console.WriteLine(rasterizer.PageCount);总是打印0

txtStatus是UI中的多行文本框。 txtOpenLocation是用户界面中的另一个TextBox,用户无法编辑,其值由OpenFileDialog设置。

我正在使用Visual Studio 2019社区版。

另一个值得一提的观察结果–当我尝试使用Adobe Acrobat DC或Foxit Reader打开任何pdf文件时,对于我机器上的每个pdf文件,首先,阅读器崩溃,大约10到15秒钟内“无响应”秒,然后打开pdf文件。

6 个答案:

答案 0 :(得分:2)

昨天我遇到了同样的问题,我从这里https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs926/gs926aw32.exe下载了9.26版,并且可以使用!

我认为这是ghostscript 9.27发布的错误。

答案 1 :(得分:1)

我怀疑,这根本不是错误(我当然不相信它是Ghostscript错误),但可能是行为上的改变。由于报告了安全漏洞,Ghostscript开发人员已删除对许多非标准PostScript扩展(对Ghostscript唯一)的访问。最近已确保可以访问字典来处理PDF文件。

我怀疑Ghostscript.NET(不是由Ghostscript开发人员维护的)正在使用一个或多个非标准扩展来进行检索页数的工作。不知道当前到底使用了什么,我当然不能确定。

如果Ghostscript.NET的开发人员想与我们联系并确认这是问题所在,那么我们可以讨论当前支持的检索PDF文件中的页数的方法。

使用Ghostscript.NET向我发送项目完全没有帮助,因为我对此一无所知。我也不是C#或.NET开发人员,因此代码对我来说可能毫无意义。

Ghostscript在反向通道,stdout和/或stderr上返回大量信息。这些可以重定向到应用程序定义的数据接收器。我想Ghostscript.NET将为您提供检索这些信息的方法,如果您打算进行涉及Ghostscript的任何实际开发,那么我强烈建议您了解如何获取此信息。

当您说“ Ghostscript没有抛出错误”时,我认为您可能会混淆Ghostscript和Ghostscript.NET。没有看到Ghostscript的反向频道,我看不到如何分辨 Ghostscript 是否产生错误。

请注意,如果您打算分发您的应用程序,则必须遵守AGPL版本3(适用于Ghostscript的许可证)的条款,其中包括随附许可证的副本,以及一些向用户通知其使用地点的方法可以得到原件。

答案 2 :(得分:1)

此问题已在 GhostScript.NET 最新版本 v.1.2.2 中修复

修复是在版本超过 9.26 时停止使用 pdfdict 和 GS_PDF_ProcSet,因为出于安全原因,Ghostscript 团队将这两个函数设为私有。

答案 3 :(得分:0)

就像OP和该问题的主要答案一样,我昨天也遇到了这个确切的问题。

我只想补充一点,对我而言,建议的ghostscript版本(9.26)无法正常工作。它抱怨我应该使用64位版本。

对于那些需要的人,这里是:https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs926/gs926aw64.exe

我只能猜测URL。我对找到较旧版本有多么困难感到惊讶。

答案 4 :(得分:0)

我对GhostScript或PostScript不太熟悉,但是,我已经在使用gsapi执行函数的GhostScript.NET代码中找到了问题所在。正在执行且在gs上失败的功能位于GhostScript.NET项目上的文件GhostscriptViewerPdfFormatHandler.cs中。

通过进一步使用Oswaldo Cotes Solano推荐的gs9.26进行测试,并使用测试脚本将结果与gs9.52进行了比较,我发现GS_PDF_ProcSet导致了不可恢复的错误,退出代码1在gs 9.52上。

这会导致在使用gs9.52 API时失败,但是,这是由于gs9.27的设计来增加安全性。虽然不建议将-dNOSAFER用于可用于生产的应用程序,但它将使我们步入正轨。

在gs9.26中工作的预期执行和结果示例应类似于:

gswin32c.exe -q -dNOSAFER -sPDFname=c:/pdfs/test.pdf c:/pdfs/pdfpagecount.ps
Executing:
/GSNETViewer_PDFpage {
(%GSNET_VIEWER_PDF_PAGE: ) print dup == flush
pdfgetpage /Page exch store
Page /MediaBox pget
{ (%GSNET_VIEWER_PDF_MEDIA: ) print == flush  }
if
Page /CropBox pget
{ (%GSNET_VIEWER_PDF_CROP: ) print == flush }
if
Page /Rotate pget not { 0 } if
(%GSNET_VIEWER_PDF_ROTATE: ) print == flush
} def
Executing:
/Page null def
/Page# 0 def
/PDFSave null def
/DSCPageCount 0 def
Executing:
GS_PDF_ProcSet begin
pdfdict begin
Executing: (C:/pdfs/Output.pdf) (r) file runpdfbegin
Executing: /FirstPage where { pop FirstPage } { 1 } ifelse
Executing: /LastPage where { pop LastPage } { pdfpagecount } ifelse
Executing: flush (%GSNET_VIEWER_PDF_PAGES: ) print exch =only ( ) print =only (
) print flush
%GSNET_VIEWER_PDF_PAGES: 1 1
Executing: process_trailer_attrs

Executing: 1 GSNETViewer_PDFpage
%GSNET_VIEWER_PDF_PAGE: 1
%GSNET_VIEWER_PDF_MEDIA: [0.0 0.0 612.0 792.0]
%GSNET_VIEWER_PDF_CROP: [0.0 0.0 612.0 792.0]
%GSNET_VIEWER_PDF_ROTATE: 0
Executing: Page pdfshowpage_init pdfshowpage_finish
Loading NimbusSans-Regular font from %rom%Resource/Font/NimbusSans-Regular... 4124032 2548352 5183568 3818848 3 done.
showpage, press <return> to continue

在使用-dNOSAFER运行2.52的同时,还将-dNOSAFER参数添加到CLI以避免文件访问错误,而GhostScript.NET源则允许相同的功能。尽管-dNOSAFER选项不是理想的选择,并且可能存在漏洞,但为了进行测试而不用深入研究,我已使用此方法进行测试。

C:\Program Files\gs\-\bin>gswin64c.exe -q -dNOSAFER -sPDFname=test.pdf c:/pdfs/pdfpagecount.ps
Error: /undefined in GS_PDF_ProcSet
Operand stack:
Execution stack:
%interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1990   1   3   %oparray_pop   1989   1   3   %oparray_pop   1977   1   3   %oparray_pop   1833   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--
Dictionary stack:
--dict:738/1123(ro)(G)--   --dict:0/20(G)--   --dict:84/200(L)--
Current allocation mode is local
Current file position is 992
GPL Ghostscript 9.52: Unrecoverable error, exit code 1

最终只需对源的3个位置进行较小的更改,便可以使用9.52进行工作。我将对我们所做的更改进行一次pull-request,并在发出pull请求时更新社区,否则,您可以直接对我们的fork进行拉动。

答案 5 :(得分:0)

我遇到了同样的问题。我使用的是 c# (.NET) Ghostscript.NET(版本 1.2.3)。问题是 PDF 文件名。如果它有括号 ) 或 ( ,则会出现该问题。 我不得不重命名 PDF 文件以转义这些字符。

using Ghostscript.NET.Rasterizer;
var strFilePath = "C:\PdfFile(.pdf";

using (var rasterizer = new GhostscriptRasterizer())
{
    rasterizer.Open(strFilePath);
    var strPageCount = rasterizer.PageCount; //return 0
}

var pattern = "[^A-Za-z0-9 .-]+";
var regEx = new Regex(pattern);
strFilePath = regEx.Replace(strFilePath, "");

using (var rasterizer = new GhostscriptRasterizer())
{
    rasterizer.Open(strFilePath);
    var strPageCount1 = rasterizer.PageCount; //return number of pages
}