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文件。
答案 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
}