これはある程度以前に尋ねられましたが、解決策も受け入れられた答えもありません。私の質問でより包括的なものにしたいと思います:
私はWKHTMLTOPDFをPHP共有サーバー(この場合は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');
エラー:
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レベルは基本的な側面ですが、最善を尽くします。
ここで私のプロジェクトを試すこともできます。コマンドラインユーティリティへのきれいな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();
snappy 、サムネイル、スナップショット、またはPDF urlまたはhtmlページからの生成を許可するPHPライブラリー。これはwkhtmltopdf/wkhtmltoimageのラッパーです。
適切なヘッダーを設定して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;
?>
Linuxの場合:
exec('wkhtmltopdf http://somesite.com /home/user/file.pdf 2>&1');
Windowsの場合:
<?php
exec('C://abc//wkhtmltopdf http://google.html form1.pdf');
echo "PDF Created Successfully";
?>
(Linux上で)phpからPDFを作成するには、ラッパーを使用する必要があります。
$cmd = '/usr/bin/xvfb-run --server-args="-screen 0, 1920x1080x24" /usr/bin/wkhtmltopdf http://google.com /tmp/google.pdf';
exec($cmd);
これは、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);
そして、実行するとどうなりますか:
$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を実行します)。