跳過到頁腳內容
PDF工具

如何在Node.js中使用Puppeteer將HTML轉PDF

在今天的數位世界中,能夠將網頁或 HTML 文件轉換為 PDF 文件是至關重要的。 這對於生成報告、創建發票或僅僅是在更具表現力的格式中共享信息都很有用。 在這篇博客文章中,我們將探討如何使用 Node.js 和 Google 開發的開源庫 Puppeteer 將 HTML 頁面轉換為 PDF。

Puppeteer 介紹

Puppeteer 是一個功能強大的 Node.js 庫,允許開發人員控制無頭瀏覽器,主要是 Google Chrome 或 Chromium,並執行各種操作,如網頁抓取、截屏和生成 PDF。 Puppeteer 提供了一個廣泛的 API 來與瀏覽器互動,使其成為將 HTML 轉換為 PDF 的極佳選擇。

為什麼選擇 Puppeteer?

  • 易於使用: Puppeteer 提供了一個簡單易用的 API,抽象了使用無頭瀏覽器的複雜性。
  • 功能強大: Puppeteer 提供了豐富的功能來操縱網頁並與瀏覽器元素進行交互。
  • 可擴展: 使用 Puppeteer,您可以通過並行運行多個瀏覽器實例輕鬆擴展 PDF 生成過程。

設置您的 NodeJS 項目

在開始之前,您需要設置一個新的 NodeJS 項目。 按以下步驟開始:

  1. 如果尚未安裝,請安裝 NodeJS(您可以從 NodeJS 官方網站 下載)。
  2. 為您的項目創建一個新文件夾,並在 Visual Studio Code 或任何特定代碼編輯器中打開它。
  3. 運行 npm init 以為您的項目創建一個新的 package.json 文件。 按照提示填寫所需的信息。

如何在 Node.js 中將 HTML 轉換為 PDF:圖 1

  1. 通過運行 npm install puppeteer 安裝 Puppeteer。

如何在 Node.js 中將 HTML 轉換為 PDF:圖 2

現在我們的項目已設置好,讓我們深入代碼。

加載 HTML 模板並轉換為 PDF 文件

要使用 Puppeteer 將 HTML 模板轉換為 PDF 文件,請按以下步驟操作:

在文件夾中創建一個名為 "HTML To PDF.js" 的文件。

導入 Puppeteer 和 fs

const puppeteer = require('puppeteer');
const fs = require('fs');

代碼從導入兩個基本庫開始:puppeteer,一個用於控制無頭瀏覽器如 Chrome 和 Chromium 的多功能工具,以及 fs,一個內置的 NodeJS 模塊用於處理文件系統操作。 Puppeteer 使您能夠自動化廣泛的基於 Web 的任務,包括渲染 HTML、截屏和生成 PDF 文件。

定義 exportWebsiteAsPdf 函數

async function exportWebsiteAsPdf(html, outputPath) {
  // Create a browser instance
  const browser = await puppeteer.launch({
    headless: true // Launches the browser in headless mode
  });

  // Create a new page
  const page = await browser.newPage();

  // Set the HTML content for the page, waiting for DOM content to load
  await page.setContent(html, { waitUntil: 'domcontentloaded' });

  // To reflect CSS used for screens instead of print
  await page.emulateMediaType('screen');

  // Download the PDF
  const PDF = await page.pdf({
    path: outputPath,
    margin: { top: '100px', right: '50px', bottom: '100px', left: '50px' },
    printBackground: true,
    format: 'A4',
  });

  // Close the browser instance
  await browser.close();

  return PDF;
}

exportWebsiteAsPdf 函數作為我們代碼片段的核心。 此異步函數接受 html 字符串和 outputPath 作為輸入參數並返回 PDF 文件。該函數執行以下步驟:

  1. 使用 Puppeteer 啟動一個新的無頭瀏覽器實例。
  2. 創建一個新的瀏覽器頁面。
  3. 將提供的 html 字符串設置為頁面內容,並等待 DOM 內容加載。
  4. 模擬 'screen' 媒體類型以應用用於屏幕的 CSS 而非專門用於打印的樣式。
  5. 從加載的 HTML 內容生成 PDF 文件,指定邊距、背景打印和格式(A4)。
  6. 關閉瀏覽器實例。
  7. 返回創建的 PDF 文件。

使用 exportWebsiteAsPdf 函數

// Usage example
// Get HTML content from HTML file
const html = fs.readFileSync('test.html', 'utf-8');

// Convert the HTML content into a PDF and save it to the specified path
exportWebsiteAsPdf(html, 'result.pdf').then(() => {
  console.log('PDF created successfully.');
}).catch((error) => {
  console.error('Error creating PDF:', error);
});

代碼的最後部分展示了如何使用 exportWebsiteAsPdf 函數。 我們執行以下步驟:

  1. 使用 fs 模塊的 readFileSync 方法從 HTML 文件中讀取 HTML 內容。
  2. 使用加載的 html 字符串和所需的 outputPath 調用 exportWebsiteAsPdf 函數。
  3. 使用 .then 塊處理成功的 PDF 創建,將成功信息記錄到控制台。
  4. 使用 .catch 塊處理 HTML 到 PDF 轉換過程中發生的任何錯誤,將錯誤信息記錄到控制台。

