PHP viết tệp pdf

TL; DR Để chuyển đổi HTML sang PDF, hãy sử dụng thư viện Dompdf nếu bạn không cần bố cục CSS Flexbox hoặc Grid. Đối với CSS hiện đại, hãy sử dụng Google Chrome ở chế độ không đầu hoặc WeasyPrint. xem xét không có trình duyệt

Tôi đã dành nhiều thời gian làm việc với các công cụ khác nhau để tạo tệp PDF, chủ yếu là hóa đơn và báo cáo. Một số tài liệu này thực sự phức tạp, bao gồm các bảng nhiều trang, biểu đồ đầy màu sắc, đầu trang và chân trang. Tôi đã thử tạo tài liệu bằng tay và chuyển đổi HTML sang PDF hoặc thậm chí là LaTeX sang PDF

Tôi biết thật khó để lựa chọn giữa vô số thư viện và công cụ, đặc biệt là khi chúng ta cần thực hiện một công việc không tầm thường. Không có viên đạn bạc;

Hai cách tạo tệp PDF

Tệp PDF chứa một tập hợp các đối tượng tạo nên tài liệu, chẳng hạn như các đoạn văn bản, hình ảnh, dòng, biểu mẫu, phông chữ, v.v. Vì vậy, tạo PDF là hành động ghép tất cả các phần này lại với nhau theo thứ tự và bố cục phù hợp. Hầu hết các đối tượng sử dụng một tập hợp con các lệnh PostScript, vì vậy bạn thậm chí có thể viết chúng trong trình soạn thảo văn bản của mình

Một cách là tạo các đối tượng này “bằng tay”. chúng tôi thêm từng dòng văn bản một cách riêng biệt, chúng tôi vẽ tất cả các bảng theo cách thủ công, tự tính toán độ rộng và khoảng cách của ô. Chúng ta phải biết khi nào nên chia nội dung dài hơn thành nhiều trang. Cách tiếp cận này đòi hỏi rất nhiều công việc thủ công và kỹ năng lập trình rất tốt, vì vậy chúng tôi không kết thúc với mã spaghetti khó tìm thấy bất kỳ logic có ý nghĩa nào giữa tất cả các lệnh vẽ

Một cách khác là chuyển đổi một tài liệu, chẳng hạn như HTML, LaTeX hoặc PostScript thành PDF

Chúng tôi đã sử dụng LaTeX cho một ứng dụng giáo dục cho phép soạn bài kiểm tra cho học sinh từ các bài tập hiện có do các chuyên gia biên soạn. Vì LaTeX là công cụ chính cho các biên tập viên của chúng tôi nên việc chuyển đổi tập lệnh của họ sang PDF là điều đương nhiên.

Chuyển đổi HTML sang PDF phức tạp hơn nhiều vì các tiêu chuẩn web ngày nay ngày càng có nhiều tính năng hơn, chỉ đề cập đến bố cục CSS Flexbox hoặc Grid

Thư viện PHP gốc

Trải nghiệm đầu tiên của tôi là với các thư viện PHP gốc, nơi bạn phải làm hầu hết mọi thứ bằng tay, như đặt văn bản vào vị trí thích hợp theo từng dòng, vẽ hình chữ nhật, tính toán các ô trong bảng, v.v. Chúng tôi đã sử dụng các thư viện FPDF và ZendPdf (thư viện sau đã ngừng hoạt động)

Tại một số thời điểm, tôi đã kết thúc việc duy trì các báo cáo phức tạp, dài nhiều trang với các bảng và biểu đồ. Doanh nghiệp muốn thêm nhiều báo cáo hơn nữa. Tôi quyết định viết lại chúng dưới dạng tài liệu HTML với biểu định kiểu và sau đó thử tạo tệp PDF từ đó

Có bốn thư viện PHP có khả năng phân tích cú pháp HTML/CSS và chuyển đổi nó thành PDF

  • mPDF
  • TCPDF (một ngày nào đó sẽ được thay thế bằng tc-lib-pdf)
  • dompdf
  • sắp chữ. sh (đã thanh toán)

Bạn không thể mong đợi những thư viện này cung cấp đầu ra giống như bạn đang thấy trong Firefox hoặc Chrome. Tuy nhiên, đối với bố cục và định dạng đơn giản, chúng là đủ. Điểm cộng là bạn vẫn không phụ thuộc vào bất kỳ công cụ bên ngoài nào – chỉ đơn giản là PHP

Để cung cấp cho bạn một số ý tưởng về những gì mong đợi từ các thư viện trên, tôi đã biên soạn một bản so sánh kết xuất hóa đơn. Ba ảnh này được tạo từ cùng một nguồn HTML 5 sử dụng CSS Flexbox để đặt các phần “Người bán” và “Người mua” cạnh nhau. Nó cũng có một số định dạng bảng

PHP viết tệp pdf
Google Chrome (hình ảnh tham khảo)
PHP viết tệp pdf
bộ sắp chữ. sh 0. 17. 3
PHP viết tệp pdf
TCPDF 6. 5. 0
PHP viết tệp pdf
mPDF 8. 1. 2
PHP viết tệp pdf
Dompdf 2. 0. 1

