Возникла проблема при конвертации .pdf в .ps через gs - PullRequest
0 голосов
/ 15 марта 2019

У меня есть файл 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

Но я вижу, что d00130 - это пустой документ, когда я просматриваю его через evince или печатаю его на принтере HP.Есть проблема с форматом файла PDF, или мне нужно настроить параметры моей команды?но оригинальный файл PDF можно открыть для просмотра или печати. ​​

Большое спасибо.

Если вам нужен оригинальный файл PDF, вы можете оставить свой адрес электронной почты, и я отправлю его вам.

Еще раз спасибо.

1 Ответ

0 голосов
/ 18 марта 2019

Я думаю, что эта проблема связана с тем, что gs не нашел китайский шрифт, который я использовал.

Это может показаться очень странным.Если Ghostscript не может найти шрифт, он будет использовать замену для замены отсутствующего шрифта.В зависимости от ряда факторов, он выберет «подходящий» шрифт.Я не буду утверждать, что это невозможно победить, и вместо этого я получу ошибку, но мне кажется, что это маловероятно.

этот путь шрифта - / usr / share / fonts / truetype / yozo / yzdwkj6.ttf, я пытаюсь добавить этот шрифт в /usr/share/ghostscript/9.22/Resource/Init/cidfmap,

ОК, так что это не шрифт , это CIDFont , есть существенные различия.

, но в файле PDF есть нижняя строка: / BaseFont / Yozo Kai.Как я могу сделать для этого описания информации является> двухсловный шрифт?

Я предполагаю, что вы имеете в виду для 2-байтовой кодировки.Ответ заключается в том, что вам нужно всего лишь использовать CIDFont с именем «Yozo Kai».Однако .... Использование пробела в имени шрифта - очень плохая идея, потому что пробелы являются разделителями в PostScript и PDF, поэтому размещенная выше строка технически недопустима.

Вместо создания словарясодержащий ключ /BaseFont и значение /Yozo Kai, PDF-файл фактически создает словарь с ключом /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

То есть вы заменяете неиспользуемый символ (в данном случае пробел) на escape-символ '#' и затем следуете за нимс байтом, описывающим символ ASCII, который вы хотите использовать, а затем продолжить.Для шрифтов с именами многобайтовой кодировки вы должны использовать управляющие коды для всех «непечатных» кодов символов.

Поскольку ваш файл PDF не соответствует правилам, по которым он в основном нарушен, вам следует обратиться к создателям программного обеспечения.который использовался для создания файла PDF и информирования их об ошибке.Единственный способ исправить это - переделать файл PDF.

...