Câu hỏi Chuyển đổi HTML + CSS sang PDF với PHP? [đã đóng]


Tôi có một tài liệu HTML (không phải XHTML) mà làm tốt trong Firefox 3 và IE 7. Nó sử dụng CSS khá cơ bản để tạo kiểu cho nó và hiển thị tốt trong HTML.

Tôi bây giờ sau khi một cách để chuyển đổi nó sang PDF. Tôi đã thử:

  • DOMPDF: nó có vấn đề lớn với các bảng. Tôi tính ra các bảng lồng nhau lớn của tôi và nó đã giúp (trước khi nó chỉ tiêu thụ tới 128 triệu bộ nhớ sau đó chết - đó là giới hạn của tôi về bộ nhớ trong php.ini) nhưng nó làm cho một mớ hỗn độn của bảng và dường như không nhận được hình ảnh. Các bảng chỉ là những thứ cơ bản với một số kiểu viền để thêm một số dòng ở các điểm khác nhau;
  • HTML2PDF và HTML2PS: Tôi thực sự đã may mắn hơn với điều này. Nó đưa ra một số hình ảnh (tất cả hình ảnh là URL của Google Chart) và định dạng bảng tốt hơn nhiều nhưng dường như có một số vấn đề phức tạp mà tôi chưa tìm ra và vẫn tiếp tục chết với lỗi node_type () không xác định. Không chắc chắn nơi để đi từ đây; và
  • Htmldoc: điều này dường như hoạt động tốt trên HTML cơ bản nhưng hầu như không hỗ trợ CSS cho nên bạn phải làm tất cả mọi thứ trong HTML (tôi đã không nhận ra nó vẫn là 2001 trong vùng đất Htmldoc ...) vì vậy nó vô dụng đối với tôi.

Tôi đã thử một ứng dụng Windows gọi là Html2Pdf Pilot thực sự đã làm một công việc khá tốt nhưng tôi cần một cái gì đó mà ở mức tối thiểu chạy trên Linux và lý tưởng chạy theo yêu cầu thông qua PHP trên máy chủ Web.

Tôi đang thiếu gì, hoặc làm cách nào để giải quyết vấn đề này?


1396


gốc


Html2Pdf thực sự sử dụng một thể hiện được nhúng của IE để hiển thị trang, sau đó chuyển đổi nó thành PDF - có thể thông qua cơ chế in của IE. - Joel Mueller
vì đó là câu hỏi năm 2008, dompdf giờ đã trưởng thành hơn nhiều. ;-) - Hendra Uzia
dompdf hiện hỗ trợ CSS 2.1 và có thể xử lý @import, @media và @screen quy tắc và sẽ tải biểu định kiểu bên ngoài. Nó cũng đi kèm với tất cả mọi thứ cần thiết cho nó để làm việc, mặc dù có những thứ bạn có thể cài đặt để có được hiệu suất tốt hơn so với các libs mặc định. code.google.com/p/dompdf - totallyNotLizards
Cập nhật 2015: Sau khi nghiên cứu rất nhiều tùy chọn, chúng tôi quyết định đi với wkhtmltopdf một tiện ích tốt đẹp, chúng tôi đấu tranh với CSS vì chúng tôi có tệp CSS bên ngoài nhưng sau đó chúng tôi áp dụng mẹo đặt liên kết giả CSS trên phần tử HTML của chúng tôi mà chúng tôi muốn chuyển đổi và thiết lập đường dẫn bên phải nó hoạt động như MAGIC !!! - Anshul Nigam
Tôi tin rằng mọi người sẽ sớm tìm thấy Chrome / Chromium không đầu chrome --headless --print-to-pdf="path/to/pdf" https://your_url  như là công cụ tạo html, pdf nhanh nhất, nhanh nhất và dễ nhất crbug.com/603559 vì nó hỗ trợ hầu hết các tính năng html mà các nhà phát triển dựa vào phát triển web và không hút các kịch bản phức tạp như hầu hết các thư viện và công cụ khác. - Ebrahim Byagowi


