Ответ 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();