Postscript/EPS Рисование прямоугольника вокруг текста

У меня есть следующий постскриптум

1448 2069 /moveto 
(Comparator) {show newpath}

Я хотел бы нарисовать прямоугольник вокруг текста (компаратор), так как мне нужно предоставить гиперссылку, чтобы перенаправить его на страницу аббревиатуры. Но я изо всех сил пытаюсь найти остальные 2 координаты. Кто-нибудь, пожалуйста, посоветуйте.


person Jwary    schedule 15.07.2016    source источник
comment
Ваш код не будет отображать компаратор, потому что он оставит в стеке процедуру, содержащую show newpath, я не понимаю, что вы делаете   -  person Stefan Hegny    schedule 15.07.2016


Ответы (1)


Ваши друзья

строка bool charpath

pathbbox llx lly urx ury

с языка постскриптума.

so do

1448 2069 moveto 
(Comparator) false charpath pathbbox newpath

даст вам левый-x, нижний-y, правый-x и верхний-y в стеке. Вы можете вычесть/добавить некоторые постоянные значения, чтобы дать небольшое пространство вокруг текста, а затем вычислить ширину и высоту вместо правых/верхних значений и выполнить rectstroke

ИЗМЕНИТЬ небольшой рабочий образец

%!PS
/Helvetica findfont 20 scalefont setfont
20 dup moveto (Link on page1) show newpath
[ /Rect [ 20 dup moveto (Link on page1) false charpath pathbbox 
 2 add 4 1 roll 2 add 4 1 roll 2 sub 4 1 roll 2 sub 4 1 roll
 newpath ] /Page 2 /Color [.7 0 0] /Subtype /Link /ANN  pdfmark
showpage
20 dup moveto (Target on page2) show
showpage

Строка 2 add 4 1 roll ... добавляет еще 2 поля с каждой стороны. Вы можете опустить всю строку.

person Stefan Hegny    schedule 15.07.2016
comment
Я очень новичок в этом PS :( и не могу понять, что вы объяснили. Мне нужны 2 координаты, чтобы я мог отправить эти аргументы в Rect[x1,y1,x2,y2] и использовать pdfmark для гиперссылки. - person Jwary; 15.07.2016
comment
[/Rect [ 1448 2069 ? ? ] /Page 160 /Color [.7 0 0] /Subtype /Link /ANN pdfmark #Я пытаюсь найти ? Согласно вашему коду, если я использую pathbox, данные хранятся в стеке, и как я могу получить эти значения? извините, я новичок в PS, поэтому задаю несколько основных вопросов. - person Jwary; 15.07.2016
comment
Вы случайно не пытаетесь вручную обойти ваш вопрос, даже не зная постскриптума? Удачи! Вы не нашли нормальный пакет всплывающих подсказок латекса и пытались как-то добавить туда гиперссылку, даже отредактировав pdf? Веб-поиск всплывающей подсказки латекса, безусловно, дает несколько интересных результатов. - person Stefan Hegny; 15.07.2016
comment
Ваша догадка верна. Если мне нужно использовать латекс, мне нужно установить безлимитные пакеты, поэтому я перестал это делать. Кроме того, гиперссылка и всплывающая подсказка не могут быть предоставлены одновременно. Я пытаюсь добиться этого через PS. Я прочитал кулинарную книгу и понял, как даются команды и последовательность их выполнения. Они используют команду stringwidth в PS для получения смещения, но я не знаю, как получить эти значения. Если я могу их получить, я могу их использовать в моем прямоугольнике. - person Jwary; 15.07.2016
comment
Я попробовал ваш код. В нем есть ошибка, поэтому pdf не создается. - person Jwary; 15.07.2016
comment
правильно, я ошибся насчет закрывающей квадратной скобки, это было слишком, я добавил в ответ небольшой образец, который работает здесь с ps2pdf (из ghostscript) и Acrobat Reader. Прямоугольник легко получить с помощью операторов charpath/pathbox. Вы также можете загрузить справочник по языку ps из Adobe, чтобы увидеть подробности. всех операторов - person Stefan Hegny; 15.07.2016
comment
Я только что просмотрел его через программу просмотра Ghost Script и вижу прямоугольник вокруг текста. Большое спасибо. Я попытаюсь интегрировать подобную вещь в свой скрипт. - person Jwary; 15.07.2016
comment
Я использую GS viewer 5.0 и вижу прямоугольную рамку вокруг текста. - person Jwary; 15.07.2016
comment
моя интеграция не сработала даже после множества разных попыток. Хорошо, я думаю, мне нужно прочитать руководство, чтобы получить остальные 2 координаты. - person Jwary; 15.07.2016
comment
На самом деле я получаю постскриптум в качестве входных данных, в котором уже есть 1448 2069 /moveto (Comparator) {show newpath}. Я могу добавить что-нибудь только в конец постскриптума. Итак, в самом конце я попытался добавить ваш код, и он ничего не сгенерировал. Если я просто дам несколько случайных координат /Rect [1559 1754 1549 1800] и использую метку pdf, он сгенерирует поле, но в другом месте. Я думаю, мне нужно получить правильные 2 координаты? Но, похоже, это очень сложно. - person Jwary; 16.07.2016
comment
Я представил это после того, как понял, что ты собираешься делать. Однако это значительно усложняет задачу. (Было бы разумно посмотреть, что идет после newpath} ) Добавление кода в конце файла, скорее всего, будет использовать совершенно другой графический контекст/шрифты/размеры шрифтов/матрицы преобразования, в конечном итоге на другой странице (последней или после даже ), чем там, где вы хотите ссылку и т. д. pp .... что вернет нас к предложению, возможно, попытаться использовать пакет, который уже разработан для того, чтобы делать то, что мы дорого (хотя и не неинтересно) пытаемся найти низко -уровень - person Stefan Hegny; 16.07.2016
comment
Спасибо за ответ. После команды newpath есть 3 1 roll moveto 1 sub {rlineto} Repeat Stroke, некоторые команды closepath eofill, затем новый параметр и т. д. Как вы догадались, если я что-то сделаю в конце файла ps, координаты будут разные Я имею в виду, что швы по оси X правильные, но ось Y показана очень низко. Да, я попробую с некоторыми пакетами. Целый день я пытался с помощью разных команд PS заставить его работать, но не смог. - person Jwary; 16.07.2016
comment
Также мне удалось нарисовать что-то вокруг текста с помощью команд currentpoint и rlineto... но без гиперссылки на него. Хотя для использования pdfmark (для вставки гиперссылки) мне нужны координаты прямоугольника. - person Jwary; 16.07.2016
comment
Ах! Стефан. Большое спасибо, я только что попробовал ваш код по-другому. То есть вместо того, чтобы делать 20 дубликатов, я использовал свои точки перемещения, и это сработало как по волшебству :). Я проверил это, добавив код в середине файла PS вручную. Теперь мне нужно автоматизировать это с помощью Perl. Еще раз спасибо - person Jwary; 16.07.2016
comment
О, это, конечно, то, что я имел в виду! Извините за пример с другой позицией текста ;-) Поздравляю! - и удачи с perl! - person Stefan Hegny; 16.07.2016
comment
Нет, не извиняйтесь, кажется, я неправильно понял, что это шрифт :). Мой Perl в данный момент не работает, потому что моя функция вызывается в многопоточном режиме, поэтому, когда я пытаюсь открыть файл PS для записи данных, он также записывает некоторые другие данные и портит мой код PS :). Просто просматриваю некоторые методы блокировки файлов. Спасибо. - person Jwary; 17.07.2016
comment
Удачи на самом деле! Я уверен, что если вы зашли так далеко сейчас, вы сможете запустить его! - person Stefan Hegny; 17.07.2016