From 071e7a796e7556dad08f0f299df6279d5c38abd7 Mon Sep 17 00:00:00 2001
From: liyulin <501351981@qq.com>
Date: Sat, 8 Jul 2023 18:15:48 +0800
Subject: [PATCH] =?UTF-8?q?add=EF=BC=9A=E5=A2=9E=E5=8A=A0download=E6=96=B9?=
=?UTF-8?q?=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
core/packages/js-docx/index.d.ts | 9 ++--
core/packages/js-docx/package.json | 2 +-
core/packages/js-docx/src/main.js | 10 +++-
core/packages/js-excel/index.d.ts | 9 ++--
core/packages/js-excel/package.json | 2 +-
core/packages/js-excel/src/main.js | 6 +++
core/packages/js-pdf/index.d.ts | 9 ++--
core/packages/js-pdf/package.json | 2 +-
core/packages/js-pdf/src/main.js | 7 ++-
core/packages/vue-docx/package.json | 2 +-
core/packages/vue-docx/src/docx.js | 15 +++++-
core/packages/vue-docx/src/main.vue | 14 ++++--
core/packages/vue-excel/package.json | 2 +-
core/packages/vue-excel/src/main.vue | 9 +++-
core/packages/vue-pdf/package.json | 2 +-
core/packages/vue-pdf/src/main.vue | 13 ++++--
core/src/components/DocxDemo.vue | 8 ++++
core/src/components/ExcelDemo.vue | 7 +++
core/src/components/JsDocxDemo.vue | 1 +
core/src/components/JsExcelDemo.vue | 1 +
core/src/components/JsPdfDemo.vue | 1 +
core/src/components/PdfDemo.vue | 7 +++
core/utils/url.js | 46 +++++++++++++------
docs/guide/js-preview.md | 8 ++++
examples/docs/404.html | 2 +-
...4fa.js => guide_js-preview.md.873b3161.js} | 2 +-
...s => guide_js-preview.md.873b3161.lean.js} | 2 +-
examples/docs/config/event.html | 2 +-
examples/docs/config/index.html | 2 +-
examples/docs/guide/contact.html | 2 +-
examples/docs/guide/faq.html | 2 +-
examples/docs/guide/index.html | 2 +-
examples/docs/guide/js-preview.html | 6 +--
examples/docs/guide/preview-docx.html | 2 +-
examples/docs/guide/preview-pdf.html | 2 +-
examples/docs/guide/preview-xlsx.html | 2 +-
examples/docs/hashmap.json | 2 +-
examples/docs/index.html | 2 +-
38 files changed, 165 insertions(+), 59 deletions(-)
rename examples/docs/assets/{guide_js-preview.md.c54034fa.js => guide_js-preview.md.873b3161.js} (94%)
rename examples/docs/assets/{guide_js-preview.md.c54034fa.lean.js => guide_js-preview.md.873b3161.lean.js} (83%)
diff --git a/core/packages/js-docx/index.d.ts b/core/packages/js-docx/index.d.ts
index 87196be..0dbb85e 100644
--- a/core/packages/js-docx/index.d.ts
+++ b/core/packages/js-docx/index.d.ts
@@ -19,10 +19,11 @@ export interface Options {
}
export interface JsDocxPreview {
- preview: (src: string | ArrayBuffer | Blob) => Promise,
- setOptions: (options: Options) => void,
- setRequestOptions: (requestOptions?: any) => void,
- destroy: ()=> void,
+ preview: (src: string | ArrayBuffer | Blob) => Promise;
+ download: (fileName?: string) => void;
+ setOptions: (options: Options) => void;
+ setRequestOptions: (requestOptions?: any) => void;
+ destroy: ()=> void;
}
declare const jsPreviewDocx: {
init: (container: HTMLElement, options?: Options, requestOptions?: any) => JsDocxPreview;
diff --git a/core/packages/js-docx/package.json b/core/packages/js-docx/package.json
index e8179a0..26ebb21 100644
--- a/core/packages/js-docx/package.json
+++ b/core/packages/js-docx/package.json
@@ -1,7 +1,7 @@
{
"name": "@js-preview/docx",
"type" :"module",
- "version": "1.0.3",
+ "version": "1.2.0",
"description": "",
"main": "lib/index.js",
"files": [
diff --git a/core/packages/js-docx/src/main.js b/core/packages/js-docx/src/main.js
index 7f37d90..62808db 100644
--- a/core/packages/js-docx/src/main.js
+++ b/core/packages/js-docx/src/main.js
@@ -1,10 +1,12 @@
import docx from '../../vue-docx/src/docx';
+import {download as downloadFile} from '../../../utils/url.js';
class JsDocxPreview {
container = null;
wrapper = null;
wrapperMain = null;
options = {};
requestOptions = {};
+ fileData = null;
constructor(container, options={}, requestOptions={}) {
this.container = container;
@@ -29,8 +31,9 @@ class JsDocxPreview {
}
preview(src){
return new Promise((resolve, reject) => {
- docx.getData(src, this.requestOptions).then(res =>{
- docx.render(res, this.wrapperMain, this.options).then(() => {
+ docx.getData(src, this.requestOptions).then(async res =>{
+ this.fileData = await docx.getBlob(res);
+ docx.render(this.fileData, this.wrapperMain, this.options).then(() => {
resolve();
}).catch(e => {
docx.render('', this.wrapperMain, this.options);
@@ -42,6 +45,9 @@ class JsDocxPreview {
});
});
}
+ download(fileName){
+ downloadFile(fileName || `js-preview-docx-${new Date().getTime()}.docx`,this.fileData);
+ }
destroy(){
this.container.removeChild(this.wrapper);
this.container = null;
diff --git a/core/packages/js-excel/index.d.ts b/core/packages/js-excel/index.d.ts
index bc20efe..4b21631 100644
--- a/core/packages/js-excel/index.d.ts
+++ b/core/packages/js-excel/index.d.ts
@@ -4,10 +4,11 @@ export interface Options {
}
export interface JsExcelPreview {
- preview: (src: string | ArrayBuffer | Blob) => Promise,
- setOptions: (options: Options) => void,
- setRequestOptions: (requestOptions?: any) => void,
- destroy: ()=> void,
+ preview: (src: string | ArrayBuffer | Blob) => Promise;
+ download: (fileName?: string) => void;
+ setOptions: (options: Options) => void;
+ setRequestOptions: (requestOptions?: any) => void;
+ destroy: ()=> void;
}
declare const jsPreviewExcel: {
init: (container: HTMLElement, options?: Options, requestOptions?: any) => JsExcelPreview;
diff --git a/core/packages/js-excel/package.json b/core/packages/js-excel/package.json
index 7c8c23c..9fd17f4 100644
--- a/core/packages/js-excel/package.json
+++ b/core/packages/js-excel/package.json
@@ -1,7 +1,7 @@
{
"name": "@js-preview/excel",
"type" :"module",
- "version": "1.0.3",
+ "version": "1.2.0",
"description": "",
"main": "lib/index.js",
"files": [
diff --git a/core/packages/js-excel/src/main.js b/core/packages/js-excel/src/main.js
index 4087bc3..0b51396 100644
--- a/core/packages/js-excel/src/main.js
+++ b/core/packages/js-excel/src/main.js
@@ -3,6 +3,7 @@ import {getData, readExcelData, transferExcelToSpreadSheet} from '../../vue-exce
import {renderImage, clearCache} from '../../vue-excel/src/media';
import {readOnlyInput} from '../../vue-excel/src/hack';
import {debounce} from 'lodash';
+import {download as downloadFile} from "../../../utils/url.js";
class JsExcelPreview {
container = null;
wrapper = null;
@@ -18,6 +19,7 @@ class JsExcelPreview {
xs = null;
offset = null;
observer = null;
+ fileData = null;
constructor(container, options={}, requestOptions={}) {
this.container = container;
@@ -86,6 +88,7 @@ class JsExcelPreview {
this.ctx = canvas.getContext('2d');
}
renderExcel(buffer){
+ this.fileData = buffer;
return readExcelData(buffer).then(workbook => {
if (!workbook._worksheets || workbook._worksheets.length === 0) {
throw new Error('未获取到数据,可能文件格式不正确或文件已损坏');
@@ -133,6 +136,9 @@ class JsExcelPreview {
});
}));
}
+ download(fileName){
+ downloadFile(fileName || `js-preview-excel-${new Date().getTime()}.xlsx`,this.fileData);
+ }
destroy(){
this.observer.disconnect();
this.container.removeChild(this.wrapper);
diff --git a/core/packages/js-pdf/index.d.ts b/core/packages/js-pdf/index.d.ts
index 56a31fe..216a8e7 100644
--- a/core/packages/js-pdf/index.d.ts
+++ b/core/packages/js-pdf/index.d.ts
@@ -14,10 +14,11 @@ export interface Options {
}
export interface JsPdfPreview {
- preview: (src: string | ArrayBuffer | Blob) => Promise,
- setOptions: (options: Options) => void,
- setRequestOptions: (requestOptions?: any) => void,
- destroy: ()=> void,
+ preview: (src: string | ArrayBuffer | Blob) => Promise;
+ download: (fileName?: string) => void;
+ setOptions: (options: Options) => void;
+ setRequestOptions: (requestOptions?: any) => void;
+ destroy: ()=> void;
}
declare const jsPreviewPdf: {
init: (container: HTMLElement, options?: Options, requestOptions?: any) => JsPdfPreview;
diff --git a/core/packages/js-pdf/package.json b/core/packages/js-pdf/package.json
index fcba9d0..021ebef 100644
--- a/core/packages/js-pdf/package.json
+++ b/core/packages/js-pdf/package.json
@@ -1,7 +1,7 @@
{
"name": "@js-preview/pdf",
"type" :"module",
- "version": "1.0.3",
+ "version": "1.2.0",
"description": "",
"main": "lib/index.js",
"files": [
diff --git a/core/packages/js-pdf/src/main.js b/core/packages/js-pdf/src/main.js
index 5886e4a..fa07d34 100644
--- a/core/packages/js-pdf/src/main.js
+++ b/core/packages/js-pdf/src/main.js
@@ -1,6 +1,6 @@
import {worker} from '../../vue-pdf/src/worker';
import {pdfjsLib} from '../../vue-pdf/src/pdf';
-import {getUrl, loadScript} from '../../../utils/url';
+import {download as downloadFile, getUrl, loadScript} from '../../../utils/url';
import omit from 'lodash/omit';
const pdfJsLibSrc = `data:text/javascript;base64,${pdfjsLib}`;
@@ -145,6 +145,11 @@ class JsPdfPreview{
});
}));
}
+ download(fileName){
+ this.pdfDocument && this.pdfDocument._transport && this.pdfDocument._transport.getData().then(fileData=>{
+ downloadFile(fileName || `js-preview-pdf-${new Date().getTime()}.pdf`,fileData.buffer);
+ });
+ }
destroy(){
this.container.removeChild(this.wrapper);
this.container = null;
diff --git a/core/packages/vue-docx/package.json b/core/packages/vue-docx/package.json
index 02974f5..0f511a0 100644
--- a/core/packages/vue-docx/package.json
+++ b/core/packages/vue-docx/package.json
@@ -1,6 +1,6 @@
{
"name": "@vue-office/docx",
- "version": "1.1.3",
+ "version": "1.2.0",
"description": "",
"main": "lib/index.js",
"files": [
diff --git a/core/packages/vue-docx/src/docx.js b/core/packages/vue-docx/src/docx.js
index df77a84..081e2d2 100644
--- a/core/packages/vue-docx/src/docx.js
+++ b/core/packages/vue-docx/src/docx.js
@@ -21,6 +21,18 @@ function fetchDocx(src, options) {
});
}
+async function getBlob(data){
+ let blob;
+ if (data instanceof Blob) {
+ blob = data;
+ } else if (data instanceof Response) {
+ blob = await data.blob();
+ } else if (data instanceof ArrayBuffer) {
+ blob = new Blob([data]);
+ }
+ return blob
+}
+
function render(data, container, options = {}) {
if (!data) {
container.innerHTML = '';
@@ -39,5 +51,6 @@ function render(data, container, options = {}) {
export default {
getData,
- render
+ render,
+ getBlob
};
\ No newline at end of file
diff --git a/core/packages/vue-docx/src/main.vue b/core/packages/vue-docx/src/main.vue
index 9c8fd73..19dcf1d 100644
--- a/core/packages/vue-docx/src/main.vue
+++ b/core/packages/vue-docx/src/main.vue
@@ -1,6 +1,7 @@
@@ -23,6 +30,7 @@ const defaultSrc = location.origin +
>
{
+// console.log( docxRef.value.download());
+// }, 2000);
@@ -24,6 +30,7 @@ const defaultSrc = location.origin +
>
{
myDocxPreview.preview('/vue-office/examples/dist/static/test-files/test.docx').then(_=>{
console.log('docx preview done');
setTimeout(()=>{
+ // myDocxPreview.download();
myDocxPreview.preview('/vue-office/examples/dist/static/test-files/test2.docx');
}, 3000);
}).catch(err=>{
diff --git a/core/src/components/JsExcelDemo.vue b/core/src/components/JsExcelDemo.vue
index 1087ef9..dad4ec7 100644
--- a/core/src/components/JsExcelDemo.vue
+++ b/core/src/components/JsExcelDemo.vue
@@ -12,6 +12,7 @@ const dom = ref(null);
onMounted(() => {
window.myExcelPreview = jsExcel.init(dom.value);
window.myExcelPreview.preview('/vue-office/examples/dist/static/test-files/test.xlsx').then(_=>{
+ // window.myExcelPreview.download();
console.log('excel preview done', window.myExcelPreview);
}).catch(err=>{
console.log('err',err);
diff --git a/core/src/components/JsPdfDemo.vue b/core/src/components/JsPdfDemo.vue
index b1aeac0..37d99cc 100644
--- a/core/src/components/JsPdfDemo.vue
+++ b/core/src/components/JsPdfDemo.vue
@@ -12,6 +12,7 @@ const dom = ref(null);
onMounted(() => {
window.myPdfPreview = jsPdf.init(dom.value);
window.myPdfPreview.preview('/vue-office/examples/dist/static/test-files/test.pdf').then(_=>{
+ // window.myPdfPreview.download();
console.log('excel preview done', window.myPdfPreview);
}).catch(err=>{
console.log('err',err);
diff --git a/core/src/components/PdfDemo.vue b/core/src/components/PdfDemo.vue
index 98eda78..81ee9b4 100644
--- a/core/src/components/PdfDemo.vue
+++ b/core/src/components/PdfDemo.vue
@@ -2,6 +2,7 @@
import VueOfficePdf from '../../packages/vue-pdf/index';
import PreviewWrapper from '../common/PreviewWrapper.vue';
import useLoading from '../hooks/useLoading.js';
+import {ref} from "vue";
function onRendered(){
useLoading.hideLoading();
}
@@ -12,6 +13,11 @@ function onError(e){
const defaultSrc = location.origin +
(location.pathname + '/').replace('//', '/')
+ 'static/test-files/test.pdf';
+const docxRef = ref();
+
+// setTimeout(()=>{
+// console.log( docxRef.value.download());
+// }, 2000);
@@ -22,6 +28,7 @@ const defaultSrc = location.origin +
>
{
- let script = document.createElement('script')
- script.src = src
+ let script = document.createElement('script');
+ script.src = src;
script.onload = function (){
- resolve()
- }
+ resolve();
+ };
script.onerror = function (){
- reject()
- }
- document.body.append(script)
- }))
+ reject();
+ };
+ document.body.append(script);
+ }));
+}
+
+export async function download(filename, data){
+ if(!data){
+ return;
+ }
+ if (data instanceof ArrayBuffer) {
+ data = new Blob([data]);
+ }
+ downloadFile(filename, URL.createObjectURL(data));
+}
+
+export function downloadFile(filename, href){
+ let eleLink = document.createElement('a');
+ eleLink.download = filename;
+ eleLink.style.display = 'none';
+ eleLink.href = href;
+ document.body.appendChild(eleLink);
+ eleLink.click();
+ document.body.removeChild(eleLink);
}
\ No newline at end of file
diff --git a/docs/guide/js-preview.md b/docs/guide/js-preview.md
index e72e7ce..d55648c 100644
--- a/docs/guide/js-preview.md
+++ b/docs/guide/js-preview.md
@@ -156,6 +156,14 @@ preview: (src: string | ArrayBuffer | Blob) => Promise
url格式适合有文件静态地址的情况,ArrayBuffer格式适合文件上传前的预览。
+### download方法
+
+调用download进行文件下载,参数名为下载的文件名称,可不传。
+
+```ts
+ download: (fileName?: string) => void;
+```
+
### destroy方法
卸载方法,可以在组件销毁前调用预览对象的卸载方法,避免长期使用造成内存泄露。
diff --git a/examples/docs/404.html b/examples/docs/404.html
index ad09843..f9e87de 100644
--- a/examples/docs/404.html
+++ b/examples/docs/404.html
@@ -12,7 +12,7 @@
Skip to content 404
PAGE NOT FOUND
But if you don't change your direction, and if you keep looking, you may end up where you are heading.
-
diff --git a/examples/docs/assets/guide_js-preview.md.c54034fa.js b/examples/docs/assets/guide_js-preview.md.873b3161.js
similarity index 94%
rename from examples/docs/assets/guide_js-preview.md.c54034fa.js
rename to examples/docs/assets/guide_js-preview.md.873b3161.js
index 630b2ee..1957ce6 100644
--- a/examples/docs/assets/guide_js-preview.md.c54034fa.js
+++ b/examples/docs/assets/guide_js-preview.md.873b3161.js
@@ -61,4 +61,4 @@ import{_ as s,c as a,o as n,O as l}from"./chunks/framework.935eb42c.js";const A=
cMapPacked ?: boolean ;
CMapReaderFactory ?: Object ;
useSystemFonts ?: boolean ;
-} preview方法 调用preview方法进行文件的预览。
preview方法接收参数支持三种: 文件url地址、文件ArrayBuffer格式数据、文件blob格式。
ts preview : ( src : string | ArrayBuffer | Blob ) => Promise < any >
url格式适合有文件静态地址的情况,ArrayBuffer格式适合文件上传前的预览。
destroy方法 卸载方法,可以在组件销毁前调用预览对象的卸载方法,避免长期使用造成内存泄露。
如果该项目帮助了您,还请您不吝点赞 `,40),e=[o];function t(c,r,y,D,F,C){return n(),a("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
+} preview方法 调用preview方法进行文件的预览。
preview方法接收参数支持三种: 文件url地址、文件ArrayBuffer格式数据、文件blob格式。
ts preview : ( src : string | ArrayBuffer | Blob ) => Promise < any >
url格式适合有文件静态地址的情况,ArrayBuffer格式适合文件上传前的预览。
download方法 调用download进行文件下载,参数名为下载的文件名称,可不传。
ts download : ( fileName ?: string ) => void;
destroy方法 卸载方法,可以在组件销毁前调用预览对象的卸载方法,避免长期使用造成内存泄露。
如果该项目帮助了您,还请您不吝点赞 `,43),e=[o];function t(c,r,y,D,F,C){return n(),a("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
diff --git a/examples/docs/assets/guide_js-preview.md.c54034fa.lean.js b/examples/docs/assets/guide_js-preview.md.873b3161.lean.js
similarity index 83%
rename from examples/docs/assets/guide_js-preview.md.c54034fa.lean.js
rename to examples/docs/assets/guide_js-preview.md.873b3161.lean.js
index b28f9fa..029089f 100644
--- a/examples/docs/assets/guide_js-preview.md.c54034fa.lean.js
+++ b/examples/docs/assets/guide_js-preview.md.873b3161.lean.js
@@ -1 +1 @@
-import{_ as s,c as a,o as n,O as l}from"./chunks/framework.935eb42c.js";const A=JSON.parse('{"title":"非Vue框架文件预览","description":"","frontmatter":{},"headers":[],"relativePath":"guide/js-preview.md"}'),p={name:"guide/js-preview.md"},o=l("",40),e=[o];function t(c,r,y,D,F,C){return n(),a("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
+import{_ as s,c as a,o as n,O as l}from"./chunks/framework.935eb42c.js";const A=JSON.parse('{"title":"非Vue框架文件预览","description":"","frontmatter":{},"headers":[],"relativePath":"guide/js-preview.md"}'),p={name:"guide/js-preview.md"},o=l("",43),e=[o];function t(c,r,y,D,F,C){return n(),a("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
diff --git a/examples/docs/config/event.html b/examples/docs/config/event.html
index aca22e5..53446c8 100644
--- a/examples/docs/config/event.html
+++ b/examples/docs/config/event.html
@@ -15,7 +15,7 @@
-
diff --git a/examples/docs/config/index.html b/examples/docs/config/index.html
index 5cce1a5..06700fc 100644
--- a/examples/docs/config/index.html
+++ b/examples/docs/config/index.html
@@ -36,7 +36,7 @@
password : '' , //string, 加密pdf的密码
//更多配置参见 https://mozilla.github.io/pdf.js/api/draft/module-pdfjsLib.html
} staticFileUrl [pdf特有属性] pdf渲染时可能会请求一些bcmap文件,这些文件默认从 https://unpkg.com/pdfjs-dist@3.1.81/ 加载,但是可能存在网络不通问题,如果遇到这种问题,可以将这些文件放到自己静态目录,然后修改该属性,告诉组件去这里请求bcmap文件。
涉及的文件存放在当前github项目中examples/public/cmaps目录下,可将cmaps目录复制到你的静态服务目录下,然后修改staticFileUrl为cmaps文件夹对应的父地址,必须已http或https开头,如 http://yourdomain/static/
-
-
@@ -77,8 +77,8 @@
cMapPacked ?: boolean ;
CMapReaderFactory ?: Object ;
useSystemFonts ?: boolean ;
-} preview方法 调用preview方法进行文件的预览。
preview方法接收参数支持三种: 文件url地址、文件ArrayBuffer格式数据、文件blob格式。
ts preview : ( src : string | ArrayBuffer | Blob ) => Promise < any >
url格式适合有文件静态地址的情况,ArrayBuffer格式适合文件上传前的预览。
destroy方法 卸载方法,可以在组件销毁前调用预览对象的卸载方法,避免长期使用造成内存泄露。
如果该项目帮助了您,还请您不吝点赞
-
Skip to content vue-office 更易用的文件预览
支持docx、xlsx、pdf文件预览
一站式 提供docx、xlsx、pdf 3种文档的在线预览方案
使用简单 只需提供文档的src即可完成文档预览,支持远程地址、ArrayBuffer、Blob多种格式
支持样式 不仅能预览内容,也支持文档样式,最大限度还原office文件内容
-