Như bạn có thể thấy, không có thư viện PHP miễn phí nào hiểu được CSS Flexbox. mPDF và TCPDF gặp một số vấn đề với việc vẽ bảng. Đối với Dompdf, việc đặt các phần “Người bán” và “Người mua” theo cách truyền thống với float hoặc

là đủ để có kết quả phù hợp

công cụ bên ngoài

Các giải pháp PHP gốc không đủ đối với tôi, vì vậy tôi đã quyết định sử dụng một công cụ bên ngoài được hỗ trợ bởi công cụ kết xuất WebKit đầy đủ chức năng. Chủ nhân của tôi đã sử dụng wkhtmltopdf hỗ trợ mọi thứ tôi cần. Hình ảnh SVG, bảng nhiều trang, đầu trang và chân trang với số trang và tên phần, dấu trang tự động

Sau đó, tôi làm quen với PhantomJS, được sử dụng chủ yếu để tiến hành kiểm tra trình duyệt tự động ở chế độ không đầu (không có cửa sổ trình duyệt). Nó cũng có thể chụp ảnh màn hình PNG và PDF. PhantomJS đã sử dụng phiên bản mới hơn của công cụ WebKit. Tuy nhiên, dự án hiện đang bị đình chỉ

Vào năm 2017, Google đã thông báo rằng Chrome có thể chạy ở chế độ không đầu. Điều này có nghĩa là bạn có thể sử dụng công cụ kết xuất Blink mới nhất để chuyển đổi HTML/CSS sang PDF từ dòng lệnh của mình. Điều này là hoàn hảo để hiển thị các tài liệu thực sự phức tạp sử dụng các tiêu chuẩn web mới nhất. Tài liệu trông giống hệt nhau trong trình duyệt của bạn và trong tệp PDF cuối cùng, điều này giúp cho việc phát triển dễ dàng hơn rất nhiều

Hai công cụ khác mà tôi phát hiện ra là WeasyPrint và Prince. Cái đầu tiên là một dự án nguồn mở được hỗ trợ bởi sự đóng góp. Prince là một công cụ nâng cao, trả phí cho mục đích thương mại, bao gồm xuất bản sách. Phiên bản miễn phí của nó đặt một hình mờ trên mỗi trang. Bạn có thể sử dụng Prince thông qua DocRaptor API

PHP viết tệp pdf
Google Chrome
PHP viết tệp pdf
WeasyPrint 53. 4
PHP viết tệp pdf
Hoàng tử 14. 2
PHP viết tệp pdf
wkhtmltopdf 0. 12. 6

Kết nối PHP với các công cụ bên ngoài

Cách dễ nhất là thực thi một công cụ bên ngoài dưới dạng lệnh shell. Bạn có thể làm điều đó với các hàm PHP như shell_exec hoặc proc_open, nhưng nó không thuận tiện lắm

Tôi khuyên bạn nên sử dụng thư viện symfony/process và sử dụng các luồng tiêu chuẩn bất cứ khi nào có thể. Một quy trình phải chấp nhận HTML đầu vào thông qua STDIN và gửi PDF kết quả qua STDOUT. Xem bài viết này để biết Symfony Process tốt hơn

Ngoài ra còn có một số thư viện trình bao bọc, như phpwkhtmltopdf hoặc KnpLabs/snappy

Đối với Chrome, hãy cân nhắc sử dụng Browserless. Bạn có thể chọn giữa hình ảnh Docker miễn phí với Chrome được định cấu hình sẵn với các phần phụ thuộc hoặc nền tảng SaaS trả phí để chuyển đổi HTML của bạn thành PDF. Với hình ảnh Docker, thật dễ dàng để gửi HTML và nhận PDF qua HTTP

Bạn cũng có thể dùng thử thư viện Chrome PHP kết nối với tệp thực thi của Chrome và cung cấp cho bạn toàn quyền kiểm soát việc in PDF, chẳng hạn như đặt tiêu đề và chân trang. Một cách phổ biến khác để xử lý Chrome là thông qua Puppeteer hoặc lớp phủ cung cấp các chức năng in bổ sung. phân trang. js và Vivliostyle

Sự kết luận

Có nhiều lựa chọn thư viện PHP và các công cụ bên ngoài có thể được sử dụng để tạo động các tệp PDF. Bạn nên chọn một sự kết hợp phù hợp với nhu cầu kinh doanh của bạn. Đối với các tài liệu đơn giản, bạn không cần một công cụ kết xuất phức tạp. Tiết kiệm dung lượng đĩa, CPU và RAM

Cũng xin nhớ rằng nhiều công cụ được phát triển bởi cộng đồng Nguồn mở và nhận được rất ít hỗ trợ thương mại. Chúng có thể bị hủy bỏ bất cứ lúc nào hoặc chúng có thể không hỗ trợ phiên bản PHP mới nhất ngay từ ngày đầu tiên (điều này có thể cản trở việc di chuyển phần còn lại của ứng dụng của bạn). Và phần phụ thuộc của bạn cũng có phần phụ thuộc, vì vậy hãy xem composer.json khi chọn thư viện