gGt 一个输出文件,其中包含每个文件的 PDF 页数

gGt an output file with a count of PDF pages for each file with Ghostscript

此代码适用于我,除了我的所有文件都在网络驱动器上。在下面的示例中,仅当文件位于根目录 (c:\) 中时代码才有效。例如。

我是否必须将 input.pdf 替换为 d:\hello space folder\filefolder\input.pdf 之类的内容?我尝试了这个,但是发现了一大堆错误,说找不到目录。我尝试做 netuse 并映射网络主驱动器文件夹,但这也没有用。

gswin32c ^
  -q ^
  -dNODISPLAY ^
  -c "(input.pdf) (r) file runpdfbegin pdfpagecount = quit"

您不能在 PostScript 字符串中使用单个反斜杠,因为那是转义字符。对于路径定界符,您需要使用两个反斜杠 \ 来转义,或者使用正斜杠 /

请注意,自 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 command/script 中加载 的 PDF 的路径在批准列表 a.k.a 中。权限列表,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 command/script 中加载 的 PDF 的路径在批准列表 a.k.a 中。权限列表。

上面示例中的 -Id:/ 只是一个快速的 hack,以确保您的路径的源路径在该列表中,给定此位 from the official documentation:

Finally, paths supplied on the command line (such as those in -I, -sFONTPATH parameters) are added to the permitted reading list. Similarly, paths read during initialisation from Fontmap, cidfmap, and the platform specific font file enumeration (e.g. fontconfig on Unix systems) are automatically added to the permit read lists.

注意/除了像这样使用 -I 时的期望:

另一个令我惊讶的是

gs -q  -I d:/ -dNODISPLAY -c "(test.pdf) (r) file runpdfbegin pdfpagecount = quit"

即在 -I 包含集中指定 PDF 的源路径,然后在 PostScript 命令中 省略 它,still 给了我一个 /invalidfileaccess 所以请确保为您正在加载的 PDF 指定正确的绝对路径

备注

适用于 PostScript 脚本,不适用于 -f 命令行

只有在 -c PostScript 命令中加载文件时才会出现此问题,不会在 中使用 [=29= 在命令行上直接指定 PDF/PS 源文件].

如何检查这是否是您的实际问题

测试 1:在没有额外 -I<path>--permit-file-read=<path> 的情况下尝试相同的方法:是否出现错误 return?如果是,那么宾果!

当此命令行(注意缺少的 -Id:/--permit-file-read=d:/ 是唯一的变化时):

gs -q -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"

给出 "invalid file access" 错误,如:

   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 which is fixed by the above addition of the PDF source directory to the accepted paths list (see also 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 和其他地方看了很多讨论,包括各种错误追踪器,似乎没有人在任何地方提到这一点,因为所有这些 pages/entries 都来自 GhostScript 9.50 版和 2019AD 版之前。

引用 from the 9.50 change notes:

The file access control capability (enable with -dSAFER) has been completely rewritten, with a ground-up rethink of the design. For more details, see: SAFER.

It is important to note that -dSAFER now only enables the file access controls, and no longer applies restrictions to standard Postscript functionality (specifically, restrictions on setpagedevice). If your application relies on these Postscript restrictions, see OLDSAFER, and please get in touch, as we do plan to remove those Postscript restrictions unless we have reason not to.

IMPORTANT: File access controls are now enabled by default. In order to run Ghostscript without these controls, see NOSAFER

Important Note for Windows Users: See below under Incompatible Changes

SAFER 更改来自 2019-09-30(9.50 版)