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,