2012-03-28 26 views
5

Tôi có bố cục HTML/CSS khá phức tạp mà tôi muốn chuyển đổi sang PDF trên máy chủ của mình. Tôi đã thử DOMPDF, tiếc là nó không chuyển đổi HTML với bố cục chính xác. Tôi đã coi HTMLDOC nhưng tôi đã nghe nói rằng nó bỏ qua CSS đến một mức độ lớn, vì vậy tôi cho rằng bố cục sẽ phá vỡ với công cụ đó.HTML2PDF bằng PHP - chuyển đổi tiện ích & tập lệnh - ví dụ & trình diễn

Câu hỏi của tôi là - có bản trình diễn trực tuyến nào cho các công cụ khác (như wkhtmltopdf tức là) mà tôi có thể sử dụng để xác minh cách HTML của tôi được chuyển đổi không? Trước khi dành phần còn lại của cuộc đời mình, hãy cài đặt thử nghiệm & từng cái một?

Thật không may, tôi không thể thay đổi bố cục HTML để phù hợp với các công cụ đó. Hoặc tốt hơn nói - tôi có thể, nếu bất kỳ ai trong số họ có được kết quả chấp nhận được ...

+3

wkhtmltopdf không đòi hỏi nhiều của một cài đặt - Tôi nghĩ họ thực sự khuyên bạn chỉ cần tải xuống phiên bản 32 hoặc 64 bit tĩnh và sử dụng phiên bản đó. Không nên mất hơn 2 phút để thử nghiệm nó, và nó có lẽ sẽ là giải pháp chất lượng cao nhất có sẵn. Chúng tôi có một số HTML/CSS bán phức tạp được chuyển đổi sang PDF cho mục đích in ấn và wkhtmltopdf chưa thất bại cho chúng tôi. – Crontab

+2

wkhtmltopdf thực sự dễ cài đặt (và tôi nghĩ rằng nó thậm chí là nhị phân liên kết tĩnh nên không cần thêm libs) ... kết quả cũng giống như hiển thị bằng công cụ webkit (mà nó nằm dưới mui xe - chỉ cần không đầu) – poncha

+0

hey guys , thanx, tôi sẽ cung cấp thêm 2 thứ nữa - TCPDF & wkhtmltopdf :) bạn vừa đúng, mọi thứ đều dễ cài đặt, nhưng phải mất thời gian để thực hiện, để kiểm tra nó, đọc qua tài liệu :) – Michal

Trả lời

11

