# htmlToImage
**Repository Path**: gitzzr/html-to-image
## Basic Information
- **Project Name**: htmlToImage
- **Description**: 使用Puppeteer将HTML转换为图片的工具
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-04-02
- **Last Updated**: 2025-05-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# HTML转图片工具
这是一个使用Puppeteer将HTML页面转换为图片的工具项目。该项目包含完整的Node.js命令行工具和PHP集成类,让您可以轻松将HTML转换为各种格式的图片。
## 项目特点
- 使用Puppeteer自动控制Chromium浏览器
- 支持动态JavaScript内容渲染
- 捕获整个页面和特定元素的截图
- 支持透明背景图片生成
- 支持模板数据动态注入
- 支持PNG和PDF输出
- 提供多种预设HTML海报模板
- 可配置输出图片类型
- 支持简化命令
- 提供完整的PHP集成类
- 强化的数据传递方式,解决跨平台兼容问题
## 项目结构
- `html2image.js`: 使用Puppeteer将HTML转换为图片的主脚本
- `HtmlToImageService.php`: PHP集成类,用于在PHP项目中调用Node.js工具
- `templates/`: 预设HTML海报模板目录
- `basic-poster.html`: 基础海报模板
- `product-poster.html`: 商品海报模板
- `event-poster.html`: 活动海报模板
- `member-poster.html`: 会员邀请海报模板
- `scripts/`: 辅助脚本目录
- `clean-output.js`: 清理输出目录的脚本
- `batch-generate.js`: 批量生成海报的脚本
- `examples/`: 示例代码目录
- `template-usage.php`: PHP调用示例,展示如何使用模板生成海报
- `batch-config.json`: 批量生成海报的配置示例
- `output/`: 输出目录,存放生成的图片和PDF文件
## 安装依赖
确保已安装Node.js和PHP,然后运行:
```bash
npm install
```
## 系统依赖
Puppeteer需要一些系统依赖才能正常运行Chrome浏览器。在不同的Linux发行版上,可能需要安装以下依赖:
### CentOS / TencentOS
```bash
# 安装Puppeteer所需的基本依赖
sudo yum install -y atk at-spi2-atk at-spi2-core pango libXcomposite libXcursor libXdamage libXext libXi libXtst cups-libs libXScrnSaver libXrandr alsa-lib libXrender mesa-libgbm
```
### Ubuntu / Debian
```bash
# 安装Puppeteer所需的基本依赖
sudo apt-get update
sudo apt-get install -y libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libasound2 libpango-1.0-0 libcairo2
```
如果遇到Chrome启动失败的错误,请检查错误信息中提到的缺少的库文件,并安装相应的依赖包。
通常,错误信息会类似于:
```
Error: Failed to launch the browser process!
/path/to/chrome: error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such file or directory
```
## 命令行工具使用
### 基本用法
```bash
node html2image.js [选项]
```
选项说明:
- `--output, -o`: 输出文件前缀
- `--transparent, -t`: 使用透明背景 (默认: true)
- `--data, -d`: 模板数据 (JSON/JSON5格式字符串)
- `--dataFile`: 从文件加载模板数据 (支持.js或.json文件)
- `--options`: 输出选项 (JSON/JSON5格式字符串)
- `--optionsFile`: 从文件加载输出选项 (支持.js或.json文件)
例如:
```bash
# 基本使用
node html2image.js test.html --output member_poster
# 指定透明背景选项
node html2image.js test.html --output test_poster --transparent false
# 使用JSON字符串作为模板数据
node html2image.js templates/member-poster.html --output custom_poster --data '{
"userName": "小明",
"shopName": "明亮智能店铺",
"avatar": "https://robohash.org/xiaoming?set=set4&size=150x150",
"storeLogo": "https://dummyimage.com/200x80/0066cc/ffffff&text=明亮店铺",
"qrCode": "https://api.qrserver.com/v1/create-qr-code/?size=180x180&data=https://example.com/test",
"template": 2,
"background": "",
"text": "诚邀您加入我们的VIP会员俱乐部,享受专属优惠与服务!",
"isShopInfo": true,
"isStoreLogo": true,
"domain": "https://example.com"
} '
# 使用JSON文件作为模板数据
node html2image.js templates/member-poster.html --output custom_poster --dataFile data/templates/member-poster.json
# 使用JS文件作为模板数据
node html2image.js templates/member-poster.html --output custom_poster --dataFile data/templates/member-poster.js
# 使用JSON字符串设置输出选项
node html2image.js templates/member-poster.html --output member_poster --options '{"fullPage":false,"element":true,"elementWithBg":true,"pdf":false}'
# 使用JSON文件设置输出选项
node html2image.js templates/member-poster.html --output member_poster --optionsFile data/output-options.json
# 显示帮助信息
node html2image.js --help
```
### 预设命令
支持以下预设命令,方便快速使用:
```bash
# 只生成元素截图和带背景的元素截图
node html2image.js elements templates/member-poster.html [--output 输出文件前缀]
# 只生成元素截图
node html2image.js element-only templates/member-poster.html [--output 输出文件前缀]
# 生成所有类型输出
node html2image.js full templates/member-poster.html [--output 输出文件前缀]
# 只生成PDF
node html2image.js pdf-only templates/member-poster.html [--output 输出文件前缀]
# 显示帮助信息
node html2image.js --help
```
### 使用npm脚本
项目提供了简洁的npm脚本命令:
```bash
# 基本转换
npm run convert -- templates/member-poster.html --output poster # 运行基本的转换命令
# 预设命令
npm run elements -- templates/member-poster.html --output <输出前缀> # 只生成元素截图和带背景截图
npm run element-only -- templates/member-poster.html --output <输出前缀> # 只生成元素截图
npm run full -- templates/member-poster.html --output <输出前缀> # 生成所有输出格式
npm run pdf-only -- templates/member-poster.html --output <输出前缀> # 只生成PDF
# 运行PHP示例
npm run example
# 批量生成和清理
npm run batch -- [配置文件路径] # 批量生成多个海报图片
npm run clean # 清空output目录中的所有文件(跨平台兼容)
```
## 配置输出选项
项目默认只生成元素截图和带背景的元素截图,你可以通过`outputOptions`参数控制生成哪些类型的图片。配置选项:
```json
{
"fullPage": false, // 是否输出完整页面截图 (默认: false)
"element": true, // 是否输出带透明背景的元素截图 (默认: true)
"elementWithBg": true, // 是否输出带背景的元素截图 (默认: true)
"pdf": false // 是否输出PDF文件 (默认: false)
}
```
## 域名配置
在使用海报模板时,可能需要动态设置域名,特别是在不同的环境(开发、测试、生产)中使用同一套代码时。项目支持三种设置域名的方式:
### 1. 在构造函数中设置默认域名
```php
// 创建实例时设置默认域名
$htmlToImage = new HtmlToImageService(
'node', // Node.js可执行文件路径
null, // 使用默认脚本路径
null, // 使用默认输出目录
false, // 是否启用调试模式
'https://dev.example.com' // 设置默认域名
);
```
### 2. 使用setter方法修改默认域名
```php
// 创建实例
$htmlToImage = new HtmlToImageService();
// 设置默认域名
$htmlToImage->setDefaultDomain('https://test.example.com');
```
### 3. 在生成海报时动态传入域名
```php
// 生成海报时通过options参数指定域名
$result = $htmlToImage->generatePoster(
'templates/member-poster.html', // HTML模板文件
$templateData, // 模板数据
[
'outputPrefix' => 'domain_example', // 输出文件前缀
'domain' => 'https://prod.example.com' // 生产环境域名
]
);
```
完整的域名配置示例参见 `/examples/use-domain.php`。
## 预设模板说明
项目提供了多种预设HTML模板,可以直接使用:
### 1. 基础海报模板 (basic-poster.html)
一个通用的海报模板,包含标题、副标题、正文、图片和底部信息等元素。
支持的模板数据:
```json
{
"title": "海报标题",
"subtitle": "海报副标题",
"text": "海报正文内容",
"price": "¥99.00",
"background": "https://placehold.co/800x600?text=背景图片",
"mainImage": "https://placehold.co/400x300?text=主图",
"qrcode": "https://placehold.co/180x180?text=二维码",
"tips": "扫码说明文字",
"shopName": "店铺名称",
"shopDesc": "店铺描述",
"shopLogo": "https://placehold.co/200x100?text=店铺Logo",
"isShowPrice": true,
"isShowShopInfo": true
}
```
### 2. 商品海报模板 (product-poster.html)
专为商品展示设计的海报模板,包含商品图片、标题、描述、价格、折扣等信息。
支持的模板数据:
```json
{
"title": "商品名称",
"description": "商品描述",
"price": "¥299",
"originalPrice": "¥399",
"discount": "7.5折",
"productImage": "https://placehold.co/300x400?text=商品图片",
"shopName": "店铺名称",
"shopLogo": "https://placehold.co/200x100?text=店铺Logo",
"qrcode": "https://placehold.co/180x180?text=二维码",
"showDiscount": true
}
```
### 3. 活动海报模板 (event-poster.html)
为促销活动设计的海报模板,包含活动标题、日期、折扣信息等。
支持的模板数据:
```json
{
"title": "活动标题",
"date": "活动日期",
"discountValue": "折扣力度",
"discountDescription": "折扣描述",
"description": "活动详情描述",
"shopName": "店铺名称",
"shopAddress": "店铺地址",
"shopLogo": "https://placehold.co/200x100?text=店铺Logo",
"qrcode": "https://placehold.co/180x180?text=二维码",
"qrcodeText": "二维码说明",
"limitedTimeTag": "限时标签文字",
"showLimitedTimeTag": true,
"backgroundColor": "背景颜色或渐变"
}
```
### 4. 会员邀请海报模板 (member-poster.html)
专为会员邀请设计的海报模板,有两种不同样式。
支持的模板数据:
```json
{
"template": 1, // 样式选择:1或2
"background": "https://placehold.co/800x600?text=背景图片",
"text": "邀请文案",
"isShopInfo": 1, // 是否显示店铺信息:0或1
"isStoreLogo": 1 // 是否显示店铺Logo:0或1
}
```
## PHP集成
项目提供了完整的PHP集成类`HtmlToImageService.php`,可以轻松地在PHP项目中使用。该类已针对新增的`--dataFile`和`--optionsFile`参数进行了优化,确保PHP和Node.js之间的数据传递更可靠,特别是在Windows环境下。
### 基本用法
```php
generatePoster('templates/basic-poster.html');
if ($result['success']) {
echo "海报生成成功!\n";
print_r($result['files']);
} else {
echo "生成失败: " . $result['error'] . "\n";
}
?>
```
### 使用模板数据
```php
'限时特惠活动',
'subtitle' => '只在本周末',
'text' => '这是一个超值促销活动,全场商品8折起!',
'price' => '¥199.00',
'shopName' => '优品商城',
'shopDesc' => '品质生活从这里开始'
];
// 设置输出选项
$outputOptions = [
'fullPage' => false,
'element' => true,
'elementWithBg' => true,
'pdf' => false
];
// 生成海报
$result = $htmlToImage->generateFromTemplate(
'templates/basic-poster.html',
'special_offer',
$templateData,
true,
$outputOptions
);
if ($result['success']) {
echo "海报生成成功!\n";
foreach ($result['files'] as $type => $path) {
if ($path) {
echo "- {$type}: {$path}\n";
}
}
} else {
echo "生成失败: " . $result['error'] . "\n";
}
?>
```
### 跨平台兼容
`HtmlToImageService`类处理了不同操作系统下命令行参数的差异,无论是在Linux/macOS还是Windows环境下,都能正确传递复杂的JSON数据。类内部实现了自动检测操作系统并使用最佳的参数传递方式:
1. 在Windows环境中,使用临时JSON文件传递数据,避免命令行参数中的引号和转义问题
2. 通过新增的`--dataFile`和`--optionsFile`参数,从文件中加载模板数据和输出选项
3. 自动清理临时文件,避免文件系统占用
### 调试模式
如果在使用过程中遇到问题,可以开启调试模式查看详细的执行信息:
```php
// 方法1:在创建实例时开启调试模式
$htmlToImage = new HtmlToImageService('node', null, null, true);
// 方法2:通过方法开启调试模式
$htmlToImage = new HtmlToImageService();
$htmlToImage->setDebug(true);
```
调试模式将输出以下信息:
- 创建的临时文件路径
- 执行的命令行
- 命令执行结果
- 命令返回代码
- 错误信息(如果有)
- 清理过程
这些信息对于排查跨平台使用中的问题特别有帮助。
### 批量生成海报
```php
'商品1',
'description' => '商品1的描述',
'price' => '¥299',
'originalPrice' => '¥399'
],
[
'title' => '商品2',
'description' => '商品2的描述',
'price' => '¥199',
'originalPrice' => '¥299'
]
];
// 批量生成海报
foreach ($products as $index => $productData) {
$result = $htmlToImage->generateFromTemplate(
'templates/product-poster.html',
"product_{$index}",
$productData,
true
);
if ($result['success']) {
echo "商品 '{$productData['title']}' 海报生成成功!\n";
}
}
?>
```
更多示例请参考`examples/template-usage.php`文件。
## 输出文件
脚本执行后,将在`output`目录中生成以下文件:
- `<前缀>_full.png`: 页面完整截图
- `<前缀>_element.png`: 仅海报元素区域的截图(透明背景,如果启用)
- `<前缀>_element_with_bg.png`: 带白色背景的海报元素截图(仅当启用透明背景时生成)
- `<前缀>.pdf`: 整个页面的PDF版本
## 许可证
ISC
## 批量生成海报
项目支持通过JSON配置文件批量生成多个海报图片。
### 配置文件格式
配置文件应包含一个数组,每个元素代表一个海报生成任务:
```json
[
{
"template": "templates/basic-poster.html", // 模板文件路径
"output": "basic_poster_1", // 输出文件前缀
"data": { // 模板数据(内联)
"title": "海报标题",
"subtitle": "海报副标题",
"text": "海报内容"
},
"dataFile": "data/poster1.json", // 也可使用数据文件(二选一)
"transparent": true, // 是否使用透明背景
"options": { // 输出选项(内联)
"fullPage": false,
"element": true,
"elementWithBg": true,
"pdf": false
},
"optionsFile": "config/options.json" // 也可使用选项文件(二选一)
},
// 更多任务...
]
```
注意:
- 如果同时指定了`data`和`dataFile`,将优先使用`dataFile`
- 如果同时指定了`options`和`optionsFile`,将优先使用`optionsFile`
- 数据文件支持JSON文件和JS模块文件
### 使用方法
```bash
# 使用默认配置文件
npm run batch examples/batch-config.json
# 或直接运行脚本
node scripts/batch-generate.js examples/batch-config.json
```
### 示例配置
项目提供了一个示例配置文件:`examples/batch-config.json`,包含了所有模板的使用示例。
### 示例数据文件
项目提供了预设的数据文件示例,位于`data/templates`目录:
**会员海报JSON数据 (member-poster.json):**
```json
{
"userName": "小明",
"shopName": "明亮智能店铺",
"template": 1,
"text": "诚邀您加入我们的VIP会员俱乐部,享受专属优惠与服务!",
"isShopInfo": true,
"isStoreLogo": true
// ...其他属性
}
```
**会员海报JS模块数据 (member-poster.js):**
```javascript
// 会员海报数据 - JS模块方式
module.exports = {
userName: "张小姐",
shopName: "张氏精品店",
template: 2,
text: "诚邀您成为我们的贵宾会员,专享VIP折扣与一对一贴心服务!",
// ...其他属性
};
```
**输出选项文件 (output-options.json):**
```json
{
"fullPage": false,
"element": true,
"elementWithBg": true,
"pdf": true
}
```
## 免责声明
**重要提示:关于图片资源的版权问题**
本项目示例中使用的图片资源URL均为占位图片,仅供功能演示之用。在实际应用中,请注意:
1. 请确保您使用的所有图片资源(如背景图、Logo、二维码等)拥有合法的使用权或授权
2. 商业用途时,建议使用:
- 您自己创建的原创图片
- 您已购买授权的商业图片
- 提供合适商业许可的免费图库(如Unsplash、Pexels等)
3. 在项目开发阶段,可以使用以下占位图服务进行测试:
- https://placehold.co/
- https://placeholder.com/
- https://dummyimage.com/
请勿直接使用未经授权的第三方图片资源,以避免潜在的版权纠纷。
## 常见问题
### 1. Puppeteer启动失败
如果遇到类似以下错误:
```
Error: Failed to launch the browser process!
/root/.cache/puppeteer/chrome/linux-127.0.6533.88/chrome-linux64/chrome: error while loading shared libraries: libatk-bridge-2.0.so.0: cannot open shared object file: No such file or directory
```
这表明系统缺少Puppeteer运行Chrome所需的依赖库。请按照"系统依赖"部分安装相应的依赖包。
常见缺失的库文件及对应的包:
- `libatk-bridge-2.0.so.0` - 安装 `at-spi2-atk`
- `libgbm.so.1` - 安装 `mesa-libgbm`
- `libXcomposite.so.1` - 安装 `libXcomposite`
- `libXdamage.so.1` - 安装 `libXdamage`
- `libXrandr.so.2` - 安装 `libXrandr`
在安装依赖后,重新运行命令应能正常工作。
### 2. Windows环境下JSON参数问题
在Windows环境下使用命令行传递JSON数据时,可能会遇到引号转义问题。建议使用以下方法之一:
- 使用`--dataFile`和`--optionsFile`参数从文件加载数据
- 使用PHP集成类`HtmlToImageService`,它会自动处理跨平台兼容问题
- 如果必须在命令行中传递JSON,注意Windows中的双引号转义规则