mirror of
https://github.com/wanglin2/mind-map.git
synced 2026-02-21 18:37:43 +08:00
100 lines
2.7 KiB
JavaScript
100 lines
2.7 KiB
JavaScript
import JsPDF from 'jspdf'
|
||
|
||
// 导出PDF插件,需要通过Export插件使用
|
||
class ExportPDF {
|
||
// 构造函数
|
||
constructor(opt) {
|
||
this.mindMap = opt.mindMap
|
||
}
|
||
|
||
// 导出为pdf
|
||
pdf(name, img, useMultiPageExport = false) {
|
||
if (useMultiPageExport) {
|
||
this.multiPageExport(name, img)
|
||
} else {
|
||
this.onePageExport(name, img)
|
||
}
|
||
}
|
||
|
||
// 单页导出
|
||
onePageExport(name, img) {
|
||
let pdf = new JsPDF('', 'pt', 'a4')
|
||
let a4Width = 595
|
||
let a4Height = 841
|
||
let a4Ratio = a4Width / a4Height
|
||
let image = new Image()
|
||
image.onload = () => {
|
||
let imageWidth = image.width
|
||
let imageHeight = image.height
|
||
let imageRatio = imageWidth / imageHeight
|
||
let w, h
|
||
if (imageWidth <= a4Width && imageHeight <= a4Height) {
|
||
// 使用图片原始宽高
|
||
w = imageWidth
|
||
h = imageHeight
|
||
} else if (a4Ratio > imageRatio) {
|
||
// 以a4Height为高度,缩放图片宽度
|
||
w = imageRatio * a4Height
|
||
h = a4Height
|
||
} else {
|
||
// 以a4Width为宽度,缩放图片高度
|
||
w = a4Width
|
||
h = a4Width / imageRatio
|
||
}
|
||
pdf.addImage(img, 'PNG', (a4Width - w) / 2, (a4Height - h) / 2, w, h)
|
||
pdf.save(name)
|
||
}
|
||
image.src = img
|
||
}
|
||
|
||
// 多页导出
|
||
multiPageExport(name, img) {
|
||
let image = new Image()
|
||
const a4Width = 592.28
|
||
const a4Height = 841.89
|
||
image.onload = () => {
|
||
let imageWidth = image.width
|
||
let imageHeight = image.height
|
||
// 一页pdf显示高度
|
||
let pageHeight = (imageWidth / a4Width) * a4Height
|
||
// 未生成pdf的高度
|
||
let leftHeight = imageHeight
|
||
// 偏移
|
||
let position = 0
|
||
// a4纸的尺寸[595.28,841.89],图片在pdf中图片的宽高
|
||
let imgWidth = a4Width
|
||
let imgHeight = (a4Width / imageWidth) * imageHeight
|
||
let pdf = new JsPDF('', 'pt', 'a4')
|
||
// 有两个高度需要区分,一个是图片的实际高度,和生成pdf的页面高度(841.89)
|
||
// 当内容未超过pdf一页显示的范围,无需分页
|
||
if (leftHeight < pageHeight) {
|
||
pdf.addImage(
|
||
img,
|
||
'PNG',
|
||
(a4Width - imgWidth) / 2,
|
||
(a4Height - imgHeight) / 2,
|
||
imgWidth,
|
||
imgHeight
|
||
)
|
||
} else {
|
||
// 分页
|
||
while (leftHeight > 0) {
|
||
pdf.addImage(img, 'PNG', 0, position, imgWidth, imgHeight)
|
||
leftHeight -= pageHeight
|
||
position -= a4Height
|
||
// 避免添加空白页
|
||
if (leftHeight > 0) {
|
||
pdf.addPage()
|
||
}
|
||
}
|
||
}
|
||
pdf.save(name)
|
||
}
|
||
image.src = img
|
||
}
|
||
}
|
||
|
||
ExportPDF.instanceName = 'doExportPDF'
|
||
|
||
export default ExportPDF
|