52

これは以前にある程度尋ねられましたが、解決策や受け入れられた回答はありません。質問をより包括的にしたいと思います。

共有サーバー上で PHP 経由で WKHTMLTOPDF を実行しようとしています (この場合は MediaTemple (gs))。ホストによると、これが機能しない理由はなく、実際には SSH 経由で機能しています。そう...

私はさまざまなことを試しましたが、最も基本的なものは何もせず、静かに失敗します:

exec("/path/to/binary/wkhtmltopdf http://www.google.com pdf1.pdf");

-出典: スタック オーバーフローに関する質問

以下の完全な PHP バインディングを使用すると、エラーが発生します。これは、最善のグーグル検索にもかかわらず、理解できません。

電話:

$html = file_get_contents("http://www.google.com");
$pdf = new WKPDF();
$pdf->set_html($html);
$pdf->render();
$pdf->output(WKPDF::$PDF_EMBEDDED,'sample.pdf');

-ソース: Google コードの WKHTMLTOPDF

エラー:

Fatal error: Uncaught exception 'Exception' with message 'WKPDF didn't return
any data. <pre>Loading pages (1/6) [> ] 0% [======> ] 10% terminate called
after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc </pre>'
in /path/to/wkhtmltopdf.php:206 Stack trace: #0 /path/to/index.php(8):
WKPDF->render() #1 {main} thrown in /path/to/wkhtmltopdf.php on line 206

そして、これを取得したら(現在は再現できないため、以下は抜粋です):

Qt Concurrent has caught an exception thrown from a worker thread. This is not
supported, exceptions thrown in worker threads must be caught before
control returns to Qt Concurrent.

他のいくつかのオプションも試しましたが、同じ結果になりました。PDFはありません。それで、私は今何をすべきですか、どうすれば何が悪いのかを理解できますか?私のPHPレベルは基本的なものですが、最善を尽くします。

4

7 に答える 7

41

ここで私のプロジェクトを試すこともできます。コマンド ライン ユーティリティへのクリーンな OO インターフェイスを提供します。

https://github.com/mikehaertl/phpwkhtmltopdf

使い方はとても簡単です:

<?php
use mikehaertl\wkhtmlto\Pdf; 

$pdf = new Pdf;

// Add a HTML file, a HTML string or a page from a URL
$pdf->addPage('/home/joe/page.html');
$pdf->addPage('<html>....</html>');
$pdf->addPage('http://google.com');

// Add a cover (same sources as above are possible)
$pdf->addCover('mycover.html');

// Add a Table of contents
$pdf->addToc();

// Save the PDF
$pdf->saveAs('/tmp/new.pdf');

// ... or send to client for inline display
$pdf->send();
于 2012-04-25T10:53:04.310 に答える
16

URL または HTML ページからサムネイル、スナップショット、または PDF を生成できる PHP5 ライブラリである snappy をご覧ください。wkhtmltopdf/wkhtmltoimage のラッパーです。

于 2012-01-18T13:45:45.780 に答える
10

適切なヘッダーを設定してapplication/pdfに設定するだけでなく、インラインに設定して、ユーザーがブラウザーで表示できるようにし(ほとんどすべての最近のブラウザーがこれをサポートしています)、必要に応じて保存することもできます。これは私が使用しているコードです:

exec("/usr/local/bin/wkhtmltopdf ../uploads/test.pdf");
$file = "../uploads/test.pdf";
$pdf = file_get_contents("../uploads/test.pdf");

header('Content-Type: application/pdf');
header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Content-Length: '.strlen($pdf));
header('Content-Disposition: inline; filename="'.basename($file).'";');
ob_clean(); 
flush(); 
echo $pdf;
?>
于 2011-07-24T14:04:52.180 に答える
2

そして、実行するとどうなりますか:

$out = array();
exec("/path/to/binary/wkhtmltopdf http://www.google.com pdf1.pdf", $out);
print_r($out);

私の推測では、ファイルのフォルダーを指定していないため、現在の作業ディレクトリに書き込もうとします。Web ユーザーがそのフォルダーへの書き込み権限を持っていない可能性があります (おそらくこれが当てはまります)。そのため、Web ユーザーが書き込み可能なフォルダーへのフルパスを提供することで、これを解決できるはずです。

すなわち。

exec("/path/to/binary/wkhtmltopdf http://www.google.com /path/to/pdf1.pdf");

それとは別に、wkhtmltopdf がヘッドレスで動作できるかどうかはよくわかりませんが、実行中の X サーバーが必要である可能性があります (X を実行していないサーバーでは、Xvfb をインストールし、xvfb-runを使用して wkhtmltopdf を実行することでこれを解決できます)。

于 2011-04-14T13:26:25.287 に答える
2

これは、PDFレポートを事前に生成し、一意のセッションIDを使用して(同じセッションの)要求ページから取得する方法として機能しました。

$cmd = "/usr/local/bin/wkhtmltopdf 'http://127.0.0.1/myApp/pdfReport.php?key=something' tmp_reports/report_".$_POST['sessionid'].".pdf";
exec($cmd);
于 2015-03-20T17:35:44.717 に答える