Các câu trả lời:


Quan trọng: Xin lưu ý rằng câu trả lời này được viết vào năm 2009 và nó có thể không phải là giải pháp tiết kiệm chi phí nhất hiện nay vào năm 2018. Các lựa chọn thay thế trực tuyến như PDFShift hôm nay tốt hơn lúc này.


Hãy xem PrinceXML.

Nó chắc chắn là công cụ chuyển đổi HTML / CSS sang PDF tốt nhất, mặc dù nó không miễn phí (Nhưng, chương trình của bạn có thể không miễn phí, vì vậy nếu bạn tiết kiệm được 10 giờ làm việc, bạn ở nhà miễn phí (vì bạn cũng cần xem xét các giải pháp thay thế sẽ yêu cầu bạn thiết lập một máy chủ chuyên dụng với phần mềm phù hợp)

Oh yeah, tôi đã đề cập rằng đây là giải pháp HTML2PDF đầu tiên (và có lẽ chỉ) ACID2 ?

Mẫu PrinceXML


443



PrinceXML thực sự tuyệt vời. Chỉ khi nó không phải là đắt tiền :-( - acme
Công ty của tôi đã viết một dịch vụ web được xây dựng xung quanh Prince. Chi phí trả trước rẻ hơn đáng kể và có thể sử dụng mà không cần phải cài đặt bất cứ điều gì: docraptor.com - Joel Meador
Tôi cũng đã sử dụng DocRaptor. Cách tuyệt vời để có được những lợi ích của Hoàng tử mà không phải trả tiền cho giấy phép đắt tiền. Chúc mừng một sản phẩm tuyệt vời, Joel. - Nate365
Cách quá đắt. WKHTMLTOPDF (xem câu trả lời khác) là miễn phí, công việc và sử dụng webkit đó là tuyệt vời. - thomallen
Nếu bạn có quyền truy cập dòng lệnh và KHÔNG muốn trả $ 3500, PhantomJS với tập lệnh này: github.com/ariya/phantomjs/blob/master/examples/rasterize.js có thể là một giải pháp - đó là cách miễn phí và dễ dàng! - chjortlund


Hãy xem wkhtmltopdf . Nó là mã nguồn mở, dựa trên webkit và miễn phí.

Chúng tôi đã viết một hướng dẫn nhỏ đây.

CHỈNH SỬA (2017):

Nếu nó là để xây dựng một cái gì đó ngày hôm nay, tôi sẽ không đi con đường đó nữa.
Nhưng sẽ sử dụng http://pdfkit.org/ thay thế.
Có lẽ loại bỏ tất cả các phụ thuộc nodejs của nó, để chạy trong trình duyệt.


628



Điều này hoạt động trên IMO tiền đề tốt nhất. Chuyển đổi Boostrap khỏi một trình kết xuất hiện có thay vì viết một từ đầu - không phải là một nhiệm vụ tầm thường. Hơn nữa, Webkit được viết bằng C ++ và do đó nhanh hơn nhiều và ít tốn kém hơn nhiều so với một tài nguyên hog so với việc thực thi dựa trên PHP. - Koobz
Chúng tôi đã gặp phải các vấn đề lớn khi cố gắng thực hiện điều này để hiển thị các máy chủ CentOS đúng cách. Sau nhiều tuần lộn xộn xung quanh, có vẻ như lựa chọn duy nhất là không sử dụng CentOS. - Abhi Beckert
CẢNH BÁO! Nếu bạn sử dụng wkhtmltopdf (ít nhất là trên hệ thống của tôi, XAMPP trên Windows 7 64-bit), trong mọi trường hợp tôi đã thử, hình ảnh .gif không xuất hiện trong tệp PDF. Tôi đã thử một số cách giải quyết được đề xuất ở những nơi khác nhau, chẳng hạn như bao gồm "chiều rộng" và "chiều cao" và viết URI theo các quy ước khác nhau. Không có gì tôi đã thử bao giờ gây ra của .gif để xuất hiện (đặc biệt, thậm chí không "chiều rộng" và "chiều cao" gợi ý, mà tôi đã thử cả hai sử dụng phong cách nội tuyến và sử dụng, nguyên "chiều rộng" và "chiều cao" HTML thuộc tính). Tuy nhiên, hoán đổi hình ảnh thành .jpg làm việc trong lần thử đầu tiên. - Dan Nissenbaum
Trừu tượng này là khá tốt đẹp mặc dù mikehaertl.github.io/phpwkhtmltopdf - saada
Các dịch vụ thương mại đều quá đắt đối với chúng tôi nên chúng tôi đã triển khai WKHTMLTOPDF như một dịch vụ đám mây miễn phí html2pdfrocket.com cho bất cứ ai sử dụng, và sau đó sử dụng nó cho chính khách hàng của chúng tôi. Chúng tôi đã làm nó theo cách đó để khách hàng của chúng tôi không phải cài đặt exe trên máy chủ của họ, vv và làm việc trên nền tảng. Tôi chắc chắn đánh giá WKHTMLTOPDF nếu bạn đang xây dựng dịch vụ của riêng mình. - eagle779


Sau khi một số điều tra và kéo tóc chung giải pháp có vẻ là HTML2PDF. DOMPDF đã làm một công việc khủng khiếp với các bảng, đường viền và bố cục phức tạp vừa phải và htmldoc có vẻ khá hợp lý nhưng gần như hoàn toàn là CSS-dốt nát và tôi không muốn quay trở lại thực hiện bố cục HTML mà không cần CSS cho chương trình đó.

HTML2PDF trông đầy hứa hẹn nhất nhưng tôi vẫn giữ lỗi lạ này về các đối số tham chiếu null đối với node_type. Cuối cùng tôi đã tìm ra giải pháp cho điều này. Về cơ bản, PHP 5.1.x làm việc tốt với thay thế regex (preg_replace_ *) trên các chuỗi có kích thước bất kỳ. PHP 5.2.1 giới thiệu một chỉ thị cấu hình php.ini được gọi là pcre.backtrack_limit. Những gì tham số cấu hình này làm là giới hạn chiều dài chuỗi cho phù hợp được thực hiện. Tại sao điều này đã được giới thiệu tôi không biết. Giá trị mặc định được chọn là 100.000. Tại sao một giá trị thấp như vậy? Một lần nữa, không có ý tưởng.

A lỗi được nâng lên so với PHP 5.2.1 cho điều này, vẫn mở gần hai năm sau.

Điều đáng sợ về việc này là khi vượt quá giới hạn, chỉ thay thế âm thầm thất bại. Ít nhất nếu một lỗi đã được nâng lên và đăng nhập bạn sẽ có một số dấu hiệu của những gì đã xảy ra, tại sao và những gì để thay đổi để sửa chữa nó. Nhưng không.

Vì vậy, tôi có một tập tin HTML 70k để chuyển thành PDF. Nó yêu cầu các cài đặt php.ini sau:

  • pcre.backtrack_limit = 2000000; # có lẽ nhiều hơn tôi cần nhưng đó là OK
  • memory_limit = 1024M; # Vâng, một gigabyte; và
  • max_execution_time = 600; # Vâng, 10 phút.

Bây giờ người đọc sắc sảo có thể nhận thấy rằng tệp HTML của tôi nhỏ hơn 100k. Lý do duy nhất tôi có thể đoán là tại sao tôi nhấn vấn đề này là html2pdf thực hiện chuyển đổi thành xhtml như là một phần của quy trình. Có lẽ điều đó đã đưa tôi qua (mặc dù gần 50% sưng lên có vẻ kỳ quặc). Dù thế nào đi chăng nữa, công việc trên cũng vậy.

Bây giờ, html2pdf là một tài nguyên. Tập tin 70k của tôi mất khoảng 5 phút và ít nhất 500-600M RAM để tạo ra một tập tin PDF 35 trang. Không đủ nhanh (cho đến nay) cho một thời gian thực tải về không may và việc sử dụng bộ nhớ đặt tỷ lệ sử dụng bộ nhớ theo thứ tự 1000-to-1 (600M RAM cho một tập tin 70k), đó là hoàn toàn vô lý.

Thật không may, đó là điều tốt nhất tôi đã nghĩ ra.


141



@cletus bạn có thể plz cho tôi biết về phiên bản ổn định của HTML2PDF không. Ví dụ về liên kết trên đã không được chấp nhận - ripa
Để xem phiên bản mới nhất, hãy xem github.com/spipu/html2pdf - Luke Wenke
Grim typo trở nên dữ tợn hơn: Tỷ lệ sử dụng bộ nhớ là theo thứ tự từ 10.000 đến 1 lol - MickLH


Tại sao bạn không thử mPDF phiên bản 2.0? Tôi đã sử dụng nó để tạo một tài liệu PDF. Nó hoạt động tốt.

Trong khi đó mPDF là phiên bản 5.7 và nó được chủ động duy trì, trái ngược với HTML2PS / HTML2PDF

Nhưng hãy nhớ rằng tài liệu có thể thực sự khó xử lý. Ví dụ, hãy xem trang này: https://mpdf.github.io/.

Nhiệm vụ rất cơ bản xung quanh html sang pdf, có thể được thực hiện với thư viện này, nhưng các tác vụ phức tạp hơn sẽ mất một thời gian đọc và "hiểu" tài liệu.


116



Nó là đúng, mpdf thực sự hoạt động và nó là nhanh chóng, nó tạo ra các tập tin pdf trên bay. - conualfy
Tôi đã thử một loạt các đề xuất ở đây. Cho đến nay, điều này đã được tải lên và làm việc ra khỏi hộp mà không có bất kỳ rắc rối và các tài liệu thực sự tuyệt vời so với phần còn lại. Hướng dẫn sử dụng được viết rõ ràng. - Smith Smithy
mPDF cho tôi một số phức tạp nghiêm trọng khi POSTing thẻ html với nền hình ảnh hoặc thẻ từ cơ sở dữ liệu: mPDF error: IMAGE Error (http://www.example.com/folder/image.jpg): Error parsing image file - image type not recognised, and not supported by GD imagecreate - Stefan
Phiên bản 6.0 hoạt động đúng như mong đợi: bao gồm nó (hoặc trong một khung công tác, tải nó) khởi tạo, điền vào nội dung của bạn, xuất nó theo cách này hay cách khác ... Đó là nó! - toesslab.ch
Vâng MPDF đang làm việc tốt, đúng! Nhưng mã và tài liệu không nhất quán - thật khó để thực hiện một tác vụ phức tạp hơn, ví dụ: tạo ra một bức thư về tiêu chuẩn din. - Qullbrune


1) sử dụng MPDF !

a) chiết xuất trong yourfolder

b) tạo file.php trong yourfolder và chèn mã như vậy:

