【问题标题】:gGt an output file with a count of PDF pages for each file with GhostscriptgGt 使用 Ghostscript 为每个文件计算 PDF 页面数的输出文件
【发布时间】:2018-06-06 22:27:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: pdf ghostscript


    【解决方案1】:

    请注意,自 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)开始的

    【讨论】:

    • -dNOSAFER 可能是最好的选择
    【解决方案2】:

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

    【讨论】:

    • 抱歉,我是 ghostscript 新手。您能在上面的代码中说明您的意思吗?
    • (d:/hello 空间文件夹/filefolder/input.pdf)
    • 非常感谢!这确实有效!这是供人们参考的最终脚本。 NET USE u: /DELETE NET USE u: "YOUR PATH" /PERSISTENT:YES NET USE b: /DELETE NET USE b: "PATH FOR LOG FILE" /PERSISTENT:YES CHCP 1252 > NULL "c:\program files (x86 )\gs\gs8.70\bin\gswin32c" -q -dNoDisplay -c "('u:/some folder/filename.pdf') (r) file runpdfbegin pdfpagecount = quit" > b:\filenamepages.txt跨度>
    猜你喜欢
    • 2014-07-17
    • 2014-06-29
    • 2011-09-21
    • 1970-01-01
    • 2021-12-28
    • 2017-01-02
    • 1970-01-01
    • 2017-06-02
    • 2011-11-19
    相关资源
    最近更新 更多