Hướng dẫn puppeteer html to pdf - puppeteer html sang pdf

Cũng khá lâu rồi, tầm mấy năm trước, mình có tạo một ứng dụng Android để convert webpage HTML sang PDF. Mặc dù tính năng đơn giản, nhưng mình thấy cũng có khá nhiều người sử dụng. Ưu điểm của PDF là bạn có thể mang đi in ấn mà không sợ mất định dạng, hầu hết máy tính bây giờ đều cài sẵn ứng dụng đọc PDF…

Về kỹ thuật chung, bạn có 2 lựa chọn:

  • Một là convert trực tiếp trên mobile. Với giải pháp này, bạn sẽ không cần tới server làm trung gian, tất cả sẽ xử lý hết trên ứng dụng mobile. Nhưng nhược điểm là cần nhiều tài nguyên để xử lý, mà bạn biết rồi đấy, tài nguyên của điện thoại luôn hạn chế, không thể nào so bì với server được.
  • Hai là tạo một server để convert html sang PDF, ứng dụng mobile chỉ có nhiệm vụ download file PDF về mà thôi.

Bài viết hôm nay, mình sẽ hướng dẫn các bạn tạo một server sử dụng Node.js để convert HTML sang PDF.

Kỹ thuật sử dụng trong bài viết:

  • Node.js: Cài đặt Node.js trên window/Ubuntu
  • Thư viện Puppeteer.

Chúng ta bắt đầu thôi nào!

Nội dung chính của bài viết

  • Convert HTML sang PDF sử dụng Node.js + Puppeteer
    • #1- Cài đặt và sử dụng Puppeteer cơ bản
    • #2- Xử lý Style
    • #3- Send PDF file tới client
    • Thay lời kết

Trước khi bắt tay thực hành, chúng ta cùng ngó qua xem Pupperteer là gì đã nhé?

Nguyên bản định nghĩa của tác giả:

Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol. Puppeteer runs headless by default, but can be configured to run full (non-headless) Chrome or Chromium.Puppeteer Official DocumentPuppeteer Official Document

Về cơ bản, bạn hiểu Puppeteer là một trình duyệt chạy trên nền Node.js. Nếu bạn đọc tài liệu của Puppeteer, điều đầu tiên tác giả nhắc tới đó là khả năng tạo ảnh chụp màn hình và PDF từ các trang web.

🔥 Bài viết hướng dẫn tạo ảnh chụp màn hình với Puppeteer: Chụp ảnh trang web với Node.js + PuppeteerBài viết hướng dẫn tạo ảnh chụp màn hình với Puppeteer: Chụp ảnh trang web với Node.js + Puppeteer

#1- Cài đặt và sử dụng Puppeteer cơ bản

#2- Xử lý Style

npm i puppeteer
# or "yarn add puppeteer"

#3- Send PDF file tới client

const puppeteer = require('puppeteer')
 
async function printPDF() {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto('https://vntalking.com', {waitUntil: 'networkidle0'});
  const pdf = await page.pdf({ format: 'A4' });
 
  await browser.close();
  return pdf
})

Thay lời kết

Trước khi bắt tay thực hành, chúng ta cùng ngó qua xem Pupperteer là gì đã nhé?

Nguyên bản định nghĩa của tác giả:

Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol. Puppeteer runs headless by default, but can be configured to run full (non-headless) Chrome or Chromium.Puppeteer Official Document

Về cơ bản, bạn hiểu Puppeteer là một trình duyệt chạy trên nền Node.js. Nếu bạn đọc tài liệu của Puppeteer, điều đầu tiên tác giả nhắc tới đó là khả năng tạo ảnh chụp màn hình và PDF từ các trang web. Hàm page.pdf({...} nhận một option. Với option này, bạn có thể cấu hình để lưu file PDF vào disk theo một đường dẫn chỉ định. Nếu bạn không chỉ định điều này, hàm này chỉ trả về một buffer của PDF mà thôi.

🔥 Bài viết hướng dẫn tạo ảnh chụp màn hình với Puppeteer: Chụp ảnh trang web với Node.js + Puppeteer

await page.type('#email', process.env.PDF_USER)
await page.type('#password', process.env.PDF_PASSWORD)
await page.click('#submit')

Để cài đặt Puppeteer, bạn thực hiện giống như mọi module khác thôi. Dùng NPM thì gõ lệnh sau:: Thông tin đăng nhập nên lưu vào các biến môi trường, không nên mã hóa chúng.

#2- Xử lý Style

#3- Send PDF file tới client

await page.addStyleTag({ content: '.nav { display: none} .navbar { border: 0px} #print-button {display: none}' })

#3- Send PDF file tới client

Thay lời kết

Trước khi bắt tay thực hành, chúng ta cùng ngó qua xem Pupperteer là gì đã nhé?

printPDF.then(pdf => {
    res.set({ 'Content-Type': 'application/pdf', 'Content-Length': pdf.length })
    res.send(pdf)

Nguyên bản định nghĩa của tác giả:

Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol. Puppeteer runs headless by default, but can be configured to run full (non-headless) Chrome or Chromium.Puppeteer Official Document

function getPDF() {
 return axios.get(`${API_URL}/your-pdf-endpoint`, {
   responseType: 'arraybuffer',
   headers: {
     'Accept': 'application/pdf'
   }
 })

Về cơ bản, bạn hiểu Puppeteer là một trình duyệt chạy trên nền Node.js. Nếu bạn đọc tài liệu của Puppeteer, điều đầu tiên tác giả nhắc tới đó là khả năng tạo ảnh chụp màn hình và PDF từ các trang web.

🔥 Bài viết hướng dẫn tạo ảnh chụp màn hình với Puppeteer: Chụp ảnh trang web với Node.js + Puppeteer

savePDF = () => {
    this.openModal(‘Loading…’) // open progress dialog
   return getPDF() // API call
     .then((response) => {
       const blob = new Blob([response.data], {type: 'application/pdf'})
       const link = document.createElement('a')
       link.href = window.URL.createObjectURL(blob)
       link.download = `your-file-name.pdf`
       link.click()
       this.closeModal() // close progress dialog
     })
   .catch(err => /** error handling **/)
 }
...

Để cài đặt Puppeteer, bạn thực hiện giống như mọi module khác thôi. Dùng NPM thì gõ lệnh sau:

Thay lời kết

Trước khi bắt tay thực hành, chúng ta cùng ngó qua xem Pupperteer là gì đã nhé?

Nguyên bản định nghĩa của tác giả:

Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol. Puppeteer runs headless by default, but can be configured to run full (non-headless) Chrome or Chromium.Puppeteer Official DocumentĐọc thêm bài viết về Node.js

  • Về cơ bản, bạn hiểu Puppeteer là một trình duyệt chạy trên nền Node.js. Nếu bạn đọc tài liệu của Puppeteer, điều đầu tiên tác giả nhắc tới đó là khả năng tạo ảnh chụp màn hình và PDF từ các trang web.
  • [JS] Xử lý ERROR trong NodeJS sao cho đúng?
  • [JS] Hướng dẫn crawl dữ liệu website bằng NodeJS

Tài liệu tham khảo:

  • https://github.com/puppeteer/puppeteer
  • https://medium.com/the-node-js-collection/generating-pdf-from-html-with-node-js-and-puppeteer-c5a0622e8e0a
  • https://nodejs.org/en/docs/

Hướng dẫn puppeteer html to pdf - puppeteer html sang pdf