7
            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() 函数的有用文档。

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

txtStatus是 UI 中的多行文本框。txtOpenLocation是 UI 中的另一个 TextBox,用户不可编辑,其值由OpenFileDialog.

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

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

4

6 回答 6

20

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

我认为这是 ghostscript 9.27 版本的错误。

于 2019-05-19T15:10:24.030 回答
4

我怀疑这根本不是一个错误(我当然不相信它是一个 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 的许可证)的条款,其中包括发送许可证副本,以及通知用户在哪里可以获得原来的。

于 2019-05-19T15:27:52.500 回答
3

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

我只想为我补充一点,建议的 ghostscript 版本(9.26)不起作用。它抱怨我应该使用 64 位版本。

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

我只需要猜测 URL。我很惊讶找到旧版本有多么困难。

于 2019-05-21T03:00:49.210 回答
1

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

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

于 2021-02-05T18:36:56.027 回答
0

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

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

这会在使用 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 的工作解决方案。我将对我们的更改进行拉取请求,并在发布拉取请求时更新社区,否则,您可以直接拉取我们的分叉。

于 2020-08-09T08:35:14.440 回答
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
}
于 2021-07-26T11:01:18.083 回答