2013-08-28 1 views
0

Я вижу какое-то странное поведение в Ghostscript 9.06, и мне интересно, нужно ли это делать с моей PS-структурой или чем-то еще.Ghostscript - использование шрифта в форме делает его недоступным

У нас есть встроенный шрифт, а затем попытайтесь установить форму и использовать ее, как показано ниже. Внизу у меня также есть некоторые строки, которые можно разместить прямо на странице без использования формы.

globaldict 
begin 
true setglobal 
/frm_test << 
/FormType 1 /BBox [-842 -842 596 596] /Matrix [1 0 0 1 0 0] /PaintProc { pop 
/ArialMT 7.0 selectfont 
0 0 moveto 
(Test text form) show 
} %endPaintProc 
>> /Form defineresource pop 
/form_test {/frm_test /Form findresource true setglobal execform false setglobal} bind def 
%/form_test {/frm_test /Form findresource execform} bind def 
false setglobal 
end 

gsave 
10 820 translate 
form_test 
grestore 

/ArialMT 7.0 selectfont 
10 800 moveto 
(Test text normal) show 
showpage 

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

Если я поменяю строку/form_test с прокомментированным ниже, то он отлично работает. Однако что это за линия? Кажется, он заставляет форму работать в глобальной области VM, но я не уверен, почему это имеет значение, и почему любые ошибки распространяются на следующий «selectfont», если они происходят.

Почему Acrobat Distiller справляется с этим - правильно ли он написан Postscript или нет? Благодарю.

Редактирование: По-видимому, изменение окружающих команд для сохранения/восстановления вместо gsave/grestore не позволяет проблеме влиять на второй текст, но это не объясняет, почему шрифт неизвестен в Форме. Также я считаю, что gsave/grestore должно быть достаточным, так как форма не должна иметь побочного эффекта, кроме состояния графики.

ответ

0

ArailMT почти наверняка не является «шрифтом» его шрифтом TrueType, если ранее вы не ввели определение типа 42, его всегда трудно определить из фрагмента программы PostScript.

Почему вы все делаете в глобальной виртуальной машине? И использование globaldict тоже? Это и очень плохая практика, и что-то в глобальной виртуальной машине не подлежит сохранению и восстановлению, поэтому она ест память до конца работы.

На самом деле выполнение формы в глобальном контексте VM еще хуже, так как оно будет хранить любые ресурсы, определенные в ходе формы в глобальной виртуальной машине. Поскольку вы вызываете «selectofnt», который будет определять ресурс шрифта, если он уже не присутствует. Поскольку вы работаете с глобальной виртуальной машиной, он будет определять шрифт в глобальной виртуальной машине вместо локальной виртуальной машины, тем самым увеличивая объем памяти.

PostScript является «правильным», в том же смысле, что программа C может лексически корректно, но не делать то, что вы ожидаете от нее.

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

+0

ArialMT шрифт Type 1, но я также попробовал его с шрифтами Type 42. Этот файл предоставляется клиентом, моя работа - преобразовать в PDF, но Ghostscript не работает в то время как Distiller. Я только что привел часть его здесь, чтобы воспроизвести проблему. Изменения, о которых я говорил выше, работают, поэтому я должен буду это сделать. Кажется, что весь файл находится в локальном сохранении/восстановлении, но формы являются глобальными, так что это объясняет проблему, но не почему работает дистиллятор. Еще одна из тех вещей, которые я предполагаю. –