V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  pythagorasd  ›  全部回复第 1 页 / 共 2 页
回复总数  34
1  2  
3 天前
回复了 qingshui33 创建的主题 前端开发 前端生成 PDF 求指教
问 gpt-4o 就行吧,我复制你的问题问的

在 Vue2 中,可以使用以下类库和工具组合将 HTML 页面转为 PDF ,同时满足你的需求:

1. html2canvas 和 jspdf

• html2canvas 用于将 HTML 元素渲染为 Canvas 图像。
• jspdf 用于生成 PDF 文件,可以支持动态内容、图片、表格和目录。

安装

npm install html2canvas jspdf

示例代码

以下是实现页面一半固定图片,一半动态数据(包含图表、表格)以及目录的示例代码:

import html2canvas from "html2canvas";
import jsPDF from "jspdf";

export default {
methods: {
async generatePDF() {
const pdf = new jsPDF("p", "mm", "a4"); // 创建 A4 纸张的 PDF
let yOffset = 10; // PDF 初始 Y 位置

// 添加固定的图片
const imgElement = document.getElementById("fixed-image");
const imgCanvas = await html2canvas(imgElement);
const imgData = imgCanvas.toDataURL("image/png");
pdf.addImage(imgData, "PNG", 10, yOffset, 90, 40); // 图片位置和大小
yOffset += 50;

// 添加动态内容
const contentElement = document.getElementById("dynamic-content");
const contentCanvas = await html2canvas(contentElement);
const contentData = contentCanvas.toDataURL("image/png");
pdf.addImage(contentData, "PNG", 10, yOffset, 190, 80); // 动态内容

yOffset += 90;

// 添加表格、图表
const chartElement = document.getElementById("chart-content");
const chartCanvas = await html2canvas(chartElement);
const chartData = chartCanvas.toDataURL("image/png");
pdf.addImage(chartData, "PNG", 10, yOffset, 190, 80);
yOffset += 90;

// 添加目录
pdf.addPage(); // 新页面
pdf.text("目录", 10, 10);
pdf.text("1. 固定图片...............1", 10, 20);
pdf.text("2. 动态数据...............2", 10, 30);
pdf.text("3. 图表、表格.............3", 10, 40);

// 保存 PDF
pdf.save("document.pdf");
},
},
};

关键点

• 固定图片部分:将图片元素渲染为 Canvas ,并嵌入 PDF 。
• 动态数据部分:支持动态表格、图表等通过 HTML 转换。
• 目录功能:手动添加目录页,并标记每个部分的页码。

2. pdfmake

如果你的数据主要是动态的,可以考虑使用 pdfmake 。它允许使用 JSON 格式定义 PDF 内容,支持表格、图表、目录等。

安装

npm install pdfmake

示例代码

import pdfMake from "pdfmake/build/pdfmake";
import pdfFonts from "pdfmake/build/vfs_fonts";

pdfMake.vfs = pdfFonts.pdfMake.vfs;

export default {
methods: {
generatePDF() {
const docDefinition = {
content: [
{ text: "目录", style: "header", toc: { title: { text: "目录", style: "subheader" } } },
{ text: "固定图片", style: "subheader" },
{ image: "data:image/png;base64,...", width: 400 },
{ text: "动态数据", style: "subheader" },
{
table: {
body: [
["列 1", "列 2", "列 3"],
["数据 1", "数据 2", "数据 3"],
],
},
},
{ text: "图表", style: "subheader" },
{ text: "此处插入图表..." },
],
styles: {
header: { fontSize: 22, bold: true },
subheader: { fontSize: 18, bold: true },
},
};

pdfMake.createPdf(docDefinition).download("document.pdf");
},
},
};

3. puppeteer (服务器端解决方案)

如果需要更精确的排版和打印效果,推荐使用 puppeteer 在服务器端生成 PDF 。这种方式可以直接将整个 HTML 页面渲染为 PDF 。

安装

npm install puppeteer

示例代码

const puppeteer = require("puppeteer");

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

