我想在 plperlu 中生成 PDF,将其存储在数据库中,然后将其作为附件添加到电子邮件中。
我正在使用 PDF::Report 来生成 PDF。代码如下所示:-
CREATE OR REPLACE FUNCTION workflow.make_pdf(report_template json, report_json json)
RETURNS bytea AS
$BODY$
use strict;
use PDF::Report;
my $pdf = new PDF::ReportNG(PageSize => 'A4', PageOrientation => "Landscape");
...
lots of tricky stuff to make PDF
...
return $pdf->Finish();
$BODY$ LANGUAGE plperlu;
我认为这个错误与invalid input syntax for type bytea
创建的 PDF 文档的编码有关。
文档本身很好,因为$pdf->saveAs('/tmp/test.pdf');
它创建了一个完全可读的文档。
我在返回结果之前尝试了 base64 编码,因为电子邮件的附件需要在 base64 中。
return MIME::base64::encode($pdf->Finish());
这消除了错误,然后我可以将它存储在一个表中: -
INSERT INTO weekly_report_pdfs(report)
VALUES (make_pdf(report_template,report_json));
这也可以正常工作,并且可以附加到电子邮件中,但是在 base64 解码后损坏问题仍然存在。
直接从数据库中导出文件并运行仅在一行之后base64 -d test.b64
就会出现错误。invalid input
这似乎与 postgres 处理 bytea 的方式有关,因为文件如下所示:-
MDA0OTY1MSAwMDAwMCBuIAowMDAwMDQ5ODU0IDAwMDAwIG4gCjAwMDAwNTAxNjcgMDAwMDAgbiAK\\012dHJhaWxlcgo8PCAvUm9vdCAxIDAgUiAvU2l6ZSA0MCAvSW5mbyA0IDAgUiA+PgpzdGFydHhyZWYK\\012
有很多 \012 分隔符。
任何想法,我一直在这几个小时,完全被难住了。