Новости

О проекте

Зачем?

Используемое ПО

Методика разработки сцен на PostScript

Операторы языка PostScript

Библиотека

Изучение языка

Статьи

Печать файлов PS

Создание каталога изображений

Печать образца доступными шрифтами

Ссылки...

Создание каталога изображений

Задача

Есть много картинок, их необходимо расположить на странице в определенном порядке в Н столбцов по К рядов на каждой странице. Страницы отпечатать. Изображения храняться в JPEG-формате.

Другими словами, сделать каталог изображений

Решение

Сразу. Основное. Главное.

Будем придерживаться второго подхода, изложенного в статье "Методика разработки сцен". Он прост. Понятен. Экономит массу времени. Он оправдан.

Не убедительно? Тогда, подумайте - Вы занимаетесь решением конкретной проблемы! Нужно решение именно этой проблемы, а не решение вообще проблемы.

Первое

Разместим все изображения в одном месте - в одной папке. Например, в папке c:/aaa/proj1. Там же будем сохранять созданные нами описания страниц.

Спроектируем макет страницы, где укажем места для размещения изображений, подписей к ним, а также сопутсвующие оформительские элементы: рамочки изображений, номера страниц и проч.

Прикинем количество рядов, строк. Примерные размеры основных элементов. Подчеркну, примерные размеры.

Макет распадается на несколько независимых частей:

  • Нижний колонтитул, где указывается номер страницы
  • Места размещения ячеек с изображениями.
  • Ячейки для изображений.

Основа макета - ячейка для размещения изображения. Придумаем ее дизайн. Например, такой: в левом нижнем и в правом верхнем углу разместим ограничивающие уголки, внизу ячейки - подпись к рисунку, а основное поле ячейки отведем под изображение.

Таким образом, ячейка состоит из:

  • левого нижнего ограничивающего уголка;
  • правого верхнего ограничивающего уголка;
  • поля для изображения;
  • поля для подписи к изображению.

Можно считать, что страницу на простые составляющие мы разбили. Приступим теперь к их реализации.

Подключим библиотеку:

  (c:/aaa/bbb/lib-2.ps) run 

Путь записываем обратным слэшем /!! Зададим размер листа:

  Страница.Формат.А4 

Ячейка

Определим отводимое место под ячейку, ее параметры. Прикинем приблизительные значения параметров.

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

Второе, левый нижний угол ячейки разместим в начале координат, чтобы не возится с пересчетом координат. В нужное время перемести начало координат в нужную позицию оператором translate.

Третье, оформим описание размещения элементов ячеки как отдельный оператор и он будет отвечать за рисование одной ячейки в начале координат. Назовем его НарисоватьЯчейку. Да, дадим ему русскоязычное название! Интерпретатор это позволяет.

Но с начала определим зададим параметры ячейки.

Параметры ячейки

Определим, что нужно отобразить файл 01.jpg с подписью к нему Картинка:

   /Ячейка.Файл (c:/aaa/proj1/01.jpg) def 
   /Ячейка.Подпись (Картинка) def 

Обязательно! Указывайте полный путь к файлам изображений (через обратный слэш)!

Размеры ячейки будут 80 мм на 100 мм:

   /Ячейка..Ширина 80 мм def 
   /Ячейка..Высота 100 мм def 

Определим, что поле для изображения - это прямоугольная область, отстоящая на одинаковом расстоянии от верхней, левой и правой границ. Отступ выберем равным 4 мм. Высоту поля примем равной 70 мм:

  /Ячейка..Изображение.Отступ  4 мм def 
  /Ячейка..Изображение.Высота 70 мм def 

Длину стороны выберем равной 10 мм:

    /ДлинаСтороныУголка 10 мм def 

Рисуем ячейку

