2012-03-28 8 views
5

私は自分のサーバー上でPDFに変換したいと思う非常に複雑なHTML/CSSレイアウトを持っています。私はすでにDOMPDFを試しましたが、残念ながら正しいレイアウトでHTMLを変換しませんでした。私はHTMLDOCを考慮しましたが、CSSを大部分無視していると聞いています。そのため、そのツールでもレイアウトがばらばらになると思います。HTML2PDF in PHP - ユーティリティとスクリプトを変換する - 例とデモ

質問があります - 他のツール(wkhtmltopdfなど)のオンラインデモはありますか?自分のHTMLがどのように変換されているかを確認するために使用できますか?残りの人生を過ごす前に、&を順番にテストしていますか?

残念ながら、これらのツールに合わせてHTMLレイアウトを変更することはできません。または、より良いと言えば、もし彼らのいずれかが受け入れ可能な結果に近づくとすれば、私はできます...

+3

wkhtmltopdfは、インストールの多くを必要としません - 私は、彼らが実際にお勧めだと思います静的な32ビット版または64ビット版をダウンロードして使用するだけです。それをテストするのに2分以上かかることはありません。おそらく最高品質のソリューションを利用できます。我々は印刷目的でPDFに変換され、wkhtmltopdfはまだ私たちを失敗させていない半複合HTML/CSSを持っています。 – Crontab

+2

wkhtmltopdfは本当にインストールが簡単です(また、静的にリンクされたバイナリなので、追加のlibsは必要ありません)...結果はWebkitエンジンによるレンダリングと同じです(これはフードの下にあります - ただヘッドなし) – poncha

+0

ねえ、thanx、私はもう2つのことを試してみましょう - TCPDF&wkhtmltopdf:両方とも正しいですが、すべてのものはインストールが簡単ですが、ドキュメントを読むためにそれをテストするために時間がかかります:) – Michal

答えて

11

実際には答えはありませんが、上記の質問に対しては、私はいくつかの経験を提供しようとします。将来誰かを助ける。

  1. wkthmltopdf本当に私が満足できる結果と呼んで作り出すことができる私のために働いた唯一のソリューションです。それでも、CSSのマイナーチェンジを行う必要がありましたが、コンテンツをレンダリングするときにはうまくいきました。他のすべてのパッケージは、あなたが基本的なテーブルなどの単純なドキュメントを持っている場合にのみ実際に適しています。デザイン要素、CSS、複数の重なったイメージなどを含む複雑なドキュメントで公正な結果を出す機会はありません。 - 時間を過ごさないでください(私のように) - はすぐにwkhtmltopdfに行きます。

  2. 注意 - wkhtmltopdfのインストールは、トリッキーです。みんなが彼らのコメントで言ったように私にとってはそれほど簡単ではなかった(その理由の一つは、私がLinuxに慣れていないかもしれないということかもしれない)。私が説明できない何らかの理由で静的バイナリが私のために働かなかった。私は、バージョンに問題があったと思う - 明らかに異なったOSとプロセッサのバージョン間に違いがある、おそらく私はvrongバージョンを持っている。静的でないバージョンをインストールするには、最初にサーバーにrootでアクセスする必要がありますが、それは明らかです。 PuTTyを使ってapt-getとインストールしました。かなりうまくいった。私は私のサーバはすでにwkhtmltopdfをインストールするすべての素因を持っていたことが幸運だった。これは私のための簡単な部分でした:)(btw、あなたはシンボリックリンクやラッパーを気にする必要はありません。多くのチュートリアルではあなたに伝えます。インストール後)もののうまく機能アップし、すべて

  3. 私はかなり有名なCannot connect to X serverエラーが発生しました。これは、'virtual' x serverでヘッドレスwkhtmltopdfを実行する必要があるためです。これを回避することも非常に簡単でした(シンボリックリンクを気にしない場合)。 apt-get install xvfbでインストールしました。これは私にとっても問題なく、とてもうまくいった。

  4. これを完了した後、私はwkhtmltopdfを実行することができました。気をつけてください。xvfbを実行しようとすると間違った方法であることがわかりました。xvfb-runを実行する必要があります。私のPHPコードはexec("xvfb-run wkhtmltopdf --margin-left 16 /data/web/domain.com/source.html /data/web/domain.com/target.pdf");のようになります(--margin-left 16のコマンドラインオプションwkhtmltopdfに気付くと、私のコンテンツはより集中しています;コマンドラインオプションの使い方を示すために残しました)。

  5. 私はまた、が生成されたPDFファイルを編集しないようにしたいと思います(私の場合は、プリントプロテクトも可能です)。いくつかの調査をした後、IDセキュリティスイートからthis classが見つかりました。まず第一に、私は言うべきです - それは古いです(私はPHP 5+を実行しています)。しかし、私はいくつか改善しました。まず第一に - FPDFライブラリのラッパーですので、パッケージにはfpdf.phpというファイルがあります。私はfrom hereを得た最新のFPDFバージョンからこのファイルを置き換えました。私のPHP警告はより持続可能に見えました。私は$pdf =& new FPDI_Protection();を変更し、その代わりに推奨されない警告を受け取っているので&記号を削除しました。しかし、来るものがもっとあります。コードを検索して変更するのではなく、エラーを報告するエラーをerror_reporting(0);で0にしました(ただし、警告をオフにするだけで十分です)。今誰かがこれが「良い習慣」ではないと言います。私は内部のシステムでこのすべてのものを使用しているので、私は気にする必要はありません。最新の要件に合わせてスクリプトを修正することができます。私にとっては、別の時間を費やして仕事をしたくなかった。 スクリプトが$pdf->SetProtection(array('print'), '', $password);と表示されているところに注意してください。 第1引数が許可であることがわかりました。 秒がユーザパスワードです。これを指定すると、パスワードを入力する必要があります(この空白は残しました)。 第三は、所有者のパスワードである - 私の全体のコードは今のように見えるなど