這段代碼片段提供了一個全面的範例,顯示了如何使用 NodeJS 和 Puppeteer 將 HTML 模板轉換為 PDF 文件。 通過實施此解決方案,您可以高效生成滿足各種應用程序和用戶需求的高質量 PDF 文件。

如何在 Node.js 中將 HTML 轉換為 PDF:圖 3

將 URL 轉換為 PDF 文件

除了轉換 HTML 模板外,Puppeteer 還允許您直接將 URL 轉換為 PDF 文件。

導入 Puppeteer

const puppeteer = require('puppeteer');

代碼開始於導入 Puppeteer 庫,這是一個用於控制像 Chrome 和 Chromium 這樣的無頭瀏覽器的強大工具。 Puppeteer 允許您自動化多種基於 Web 的任務,包括渲染您的 HTML 代碼、截屏,以及在我們的情況下,生成 PDF 文件。

定義 exportWebsiteAsPdf 函數

async function exportWebsiteAsPdf(websiteUrl, outputPath) {
  // Create a browser instance
  const browser = await puppeteer.launch({
    headless: true // Launches the browser in headless mode
  });

  // Create a new page
  const page = await browser.newPage();

  // Open the URL in the current page
  await page.goto(websiteUrl, { waitUntil: 'networkidle0' });

  // To reflect CSS used for screens instead of print
  await page.emulateMediaType('screen');

  // Download the PDF
  const PDF = await page.pdf({
    path: outputPath,
    margin: { top: '100px', right: '50px', bottom: '100px', left: '50px' },
    printBackground: true,
    format: 'A4',
  });

  // Close the browser instance
  await browser.close();

  return PDF;
}

exportWebsiteAsPdf 函數是我們代碼片段的核心。 此異步函數接受 websiteUrloutputPath 作為其輸入參數並返回 PDF 文件。該函數執行以下步驟:

  1. 使用 Puppeteer 啟動一個新的無頭瀏覽器實例。
  2. 創建一個新的瀏覽器頁面。
  3. 瀏覽至提供的 websiteUrl,並使用 waitUntil 選項設置為 networkidle0 等待網絡空閒。
  4. 模擬 'screen' 媒體類型以確保應用屏幕使用的 CSS 而非專門用於打印的樣式。
  5. 將加載的網頁轉換為具有指定邊距、背景打印和格式(A4)的 PDF 文件。
  6. 關閉瀏覽器實例。
  7. 返回生成的 PDF 文件。

使用 exportWebsiteAsPdf 函數

// Usage example
// Convert the URL content into a PDF and save it to the specified path
exportWebsiteAsPdf('https://ironpdf.com/', 'result.pdf').then(() => {
  console.log('PDF created successfully.');
}).catch((error) => {
  console.error('Error creating PDF:', error);
});

代碼的最後部分展示了如何使用 exportWebsiteAsPdf 函數。 我們執行以下步驟:

  1. 使用所需的 websiteUrloutputPath 調用 exportWebsiteAsPdf 函數。
  2. 使用 then 塊處理成功的 PDF 創建。 在此塊中,我們將成功信息記錄到控制台。
  3. 使用 catch 塊處理網站到 PDF 轉換過程中可能發生的任何錯誤。 如果發生錯誤,我們會將錯誤信息記錄到控制台。

通過將此代碼片段集成到您的項目中,您可以輕鬆地使用 NodeJS 和 Puppeteer 將 URL 轉換為高品質的 PDF 文件。

如何在 Node.js 中將 HTML 轉換為 PDF:圖 4

C# 開發者的最佳 HTML 到 PDF 庫

探索 IronPDF 是一個流行的 .NET 庫,用於生成、編輯和提取 PDF 文件中的內容。 它提供了一個簡單而高效的解決方案,用於從 HTML、文本、圖像和現有 PDF 文件創建 PDF。 IronPDF 支持 .NET Core、.NET Framework 和 .NET 5.0+ 項目,使其成為各種應用程序的多功能選擇。

IronPDF的核心特性

使用 IronPDF 進行 HTML 到 PDF 轉換:IronPDF 允許您將 HTML 內容(包括 CSS)轉換為 PDF 文件。 此功能使您能夠從網頁或 HTML 模板創建像素完美的 PDF 文件。

URL 渲染:IronPDF 可以使用 URL 直接從服務器獲取網頁並將其轉換為 PDF 文件,使得存檔網頁內容或從動態網頁生成報告變得簡單。

文本、圖像和 PDF 合併:IronPDF 允許您將文本、圖像和現有的 PDF 文件合併為單個 PDF 文件。 此功能特別適用於創建包含多個內容來源的複雜文檔。

PDF 操作:IronPDF 提供了編輯現有 PDF 文件的工具,例如添加或刪除頁面、修改元數據,甚至從 PDF 文檔中提取文本和圖像。

結論

總之,生成和操作 PDF 文件是許多應用程序中的常見需求,擁有合適的工具是至關重要的。 本文提供的解決方案,如使用 NodeJS 的 Puppeteer 或 .NET 的 IronPDF,提供了強大和高效的方法,將 HTML 內容和 URL 轉換為專業、高質量的 PDF 文件。

IronPDF 特別以其廣泛的功能集脫穎而出,使其成為 .NET 開發者的首選。 IronPDF 提供免費試用,讓您探索其功能。

Users can also benefit from the Iron Suite package, a suite of five professional .NET libraries including IronXL, IronPDF, IronOCR and more.

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。