Говорим, что ниже приведенный фрагмент кода рисует ячейку:

    /Ячейка { 

Теперь нарисуем левый верхний уголок. Уголок определим тремя параметрами: координатами его угла и длиной стороны, учитывая что он симметричный и его стороны параллельны соответсвующим сторонам ячейки.

Уголок нарисуем как два луча заданной длины исходящих из одной точки - угла уголка. Легко определить, что координаты угла - (0, Ячейка..Высота). Тогда,

Устанавливаем параметры линий уголка:

рисовать Уголок черной

    1 setlinewidth 

тонкой линией

    0 setgray 

говорим, что рисуем новую фигуру

    newpath 

Указываем координаты (х, у) угла Уголка и перемещаем туда перо

   0 Ячейка..Высота 
   moveto 

Рисуем (0, -dу) прямую вертикально вниз

   0 ДлинаСтороныУголка neg 
   rlineto 

Начинаем рисовать второй луч из (х, у) угла Уголка

   0 Ячейка..Высота 
   moveto 

Рисуем (dх, 0) прямую горизонтально вправо

   ДлинаСтороныУголка 0 
   rlineto 

Наводим

   stroke 

Проверяем работу. Ок. Все работает

Аналогично, с учетом зеркальности, рисуем правый нижний угол:

   1 setlinewidth 
   0 setgray 
   newpath 
     Ячейка..Ширина 0 
     moveto 
     0 ДлинаСтороныУголка 
     rlineto 
   Ячейка..Ширина 0 
   moveto 
   ДлинаСтороныУголка neg 0 
   rlineto 
 stroke 

Проверяем. Все просто чудесно.

Для поля с изображением необходимо знать:

  • размер самого поля - ширина, высота;
  • название файла изображения, который необходимо вывести.
  • координаты левого нижнего угла;

Изображение печатается в нужном месте командой printJPEG. Посмотрите в справочнике что она ожидает в качестве своих аргументов.

Первым параметром printJPEG мы должны задать ширину области для изображения:

   Ячейка..Ширина 
   Ячейка..Изображение.Отступ 
   sub 
   Ячейка..Изображение.Отступ 
   sub 

Надеюсь, понятно как расчитали Ширину.

Далее, указываем высоту поля:

  Ячейка..Изображение.Высота 

Указываем название файла с изображением, который нужно вывести

   Ячейка.Файл 

Указываем координаты (х, у) левого нижнего угла поля. Сначала х:

   Ячейка..Изображение.Отступ 

Теперь y:

   Ячейка..Высота 
   Ячейка..Изображение.Отступ 
   sub 
   Ячейка..Изображение.Высота 
   sub 

Все параметры указаны, вызываем оператор отрисовки изображения:

  printJPEG 

Проверяем... Работает. Но, выравнивает картинку по нижнему краю. Пока оставим.

Печатаем подпись к ячейке

Укажем каким шрифтом печатаем.

  Шрифт.Ариал-Рус 
  5 мм Шрифт.Размер! 
  Шрифт.Применить 

Укажем откуда начинаем печатать и что печатаем:

  10 мм 8 мм moveto 
  Ячейка.Подпись show 

О чудесно, все работает... Если что-то не нравится - подкоректируйте параметры.

Ячейка готова:

  } def 

Рисуем макет страницы

Печать нижнего колонтитула

Нарисуем нижний колонтитул, где будет размещаться номера страниц. Номер страницы указываем вручную. Тогда:

  95 мм 10 мм moveto 
  Шрифт.Ариал-Рус 
  6 мм Шрифт.Размер! Шрифт.Применить 

Указавем номер страницы

      (- 1 -) show 

Размещение и печать ячеек

Для того чтобы нарисовать несколько ячеек на одном листе, достаточно каждый раз передвигать начало координат в новое место. Чтобы расположить четыре ячейки в два столбца и по два ряда сделаем так.

Сначала переместим начало координат в нижний левый край листа с учетом полей (левое поле - 20мм, нижнее - 30мм):

  20 мм  30 мм 
  translate 

Печатаем нижний ряд

   /Ячейка.Файл (c:/aaa/proj1/01.jpg) def 
   /Ячейка.Подпись (Картинка 1) def 
     Ячейка 

Передвинули начало координат в позицию для отрисовки следующей ячейки - на ширину уже нарисованной.

   Ячейка..Ширина 0 
     translate 

