Ghostscript:ps2pdf 不适用于 Win 7 32 位
Posted
技术标签:
【中文标题】Ghostscript:ps2pdf 不适用于 Win 7 32 位【英文标题】:Ghostscript: ps2pdf doesn't work with Win 7 32-bit 【发布时间】:2012-04-29 10:36:00 【问题描述】:我有最新的 GPL Ghostscript v9.05,我在 Win 32 位系统上运行它。在我的 XP 机器上,这两个命令
ps2pdf -v -
和
rungs -v (used internally by TeXLive)
Ghostscript 9.05 报告如下:
GPL Ghostscript 9.05 (2012-02-08)
Copyright (C) 2010 Artifex Software, Inc. All rights reserved.
在另一台 Win 7 计算机上,命令
ps2pdf -v -
在命令行中不被识别为有效的ps2pdf
syntax,但rungs -v
工作正常。
我在互联网上阅读了有关在此处为 Ghostscript 设置临时目录的信息:
http://schlingel.bplaced.net/?p=54
它基本上说要编辑Ghostscript的lib
文件夹中的gssetgs.bat
文件并添加以下行:
set path=%ProgramFiles%\gs\gs9.02\lib;%ProgramFiles%\gs\gs9.02\bin;%windir%\SysWOW64
set TMP=%YOUR_TEMP%
set TEMP=%TMP%
在我的例子中,这需要通过将 9.02 替换为 9.05 来进行适当的修改。现在在 Win 7 上,关于临时文件夹的最后两行应该如何?我可以为Set TMP
提供如下:
set TMP=%"C:\Users\hihi\AppData\Local\Temp"%
语法正确吗?
我还将tmp
和temp
变量放在我的环境变量中。
更新
A.使用ps2pdf
,下面是我在我的Win 7 机器上将PS
转换为PDF
文件的方法,但出现错误:
C:\work\misc>ps2pdf -dNOSAFER -sDEVICE=pdfwrite -r720 -dCompatibilityLevel=1.5 -dUseFlateCompression=true -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true -dEPSCrop "%1.ps" "%1.pdf"
Unknown device:
Unrecoverable error: undefined in .uninstallpagedevice
Operand stack:
defaultdevice
注意:以上命令在我的 Win XP 机器上运行良好!
B.在这里使用gswin32c
是我如何在我的Win 7 机器上将PS
转换为PDF
文件,这工作:
C:\work\misc>gswin32c.exe -o "%1.pdf" -dNOSAFER -sDEVICE=pdfwrite -r720 dCompatibilityLevel=1.5 -dUseFlateCompression=true -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true -dNumRenderingThreads=2 -c "60000000 setvmthreshold" -f -dEPSCrop "%1.ps"
GPL Ghostscript 9.05 (2012-02-08)
Copyright (C) 2010 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Loading NimbusSanL-Regu font from %rom%Resource/Font/NimbusSanL-Regu... 2837152
1454727 4413848 3026018 1 done.
Loading Dingbats font from %rom%Resource/Font/Dingbats... 2837152 1510862 457461
6 3180865 1 done.
Loading NimbusSanL-Bold font from %rom%Resource/Font/NimbusSanL-Bold... 2857248
1553499 4655000 3251960 1 done.
注意:上面的命令在我的 Win XP 机器上也可以正常工作
总结:我的 Win 7 机器上的 ps2pdf
有问题。
新功能(2012 年 5 月 9 日)
当我按照 Ken 的建议 rem 最后两行时,我得到了这样的结果:
C:\work\misc>ps2pdf -dNOSAFER -r720 -dCompatibilityLevel=1.5 -dUseFlateCompression=true -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true -dEPSCrop "%1.ps" "%1.pdf"
Unrecoverable error: typecheck in .putdeviceprops
avoiding clean up
temp 文件夹有你提到的那些临时文件。
_.at
的内容:
-dCompatibilityLevel#1.4
-dNOSAFER
-r720
-dCompatibilityLevel
_.at2
的内容:
-q -P- -dSAFER -dNOPAUSE -dBATCH -sDEVICE#pdfwrite
-sOutputFile#-dUseFlateCompression
-dCompatibilityLevel#1.4
-dNOSAFER
-r720
-dCompatibilityLevel
-c .setpdfwrite -f1.5
5 月 11 日更新
注意:现在在我的 win 7 机器上运行良好
C:\work\misc>ps2pdf -dNOSAFER -r720 -dCompatibilityLevel#1.5 -dUseFlateCompression#true -dMaxSubsetPct#100 -dSubsetFonts#true -dEmbedAllFonts#true -dEPSCrop "defense.ps" "defense.pdf"
avoiding clean up
_.at
的内容:
-dCompatibilityLevel#1.4
-dNOSAFER
-r720
-dCompatibilityLevel#1.5
-dUseFlateCompression#true
-dMaxSubsetPct#100
-dSubsetFonts#true
-dEmbedAllFonts#true
-dEPSCrop
_.at2
的内容:
-q -P- -dSAFER -dNOPAUSE -dBATCH -sDEVICE#pdfwrite
-sOutputFile#"defense.pdf"
-dCompatibilityLevel#1.4
-dNOSAFER
-r720
-dCompatibilityLevel#1.5
-dUseFlateCompression#true
-dMaxSubsetPct#100
-dSubsetFonts#true
-dEmbedAllFonts#true
-dEPSCrop
-c .setpdfwrite -f"defense.ps"
谢谢。
【问题讨论】:
【参考方案1】:比临时文件问题更可能是您尝试写入目标文件的目录的权限。您引用的错误消息早在使用任何临时文件之前就出现了,但是如果您尝试写入不存在的目录或进程没有写入权限的目录,这是一个非常常见的错误。
首先要做的是发布您正在使用的实际 gswin32 命令行。
您查询的语法不正确。 %value% 是一个 Windows 脚本操作,它表示“用命名值替换 % 符号之间的内容”。所以如果我声明'set VAL=c:/temp' 然后我可以说'set NEWVAL=%VAL%/New' 这将使NEWVAL 'c:/temp/new'。您可以在 Windows 帮助中或通过快速 Google 找到有关 Windows 脚本的更多信息。
鉴于在您的 Windows 7 机器上找不到“ps2pdf”(这是一个 Windows 脚本)(至少我认为这就是您所说的“不被识别为有效的 ps2pdf 命令”的意思),它似乎确实就像您需要将 Ghostscript 路径添加到您的环境一样。简单地自行更改 gssetgs.bat 将无济于事,您需要确保从您的 autoexec.bat 脚本调用此脚本文件,以便应用其他环境设置。
如果您不确定 autoexec.bat 是什么或如何修改它,那么 Google 应该会很快为您提供帮助。
你是真的安装了 Ghostscript,还是简单地复制了它?
鉴于 Ghostscript 可以正常工作,问题一定出在 shell 脚本“ps2pdf”中,或者更准确地说,Windows 7 中的某些更改导致旧脚本无法正常工作。
这个脚本(不幸的是)比我想的要复杂得多(我没有写)。它实际上使用大约三个不同的脚本来完成这项工作。您确实需要找出发送给 GS 的内容。
可能最简单的方法是编辑“ps2pdfxx.bat”。在 :end 标签上,您会看到“rem Clean up”,后跟两行以“如果存在”开头。把rem放在那两个前面。添加一行“回显避免清理”文件的末尾应如下所示:
:结束 rem 清理。 rem 如果存在 "%TEMP%_.at" 擦除 "%TEMP%_.at" rem 如果存在 "%TEMP%_.at"2 擦除 "%TEMP%_.at"2 echo 避免清理
现在运行您的命令行(顺便说一下,您真的在使用 ps2pdf 时不需要输入 -sDEVICE=.....)
在您的 TEMP 目录中,您应该有名为 _.at 和可能的 _.at2 的文件,其中包含发送到 GS 的实际命令。
OK 文件_.at 被复制到文件.at2,然后.at2 被用作Ghostscript 的参数列表。评论你得到的文件:
---批处理文件ps2pdfxx.bat添加的这一行 -q -P- -dSAFER -dNOPAUSE -dBATCH -sDEVICE#pdfwrite
---这些行来自_.at -sOutputFile#-dUseFlateCompression -dCompatibilityLevel#1.4 -dNOSAFER -r720 -dCompatibilityLevel
--批处理文件ps2pdfxx.bat添加的这一行 -c .setpdfwrite -f1.5
这有很多问题:
-sOutputFile#-dUseFlateCompression
这实际上将输出文件设置为“-dUseFlateCompression”
-c .setpdfwrite -f1.5
我不完全确定这会做什么。它要么正确处理 -f 并终止 PostScript 输入,要么将其作为无法识别的开关忽略(可能是后者)。 '1.5' 应该 是输入文件名,没有那个 Ghostscript 不知道要使用哪个文件.....即使这样做,它也会尝试将输出写入虚假文件名.
老实说,我建议,如果您想设置所有这些开关,您只需直接调用 Ghostscript,而不是尝试使用该脚本。事实上,我还是建议这样做,每次看到这些脚本时,我都会更加不寒而栗。
ps2pdf 脚本所做的几乎所有事情都被您的命令行覆盖,或者一开始就不需要。
【讨论】:
@KenS 谢谢。是的,我完全安装了 Ghostscript 9.05 并在我的路径中有 lib 和 bin 文件夹,并且我已将 GS_LIB 变量设置为指向 lib 文件夹。 Gswin32c.exe 可从命令行识别。我已经用您要求的信息更新了我的帖子。 1 票赞成 OK 命令行不起作用,因为您没有指定输出文件名。与脚本不同,GS 需要您给它一个明确的名称。试试 "gswin32c..... -sOutputFile=%1.pdf .... %1.ps' 或者你可以使用 -o 开关,它还包括 -dNOPAUSE 和 -dBATCH。 @Ken S 谢谢。我已经做了一些测试并编辑了我的大部分帖子,并显示了我收到的错误消息。本质上,我可以让gwin32c
在我的 Win 7 机器上工作,但不能让ps2pdf
工作。然而,两者在我的 Win XP 机器上都运行良好。我在两台机器上都安装了相同的Ghostscript 9.05
。我试图让我的帖子更清晰。
看起来 Windows 7 Shell 命令“findstr”正在捕获 CompatibilityLevel=1.5 中的“=”。这导致脚本停止处理命令行开关,并将“1.5”视为输入文件名。我感觉这是 Windows 脚本的一个众所周知的问题,您应该在整个命令行中使用“#”而不是“=”。这可能会为您解决问题。
啊,好的,明白了。据我了解,GSView 通常会设置特定的页面大小,如果存在则由 DSC cmets 确定,如果不存在则为默认值。如果你这样做,那么你可能不会得到正确的答案。默认的 GS 行为是尊重文档中的媒体请求。在 GSView 中,这是您的“可变页面大小”,它仅表示“不指定页面大小”。请注意,尽管名称如此,GSView 由与 Ghostscript 不同的组织拥有和支持(令人困惑!)以上是关于Ghostscript:ps2pdf 不适用于 Win 7 32 位的主要内容,如果未能解决你的问题,请参考以下文章
Ghostscript ps2pdf 输出大小 555 点 x 555 点
python ghostscript:RuntimeError:找不到Ghostscript库(libgs)
如何使用 Ghostscript 在 Postscript 中导入 png 文件?
如何在ghostscript中将svg、eps和ai转换为png