上一篇
humer.js
- 行业动态
- 2025-05-01
- 4348
Humer.js是一款轻量级JavaScript工具库,主要用于简化DOM操作与事件绑定,提升前端开发效率,支持链式调用与模块化
Humer.js 是一个基于 Node.js 的 PDF 生成工具,专注于将 HTML/CSS 内容转换为 PDF 文件,它通过解析 HTML 结构、计算 CSS 样式,并结合自定义布局规则生成高质量的 PDF 文档,以下是其核心功能与使用细节。
核心功能
功能类别 | 详细说明 |
---|---|
HTML 解析 | 支持标准 HTML 标签(如 <div> 、<table> 、<img> ),可嵌套复杂结构。 |
CSS 样式处理 | 部分支持 CSS 属性(如字体、颜色、定位),但高级特性(如 Flex/Grid)需手动适配。 |
分页与布局 | 自动分页、自定义页边距、页眉页脚插入。 |
图像与链接 | 支持内联图片、外部链接(需 base64 编码),但复杂动画或脚本会被忽略。 |
多文档合并 | 可拼接多个 HTML 片段或 PDF 文件为单一文档。 |
安装与依赖
- 安装方式
npm install humer-js
- 依赖项
pdf-lib
:用于 PDF 生成与操作。css-parser
:解析 CSS 样式表。jsdom
:模拟浏览器环境执行 HTML/CSS 渲染。
基本使用步骤
初始化文档
const Humer = require('humer-js'); const doc = new Humer.Document({ paperSize: 'A4', // 默认纸张大小 margin: { top: 20, bottom: 20, left: 30, right: 30 } // 单位:px });
doc.addSection({ content: ` <h1>标题</h1> <p style="color: red;">红色文字</p> <img src="data:image/png;base64,..." alt="示例图片" /> ` });
生成 PDF
doc.save('output.pdf');
注意事项
问题 | 解决方案 |
---|---|
CSS 兼容性 | 仅支持基础样式(如 font-size 、text-align ),需手动转换高级布局(如 Flex)。 |
分页溢出 | 使用 <div style="page-break-before: always;"> 强制分页。 |
中文字体渲染 | 需手动引入字体文件(如 .ttf ),并通过 CSS @font-face 定义。 |
性能优化 | 对大文档建议分批处理(如按章节拆分),避免单次渲染过载。 |
示例代码
const Humer = require('humer-js'); const fs = require('fs'); // 加载自定义字体 const fontBuffer = fs.readFileSync('path/to/font.ttf'); const doc = new Humer.Document({ fonts: [{ name: 'CustomFont', buffer: fontBuffer }], defaultFont: 'CustomFont' }); 与样式 doc.addSection({ content: ` <h1 style="font-size: 24px;">自定义字体标题</h1> <p>这是一段包含中文的文字,使用自定义字体渲染。</p> `, styles: ` @font-face { font-family: 'CustomFont'; src: url('font.ttf'); } body { font-family: 'CustomFont'; } ` }); // 生成 PDF doc.save('output.pdf');
相关问题与解答
问题 1:Humer.js 与 Puppeteeer 生成 PDF 的区别?
解答:
- Humer.js:专注于离线渲染,无需浏览器环境,适合服务器端批量生成简单文档,但 CSS 支持有限。
- Puppeteer:依赖 Chromium 浏览器,支持完整 CSS/JS,适合动态内容(如交互式图表),但资源消耗大且速度较慢。
问题 2:如何让 Humer.js 支持 Flex 布局?
解答:
Humer.js 默认不解析 Flex/Grid 布局,需手动转换为绝对定位或浮动布局。
/ 原 Flex 样式 / .container { display: flex; justify-content: space-between; } / 转换后样式 / .container { position: relative; } .item { position: absolute; top: 0; left: 50%; }