Không thực sự là câu trả lời nhưng cho câu hỏi trên, nhưng tôi sẽ cố gắng cung cấp một số kinh nghiệm của tôi giúp ai đó ở đâu đó trong tương lai.

  1. wkthmltopdf thực sự là giải pháp duy nhất mà làm việc cho tôi rằng có thể tạo ra cái mà tôi gọi kết quả chấp nhận được. Tuy nhiên, một số sửa đổi nhỏ cho CSS đã được thực hiện, tuy nhiên, nó đã làm việc thực sự tốt khi nói đến rendering nội dung. Tất cả các gói khác thực sự chỉ phù hợp nếu bạn có một tài liệu đơn giản chỉ với một bảng cơ bản, v.v. Không có cơ hội để chúng tạo ra kết quả công bằng trên tài liệu phức tạp với các yếu tố thiết kế, css, nhiều hình ảnh chồng chéo vv. - không dành thời gian (như tôi đã làm) - chuyển thẳng đến wkhtmltopdf.

  2. Hãy coi chừng - việc cài đặt wkhtmltopdf là khó khăn. Nó không phải là dễ dàng như vậy cho tôi như những kẻ nói trong ý kiến ​​của họ (một trong những lý do có thể là tôi không quá quen thuộc với Linux). Các nhị phân tĩnh đã không làm việc cho tôi vì một lý do tôi không thể giải thích. Tôi nghi ngờ rằng có vấn đề với phiên bản - dường như có sự khác biệt giữa các phiên bản cho các hệ điều hành và bộ xử lý khác nhau, có thể tôi có phiên bản không đúng. Để cài đặt phiên bản không tĩnh trước hết bạn phải có quyền truy cập root vào máy chủ, điều đó hiển nhiên. Tôi đã cài đặt nó với apt-get bằng PuTTy, đã hoạt động khá tốt. Tôi đã may mắn rằng máy chủ của tôi đã có tất cả các ưu tiên để cài đặt wkhtmltopdf. Vì vậy, đây là phần dễ dàng cho tôi :) (btw, bạn không cần phải quan tâm đến các liên kết tượng trưng hay trình bao bọc như nhiều hướng dẫn cho bạn biết - tôi đã dành hàng giờ cố gắng tìm ra cách để làm điều đó, cuối cùng tôi đã cho nó lên và mọi thứ hoạt động tốt)

  3. Sau khi cài đặt Tôi gặp lỗi khá nổi tiếng Cannot connect to X server. Điều này là do thực tế là chúng tôi cần chạy wkhtmltopdf không đầu trên 'virtual' x server. Bắt xung quanh điều này cũng khá đơn giản (nếu không quan tâm đến các liên kết tượng trưng). Tôi đã cài đặt nó với apt-get install xvfb. Điều này cũng đã đi khá tốt cho tôi, không có vấn đề gì.

  4. Sau khi hoàn thành, tôi có thể chạy wkhtmltopdf. Cẩn thận - nó đã cho tôi một thời gian để tìm ra rằng cố gắng để chạy xvfb là sai cách - thay vì bạn phải chạy xvfb-run. Mã PHP của tôi bây giờ trông như thế này exec("xvfb-run wkhtmltopdf --margin-left 16 /data/web/domain.com/source.html /data/web/domain.com/target.pdf"); (thông báo tùy chọn dòng lệnh --margin-left 16 cho wkhtmltopdf - nó làm cho nội dung của tôi tập trung hơn; tôi để nó ở vị trí để chứng minh cách bạn có thể sử dụng tùy chọn dòng lệnh).

  5. Tôi cũng muốn bảo vệ tệp PDF được tạo khỏi chỉnh sửa (trong trường hợp của tôi, cũng có thể bảo vệ in). Sau khi thực hiện một số nghiên cứu, tôi đã tìm thấy this class từ ID Security Suite. Trước hết tôi phải nói - IT'S OLD (Tôi đang chạy PHP 5+). Tuy nhiên, tôi đã thực hiện một số cải tiến cho nó. Trước hết - đó là trình bao bọc xung quanh thư viện FPDF, do đó, có một tệp có tên là fpdf.php trong gói. Tôi đã thay thế tệp này từ phiên bản FPDF mới nhất mà tôi nhận được from here. Nó làm cho cảnh báo PHP của tôi trông bền vững hơn. Tôi cũng đã thay đổi số $pdf =& new FPDI_Protection(); và xóa dấu hiệu & vì tôi đã nhận được cảnh báo không được chấp nhận cho nó. Tuy nhiên, có nhiều người đến. Thay vì tìm kiếm và sửa đổi mã tôi chỉ cần chuyển báo cáo lỗi lvl thành 0 với error_reporting(0); (mặc dù tắt cảnh báo chỉ nên là đủ). Bây giờ ai đó sẽ nói rằng đây không phải là "thực hành tốt". Tôi đang sử dụng toàn bộ nội dung này trên một hệ thống nội bộ, vì vậy tôi không thực sự phải quan tâm. Để đảm bảo các tập lệnh có thể được sửa đổi để phù hợp với các yêu cầu mới nhất. Đối với tôi, tôi không muốn dành một giờ làm việc trên đó nữa. Hãy cẩn thận khi tập lệnh nói $pdf->SetProtection(array('print'), '', $password); (Tôi đã cho phép in tài liệu của mình như bạn có thể thấy). Phải mất một thời gian để tôi nhận ra rằng đối số đầu tiên là các điều khoản. giây là USER PASSWORD - nếu bạn cung cấp tài liệu này thì tài liệu sẽ yêu cầu mật khẩu để mở (tôi để trống trường này). Thứ ba là chủ sở hữu PASSWORD - đây là những gì bạn cần phải thực hiện các tài liệu "bảo đảm" chống lại chỉnh sửa, sao chép, vv

toàn bộ mã của tôi bây giờ trông giống như:

// 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); 

Hy vọng điều này giúp ai đó tiết kiệm thời gian trong tương lai. Toàn bộ giải pháp này đưa tôi như 12 giờ để thực hiện vào hệ thống lập hóa đơn của chúng tôi. Nếu có thông tin tốt hơn về wkhtmltopdf cho những người dùng như tôi, những người không quen thuộc với Linux/UNIX, tôi có thể đã tiết kiệm được một số giờ dành cho việc này.

Tuy nhiên - những gì không giết chết bạn làm cho bạn mạnh mẽ hơn :) Vì vậy, tôi hoàn hảo hơn một chút bây giờ mà tôi đã thực hiện hoạt động này :)

+0

bạn đang chạy SELinux trong chế độ thực thi? –

Các vấn đề liên quan