Следующая

   /Ячейка.Файл (c:/aaa/proj1/02.jpg) def 
   /Ячейка.Подпись (Картинка 2) def 
   Ячейка 

Между рядами сделаем промежуток 4 мм

   0   Ячейка..Высота 4 mm add 
       translate 

Верхний ряд

   /Ячейка.Файл (c:/aaa/proj1/03.jpg) def 
   /Ячейка.Подпись (Картинка 3) def 
   Ячейка 
      Ячейка..Ширина neg 0 translate 
   /Ячейка.Файл (c:/aaa/proj1/04.jpg) def 
   /Ячейка.Подпись (Картинка 4) def 
   Ячейка 

Теперь говорим, что формирование страницы закончилось и ее нужно вывести

  showpage 

Макет готов. Работает. Теперь формируем каждую страницу.

Формируем страницы каталога

Страницы каталога формируем теперь по образу и подобию - первой страницы, описанной нами выше. Только подставляем нужные названия файлов и комментарии к ним

           95 мм 10 мм moveto 
           Шрифт.Ариал-Рус 
           6 мм Шрифт.Размер! Шрифт.Применить 
 (- 2 -) show 
          20 мм  30 мм  translate /Ячейка.Файл 
 (c:/aaa/proj1/001.jpg)  def /Ячейка.Подпись 
 (Файл 001.jpg)              def Ячейка 
     Ячейка..Ширина 0 translate /Ячейка.Файл 
 (c:/aaa/proj1/002.jpg)  def /Ячейка.Подпись 
 (Файл 002.jpg)              def Ячейка 
     0 Ячейка..Высота 4 mm add translate /Ячейка.Файл 
 (c:/aaa/proj1/003.jpg)  def /Ячейка.Подпись 
 (Файл 003.jpg)              def Ячейка 
      Ячейка..Ширина neg 0 translate /Ячейка.Файл 
 (c:/aaa/proj1/004.jpg)  def /Ячейка.Подпись 
 (Файл 004.jpg)              def Ячейка 
                  showpage 

Код страницы переупорядочен с целью выделения важных деталей - что выводить и с какой подписью. Также это сократило занимаемое им место на экране. Хотя код стал менее понятливым, зато набивать его данными стало проще, а код уже отработан!

Третью страницу делаем аналогично - скопировали текст второй (шаблон, макет) внесли нужные данные и т.д.

             95 мм 10 мм moveto 
             Шрифт.Ариал-Рус 
             6 мм Шрифт.Размер! Шрифт.Применить 
 (- 3 -)     show 
          20 мм  30 мм  translate /Ячейка.Файл 
 (c:/aaa/proj1/005.jpg)  def /Ячейка.Подпись 
 (Файл 005.jpg)              def Ячейка 
     Ячейка..Ширина 0 translate /Ячейка.Файл 
 (c:/aaa/proj1/006.jpg)  def /Ячейка.Подпись 
 (Файл 006.jpg)              def Ячейка 
     0 Ячейка..Высота 4 mm add translate /Ячейка.Файл 
 (c:/aaa/proj1/007.jpg)  def /Ячейка.Подпись 
 (Файл 007.jpg)              def Ячейка 
      Ячейка..Ширина neg 0 translate /Ячейка.Файл 
 (c:/aaa/proj1/008.jpg)  def /Ячейка.Подпись 
 (Файл 008.jpg)              def Ячейка 
                  showpage 

Все. Можно печатать.

Практические замечания

При работе обратите внимание на следующие моменты.

Удостоверьтесь что имена файлов и пути написаны Вами правильно.

К сожалению, Ghostscript продвинутые форматы JPEG не понимает, поэтому изображения НЕ должны быть записаны в прогрессивном формате JPEG.

А в остальном только Ваша внимательность!

Вместо вывода.

Как видите ничего сложно. Только непривычно. Как и с любой новой технологией, главное начать.

Текст программы можно взять отсюда



©Фурашев А. 2002
e-mail

Хостинг от uCoz