我正在使用PDF :: FromHTML从HTML生成PDF(正如模块的名称所暗示的那样):))
我可以从命令行运行它并接收我预期的输出 - 但是当我在我的网络应用程序中使用完全相同的代码时,输出看起来不正确 - 文本出现在错误的地方,而不是全部出现。
我在网络应用程序和命令行中使用完全相同的输入文件 - 从我的网络应用程序内部调用它的某些原因,它显示的方式不同。
以下是代码:
use PDF::FromHTML;
my $filename = '/tmp/backup.html';
my $font = 'Helvetica';
my $encoding = 'utf-8';
my $size = 12;
my $landscape = 0;
my $pdf = PDF::FromHTML->new(
encoding => $encoding,
);
my $input_file = $filename;
my $output_file = "$input_file.pdf";
warn "$input_file\n$output_file\n";
$pdf->load_file($input_file);
$pdf->convert(
Font => $font,
LineHeight => $size,
Landscape => $landscape,
);
$pdf->write_file($output_file);
网络应用程序代码是相同的,只是将该块抛入方法中。
我在十六进制编辑器中查看了两个生成的PDF文件,发现了差异。他们是一样的,直到一个意图我无法理解的街区......
该块的PDF内容很好:
/Length 302 >> stream
**binary data
endstream endobj
10 0 obj << /Filter [ /FlateDecode ] /Length 966
错误的PDF内容:
/Length 306 >> stream
**binary data
endstream endobj
10 0 obj << /Filter [ /FlateDecode ] /Length 559
正如您所看到的,此处包含的内容长度不同,该流中包含的二进制数据(长度302与长度306之一)以及下一个流(长度966与559之一)不同
我不完全确定导致这种差异的原因,我唯一能想到的是当我在命令行上运行这个用户而不是从网上运行它时环境中的某种差异应用程序。但是,我不知道从哪里开始调试。
答案 0 :(得分:4)
通常,CGI环境与您的交互式登录环境不同,就像其他人的登录环境与您的不同一样。诀窍是弄清楚你在命令行上设置或取消设置的程序是什么。
您可能希望看到我的Troubleshooting Perl CGI scripts一步一步的方法来追踪这些问题。
要调查的一些事项:
一种有用的技术是使您的登录shell暂时具有与CGI环境相同的设置。一旦这样做,即使这些结果错误,您也应该在命令行上获得相同的结果。但是,一旦得到错误的结果,您就可以从命令行开始跟踪它。
祝你好运。答案 1 :(得分:1)
一些建议:
输出文本的顺序是不同的还是仅仅是位置?如果它的位置然后尝试设置PageWidth等因为正在使用的库(PDFLib或其他)可能在两个环境之间选择不同的默认值。如果订购错了,那我就不知道了。
您发布的两个PDF块并没有真正显示太多 - 只是显示压缩部分的大小不同。在任何一个例子中,语法上没有任何错误。
答案 2 :(得分:0)
也许有一些编码问题?看看标题。
答案 3 :(得分:0)
我会好好看看Web服务器正在运行的用户以及用户环境变量的外观。还要注意用户对目录的权限。还有其他限制Web服务器用户的东西,比如Linux盒子上的SElinux吗?