当前位置:首页 > JavaScript

js实现pdf报表

2026-04-07 13:44:50JavaScript

使用jsPDF生成PDF报表

jsPDF是一个流行的JavaScript库,用于客户端生成PDF文件。它支持文本、表格、图像等多种元素。

安装方式:

npm install jspdf

基础示例代码:

import { jsPDF } from "jspdf";

const doc = new jsPDF();
doc.text("Hello world!", 10, 10);
doc.save("report.pdf");

添加表格数据

使用jsPDF-autoTable插件可以方便地添加表格:

import { jsPDF } from "jspdf";
import "jspdf-autotable";

const doc = new jsPDF();
const data = [
  ["ID", "Name", "Value"],
  [1, "Item 1", 100],
  [2, "Item 2", 200]
];

doc.autoTable({
  head: [data[0]],
  body: data.slice(1),
  startY: 20
});

doc.save("table-report.pdf");

使用PDFKit生成PDF

PDFKit是另一个功能强大的PDF生成库,适合更复杂的文档需求。

安装:

js实现pdf报表

npm install pdfkit

示例代码:

const PDFDocument = require('pdfkit');
const fs = require('fs');

const doc = new PDFDocument();
doc.pipe(fs.createWriteStream('output.pdf'));

doc.fontSize(25).text('Report Title', 100, 80);
doc.fontSize(12).text('This is a sample PDF report', 100, 100);

doc.end();

添加图表到PDF

结合Chart.js和jsPDF可以将图表转换为PDF:

// 先使用canvas生成图表
const chartCanvas = document.getElementById('chart');
const chartImage = chartCanvas.toDataURL('image/png');

// 添加到PDF
const doc = new jsPDF();
doc.addImage(chartImage, 'PNG', 15, 40, 180, 100);
doc.save('chart-report.pdf');

服务器端生成方案

对于Node.js环境,Puppeteer可以渲染网页后生成PDF:

js实现pdf报表

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('http://example.com/report', {waitUntil: 'networkidle0'});
  await page.pdf({path: 'report.pdf', format: 'A4'});
  await browser.close();
})();

样式和布局控制

jsPDF支持基本样式设置:

const doc = new jsPDF();
doc.setFont("helvetica", "bold");
doc.setTextColor(255, 0, 0);
doc.text("Important Note", 10, 10);

doc.setFontSize(10);
doc.setTextColor(0, 0, 0);
doc.text("Details go here...", 10, 20);

多页文档处理

处理长内容自动分页:

const doc = new jsPDF();
let y = 20;

for(let i = 0; i < 100; i++) {
  if(y > 280) {
    doc.addPage();
    y = 20;
  }
  doc.text(`Item ${i}`, 10, y);
  y += 10;
}

doc.save("long-report.pdf");

中文支持

处理中文需要添加字体:

import { jsPDF } from "jspdf";

const doc = new jsPDF();
doc.addFont('NotoSansSC-Regular.ttf', 'NotoSansSC', 'normal');
doc.setFont('NotoSansSC');
doc.text("中文内容", 10, 10);
doc.save("chinese-report.pdf");

性能优化建议

大量数据生成时考虑分块处理,避免浏览器卡顿。对于复杂报表,建议先在服务器端生成或使用Web Worker。

浏览器内存限制大约在500页左右,超过此限制可能导致崩溃。对于超长文档,建议分批生成后合并。

标签: 报表js
分享给朋友:

相关文章

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:CSS…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js实现图片放大

js实现图片放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性实现图片放大效果。当鼠标悬停时,图片会平滑放大。 const img = document…

js验证码实现

js验证码实现

验证码的基本原理 验证码(CAPTCHA)用于区分人类用户和自动化程序。常见类型包括图形验证码、滑动验证码、短信验证码等。JavaScript 可用于前端验证码的生成和验证逻辑。 图形验证码实现 使…