从我的网络应用程序调用时,为什么PDF :: FromHTML的行为会有所不同?

时间:2009-04-09 14:19:41

标签: perl pdf pdf-generation

我正在使用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之一)不同

我不完全确定导致这种差异的原因,我唯一能想到的是当我在命令行上运行这个用户而不是从网上运行它时环境中的某种差异应用程序。但是,我不知道从哪里开始调试。

4 个答案:

答案 0 :(得分:4)

通常,CGI环境与您的交互式登录环境不同,就像其他人的登录环境与您的不同一样。诀窍是弄清楚你在命令行上设置或取消设置的程序是什么。

您可能希望看到我的Troubleshooting Perl CGI scripts一步一步的方法来追踪这些问题。

要调查的一些事项:

  • 您的CGI脚本是否在同一平台上运行(即,它是Windows与Unix排序的对象)
  • 环境变量有什么不同?
  • 您的CGI脚本是否使用相同版本的Perl?
  • perl二进制文件是否有不同的编译选项?
  • 您使用的是相同版本的模块吗?
  • 如果其中一些模块使用外部库,它们是否相同?

一种有用的技术是使您的登录shell暂时具有与CGI环境相同的设置。一旦这样做,即使这些结果错误,您也应该在命令行上获得相同的结果。但是,一旦得到错误的结果,您就可以从命令行开始跟踪它。

祝你好运。

答案 1 :(得分:1)

一些建议:

  • PDF :: FromHTML使用PDF :: Writer,后者又使用PDF渲染库作为插件(认为选项是PDFLib和其他一些选项)。这些库的版本是否与插件一样可用?
  • 您的HTML输入文件是否包含尚未上传的CSS文件?
  • 尝试设置其他PDF :: FromHTML变量:PageWidth,PageResolution,PageSize等

输出文本的顺序是不同的还是仅仅是位置?如果它的位置然后尝试设置PageWidth等因为正在使用的库(PDFLib或其他)可能在两个环境之间选择不同的默认值。如果订购错了,那我就不知道了。

您发布的两个PDF块并没有真正显示太多 - 只是显示压缩部分的大小不同。在任何一个例子中,语法上没有任何错误。

答案 2 :(得分:0)

也许有一些编码问题?看看标题。

答案 3 :(得分:0)

我会好好看看Web服务器正在运行的用户以及用户环境变量的外观。还要注意用户对目录的权限。还有其他限制Web服务器用户的东西,比如Linux盒子上的SElinux吗?