当前位置:首页 > 行业动态 > 正文

humer.js

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 文件为单一文档。

安装与依赖

  1. 安装方式
    npm install humer-js
  2. 依赖项
    • pdf-lib:用于 PDF 生成与操作。
    • css-parser:解析 CSS 样式表。
    • jsdom:模拟浏览器环境执行 HTML/CSS 渲染。

基本使用步骤

  1. 初始化文档

    const Humer = require('humer-js');
    const doc = new Humer.Document({
      paperSize: 'A4', // 默认纸张大小
      margin: { top: 20, bottom: 20, left: 30, right: 30 } // 单位:px
    });
  2. doc.addSection({
      content: `
        <h1>标题</h1>
        <p style="color: red;">红色文字</p>
        <img src="data:image/png;base64,..." alt="示例图片" />
      `
    });
  3. 生成 PDF

    doc.save('output.pdf');

注意事项

问题 解决方案
CSS 兼容性 仅支持基础样式(如 font-sizetext-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%; }
0