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

问题描述 投票:0回答:1

我有一个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文件,您可以留下您的电子邮件,我会将其发送给您。

再次感谢。

pdf ghostscript postscript
1个回答
0
投票

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

这似乎非常不合时宜。如果Ghostscript找不到字体,那么它将使用替换来替换丢失的字体。根据许多因素,它会选择它认为是“合适”的字体。我不会声称它不可能打败这个,而是得到一个错误,但我似乎不太可能。

这个字体路径是/usr/share/fonts/truetype/yozo/yzdwkj6.ttf,我试着将这个字体添加到/usr/share/ghostscript/9.22/Resource/Init/cidfmap,

好吧,这不是一个字体,它是一个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文件。

© www.soinside.com 2019 - 2024. All rights reserved.