<?php
include('../mpdf.php');
$mpdf=new mPDF();
$mpdf->WriteHTML('<p style="color:red;">Hallo World<br/>Fisrt sentencee</p>');
$mpdf->Output();   exit;
 ?>

c) mở file.php từ trình duyệt của bạn






2) Sử dụng pdfToHtml !

1) trích xuất pdftohtml.exe vào thư mục gốc của bạn:

2) bên trong thư mục đó, trong anyfile.php tập tin, đặt mã này (giả sử, có một example.pdf nguồn quá):

<?php
$source="example.pdf";
$output_fold="FinalFolder";

    if (!file_exists($output_fold)) { mkdir($output_fold, 0777, true);}
$result= passthru("pdftohtml $source $output_fold/new_filename",$log);
//var_dump($result); var_dump($log);
?>

3) nhập FinalFoldervà sẽ có các tệp được chuyển đổi (nhiều trang, như nguồn PDF có ..)


60



Tôi sẽ thử GrabzIt API của họ hỗ trợ CSS, JavaScript và hầu hết các loại tài nguyên khác. Nó chỉ cần được tham chiếu với URL tuyệt đối, hoặc được tạo nội dòng và được bao gồm trong HTML được gửi đến dịch vụ. Hãy thử ở đây: grabz.it/html-to-pdf-image-api.aspx
GrabzIt không miễn phí - chatoxz


