跳過到頁腳內容
PDF工具

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

在當今的數位世界中,能夠將網頁或 HTML 文件轉換為 PDF 文件至關重要。 這對於產生報告、建立發票或以更易於理解的方式共享資訊非常有用。 在這篇文章中,我們將探討如何使用Node.js和 Puppeteer(Google開發的開源程式庫)將 HTML 頁面轉換為 PDF。

木偶師入門

Puppeteer 是一個強大的Node.js庫,它允許開發人員控制無頭瀏覽器(主要是 Google Chrome 或 Chromium),並執行各種操作,例如網頁抓取、螢幕截圖和生成 PDF。 Puppeteer 提供了豐富的 API 來與瀏覽器交互,使其成為將 HTML 轉換為 PDF 的絕佳選擇。

為什麼選擇木偶師?

*易用性:* Puppeteer 提供了一個簡單易用的 API,它抽象化了使用無頭瀏覽器的複雜性。 功能強大:** Puppeteer 提供了強大的功能,可用於操作網頁和與瀏覽器元素互動。 *可擴展性:借助 Puppeteer,您可以透過並行運行多個瀏覽器實例輕鬆擴展 PDF 生成過程。

設定你的 Node.js 項目

開始之前,您需要建立一個新的Node.js專案。 請依照以下步驟開始:

  1. 如果您還沒有安裝 Node.js,請安裝它(您可以從Node.js 網站下載)。
  2. 為您的專案建立一個新資料夾,並在 Visual Studio Code 或任何特定的程式碼編輯器中開啟它。
  3. 執行 npm init 為您的專案建立一個新的 package.json 檔案。 依照提示填寫所需資訊。

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

  4. 透過運行 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,一個用於處理檔案系統操作的內建 Node.js 模組。 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 函數是我們程式碼片段的核心。 此非同步函數接受一個字串和一個字串作為輸入參數,並傳回一個 PDF 檔案。此函數執行以下步驟:

  1. 使用 Puppeteer 啟動一個新的無頭瀏覽器實例。
  2. 建立一個新的瀏覽器頁面。
  3. 將提供的 html 字串設定為頁面內容,等待 DOM 內容載入。
  4. 模擬"螢幕"媒體類型,套用螢幕使用的 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 轉換過程中發生的任何錯誤,並將錯誤訊息記錄到控制台。

這段程式碼片段提供了一個全面的範例,說明如何使用 Node.js 和 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 函數是我們程式碼片段的核心。 此非同步函數接受一個 websiteUrl 和一個 outputPath 作為輸入參數,並傳回一個 PDF 檔案。此函數執行以下步驟:

  1. 使用 Puppeteer 啟動一個新的無頭瀏覽器實例。
  2. 建立一個新的瀏覽器頁面。
  3. 導覽至提供的 websiteUrl,並使用設定為 networkidle0waitUntil 選項等待網路空閒。
  4. 模擬"螢幕"媒體類型,以確保應用程式螢幕使用的 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. 使用所需的 exportWebsiteAsPdfoutputPath 呼叫 exportWebsiteAsPdf 函數。
  2. 使用 then 區塊來處理成功建立 PDF。 在這個程式碼區塊中,我們將成功訊息記錄到控制台。
  3. 使用 catch 區塊來處理網站轉換為 PDF 過程中發生的任何錯誤。 如果發生錯誤,我們會將錯誤訊息記錄到控制台。

透過將此程式碼片段整合到您的專案中,您可以使用 Node.js 和 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 文件是許多應用中的常見需求,擁有合適的工具至關重要。 本文提供的解決方案,例如使用 Puppeteer 和 Node.js 或IronPDF和.NET,為將 HTML 內容和 URL 轉換為專業、高品質的 PDF 文件提供了強大且高效的方法。

IronPDF尤其以其豐富的功能集脫穎而出,成為.NET開發人員的首選。 IronPDF提供免費試用版,讓您可以探索其各項功能。

用戶還可以從Iron Suite軟體包中受益,該軟體包包含五個專業的.NET庫,包括IronXLIronPDFIronOCR等。

Curtis Chau
技術作家

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

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

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me