wkhtmltopdf/perl:HTTP 标头和日志记录

Posted

技术标签:

【中文标题】wkhtmltopdf/perl:HTTP 标头和日志记录【英文标题】:wkhtmltopdf/perl: HTTP headers & logging 【发布时间】:2011-04-06 20:57:30 【问题描述】:

我刚刚发现了 wkhtmltopdf,我正在尝试在 perl CGI 脚本中使用它来生成 PDF。基本上,perl 脚本编写一个 HTML 文件,通过 system() 调用 wkhtmltopdf 创建一个 pdf,然后下载 pdf 并删除临时文件。

open NNN, ">$path_to_files/$file_pdf.html" or die "can't write file: $!";
print NNN $text;
close NNN;

my @pdfSettings = (
    "d:/very/long/path/wkhtmltopdf",
    "$path_to_files/$file_pdf.html",
    "$path_to_files/$file.pdf"
    );

system(@pdfSettings);

open(DLFILE, '<', "$path_to_files/$file.pdf");
   print $q->header(
        -type=> 'application/x-download',
        -attachment => "$file.pdf",
        -filename => "$file.pdf",
        'Content-length' => -s "$path_to_files/$file.pdf",
);

binmode DLFILE;
print while <DLFILE>;
close (DLFILE);


unlink("$path_to_files/$file_pdf.html");
unlink("$path_to_files/$file.pdf");

这在我的本地服务器上运行良好。但是,当我将它上传到我的公共服务器时,它会创建 pdf 文件,然后因“指定的 CGI 应用程序因未返回一组完整的 HTTP 标头而行为异常”而死掉。

将“print $q->header”移动到 system() 调用之前会导致 pdf 在文件顶部生成 wkhtmltopdf 的控制台输出(“Loading pages (1/6)”等),所以我认为正在发生的事情是 wkhtmltopdf 正在向服务器发送无标题的信息并导致它失败。但是我在 wkhtmltopdf 文档中找不到任何选项来关闭控制台输出,而且我无法找到一种 perl 方法来抑制/重定向该输出。

(是的,我知道 WKHTMLTOPDF.pm,但我在安装它时遇到了我的 ActivePerl 风格的问题,我想尽可能避免切换。)

【问题讨论】:

【参考方案1】:

如何通过 qx 或反引号而不是 system() 执行,并将输出重定向到 NUL:?


qx("d:/very/long/path/wkhtmltopdf" "$path_to_files/$file_pdf.html" "$path_to_files/$file.pdf" > NUL: 2> NUL:);

【讨论】:

有效!我试过 qx 但不知道 NUL。谢谢! 等等。 . .抱歉,它毕竟不起作用。有一次我试图检查输出,所以我注释掉了删除临时 pdf 的行,所以它一次又一次地下载。但是现在我已经删除了该文件,它根本无法创建 pdf,只显示以下消息:“Content-Disposition: attachment; filename="Advanced.pdf" Filename: Advanced.pdf Content-length Content-Type: application/x-download " ("Advanced" 是 $file 的值) 那是在私人服务器上。公共服务器失败并显示与以前相同的 HTTP 标头消息。 也许您正试图在您无权写入文件的地方生成文件? 盖克。如果有人用评论回复答案,我希望 *** 有一个通知选项。

以上是关于wkhtmltopdf/perl:HTTP 标头和日志记录的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 1.1 TE 标头

HTTP标头设置授权标头阻止数据加载

Angular:自定义标头被 $http 和 $resource 忽略。为啥?

我可以使用 tcpdump 获取 HTTP 请求、响应标头和响应正文吗?

HTTP 连接标头

GWT RPC 安全、http 标头、身份验证和 requestbuilder