Если 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();