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

时间:2018-06-06 22:27:11

标签: pdf ghostscript

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

请注意,自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的路径在批准列表(也称为权限列表)中。

在给定from the official documentation的情况下,以上示例中的-Id:/只是一种快速的技巧,可以确保您的路径的源路径在该列表中:

最后,将命令行中提供的路径(例如-I,-sFONTPATH参数中的路径)添加到允许的读取列表中。同样,初始化期间从Fontmap,cidfmap和特定于平台的字体文件枚举(例如Unix系统上的fontconfig)读取的路径会自动添加到允许读取列表中。

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

另一个令我惊讶的是

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

即在-I包含集中指定PDF的源路径,然后在PostScript命令中省略它, still 给了我/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和其他地方都讨论了很多讨论,包括各种bug跟踪器,但似乎所有地方都没有提到这一点,因为所有这些页面/条目都来自GhostScript 9.50和2019AD之前的版本。

引用from the 9.50 change notes

文件访问控制功能(通过-dSAFER启用)已被完全重写,并重新设计。有关更多详细信息,请参阅:SAFER。

请注意,-dSAFER现在仅启用文件访问控制,并且不再对标准Postscript功能施加限制(特别是对setpagedevice的限制)。如果您的应用程序依赖于这些Postscript限制,请参见OLDSAFER,并与我们取得联系,因为我们确实打算删除这些Postscript限制,除非我们有理由不这样做。

重要:默认情况下,文件访问控制已启用。为了在没有这些控件的情况下运行Ghostscript,请参见NOSAFER

Windows用户重要提示:请参见下文Incompatible Changes

SAFER的更改从2019-09-30(版本9.50)开始