Подтвердить что ты не робот

Сделать отчеты в формате PDF на Perl?

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

Мне нужно:

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

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

4b9b3361

Ответ 1

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

Изменить 3: Здесь Edit 2, за исключением разделения на модульный стиль, если людям это нравится (и если это нечто вроде надежного), возможно, я могу опубликовать его в CPAN. Пока поместите файл .pm в файловую структуру типа Inline/Python/ReportLab.pm где-нибудь в вашем @INC (собственный базовый каталог script обычно находится в @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;

Тогда a script может быть чем-то вроде:

#!/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: Хотя Edit 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: теперь я обнаружил некоторые функции, вручную взломав методы. Это означает, что для каждого метода, который нужно использовать, должен быть добавлен метод обертки. Хотя это уже приемлемое решение, мне интересно, не существует ли какой-либо более простой способ разоблачить весь класс canvas python, но пока я здесь:

#!/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();

Ответ 2

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

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

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

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

Ответ 3

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