Thứ Hai, 12 tháng 3, 2018

Tạo file PDF trong Java, sử dụng Flying Saucer và Thymeleaf


ảnh minh họa -  Học lập trình Java
Chắc hẳn các bạn đã quá quen thuộc với các file định dạng PDF. nà CV, các văn bản đặc tả spec, các công văn, mỏng, các vé điện tử .v.v.v Điều đó đặt ra yêu cầu các áp dụng web phải có khả năng xuất file PDF với format nào đó hiệp với từng đề nghị của hệ thống chức năng. Bài viết bữa nay của mình sẽ chỉ dẫn các bạn dùng Java để thực hiện điều đó!

 


Trong bài này, các bạn sẽ thấy, quá trình xuất file PDF của mình gồm 2 bước chính như sau

Sử Thymeleaf để đưa dữ liệu vào mẫu và từ đó nhận được document dạng XHTML với các data đã được bind. Mình tỉ dụ hình trên, $$name được gán với giá trị Thomas

Save document XHTML đó dưới dạng PDF sử dụng Flying Saucer.

Lưu ý rằngm 2 bước trên là hoàn toàn đoọc lập. Chúng ta có thể dễ dàng dùng các template engine khác (thí dụ như Apache FreeMarker) hay thậm chí là HTML thuần. Tuy nhiên, bài viết này dùng Thymeleaf là bởi vì Thymeleaf là 1 template engine rất phổ quát được biệt là khi làm việc với Spring
 
1. Bước 1: Cài đặt project
Để bắt đầu, chúng ta cần 3 dependenciescompile group: 'org.thymeleaf', name: 'thymeleaf', version: '3.0.6.RELEASE' compile group: 'org.xhtmlrenderer', name: 'flying-saucer-core', version: '9.1.6' compile group: 'org.xhtmlrenderer', name: 'flying-saucer-pdf-itext5', version: '9.1.6' 

2. Bước 2: Thymeleaf Template

Đầu tiên, để đơn giản cho các bạn dễ tưởng tượng, mình sẽ dùng 1 tỉ dụ đơn giản trước, Ở đây Thymeleaf Template mình tạo đơn giản như sau
Hi! My name is [[$name]]!

 

và đển render template này với ThymeLeaf, bạn có thể dùng đoạn code sauClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode("HTML"); TemplateEngine templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(templateResolver); Context context = new Context(); // Gán giá trị "Thomas" cho biến name để lát nữa bind dữ liệu context.setVariable("name", "Thomas"); // Trả về chuỗi là html string sau khi thực hành bind dữ liệu String html = templateEngine.process("template", context); 

Và như thế, bạn đã có 1 chuỗi là chuỗi htlml sau khi bind dữ liệu (name = Thomas).

Việc tiếp theo là sử dụng chuỗi này cho việc chuyển hóa sang PDF thôi.

để ý rằng, tỉ dụ này của mình chỉ là 1 thí dụ vô cùng đơn giản. ThymeLeaf thực tại còn mạnh hơn rất nhiều với việc cung cấp các cấu trúc lệnh for, if và gọi lệnh Java trong template. Bạn có thể tìm được rất nhiều các vi dụ và chỉ dẫn trên internet  Hãy thử nhé.
 
3. Bước 3: PDF Generation

Đến với bước 3, rất đơn giản. Về cơ bản, chúng ta chỉ cần có chuỗi HTML và sử dụng nó trong đọan code dưới đâyOutputStream outputStream = new FileOutputStream("message.pdf"); ITextRenderer renderer = new ITextRenderer(); renderer.setDocumentFromString(html); renderer.layout(); renderer.createPDF(outputStream); outputStream.close(); 

Và thành quả là đây
    4. Nâng cấp

ví dụ bên trên thực tại là 1 thí dụ quá đơn giản và nó k đc vận dụng trong thực tiễn. Trong thực tại, file PDF có bố cục và nội dụng phức tạp hơn rất nhiều. Như vậy, chúng ta thay đổi chiến thuật
 
Và như thế, để gen ra được 1 file PDF, chúng ta sẽ phải đi qua vài bước như sau
trước tiên, chúng ta có 1 Thymeleaf HTML template. Mẫu này được bind data bằng việc sử dụng Thymeleaf rendering engine
Flying Saucer yêu cầu XHTML. nên chúng ta cần chuyển đổi HTML sang XHTML. Để làm đc điều đó, chúng ta dùng JTidy.
XHTML file refer tới các
rút cục, chuyển đổi từ XHTML sang PDF bằng Flying Saucer

Chúng ta có thể làm design file PDF của mình bằng cách design thymeleaf template. Như là

Chỉ định file css
... 

Hoặc thậm chí viết css ngay trong đó.logo width: 275px; h1 font-size: 18px; margin-bottom: 40px; margin-top: 40px; p font-size: 12px;  

Hoặc là nhét ảnh vào *TEST BARCODE*  

Nói chung, về cơ bản, việc chúng ta cần phải làm là design XHTML cho ổn, sau đó FlyingSaucer sẽ chuyển đổi nó sang PDF cho bạn

Không có nhận xét nào:

Đăng nhận xét

Stack Overflow đã phát hành nghiên cứu hàng năm về ngành công nghiệp lập trình.

Công ty cho biết ấn bản 2018 của nó đại diện cho nghiên cứu 'lớn nhất từng có' về thái độ, lương và nhân khẩu học của nhà phát triển...