await page.goto("http://localhost:8080", { waitUntil: "networkidle2" });
await page.pdf({
path: "output.pdf",
format: "A4",
printBackground: true,
});

await browser.close();
}

generatePDF();

选择方案

1. 前端生成( html2canvas + jspdf ):适合小型、动态页面。
2. 动态内容为主( pdfmake ):适合需要大量动态生成内容(如表格、目录)。
3. 高精度排版( puppeteer ):适合对 PDF 排版有较高要求的场景。
3 天前
回复了 gdw1986 创建的主题 macOS 大家现在都用什么输入法?
macos 和 ios 都是微信输入法+小鹤双拼,感觉还行。

喜欢表情包自动联想,有时候会出现自动纠错纠到我不想要的地方
4 天前
回复了 YoungKing6 创建的主题 Apple 大家 iPhone 的听歌软件是什么
everplay, 下好歌放本地离线听
@mashiromelody icloud 太贵了
@maizero 谢谢,非常有用的建议
1. 听起来存储盘建议买 10T 企业盘,这个我去好好搜搜,暂时放弃自己原来关于存储盘的方案,这方面的预算暂时是 2000 元,暂时没有特别多的数据需要备份,可以考虑直接买个现有成熟的 NAS + 企业盘。
2. 文件系统会换成 ext4 ,这个非常关键
3. 存照片和视频的移动硬盘打算换成致态 TiPlus7100 2T 的,TLC 颗粒,有 1200TBW ,其实也考虑过 英睿达 T500 Pro ,不过买致态可以支持国产。
4. 选阿卡西斯的盒子是因为他不需要额外供电就可以直接连接 iPhone ,看了一下 WERO 产品更硬啊,感谢推荐!
5. 打算从 T7 shield 换成 致态灵·先锋版 2T 的了,小巧一点,只要 940 ,4T 的 WD mypassport SSD 超出预算了,放入购物车,后面有钱了再买

最后再次感谢推荐!👍
我现在就是这么弄的,不过没用共享相簿,不是原图不舒服
@Donaldo 请问什么云服务合适?百度云、阿里云还是什么?
@234ygg 方便以后组 raid ,数据更安全呀
14 天前
回复了 8eacekeep 创建的主题 macOS mac 有什么好用的邮箱软件吗
我的自带的够了
@murmur 比较纠结买哪个品牌的 NAS ,而且还要考虑等不等小米的 NAS ,所以可以先把硬盘买了,后面再说。我现在买好硬盘,到时候能插到 NAS 里面吗?
23 天前
回复了 ztfot 创建的主题 程序员 MacOS 下 Chrome 自动短信填充
之前用过 2FHey ,类似的功能,挺好用的
支持作者!支持好的产品!提高中奖率!
重新贴图
https://i.imgur.com/UolE3xu.png
支持作者!支持好的产品!提高中奖率!
![]( https://pic.imgdb.cn/item/6720ad78d29ded1a8c23ae86.png)
可以可以,自媒体慢慢经营还是有用的
@gingigo 这都血淋淋的新闻的,希望 op 仔细看看吧
30 天前
回复了 Sabrina9 创建的主题 Apple 说说你最喜欢的 iPhone 自带 App
我说一个人少的 safari
挺好的,不过微信输入法就能做到,我一直在用,聊天时自动出颜文字挺方便
35 天前
回复了 RamenCurator 创建的主题 买买买 问今年各位最满意的购物
@RamenCurator #10 座套能给我推荐一个吗?最近一直在看,之前买过的质量不行,才一个月就破了,下雨又湿屁股 https://i.imgur.com/n119Wvk.png
37 天前
回复了 JeffyChen 创建的主题 Apple safari 作为主浏览器体验如何?
拿 safari 当主力三年了,之前 chrome 上装了一堆插件用不了也没什么大不了,safari 好处在于多端同步( chrome 也能做到)、UI 比 chrome 更简洁 https://i.imgur.com/L62ZP7V.png
1  2  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3012 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 31ms · UTC 14:16 · PVG 22:16 · LAX 06:16 · JFK 09:16
Developed with CodeLauncher
♥ Do have faith in what you're doing.