Perl的所有PDF库似乎有点野蛮 – 困在20世纪80年代.您必须指定PostScript点进行布局.
Java有JasperReports,Ruby有Prawn,Python有ReportLab.有没有一个非绝灭的图书馆/模块,让我在不到一个星期的编码中做一个漂亮的PDF? (我有点沮丧的PDF :: API2,PDF ::表等)我不想生成HTML并转换它. Perl是报告的理想选择,但主要报告文件格式不可用.人们使用哪些图书馆?
我需要:
>表
>图表(图片)
>颜色
>格式化(理想情况下自动,不是逐个像素)
>页眉/页脚
如果绝对需要,我稍微打开包装外部(非Perl)开源工具.但对主要的Java服务器方法并不感兴趣.对于赏金,我想要一个纯粹的Perl方法,因为我想在不能添加多个模块的服务器上运行这个方法.如果你有一个很好的公共例子,请指出我.
解决方法
如果LaTeX太大,也许可以使用
Inline::Python
来包装ReportLab,大家似乎都很喜欢(我没有使用它,对Python并不太熟练).
编辑3:
这是编辑2,除了分割成模块化的风格,如果人们喜欢它(如果它是一种强大的)也许我可以发布到CPAN.现在将.pm文件放在@INC中某处的文件结构(如Inline / Python / ReportLab.pm)(脚本自己的基本目录通常在@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__','hello.pdf'); $c->drawString(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,text) def save(self): self.canvas.showPage() self.canvas.save() END_PYTHON my $c = Canvas->new('hello.pdf'); $c->drawString(100,"Hello World"); $c->save();