1

我正在使用 PDF::FromHTML 从 HTML 生成 PDF(正如模块名称所暗示的那样):)

我可以从命令行很好地运行它并接收我的预期输出 - 但是当我在我的网络应用程序中使用完全相同的代码时,输​​出看起来根本不正确 - 文本出现在错误的位置而不是这一切都在出现。

我在 Web 应用程序和命令行中使用完全相同的输入文件- 出于某种原因,当从我的 Web 应用程序内部调用它时,它的显示方式有所不同。

这是代码:

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

Web 应用程序代码是相同的,只是将该块放入方法中。

我在十六进制编辑器中查看了两个生成的 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 一个)中包含的二进制数据也是如此。

我不完全确定是什么导致了这种差异,我唯一能想到的就是当我在命令行上以用户身份运行它与从 Web 应用程序运行它时,环境中的某种差异。但是,我不知道应该从哪里开始调试。

4

4 回答 4

4

一般来说,CGI 环境与您的交互式登录环境不同,就像其他人的登录环境与您的不同一样。诀窍是弄清楚你在命令行上设置或取消设置的哪些东西使你的程序工作。

您可能希望查看我的Perl CGI 脚本疑难解答,以了解跟踪这些问题的分步方法。

需要调查的一些事情:

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

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

祝你好运。

于 2009-04-09T15:30:59.357 回答
1

几个建议:

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

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

您发布的两个 PDF 块并没有真正显示太多 - 只是显示压缩部分的大小不同。这两个示例在语法上实际上都没有错误。

于 2009-04-15T20:13:07.553 回答
0

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

于 2009-04-17T07:02:42.863 回答
0

我会好好看看 Web 服务器以什么用户身份运行以及用户环境变量是什么样的。还要注意用户对目录的权限。还有其他限制Web服务器用户的东西,例如Linux机器上的SElinux吗?

于 2009-04-17T21:12:00.310 回答