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

There was a problem when I convert .pdf to .ps via gs

我有一个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

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

非常感谢。

如果需要原版PDF文件,可以留下邮箱,我发给你。

再次感谢。

I think this issue is gs did not found the chinese font my used.

这似乎不太可能。如果 Ghostscript 找不到字体,那么它将使用替代品来替换丢失的字体。它会根据多种因素选择它认为是 'suitable' 的字体。我不会声称它不可能打败它,而是得到一个错误,但对我来说这似乎不太可能。

this font path is /usr/share/fonts/truetype/yozo/yzdwkj6.ttf, I have try to add this font to /usr/share/ghostscript/9.22/Resource/Init/cidfmap,

好的,这不是 Font,而是 CIDFont,两者之间存在显着差异。

but the PDF file have below line: /BaseFont /Yozo Kai. how can I do for this description information is a > two-word font?

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

PDF 文件实际上创建了一个包含键 /BaseFont 和值 /Yozo 的字典,而不是创建包含键 /BaseFont 和值 /Yozo Kai 的字典,有一个备用字符串 Kai 留在周围。这意味着字典没有偶数个条目,因此是非法的。在这些情况下究竟会发生什么还没有定义。

请注意,我正在逐字记录您所说的内容,因为我没有##可以查看的 PDF 文件,但此错误消息:

**** Error: File has an unbalanced >> (close dictionary). Output may be incorrect.

表明我是对的,条目的数量不是均匀的,所以 Ghostscript 已经吃掉了结尾 >> 然后抱怨因为找不到结尾的字典标记。

If I use below script to describe this font, printing driver will output filter failed log.

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

同样的道理,你不能起一个包含space这样的名字,因为space是分隔符。在 PostScript(cidfmap 的定义方式)中,您可以这样做:

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

请注意,我仍然很怀疑你在那里的路径,因为这是将 Ghostscript 通用资源目录与 'usr/share/...' 连接起来,这对我来说似乎不太正确。我怀疑你只是想要 /Path (/usr/share/fonts/truetype/yozo/yzdwkj6.ttf).

但真正的问题是(或看起来是)您的 PDF 文件已损坏。在名称中嵌入带有 space 的字体的正确方法是:

/BaseFont /Yozo#20Kai

也就是说,您将无法使用的字符(在本例中为 space)替换为转义字符“#”,然后在其后跟描述您要使用的 ASCII 字符的字节,然后继续。对于具有多字节编码名称的字体,您必须对所有 'unprintable' 字符代码使用转义码。

由于您的 PDF 文件不符合规则,因此它已从根本上破坏了,您应该联系用于制作 PDF 文件的软件的创建者,并通知他们他们有一个错误。纠正此问题的唯一方法是重新制作 PDF 文件。