当我通过gs将.pdf转换为.ps时出现问题

时间:2019-03-15 06:58:30

标签: pdf ghostscript postscript

我有一个PDF文件,我想将其转换为PS文件,然后执行以下命令

# file d00137-001
/var/spool/cups/d00137-001: PDF document, version 1.4
# gs -dBATCH -dNOPAUSE -q -sDEVICE=ps2write -sOutputFile=d00130 d00137-001

然后,我看到很多错误输出:

**** Error: File has an unbalanced >> (close dictionary).
            Output may be incorrect.
**** Error: obj definition followed by multiple tokens, attempting to recover.
           Output may be incorrect.
**** Error: obj definition followed by multiple tokens, attempting to recover.

......    /* Skip 11 lines of the same output */

**** Error: Tf refers to a resource key with an invalid value type: marktype. Assuming resource key: F7 is a font name.
           Output may be incorrect.
**** Error: Tf refers to a resource key with an invalid value type: marktype. Assuming resource key: F7 is a font name.
           Output may be incorrect.
......    /* Skip 11 lines of the same output */

# file d00130
/var/spool/cups/d00130: PostScript document text conforming DSC level 3.0, Level 2
# ls -l d00130 d00137-001 
-rw-r--r-- 1 root root 203745 3月  15 14:27 d00130
-rw-r----- 1 root lp     6565 3月  15 14:27 d00137-001

但是当我通过证据查看或通过HP打印机进行打印时,我看到d00130是空白文档。 PDF文件格式是否存在问题,还是需要调整命令参数?但是可以打开原始PDF文件进行查看或打印。

非常感谢。

如果您需要原始的PDF文件,可以留下您的电子邮件,我会发送给您。

再次感谢。

1 个答案:

答案 0 :(得分:0)

  

我认为这个问题是gs找不到我使用的中文字体。

这似乎很有可能。如果Ghostscript找不到字体,则它将使用替代品替换丢失的字体。根据多种因素,它将选择它认为合适的字体。我不会声称无法克服它,而是会出错,但是对我来说似乎不太可能。

  

此字体路径为/usr/share/fonts/truetype/yozo/yzdwkj6.ttf,我尝试添加它   /usr/share/ghostscript/9.22/Resource/Init/cidfmap的字体,

好,所以它不是 Font ,也不是 CIDFont ,两者之间存在显着差异。

  

但PDF文件具有   在下面的行:/ BaseFont / Yozo Kai。我该怎么做,说明信息是>两字字体?

我假设您的意思是2字节编码。答案是您只需要添加一个名为“ Yozo Kai”的CIDFont。但是,...在字体名称中使用空格是一个非常糟糕的主意,因为空格是PostScript和PDF中的定界符,因此您在上面发布的行在技术上是无效的。

PDF文件实际上不是创建包含键/BaseFont和值/Yozo Kai的字典,而是创建包含键/BaseFont和值/Yozo并带有键的字典。备用字符串Kai留在身边。这意味着字典中没有偶数个条目,因此是非法的。在这种情况下发生的确切情况尚不确定。

请注意,由于我没有#查看PDF文件,因此我按原样说了这句话,但这是错误消息:

  

****错误:文件的不平衡>>(关闭词典)。               输出可能不正确。

我是正确的,条目的数量甚至没有,因此Ghostscript吃掉了结尾>>,然后抱怨,因为它找不到结尾的字典标记。

  

如果我使用以下脚本描述此字体,则打印驱动程序将   输出过滤器日志失败。

     

/ Yozo Kai << / FileType / TrueType / Path pssystemparams   / GenericResourceDir get(/usr/share/fonts/truetype/yozo/yzdwkj6.ttf)   concatstrings / CSI [(GB1)5] >>;

同样的原因,您不能创建一个包含这样的空格的名称,因为空格是分隔符。在PostScript(cidfmap的定义方式)中,您可以执行以下操作:

(Yozo Kai) cvn <</FileType...... ...../CSI [(GB1) 5] >> ;

请注意,我仍然对您在其中的路径感到怀疑,因为这会将Ghostscript通用资源目录与“ usr / share / ...”串联在一起,这对我来说似乎不太正确。我怀疑您只是想/Path (/usr/share/fonts/truetype/yozo/yzdwkj6.ttf)

但是真正的问题是(或似乎是)您的PDF文件已损坏。在名称中嵌入带空格的字体的正确方法是:

/BaseFont /Yozo#20Kai

也就是说,您将不可用的字符(在这种情况下为空格)替换为转义字符“#”,然后在其后跟描述您要使用的ASCII字符的字节,然后继续。对于具有多字节编码名称的字体,您必须对所有“不可打印的”字符代码使用转义代码。

由于您的PDF文件没有遵循从根本上被破坏的规则,因此您应联系用于制作PDF文件的软件的创建者,并告知他们存在错误。纠正此问题的唯一方法是重新制作PDF文件。