使用ghostscript时如何使用不带扩展名的输入文件名附加输出文件名?

Posted

技术标签:

【中文标题】使用ghostscript时如何使用不带扩展名的输入文件名附加输出文件名?【英文标题】:How to append output file name using input file name without extention while using ghostscript? 【发布时间】:2019-05-17 09:46:45 【问题描述】:

我使用 GS 来“压缩”PDF,点击 2 次。我已经使用上述代码在 Windows 寄存器中添加了一个上下文菜单。

例如,如果我在 test.pdf 上使用它,则输出文件将为 test.pdf-compressed.pdf。它有效,但我想摆脱文件名中的扩展名。有什么办法吗?

我尝试使用 cmd 参数,但它似乎不适用于 postscript。

C:\Program Files\gs\gs9.27\bin\gswin64c.exe -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dCompatibilityLevel=1.4 -sOutputFile=%1%-compressed.pdf -c .setpdfwrite -f %1

【问题讨论】:

【参考方案1】:

这不是 Ghostscript 问题。如果你得到正确的参数,那么传递给 Ghostscript 的参数就是正确的,输出文件就是你想要的。

您还没有说出您尝试过的内容,因此很难提出建议。但是,您应该能够使用 %~dp1 和/或 %~n1 而不是简单地 %1 来扩展为仅路径或文件。还有其他变体,在 Windows 命令行中键入“帮助”将为您提供更多详细信息。

请注意,Ghostscript 始终不会压缩 PDF 文件,通过使用 -dPDFSETTINSG=/ebook,您正在生成一个全新的 PDF 文件,该文件已更改了原始内容(例如,图像将被下采样)。

另外,序列-c .setpdfwrite -f 已经冗余多年了,你不需要它。

[编辑]

此批处理文件演示了在批处理文件中使用命令 shell 变量扩展

@ECHO OFF
ECHO Input file is %1
ECHO Input directory is %~dp1

\ghostpdl\debugbin\gswin32c -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=%~dp1\new.pdf %1

当保存为 test.bat 然后 test d:\temp\input.ps 会生成以下输出:

Input file is d:\temp\input.ps
Input directory is d:\temp\
GPL Ghostscript GIT PRERELEASE 9.28 (2019-04-04)
Copyright (C) 2019 Artifex Software, Inc.  All rights reserved.
This software is supplied under the GNU AGPLv3 and comes with NO WARRANTY:
see the file COPYING for details.

并且在目录 d:\temp 中创建了一个文件 new.pdf

所以变量扩展按预期工作,因为它发生在命令行执行之前。

如果它仍然不适合您,那么您将不得不提供更多信息。在你的位置,我将从命令行中删除 -dNOPAUSE 和 -dBATCH 开关开始,至少这样你就可以看到 Ghostscript 是否试图告诉你一些事情。

【讨论】:

->你还没有说你试过什么[...]“我试过使用 cmd 参数”也就是说你提到的 %~dp1 等,它确实做到了不工作。这就是我在这里的原因。我试过-sOutputFile=%~dp1\test1.pdf 只是为了看看它是否可以正确地获取文件路径。它不起作用。同时它在我使用 | 时有效夹子。 ```sOutputFile= -> 请注意,Ghostscript 不会压缩我知道的 PDF 文件。这就是为什么我把压缩这个词变成昏迷。但无论如何,谢谢。 -> 序列 -c .setpdfwrite -f 多年来一直是多余的,你不需要它。这很有用。谢谢。 您实际上并没有说您尝试过 %~dp1,您只是说“命令参数”,这可能意味着几乎任何东西。你是什​​么意思'没有工作'? Gort 一个错误,产生了一个你没想到的文件名(如果是这样呢?),还有别的吗?我不知道你说“我只是在使用 | 剪辑”是什么意思。 当我尝试使用-sOutputFile=%~dp1\test1.pdf 时,会出现一个空的命令行窗口并立即关闭。没有错误消息,没有生成文件。另外,我对 sOutPutfile 做了一些研究,它似乎需要一个特定的参数类型。这就是为什么我认为它实际上与幽灵脚本有关。 好吧,我不同意你的看法。命令扩展在参数传递给 Ghostscript 之前完成(或者如果您使用批处理文件)。为了使用它必须的shell扩展,Ghostscript本身并不理解Windows命令shell变量扩展,因为它是一个跨平台的应用程序。我已经用批处理文件修改了我的答案,以证明我的意思。请注意,通过使用 -dNOPAUSE 和 -dBATCH,命令窗口打开和关闭也就不足为奇了。您已经告诉 Ghostscript 不要在页面之间暂停,并在完成时退出,所以它就是这样做的。 非常感谢您的帮助。阅读您的示例后,我尝试了以下命令:gswin64c -sDEVICE=pdfwrite -sOutputFile=%~dp1\new.pdf %1 我已确保删除 -dNOPAUSE 和 -dBATCH。但是 cmd 窗口会立即关闭。【参考方案2】:

显然我发现这篇文章有点晚了。 但是,我想发布我的答案,以防将来有人来寻找类似问题的解决方案。

我首先在我的桌面上创建了一个名为“PDF”的新文件夹,并在其中放置了“test.pdf”文件。 然后,我创建了一个名为“CompressPDF.bat”的 .BAT 文件,并在其中添加了下面的脚本。

此脚本将循环并压缩放置在“PDF”文件夹中的任何/所有 .PDF 文件。 然后,根据 OP 的请求,它将“-compressed.pdf”字符串正确附加到文件名,从而将“test.pdf”文件保存为“test-compressed.pdf”。

您会注意到,我在脚本的最后添加了“PAUSE”命令。 这将使窗口不会自动关闭,直到您按下任意键,这将允许您查看压缩过程中可能出现的任何错误。

@echo off
cd "%USERPROFILE%\Desktop\PDF"
for %%f in (*.pdf) do (
    gswin64c.exe -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile="%%~nf-compressed.pdf" "%%f"
)
PAUSE

我希望这篇文章能够帮助其他人,他们可能正在寻找类似问题的答案。

如果有人有任何问题,请随时回复或与我联系,因为我总是很乐意提供帮助。

【讨论】:

以上是关于使用ghostscript时如何使用不带扩展名的输入文件名附加输出文件名?的主要内容,如果未能解决你的问题,请参考以下文章

Ghostscript 如何支持 PMingLiU?

使用 Ghostscript 渲染空白页

使用记录的 ghostscript 语法时,在 ghostscript 中不断收到错误消息

使用 ghostscript 创建 pdf 文件

如何使用 Ghostscript 和 Ghostscript .NET 通过嵌入 IIC 配置文件生成正确的 PDF/A

打印时出现 GhostScript 图像质量问题