Kiểm tra TCPDF. Nó có một số chức năng HTML to PDF có thể đủ cho những gì bạn cần. Nó cũng miễn phí!


51



nó hỗ trợ cho việc render html khá hạn chế, bạn có thể muốn đọc nó: tcpdf.org/doc/classTCPDF.html#ac3fdf25fcd36f1dce04f92187c621407 - Hendra Uzia
nhưng phong cách css không hoạt động - KBK


Tôi đề nghị DocRaptor (sử dụng PrinceXML là "động cơ")


29



Thật không may là không thể sử dụng nếu bạn muốn tạo các tệp PDF lớn với nhiều hình ảnh. Tôi nghĩ rằng có một thời gian 60 giây về yêu cầu và nếu Docraptor cần tải xuống nhiều tệp, điều này sẽ bị vượt quá và sẽ không có tệp nào được thực hiện. - Vilhelm
Vấn đề này Vilhelm đã đề cập đã được cố định. - illbzo1


Chỉ cần để bump thread, tôi đã thử DOMPDF và nó hoạt động hoàn hảo. Tôi đã sử dụng DIV và các yếu tố mức khối khác để định vị mọi thứ, giữ nó nghiêm ngặt CSS 2.1 và nó chơi veru độc đáo.


25





Tin tốt! Snappy!!

