我拥有最新的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语法,但是rungs -v 可以正常工作

我已经在互联网上阅读了有关在此处为Ghostscript设置临时目录的信息:

http://schlingel.bplaced.net/?p=54

它说基本上是编辑Ghostscript的gssetgs.bat文件夹中的lib文件并添加以下行:
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"%

这是正确的语法吗?

我还把tmptemp变量放在我的环境变量中。

更新

答:使用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"

谢谢。

最佳答案

比临时文件问题更有可能是您尝试写入目标文件的目录的权限。您引用的错误消息很早就出现在使用任何临时文件之前,但是如果您尝试写入一个不存在的目录或该进程没有写权限的目录,这是一个非常常见的错误。

首先要做的就是发布您正在使用的实际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',后面是两行,以'if exist'开始。把rem放在那两个的前面。添加一行,写着“回声避免清理”,文件末尾应如下所示:

:结尾
雷姆清理。
rem如果存在“%TEMP%_。at”,则擦除“%TEMP%_。at”
rem如果存在,则“%TEMP%_。at” 2擦除“%TEMP%_。at” 2
回声避免清理

现在运行您的命令行(通过使用ps2pdf .....,您真的不需要放-sDEVICE =。)

在您的TEMP目录中,应该有一个名为_.at的文件,也可能是_.at2的文件,其中将包含发送到GS的实际命令。

好的,将文件_.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脚本正在执行的几乎所有操作都已被您的命令行覆盖,或者根本不需要。

10-04 19:22