Делать PDF отчеты в Perl? - PullRequest
       13

Делать PDF отчеты в Perl?

13 голосов
/ 24 сентября 2011

Все библиотеки PDF для Perl кажутся немного варварскими - застряли в 1980-х годах. Вы должны указать точки PostScript, чтобы сделать макет. В Java есть JasperReports, в Ruby есть Prawn, а в Python есть ReportLab. Есть ли не потухшая библиотека / модуль, который позволил бы мне сделать красивый PDF менее чем за неделю кодирования? (Я немного разочарован PDF :: API2, PDF :: Table и т. Д.) Я не хочу генерировать HTML и конвертировать его. Perl идеально подходит для создания отчетов, но основной формат файла отчета недоступен для использования. Какие библиотеки используют люди?

Мне нужно:

  • таблицы
  • диаграммы (изображения)
  • цвет
  • форматирование (в идеале автоматическое, не попиксельное)
  • колонтитулы

Я немного открыт для упаковки внешних (не Perl) инструментов с открытым исходным кодом, если это абсолютно необходимо. Но на самом деле не интересует основной подход к серверу Java. Для награды я хочу чистый подход Perl, так как я хочу запустить его на сервере, к которому я не могу добавить больше модулей. Если у вас есть публичный пример, который работает хорошо, пожалуйста, укажите мне на него.

Ответы [ 3 ]

10 голосов
/ 24 сентября 2011

Используя Perl, сгенерируйте LaTeX , возможно, используя Template :: Toolkit , затем вызовите компилятор, TeXLive или MikTeX или любой другой дистрибутив, который вам нужен для вашей ОС.Существует расширение под названием Template :: LaTeX , хотя оно, вероятно, вам не нужно, которое управляет процессом сборки.

LaTeX поддерживает все, что вам нужно.Таблицы становятся немного интереснее, но есть некоторые современные пакеты таблиц, которые облегчают работу (я думаю, что это называется ltxtable).Для диаграмм (вы имеете в виду диаграммы) есть под язык TikZ, который является чрезвычайно мощным.

Это действительно очень простой рабочий процесс, особенно если вы хотите, чтобы результаты были похожи каждый раз (т.е. могутиспользовать шаблон).На самом деле это на самом деле мало чем отличается от создания HTML из шаблона и его передачи в браузер.

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

5 голосов
/ 27 сентября 2011

Если LaTeX слишком велик, возможно, можно использовать Inline::Python, чтобы обернуть ReportLab, что всем, похоже, очень нравится (я не использовал его и не слишком опытен в Python).

Редактировать 3: Вот Редактирование 2, за исключением разделения на модульный стиль, если людям это нравится (и если он достаточно надежный), возможно, я могу опубликовать его в CPAN. А пока поместите файл .pm в файловую структуру, например Inline/Python/ReportLab.pm, где-нибудь в вашем @INC (собственный базовый каталог скрипта обычно находится в @INC).

# Inline/Python/ReportLab.pm
package Inline::Python::ReportLab;

use strict;
use warnings;

use Carp;

use Inline::Python qw/py_eval/;
our @ISA = 'Inline::Python::Object';

sub import {
  py_eval('from reportlab.pdfgen.canvas import Canvas');
}

sub new {
  my $class = shift;
  my $filename = shift || croak "Must specify file name to contructor";
  return bless(Inline::Python::Object->new('__main__', 'Canvas', $filename), $class);
}

1;

Тогда скрипт может быть что-то вроде:

#!/usr/bin/env perl

use strict;
use warnings;

use Inline::Python::ReportLab;

my $c = Inline::Python::ReportLab->new('hello.pdf');
$c->drawString(100,100,"Hello World");
$c->showPage();
$c->save();

Редактировать 2: Хотя Редактирование 1 все еще представляет интерес, кажется (скажите мне, если я ошибаюсь!), Что я выяснил, как создать экземпляр Canvas и предоставить его методы напрямую:

#!/usr/bin/env perl

use strict;
use warnings;

use Inline::Python qw/py_eval/;

py_eval('from reportlab.pdfgen.canvas import Canvas');

my $c = Inline::Python::Object->new('__main__', 'Canvas', 'hello.pdf');
$c->drawString(100,100,"Hello World");
$c->showPage();
$c->save();
<ч />

Редактировать 2/3: эта часть оставлена ​​в качестве примера более ручного интерфейса. Я думаю, что Редактирование 2/3 дает лучший интерфейс, который оставляет тяжелую работу для исходного класса Python без (слишком много) переноса.

Редактировать 1: Теперь я раскрыл некоторые функциональные возможности, взломав методы вручную. Это означает, что для каждого метода, который вы хотите использовать, должен быть добавлен метод-обертка. Хотя это уже выполнимое решение, мне интересно, нет ли более простого способа раскрыть весь класс python 'canvas', но сейчас я здесь:

#!/usr/bin/env perl

use strict;
use warnings;

use Inline Python => <<END_PYTHON;
from reportlab.pdfgen import canvas

class Canvas:
  def __init__(self,filename):
    self.canvas = canvas.Canvas(filename)
  def drawString(self,x,y,text):
    self.canvas.drawString(x,y,text)
  def save(self):
    self.canvas.showPage()
    self.canvas.save()

END_PYTHON

my $c = Canvas->new('hello.pdf');
$c->drawString(100,100,"Hello World");
$c->save();
0 голосов
/ 26 февраля 2013

После долгих раздумий и экспериментов я написал много кода для упаковки PDF :: API2.К сожалению, это был внутренний проект внутри компании, поэтому он не будет выпущен с открытым исходным кодом, но, честно говоря, я бы рекомендовал использовать другой язык (Python / Ruby), возможно, для передачи данных через JSON или что-то в этом роде.Мой конечный результат эффективен, но он потребовал много кода.В CPAN ведется рефакторинг PDF :: API2, но, похоже, он остановился.

...