Snappy là một rất dễ thư viện mã nguồn mở PHP5, cho phép hình thu nhỏ, ảnh chụp nhanh hoặc tạo PDF từ url hoặc trang html. Và ... nó sử dụng Xuất sắc dựa trên webkit wkhtmltopdf

Thưởng thức! ^ _ ^


24



Tôi đã xây dựng một API HTTP sử dụng Snappy (dựa trên wkhtmltopdf). Bạn có thể chuyển vào một URL và chuyển đổi trang web từ HTML sang PDF: github.com/Dellos7/dhtml2pdf - David López


Vâng, nếu bạn muốn tìm một thư viện XHTML + CSS hoàn hảo để chuyển đổi PDF, hãy quên nó đi. Nó xa nhất có thể. Bởi vì nó giống như việc tìm kiếm một trình duyệt hoàn hảo (công cụ dựng hình XHTML + CSS). Chúng ta có một cái không? IE hoặc FF?

Tôi đã có một số thành công với DOMPDF. Vấn đề là bạn phải sửa đổi mã HTML + CSS của mình để đi theo cách thư viện có nghĩa là hoạt động. Ngoài ra, tôi có kết quả khá tốt.

Xem bên dưới:

HTML gốc

Chuyển đổi HTML sang PDF


22





Nó đã được đề cập, nhưng tôi chỉ muốn xác nhận rằng mpdf là trình chuyển đổi html sang pdf dễ nhất, mạnh nhất và miễn phí nhất hiện có. Bầu trời thực sự là giới hạn. Bạn thậm chí có thể tạo các tệp pdf dữ liệu động, do người dùng tạo.

Ví dụ, một khách hàng muốn có một hệ thống CMS để anh ấy có thể cập nhật danh sách bản nhạc mà anh ấy đã chơi ở câu lạc bộ của mình. Đó không phải là vấn đề, nhưng anh ta cũng muốn người dùng có thể tải xuống tệp .pdf của danh sách phát và do đó, bản pdf tải xuống này cũng phải được cập nhật bằng các cm. Nhờ mpdf, với một số vòng lặp đơn giản và biến xen kẽ tôi có thể làm điều đó. Một cái gì đó mà tôi nghĩ sẽ đưa tôi tuần theo nghĩa đen đã cho tôi vài phút.

Tuyệt quá bài báo đã giúp tôi bắt đầu.


19



PDF của danh sách phát. Chúa đã giúp tôi. - Henrik Erlandsson