请注意,自 GhostScript 9.50 起,SAFER 模式已默认打开,导致类似 /invalidfileaccess 的错误,通过确保路径中的所有目录分隔符都是 / 正斜杠,这些错误不会消失,摆弄当前路径等
今天这花了我不少头发和几个小时,但是到 2020 年你需要做这样的事情:
解决方案 1:使用 --permit-file-read=<path> 将源路径添加到接受列表中,以使 /invalidfileaccess 消失
gs -q --permit-file-read=d:/ -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"
即确保您在 PostScript 命令/脚本中加载的 PDF 的路径在批准列表(也称为权限列表)中,using one of the --permit-file-xyz commandline arguments。
解决方案 2:使用 -I<path> 快速破解以使 /invalidfileaccess 消失
gs -q -Id:/ -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"
即确保您在 PostScript 命令/脚本中加载的 PDF 的路径在批准列表中,也就是权限列表。
上面示例中的-Id:/ 只是一个快速的技巧,以确保您的路径的源路径在该列表中,鉴于此位from the official documentation:
最后,命令行中提供的路径(如-I、-sFONTPATH 参数中的路径)被添加到允许阅读列表中。同样,在初始化期间从 Fontmap、cidfmap 和平台特定的字体文件枚举(例如 Unix 系统上的 fontconfig)读取的路径会自动添加到允许读取列表中。
注意/除了这样使用-I 时的期望:
对我来说另一个惊喜是
gs -q -I d:/ -dNODISPLAY -c "(test.pdf) (r) file runpdfbegin pdfpagecount = quit"
即在 -I 包含集中指定 PDF 的源路径,然后在 PostScript 命令中省略它,仍然给了我一个 /invalidfileaccess,所以请务必指定一个您正在加载的 PDF 的正确绝对路径。
注意事项
适用于 PostScript 脚本,而不是 -f 命令行
这个问题只发生在-c PostScript 命令中的文件加载,不在使用-f <file> 直接在命令行上指定的 PDF/PS 源文件。
如何检查这是否是您的实际问题
测试 1:在没有额外的 -I<path> 或 --permit-file-read=<path> 的情况下尝试相同的方法:错误是否返回?如果是,那么宾果游戏!
当这个命令行(注意缺少的-Id:/ 或--permit-file-read=d:/ 是唯一的变化):
gs -q -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"
给你“无效的文件访问”错误,如下所示:
Error: /invalidfileaccess in --file--
Operand stack:
(d:/test.pdf) (r)
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval--
Dictionary stack:
--dict:737/1123(ro)(G)-- --dict:0/20(G)-- --dict:75/200(L)--
Current allocation mode is local
Last OS error: Permission denied
GPL Ghostscript 9.52: Unrecoverable error, exit code 1
你很可能有a -dSAFER problem,这是通过上面将PDF源目录添加到接受的路径列表来修复的(另请参阅the GhostScript documentation at 'NOSAFER'及以后的内容,包括关于--permit-file-read=pathlist的部分等。
测试 2:当您使用-dNOSAFER 运行时,问题会消失吗?如果是,那么宾果游戏!
当这个命令行:
gs -q -dNOSAFER -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"
工作正常,那么这肯定表明您需要上述任一解决方案来消除/invalidfileaccess 错误。
警告:您在网上找到的旧答案可能不再有效
正如我在 SO 和其他地方看到的很多讨论,包括各种错误跟踪器,似乎没有人在任何地方提到这一点,因为所有这些页面/条目都来自 GhostScript 版本 9.50 和 2019AD 之前。
引用from the 9.50 change notes:
文件访问控制功能(通过-dSAFER 启用)已完全重写,并对设计进行了彻底的重新思考。有关详细信息,请参阅:更安全。
请务必注意,-dSAFER 现在仅启用文件访问控制,不再对标准 Postscript 功能施加限制(特别是对setpagedevice 的限制)。如果您的应用程序依赖这些 Postscript 限制,请参阅 OLDSAFER,并请与我们联系,因为我们确实计划删除这些 Postscript 限制,除非我们有理由不这样做。
重要提示:现在默认启用文件访问控制。要在没有这些控件的情况下运行 Ghostscript,请参阅 NOSAFER
Windows 用户重要提示:见下文Incompatible Changes
SAFER 更改是从 2019-09-30(版本 9.50)开始的