пятница, 20 августа 2010 г.

Создание PDF-файлов на Perl

Введение

Начну с того, что есть несколько различных подходов к решению данной задачи:
  1. Создание PDF "с нуля" (PDF::API2, PDF::Haru, PDF::CreateSimple)
  2. Модификация уже существующего PDF-бланка (PDF::Reuse, PDF::API2, PDF::Haru, PDF::CreateSimple)
  3. Создание PDF из XML-шаблона при помощи XSLT-преобразования (XML::ApacheFOP)
  4. Конвертация LaTeX или HTML файла в PDF внешними утилитами (исходые файлы при этом можно генерировать по шаблону, к примеру, Template::Toolkit)
У каждого подхода есть свои плюсы и минусы, так что выбор зависит от конкретной ситуации. В этой же статье четь пойдёт о первом подходе, а точнее о создании PDF-файлов при помощи модуля PDF::API2.

Краткий обзор PDF::API2

Модуль PDF::API2 - ветеран среди PDF-модулей на CPAN. Проект насчитывает уже несколько лет и обладает внушительным функционалом. Стоит отметить, однако, что интерфейс PDF::API2 довольно запутан и не всегда очевиден, кроме того, работать придется с довольно низкоуровневыми элементами (графические примитивы, строки текста и т.д.). Последний недостаток отчасти компенсируют модули-обёртки с более удобным интерфейсом: PDF::API2::Simple, PDF::Table.

В целом, работа с PDF::API2 напоминает рисование: получить графический контекст, задать необходимые атрибуты (цвет, фон, стиль начертания), вызвать соответствующий метод-примитив (текст, прямоугольник, дуга и т.д.).

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

Пример

#!/usr/bin/perl

#===============================================================================
#    REVISION:  $Id$
# DESCRIPTION:  Минимальный пример использования PDF::API2
#      AUTHOR:  Alexander Simakov, <xdr (dot) box (at) Gmail>
#               http://alexander-simakov.blogspot.com/
#     LICENSE:  Public domain
#===============================================================================

use strict;
use warnings;

our $VERSION = qw($Revision$) [1];

use Readonly;
use PDF::API2;

# Размер бумаги A4
Readonly my $PAGE_WIDTH  => 210;
Readonly my $PAGE_HEIGHT => 297;

# Внутренняя единица измерения PDF::API2 - пункты
# см. http://ru.wikipedia.org/wiki/Типографский_пункт
Readonly my $ONE_MILLIMETER_IN_POINTS => 72 / 25.4;

# Перевод миллиметров в типографские пункты
sub _mm_to_pt {
    my $mm = shift;

    return $mm * $ONE_MILLIMETER_IN_POINTS;
}

sub main {

    # Создаём PDF-объект
    my $pdf = PDF::API2->new( -file => 'example.pdf' );

    # Создаём новую станицу размера A4
    my $page = $pdf->page();
    $page->mediabox( _mm_to_pt($PAGE_WIDTH), _mm_to_pt($PAGE_HEIGHT) );

    # Встраиваем в PDF-файл шрифты
    my %fonts = (
        Helvetica => {
            Bold   => $pdf->corefont('Helvetica-Bold'),
            Roman  => $pdf->corefont('Helvetica'),
            Italic => $pdf->corefont('Helvetica-Oblique'),
        },
    );

    # Напишем строку текста
    my $text_ctx = $page->text();

    $text_ctx->font( $fonts{'Helvetica'}{'Bold'}, 12 );
    $text_ctx->fillcolor('red');

    # В PDF::API2 - начало координат в левом нижнем углу
    $text_ctx->translate(
        _mm_to_pt( $PAGE_WIDTH / 2 ),
        _mm_to_pt( $PAGE_HEIGHT / 2 )
    );

    # Выводим строку с выравниванием по центру
    $text_ctx->text_center('Hello PDF::API2');

    $pdf->save();

    return;
}

main();

А вот результат: example.pdf
Скачать скрипт: create_example_pdf.tar.gz

Заключение

Модуль PDF::API2 позволяет достаточно тонко и точно контроллировать процесс создания PDF-файла, но за всё приходится платить. В данном случае плата - это довольно большое количество усилий необходимых для выполнения относительно простых операций.

Ссылки

среда, 11 августа 2010 г.

Программист-прагматик. Путь от подмастерья к мастеру

Программист-прагматик. Путь от подмастерья к мастеру // 2009
Эндрю Хант, Дэвид Томас

В этой книге собраны проверенные временем рекомендации настоящих мастеров своего дела. В ней затронуты такие темы как персональная продуктивность, профессиональный рост, принципы построения надёжных и масштабируемых архитектур (борьба с дублированием знаний, принцип ортогональности), тестирование, автоматизация, сбор требований и многое другое.

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

Оценка по шкале ИМХО: 5

пятница, 6 августа 2010 г.

pm-version.pl --- самый быстрый способ узнать установлен ли Perl модуль и если да, то какой версии

Введение

Для того чтобы узнать установлен ли определенный Perl модуль, чаще всего пишут короткий однострочник, который загружает модуль и распечатывает его $VERSION. Ниже представлен усовершенстованный вариант который помимо вывода версии, проверяет является ли модуль встроеным и если да, то начиная с какой версии Perl. Для максимальной эффективности предлается установить короткий Shell alias (см. в заголовке скрипта) для вызова pm-version.pl

Примеры
V Smart::Comments
Smart::Comments v1.0.3

V File::Spec
File::Spec v3.2501 (built-in since perl v5.00405)

V Foo::Bar
Foo::Bar is not installed

Скачать
http://entropyware.info/blog/perl_tools/pm-version.tar.gz