Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

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

PDF::Writer
эта проблема будет решена.

В следующем примере мы задали для PDF-документа шрифт Times-Roman. Программа чтения PDF-файлов будет считать, что текст представлен в кодировке

WinAnsiEncoding
, но вместо символа с кодом
0x01
подставит глиф «lozenge» (ромб), еще увидим его ниже (листинг 15.11).

pdf.select_font "Times-Roman",

 { :encoding => "WinAnsiEncoding",

:differences => {0x01 => "lozenge"}

 }

Библиотека

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

В текущей версии

PDF::Writer
(1.1.3) каждая такая «страница» должна полностью умещаться на одной физической странице. Если в дело вмешивается механизм автоматического разбиения на страницы, то будет создана новая физическая страница. В следующих версиях усовершенствованный вариант этой техники будет работать и для многоколонных страниц.

Для демонстрации создадим метод

quadrant
(листинг 15.10). Он войдет также составной частью в длинный пример из следующего раздела, который преследует две цели: показать, как создается документ из четырех страниц и как можно разместить четыре страницы PDF-документа на одной странице книги, сэкономив тем самым место.

Листинг 15.10. Метод quadrant

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 # pdf.translate_axis(0, 0)

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.translate_axis x, y)
.

Предположим, что начало координат находится не в точке

(0, 0)
, а в точке
(50, 50)
. Тогда отрезок из точки
(15, 20)
в точку
(35, 40)
на самом деле будет соединять точки с координатами
(65, 70)
и
(85, 90)
. Но код рисования отрезка об этом ничего не знает.

После переноса оси (то есть сдвига начала координат) мы можем изменить масштаб вдоль оси. Чтобы получить четыре квадранта, следует уменьшить вдвое масштаб по осям X и Y (

pdf.scale_axis 0.5, 0.5
). Иными словами, если бы сейчас я провел отрезок между точками
(0, 0)
и
(90, 90)
, то без переноса осей он соединял бы точки с физическими координатами
(0, 0)
и
(45, 45)
, а с переносом — точки с координатами
(90, 90)
и
(135, 135)
. В любом случае будет проведена линия вдоль диагонали длиной 90 единиц измерения. Просто из-за масштабирования сами единицы стали в два раза меньше.

Затем мы отдаем управление блоку, а когда он закончит работу, восстанавливаем состояние, вызывая предоставленный библиотекой метод

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

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",

Поделиться:
Популярные книги

Император Пограничья 5

Астахов Евгений Евгеньевич
5. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 5

Второгодка. Книга 5. Презренный металл

Ромов Дмитрий
5. Второгодка
Фантастика:
городское фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Второгодка. Книга 5. Презренный металл

Ненаглядная жена его светлости

Зика Натаэль
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Ненаглядная жена его светлости

На границе империй. Том 8. Часть 2

INDIGO
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8. Часть 2

Телохранитель Генсека. Том 2

Алмазный Петр
2. Медведев
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Телохранитель Генсека. Том 2

Размышления русского боксёра в токийской академии Тамагава

Афанасьев Семён
1. Размышления русского боксёра в токийской академии
Фантастика:
альтернативная история
6.80
рейтинг книги
Размышления русского боксёра в токийской академии Тамагава

ЖЛ. Том 6

Шелег Дмитрий Витальевич
6. Живой лед
Фантастика:
фэнтези
городское фэнтези
5.00
рейтинг книги
ЖЛ. Том 6

Враг из прошлого тысячелетия

Еслер Андрей
4. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Враг из прошлого тысячелетия

Последний Паладин. Том 8

Саваровский Роман
8. Путь Паладина
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Последний Паладин. Том 8

Мир повелителей смерти

Муравьёв Константин Николаевич
10. Живучий
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Мир повелителей смерти

Лондон

Резерфорд Эдвард
The Big Book
Проза:
историческая проза
6.67
рейтинг книги
Лондон

Я снова князь. Книга XXIII

Дрейк Сириус
23. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я снова князь. Книга XXIII

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Поход

Валериев Игорь
4. Ермак
Фантастика:
боевая фантастика
альтернативная история
6.25
рейтинг книги
Поход