# Это текст Геттисбергского обращения Авраама Линкольна.

quadrant(pdf, :lr) do

 pdf.text('The Gettysburg Address ',

  :font_size => 36, justification => :center)

 y0 = pdf.y + 18

 speech = <<-'EOS'.split($/). join(' ').squeeze(' ')

Four score and seven years ago our fathers brought forth on

this continent a new nation, conceived in liberty and

dedicated to the proposition that all men are created equal.

Now we are engaged in a great civil war, testing whether

that nation or any nation so conceived and so dedicated can

long endure. We are met on a great battlefield of that war.

We have come to dedicate a portion of that field as a final

resting-place for those who here gave their lives that that

nation might live. It is altogether fitting and proper that

we should do this. But in a larger sense, we cannot

dedicate, we cannot consecrate, we cannot hallow

this ground. The brave men, living and dead who struggled here

have consecrated it far above our poor power to add or

detract. The world will little note nor long remember what

we say here, but it can never forget what they did here. It

is for us the living rather to be dedicated here to the

unfinished work which they who fought here have thus far so

nobly advanced. It is rather for us to be here dedicated to

the great task remaining before us that from these honored

dead we take increased devotion to that cause for which they

gave the last full measure of devotion that we here highly

resolve that these dead shall not have died in vain, that

this nation under God shall have a new birth of freedom, and

that government of the people, by the people, for the people

shall not perish from the earth.

EOS

 pdf.text(speech, justification => :full, :font_size => 14,

  :left => 50, :right => 50)

 pdf.move_pointer(36)

 pdf.text('U.S. President Abraham Lincoln, 19 November 1863',

  :justification => :right, :right => 100)

 pdf.text('Gettysburg, Pennsylvania', :justification => :right,

  :right => 100)

 pdf.rounded_rectangle(pdf.left_margin + 25, y0, pdf.margin_width - 50,

  y0 - pdf.y + 18, 10).stroke

end

pdf.save_as('4page.pdf')

Рис. 15.4. Пример документа, состоящего из четырех страниц в разных квадрантах

Итак, в четырех квадрантах расположены следующие страницы:

• левый верхний: demo.rb;

• правый верхний: фотография Грампианских холмов, Шотландия;

• левый нижний: individual-i.rb;

• правый нижний: Геттисбергское обращение.

Для краткости будем называть эти квадранты UL, UR, LL и LR. В тексте программы используются соответствующие символы (:ul и т.д.).

Первый квадрант (UL) заполнен вертикальными линиями, толщина которых постепенно уменьшается, начиная с 40 единиц, с одновременным осветлением. Затем рисуются круги увеличивающегося радиуса, при этом толщина линий уменьшается, а цвет становится светлее. И наконец, выводятся два набора текстов: один — сверху вниз с постепенным уменьшением размера шрифта, а другой — с поворотом вокруг центральной оси как раз там, где кончаются вертикальные линии.

Страница во втором квадранте (UR) содержит картинку и ее описание. Особый интерес представляет строка с датой. Мы вставляем в поток байт с кодом 0x01; при отображении вместо него будет поставлен символ ромба в соответствии с таблицей замены, заданной при выборе шрифта.

В третьем квадранте (UR) с помощью программы Individual-I мы снова демонстрируем технику переноса осей и масштабирования. Самое интересное здесь — инверсия осей. Если по оси выбирается отрицательный масштаб, то команды вывода текста и рисования меняют направление. Следовательно, при рисовании буквы I достаточно задать лишь правила формирования половины рисунка, а потом инвертировать ось X, вызвав метод pdf.scale_axis(-1, 1), и повторить ту же последовательность операций.

Последний квадрант (LR) заполняется сравнительно легко. Мы форматируем и заключаем в прямоугольник со скругленными углами текст речи, которую президент Линкольн произнес в Геттисберге.

Сохранение PDF-документа — воплощенная простота. Если нужно записать его на диск, мы вызываем метод save_as объекта PDF:

pdf.save_as('4page.pdf')

Нетрудно также отправить PDF-документ браузеру из CGI-программы:

require 'cgi'

cgi = CGI.new

out = pdf.render

puts <<-EOS

Content-Type: application/pdf

Content-Disposition: inline; filename='4page.pdf'

Size: #{out.size}

EOS

Конечно, в этом разделе мы сумели затронуть лишь малую толику библиотеки PDF::Writer. Дополнительную информацию ищите в онлайновой документации. Если вы знакомы с форматом PDF, имейте в виду, что библиотека еще развивается и пока не поддерживает спецификацию в полном объеме.

15.5. Заключение

В этой главе мы показали, как с помощью библиотеки REXML можно разбирать XML-документы,

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату