From 24b00fbb2025f1ad77f362def4f816ac63b4704a Mon Sep 17 00:00:00 2001 From: pipipi-pikachu Date: Sat, 9 Apr 2022 16:53:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useExport.ts | 33 ++++ .../Editor/EditorHeader/ExportImgDialog.vue | 169 ++++++++++++++++++ src/views/Editor/EditorHeader/index.vue | 16 ++ 3 files changed, 218 insertions(+) create mode 100644 src/views/Editor/EditorHeader/ExportImgDialog.vue diff --git a/src/hooks/useExport.ts b/src/hooks/useExport.ts index 1190b2f8..7aa55119 100644 --- a/src/hooks/useExport.ts +++ b/src/hooks/useExport.ts @@ -4,6 +4,7 @@ import { trim } from 'lodash' import { saveAs } from 'file-saver' import pptxgen from 'pptxgenjs' import tinycolor from 'tinycolor2' +import { toPng, toJpeg } from 'html-to-image' import { useSlidesStore } from '@/store' import { getElementRange, getLineElementPath, getTableSubThemeColor } from '@/utils/element' import { AST, toAST } from '@/utils/htmlParser' @@ -11,10 +12,41 @@ import { SvgPoints, toPoints } from '@/utils/svgPathParser' import { svg2Base64 } from '@/utils/svg2Base64' import { message } from 'ant-design-vue' +interface ExportImageConfig { + quality: number; + width: number; + fontEmbedCSS?: string; +} + export default () => { const { slides } = storeToRefs(useSlidesStore()) const exporting = ref(false) + + // 导出图片 + const exportImage = (domRef: HTMLElement, format: string, quality: number, ignoreWebfont = true) => { + exporting.value = true + const toImage = format === 'png' ? toPng : toJpeg + + setTimeout(() => { + if (!domRef) return + + const config: ExportImageConfig = { + quality, + width: 1600, + } + + if (ignoreWebfont) config.fontEmbedCSS = '' + + toImage(domRef, config).then(dataUrl => { + exporting.value = false + saveAs(dataUrl, `pptist_slides.${format}`) + }).catch(() => { + exporting.value = false + message.error('导出图片失败') + }) + }, 200) + } // 导出JSON文件 const exportJSON = () => { @@ -576,6 +608,7 @@ export default () => { return { exporting, + exportImage, exportJSON, exportPPTX, } diff --git a/src/views/Editor/EditorHeader/ExportImgDialog.vue b/src/views/Editor/EditorHeader/ExportImgDialog.vue new file mode 100644 index 00000000..e885f699 --- /dev/null +++ b/src/views/Editor/EditorHeader/ExportImgDialog.vue @@ -0,0 +1,169 @@ + + + + + \ No newline at end of file diff --git a/src/views/Editor/EditorHeader/index.vue b/src/views/Editor/EditorHeader/index.vue index e9491db4..607c8f00 100644 --- a/src/views/Editor/EditorHeader/index.vue +++ b/src/views/Editor/EditorHeader/index.vue @@ -7,6 +7,7 @@ 导出 JSON 导出 PPTX + 导出图片 @@ -63,6 +64,17 @@ + + + + @@ -77,11 +89,13 @@ import useHistorySnapshot from '@/hooks/useHistorySnapshot' import useExport from '@/hooks/useExport' import HotkeyDoc from './HotkeyDoc.vue' +import ExportImgDialog from './ExportImgDialog.vue' export default defineComponent({ name: 'editor-header', components: { HotkeyDoc, + ExportImgDialog, }, setup() { const mainStore = useMainStore() @@ -97,6 +111,7 @@ export default defineComponent({ } const hotkeyDrawerVisible = ref(false) + const exportImgDialogVisible = ref(false) const goIssues = () => { window.open('https://github.com/pipipi-pikachu/PPTist/issues') @@ -107,6 +122,7 @@ export default defineComponent({ undo, showGridLines, hotkeyDrawerVisible, + exportImgDialogVisible, exporting, enterScreening, enterScreeningFromStart,