2

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 ファイルを作成するところまで到達し、「HTTP ヘッダーの完全なセットを返さないことで、指定された CGI アプリケーションが正しく動作しませんでした」というメッセージが表示されます。

"print $q->header" を system() 呼び出しの前に移動すると、ファイルの先頭に wkhtmltopdf のコンソール出力 ("Loading pages (1/6)" など) で pdf が生成されるので、私は思う何が起こっているかというと、wkhtmltopdf がその情報をヘッダーなしでサーバーに吐き出し、失敗させているということです。しかし、コンソール出力をオフにするオプションが wkhtmltopdf docs に見つからず、その出力を抑制/リダイレクトする perl メソッドがわかりません。

(はい、WKHTMLTOPDF.pm のことは知っていますが、自分の ActivePerl のフレーバーではインストールに問題があり、できれば切り替えを避けたかったのです。)

4

1 に答える 1

2

system()の代わりにqxまたはbackticksを介して実行し、出力をNULにリダイレクトするのはどうですか?


qx("d:/very/long/path/wkhtmltopdf" "$path_to_files/${file}_pdf.html" "$path_to_files/$file.pdf" > NUL: 2> NUL:);
于 2011-04-06T22:12:12.390 に答える