怎样将 HTML 和 CSS 转换为 PDF?
                           
天天向上
发布: 2025-01-05 22:27:52

原创
28 人浏览过

将 HTML 和 CSS 转换为 PDF 是一个常见的需求,尤其在生成报表、发票、文档或其他格式的电子文件时。这里有几种常见的方式和工具可以有效地实现这一目标。

1. 使用 wkhtmltopdf 工具

wkhtmltopdf 是一个开源工具,它通过 Webkit 引擎将 HTML 转换为 PDF。它能够完全支持 HTML5 和 CSS3,并且在页面渲染时会严格遵循网页的样式。

使用步骤:

  1. 安装 wkhtmltopdf
  • 对于 Linux(如 Ubuntu):
    bash sudo apt-get install wkhtmltopdf
  • 对于 macOS(使用 Homebrew):
    bash brew install wkhtmltopdf
  • 对于 Windows:可以下载并安装 Windows 版本
  1. 命令行转换
    假设你的 HTML 文件是 file.html,可以通过以下命令将其转换为 PDF:
   wkhtmltopdf file.html output.pdf

如果你的 HTML 文件包含外部 CSS 和图像,它们会被一并处理并嵌入到最终的 PDF 文件中。

使用 wkhtmltopdf 的优点:

  • 完全支持复杂的 CSS 样式。
  • 可以直接通过命令行或脚本调用,方便自动化生成 PDF 文件。
  • 渲染效果非常接近浏览器渲染的结果。

缺点:

  • 渲染速度较慢,特别是处理复杂的页面时。
  • 需要额外的安装和配置。

2. 使用 PHP 的 dompdf

dompdf 是一个 PHP 库,可以将 HTML 和 CSS 转换为 PDF。它是纯 PHP 实现的,不需要外部依赖,非常适合 PHP 项目。

安装:

composer require dompdf/dompdf

使用代码示例:

require 'vendor/autoload.php';

use Dompdf\Dompdf;
use Dompdf\Options;

// 创建 Dompdf 实例
$options = new Options();
$options->set('isHtml5ParserEnabled', true);
$options->set('isPhpEnabled', true);
$dompdf = new Dompdf($options);

// 加载 HTML 内容
$html = file_get_contents('file.html');

// 加载 HTML 内容到 Dompdf
$dompdf->loadHtml($html);

// 设置页面大小
$dompdf->setPaper('A4', 'portrait');

// 渲染 PDF(第一步:将 HTML 转换为 PDF)
$dompdf->render();

// 输出 PDF 到浏览器
$dompdf->stream('output.pdf');

dompdf 的优点:

  • 支持在 PHP 中直接调用。
  • 适用于 Web 项目,尤其是生成报表或文档。
  • 支持基本的 CSS 和 HTML5。

缺点:

  • 对 CSS 支持有限,不支持所有 CSS 特性(例如复杂的布局、媒体查询、JavaScript 动画等)。
  • 渲染复杂的页面时可能会有性能问题。

3. 使用 Puppeteer(Node.js)

Puppeteer 是一个基于 Chrome 的 Node.js 库,它允许你通过控制无头浏览器来操作网页。Puppeteer 提供了强大的功能,能够将 HTML 转换为 PDF,支持完整的 CSS3 和 JavaScript。

安装:

npm install puppeteer

使用代码示例:

const puppeteer = require('puppeteer');

async function convertHtmlToPdf() {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    // 加载 HTML 内容
    await page.goto('file://path/to/your/file.html', {waitUntil: 'networkidle0'});

    // 转换为 PDF
    await page.pdf({path: 'output.pdf', format: 'A4'});

    await browser.close();
}

convertHtmlToPdf();

Puppeteer 的优点:

  • 完全支持 HTML5、CSS3 和 JavaScript。
  • 渲染效果非常接近实际浏览器的表现,尤其是在处理复杂的页面和动态内容时。
  • 支持定制化,能够处理 AJAX 请求、延迟加载、动画等动态内容。

缺点:

  • 需要 Node.js 环境。
  • 对于服务器端的应用程序,需要安装 Chromium(虽然它是自动安装的,但可能会占用一定的磁盘空间)。

4. 使用 WeasyPrint(Python)

WeasyPrint 是一个 Python 库,能够将 HTML 和 CSS 转换为 PDF,基于 WebKit 引擎。它支持 CSS3 和 HTML5,并能有效地处理排版和复杂布局。

安装:

pip install weasyprint

使用代码示例:

import weasyprint

# 从 HTML 文件生成 PDF
weasyprint.HTML('file.html').write_pdf('output.pdf')

WeasyPrint 的优点:

  • 适用于 Python 项目,安装简便。
  • 支持最新的 CSS 和 HTML 特性,渲染效果接近浏览器表现。

缺点:

  • 仅适用于 Python 环境。

5. 使用在线工具

如果你不希望使用命令行或编程接口,还可以使用一些在线工具,它们支持将 HTML 转换为 PDF。这些工具适合小规模转换。

这些工具通常可以上传 HTML 文件并快速生成 PDF。

选择最佳方案的依据:

  1. 项目环境:如果你在 PHP 项目中工作,可以选择 dompdfwkhtmltopdf。在 Node.js 环境中,Puppeteer 是一个非常好的选择。对于 Python 项目,可以使用 WeasyPrint。
  2. 渲染效果:如果你需要支持最新的 CSS 和 JavaScript,Puppeteer 是最强大的选择,因为它使用的是 Chromium 引擎,支持动态内容和复杂布局。
  3. 安装和性能:如果你需要简单快速的解决方案,dompdfwkhtmltopdf 是不错的选择,但它们对 CSS 支持可能有限。

总的来说,选择工具时应根据项目的需求、环境以及对渲染效果的要求来决定。

发表回复 0

Your email address will not be published. Required fields are marked *