在Perl中制作PDF报告?

前端之家收集整理的这篇文章主要介绍了在Perl中制作PDF报告?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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中).

  1. # Inline/Python/ReportLab.pm
  2. package Inline::Python::ReportLab;
  3.  
  4. use strict;
  5. use warnings;
  6.  
  7. use Carp;
  8.  
  9. use Inline::Python qw/py_eval/;
  10. our @ISA = 'Inline::Python::Object';
  11.  
  12. sub import {
  13. py_eval('from reportlab.pdfgen.canvas import Canvas');
  14. }
  15.  
  16. sub new {
  17. my $class = shift;
  18. my $filename = shift || croak "Must specify file name to contructor";
  19. return bless(Inline::Python::Object->new('__main__','Canvas',$filename),$class);
  20. }
  21.  
  22. 1;

那么一个脚本可能是这样的:

  1. #!/usr/bin/env perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use Inline::Python::ReportLab;
  7.  
  8. my $c = Inline::Python::ReportLab->new('hello.pdf');
  9. $c->drawString(100,100,"Hello World");
  10. $c->showPage();
  11. $c->save();

编辑2:
虽然编辑1仍然是感兴趣的,但似乎(告诉我,如果我不正确!),我已经弄清楚如何创建一个“Canvas”的实例并直接公开其方法

  1. #!/usr/bin/env perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use Inline::Python qw/py_eval/;
  7.  
  8. py_eval('from reportlab.pdfgen.canvas import Canvas');
  9.  
  10. my $c = Inline::Python::Object->new('__main__','hello.pdf');
  11. $c->drawString(100,"Hello World");
  12. $c->showPage();
  13. $c->save();

编辑2/3:这部分作为一个更加手动的界面的例子.我认为编辑2/3提供了一个更好的界面,使原来的Python类没有(太多)的包装.

编辑1:我已经通过在方法中手动黑客暴露了一些功能.这意味着对于每个想要使用的方法,必须添加一个包装方法.虽然这已经是一个可行的解决方案,但我不知道是否有更简单的方法来暴露整个python’canvas’类,但是现在这就是我所在的地方:

  1. #!/usr/bin/env perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use Inline Python => <<END_PYTHON;
  7. from reportlab.pdfgen import canvas
  8.  
  9. class Canvas:
  10. def __init__(self,filename):
  11. self.canvas = canvas.Canvas(filename)
  12. def drawString(self,x,y,text):
  13. self.canvas.drawString(x,text)
  14. def save(self):
  15. self.canvas.showPage()
  16. self.canvas.save()
  17.  
  18. END_PYTHON
  19.  
  20. my $c = Canvas->new('hello.pdf');
  21. $c->drawString(100,"Hello World");
  22. $c->save();

猜你在找的Perl相关文章