加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中制作PDF报告?

发布时间:2020-12-15 21:30:51 所属栏目:大数据 来源:网络整理
导读:Perl的所有PDF库似乎有点野蛮 – 困在20世纪80年代.您必须指定PostScript点进行布局. Java有JasperReports,Ruby有Prawn,Python有ReportLab.有没有一个非绝灭的图书馆/模块,让我在不到一个星期的编码中做一个漂亮的PDF? (我有点沮丧的PDF :: API2,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中).

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读