修改导出,使用FileReader代替URL.createObjectURL转换blob数据

This commit is contained in:
wanglin2 2023-04-25 17:13:39 +08:00
parent b2ca5d0fba
commit ee59b8002a
3 changed files with 52 additions and 35 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "simple-mind-map", "name": "simple-mind-map",
"version": "0.5.8", "version": "0.5.9",
"description": "一个简单的web在线思维导图", "description": "一个简单的web在线思维导图",
"authors": [ "authors": [
{ {

View File

@ -1,4 +1,4 @@
import { imgToDataUrl, downloadFile } from './utils' import { imgToDataUrl, downloadFile, readBlob } from './utils'
import JsPDF from 'jspdf' import JsPDF from 'jspdf'
import { SVG } from '@svgdotjs/svg.js' import { SVG } from '@svgdotjs/svg.js'
import drawBackgroundImageToCanvas from './utils/simulateCSSBackgroundInCanvas' import drawBackgroundImageToCanvas from './utils/simulateCSSBackgroundInCanvas'
@ -127,6 +127,28 @@ class Export {
}) })
} }
// 在svg上绘制思维导图背景
drawBackgroundToSvg(svg) {
return new Promise(async resolve => {
let {
backgroundColor = '#fff',
backgroundImage,
backgroundRepeat = 'repeat'
} = this.mindMap.themeConfig
// 背景颜色
svg.css('background-color', backgroundColor)
// 背景图片
if (backgroundImage && backgroundImage !== 'none') {
let imgDataUrl = await imgToDataUrl(backgroundImage)
svg.css('background-image', `url(${imgDataUrl})`)
svg.css('background-repeat', backgroundRepeat)
resolve()
} else {
resolve()
}
})
}
// 导出为png // 导出为png
/** /**
* 方法1.把svg的图片都转化成data:url格式再转换 * 方法1.把svg的图片都转化成data:url格式再转换
@ -145,11 +167,10 @@ class Export {
type: 'image/svg+xml' type: 'image/svg+xml'
}) })
// 转换成data:url数据 // 转换成data:url数据
let svgUrl = URL.createObjectURL(blob) let svgUrl = await readBlob(blob)
// 绘制到canvas上 // 绘制到canvas上
let imgDataUrl = await this.svgToPng(svgUrl, transparent) let res = await this.svgToPng(svgUrl, transparent)
URL.revokeObjectURL(svgUrl) return res
return imgDataUrl
} }
// 导出为pdf // 导出为pdf
@ -184,28 +205,6 @@ class Export {
image.src = img image.src = img
} }
// 在svg上绘制思维导图背景
drawBackgroundToSvg(svg) {
return new Promise(async resolve => {
let {
backgroundColor = '#fff',
backgroundImage,
backgroundRepeat = 'repeat'
} = this.mindMap.themeConfig
// 背景颜色
svg.css('background-color', backgroundColor)
// 背景图片
if (backgroundImage && backgroundImage !== 'none') {
let imgDataUrl = await imgToDataUrl(backgroundImage)
svg.css('background-image', `url(${imgDataUrl})`)
svg.css('background-repeat', backgroundRepeat)
resolve()
} else {
resolve()
}
})
}
// 导出为svg // 导出为svg
// plusCssText附加的css样式如果svg中存在dom节点想要设置一些针对节点的样式可以通过这个参数传入 // plusCssText附加的css样式如果svg中存在dom节点想要设置一些针对节点的样式可以通过这个参数传入
async svg(name, plusCssText) { async svg(name, plusCssText) {
@ -226,28 +225,32 @@ class Export {
let blob = new Blob([str], { let blob = new Blob([str], {
type: 'image/svg+xml' type: 'image/svg+xml'
}) })
return URL.createObjectURL(blob) let res = await readBlob(blob)
return res
} }
// 导出为json // 导出为json
json(name, withConfig = true) { async json(name, withConfig = true) {
let data = this.mindMap.getData(withConfig) let data = this.mindMap.getData(withConfig)
let str = JSON.stringify(data) let str = JSON.stringify(data)
let blob = new Blob([str]) let blob = new Blob([str])
return URL.createObjectURL(blob) let res = await readBlob(blob)
return res
} }
// 专有文件其实就是json文件 // 专有文件其实就是json文件
smm(name, withConfig) { async smm(name, withConfig) {
return this.json(name, withConfig) let res = await this.json(name, withConfig)
return res
} }
// markdown文件 // markdown文件
md() { async md() {
let data = this.mindMap.getData() let data = this.mindMap.getData()
let content = transformToMarkdown(data) let content = transformToMarkdown(data)
let blob = new Blob([content]) let blob = new Blob([content])
return URL.createObjectURL(blob) let res = await readBlob(blob)
return res
} }
} }

View File

@ -343,3 +343,17 @@ export const getTextFromHtml = (html) => {
getTextFromHtmlEl.innerHTML = html getTextFromHtmlEl.innerHTML = html
return getTextFromHtmlEl.textContent return getTextFromHtmlEl.textContent
} }
// 将blob转成data:url
export const readBlob = (blob) => {
return new Promise((resolve, reject) => {
let reader = new FileReader()
reader.onload = (evt) => {
resolve(evt.target.result)
}
reader.onerror = (err) => {
reject(err)
}
reader.readAsDataURL(blob)
})
}