увеличивать масштаб вдвое и переносить ось в обратном направлении.

15.4.2. Пример документа

Для демонстрации рассмотренной выше техники мы создадим четыре страницы в четырех разных квадрантах. Три из них — слегка измененные варианты демонстрационных программ, включённых в дистрибутив PDF::Writer:

demo.rb, квадрант 1

individual-i.rb, квадрант 3

gettysburg.rb, квадрант 4

Четвертая страница (в квадранте 2) не имеет прямого аналога среди демонстрационных программ, она ближе всего к программе chunkybacon.rb.

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

Листинг 15.11. Создание демонстрационного документа

require 'rubygems'

require 'pdf/writer'

def quadrant(pdf, quad)

 raise unless block_given?

 mx = pdf.absolute_x_middle

 my = pdf.absolute_y_middle

 pdf.save_state

 case quad

  when :ul

   pdf.translate_axis 0, my

  when :ur

   pdf.translate_axis mx, my

  when :ll

   nil # no translation needed

  when :lr

   pdf.translate_axis mx, 0

 end

 pdf.scale_axis(0.5, 0.5)

 pdf.у = pdf.page_height

 yield

 pdf.restore_state

end

pdf = PDF::Writer.new

pdf.select_font('Times-Roman',

 rencoding => 'WinAnsiEncoding',

 differences => { 0x01 => 'lozenge' })

mx = pdf.absolute_x_middle

my = pdf.absolute_y_middle

pdf.line(0, my, pdf.page_width, my).stroke

pdf.line(mx, 0, mx, pdf.page_height).stroke

# Левый верхний: Demo (UL).

quadrant(pdf, :ul) do

 x = pdf.absolute_right_margin

 r1 = 25

 40.step(1, -3) do |xw|

  tone = 1.0 - (xw / 40.0) * 0.2

  pdf.stroke_style(PDF::Writer::StrokeStyle.new(xw))

  pdf.stroke_color(Color::RGB.from_fraction(1, tone, tone))

  pdf.line(x, pdf.bottom_margin, x,

   pdf.absolute_top_margin).stroke

  x -= xw+2

 end

 40.step(1, -3) do |xw|

  tone = 1.0 - (xw / 40.0) * 0.2

  pdf.stroke_style(PDF::Writer::StrokeStyle.new(xw))

  pdf.stroke_color(Color::RGB.from_fraction(1, tone, tone))

  pdf.circle_at(pdf.left_margin + 10, pdf.margin_height - 15,

   r1).stroke

  r1 += xw

 end

 pdf.stroke_color(Color::RGB::Black)

 x = pdf.absolute_left_margin

 y = pdf.absolute_bottom_margin

 w = pdf.margin_width

 h = pdf.margin_height

 pdf.rectangle(x, y, w, h).stroke

 text = 'The Ruby Way'

 y = pdf.absolute_top_margin

 50.step(5, -5) do |size|

  height = pdf.font_height(size)

  y -= height

  pdf.add_text(pdf.left_margin + 10, y, text, size)

 end

 (0...360).step(20) do |angle|

  pdf.fill_color(Color::RGB.from_fraction(rand, rand, rand))

  pdf.add_text(300 + Math.cos(PDF::Math.deg2rad(angle)) * 40,

   300 + Math.sin(PDF::Math.deg2rad(angle)) * 40,

   text, 20, angle)

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

0

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

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