、これはあなたがドキュメントを編集に対して「確保」させるために必要なものであるコピー:

// get the HTML content of the file we want to convert 
$invoice = file_get_contents("http://www.domain.com/index.php?s=invoices-print&invoice_no=".$_GET['invoice_no']; 
// replace the CSS style from a print version to a specially modified PDF version 
$invoice = str_replace('href="design/css/base.print.css"','href="design/css/base.pdf.css"',$invoice); 

// write the modified file to disk 
file_put_contents("docs/invoices/tmp/".$_GET['invoice_no'].".html", $invoice); 

// do the PDF magic 
exec("xvfb-run wkhtmltopdf --margin-left 16 /data/web/domain.com/web/docs/invoices/tmp/".$_GET['invoice_no'].".html /data/web/domain.com/web/docs/invoices/".$_GET['invoice_no'].".pdf"); 

// delete the temporary HTML data - we don't need that anymore since our PDF is created 
unlink("docs/invoices/tmp/".$_GET['invoice_no'].".html"); 

// workaround the warnings 
error_reporting(0); 

// script from ID Security Suite 
function pdfEncrypt ($origFile, $password, $destFile){ 
    require_once('libraries/fpdf/FPDI_Protection.php'); 
    $pdf = new FPDI_Protection(); 
    $pdf->FPDF('P', 'in'); 
    //Calculate the number of pages from the original document. 
    $pagecount = $pdf->setSourceFile($origFile); 
    //Copy all pages from the old unprotected pdf in the new one. 
    for ($loop = 1; $loop <= $pagecount; $loop++) { 
     $tplidx = $pdf->importPage($loop); 
     $pdf->addPage(); 
     $pdf->useTemplate($tplidx); 
    } 

    //Protect the new pdf file, and allow no printing, copy, etc. and 
    //leave only reading allowed. 
    $pdf->SetProtection(array('print'), '', $password); 
    $pdf->Output($destFile, 'F'); 
    return $destFile; 
} 

//Password for the PDF file (I suggest using the email adress of the purchaser). 
$password = md5(date("Ymd")).md5(date("Ymd")); 
//Name of the original file (unprotected). 
$origFile = "docs/invoices/".$_GET['invoice_no'].".pdf"; 
//Name of the destination file (password protected and printing rights removed). 
$destFile = "docs/invoices/".$_GET['invoice_no'].".pdf"; 
//Encrypt the book and create the protected file. 
pdfEncrypt($origFile, $password, $destFile); 

・ホープ、この将来誰かに時間を節約するのに役立ちます。この全体的なソリューションは、私たちの請求システムに実装するのに12時間かかった。私のようなLinux/UNIXに精通していないユーザーのためにwkhtmltopdfに関するより良い情報があれば、これに費やす時間の一部を節約できました。

しかし - あなたは、あなたがより強くなります殺すことはありません:)だから私はもう少し完璧だ今、私はこの実行をしたこと:)

+0

Are SELinuxを強制モードで実行していますか? –

関連する問題