Este artículo comprende a fondo la implementación frontal de la vista previa de archivos (word, excel, pdf, ppt, mp4, imagen, texto)

Dachang Technology Advanced Front-end Nodo Avanzado

Haga clic en la guía de crecimiento del programador superior, preste atención al número público

Respuesta 1, únete al grupo de intercambio de nodos avanzado

prefacio

Debido a las necesidades comerciales, es necesario obtener una vista previa de muchos archivos en el front-end. Aprendamos sobre ellos hoy.

Demostración地址[1]:https://zhuye1993.github.io/file-view/dist/index.html

Plan de IMPLEMENTACION

Encontré una solución de implementación en línea, el efecto se ve bien, lo puse en la tabla a continuación, algunas de las cuales se pueden introducir y usar directamente en vue a través de npm.

formato de documento viejos componentes de código abierto Alternativa a los componentes de código abierto
palabra (docx) mamut vista previa de docx (npm)
power point(pptx) pptxjs desarrollo de transformación pptxjs
sobresalir (xlsx) sheetjs, tabla práctica exceljs (npm) 、 handsontable (npm) (npm)
pdf (pdf) pdfjs pdfjs (npm)
imagen jquery.verySimpleImageViewer visor v (npm)

archivo docx para lograr la vista previa de front-end

Código

  • Primer npm i docx-vista previa

  • Introducir el método renderAsync

  • Pase el flujo de datos del blob al método para representar el documento de Word

import { defaultOptions, renderAsync } from "docx-preview";
renderAsync(buffer, document.getElementById("container"), null,
options: {
       className: string = "docx", // 默认和文档样式类的类名/前缀
       inWrapper: boolean = true, // 启用围绕文档内容渲染包装器
       ignoreWidth: boolean = false, // 禁止页面渲染宽度
       ignoreHeight: boolean = false, // 禁止页面渲染高度
       ignoreFonts: boolean = false, // 禁止字体渲染
       breakPages: boolean = true, // 在分页符上启用分页
       ignoreLastRenderedPageBreak: boolean = true,//禁用lastRenderedPageBreak元素的分页
       experimental: boolean = false, //启用实验性功能(制表符停止计算)
       trimXmlDeclaration: boolean = true, //如果为真,xml声明将在解析之前从xml文档中删除
       debug: boolean = false, // 启用额外的日志记录
   }
);

复制代码

lograr efecto

076ffc0d81af83472539edca635af8f5.png
imagen.png

pdf se da cuenta de la vista previa de front-end

Código

  • Primero npm i pdfjs-dist

  • Establecer la dirección de PDFJS.GlobalWorkerOptions.workerSrc

  • Procese datos pdf a través de PDFJS.getDocument y devuelva un objeto pdfDoc

  • Obtenga los datos de la página 1 por separado a través de pdfDoc.getPage

  • Crea un elemento dom y establece la propiedad canvas del elemento.

  • Renderice los datos en el lienzo a través del método page.render

import * as PDFJS from "pdfjs-dist/legacy/build/pdf";
// 设置pdf.worker.js文件的引入地址
PDFJS.GlobalWorkerOptions.workerSrc = require("pdfjs-dist/legacy/build/pdf.worker.entry.js");
// data是一个ArrayBuffer格式,也是一个buffer流的数据
PDFJS.getDocument(data).promise.then(pdfDoc=>{
    const numPages = pdfDoc.numPages; // pdf的总页数
    // 获取第1页的数据
    pdfDoc.getPage(1).then(page =>{
     // 设置canvas相关的属性
     const canvas = document.getElementById("the_canvas");
     const ctx = canvas.getContext("2d");
     const dpr = window.devicePixelRatio || 1;
     const bsr =
       ctx.webkitBackingStorePixelRatio ||
       ctx.mozBackingStorePixelRatio ||
       ctx.msBackingStorePixelRatio ||
       ctx.oBackingStorePixelRatio ||
       ctx.backingStorePixelRatio ||
       1;
     const ratio = dpr / bsr;
     const viewport = page.getViewport({ scale: 1 });
     canvas.width = viewport.width * ratio;
     canvas.height = viewport.height * ratio;
     canvas.style.width = viewport.width + "px";
     canvas.style.height = viewport.height + "px";
     ctx.setTransform(ratio, 0, 0, ratio, 0, 0);
     const renderContext = {
       canvasContext: ctx,
       viewport: viewport,
     };
     // 数据渲染到canvas画布上
     page.render(renderContext);
    })
})

复制代码

lograr efecto

bf58806ffcce46b9d1e1e38bcbcedaf7.png
imagen.png

Excel realiza una vista previa de front-end

Código

  • Descarga la biblioteca de exceljs, handsontable

  • Leer datos del archivo a través de exceljs

  • Obtenga los datos de cada hoja de trabajo a través del método workbook.getWorksheet y procese los datos en una matriz bidimensional de datos

  • Presentar el componente HotTable de @handsontable/vue

  • A través del atributo de configuración, algunos parámetros de configuración y datos de matriz bidimensional se pasan al componente, se representan en un estilo de Excel y se previsualizan.

// 加载excel的数据
(new ExcelJS.Workbook().xlsx.load(buffer)).then(workbook=>{
   // 获取excel的第一页的数据
   const ws = workbook.getWorksheet(1);
   // 获取每一行的数据
   const data = ws.getRows(1, ws.actualRowCount);
 })
 
 
// 渲染页面
import { HotTable } from "@handsontable/vue";
<hot-table  :settings="hotSettings"></hot-table>
hotSettings = {
   language: "zh-CN",
   readOnly: true,
   data: this.data,
   cell: this.cell,
   mergeCells: this.merge,
   colHeaders: true,
   rowHeaders: true,
   height: "calc(100vh - 107px)",
   // contextMenu: true,
   // manualRowMove: true,
   // 关闭外部点击取消选中时间的行为
   outsideClickDeselects: false,
   // fillHandle: {
   //   direction: 'vertical',
   //   autoInsertRow: true
   // },
   // afterSelectionEnd: this.afterSelectionEnd,
   // bindRowsWithHeaders: 'strict',
   licenseKey: "non-commercial-and-evaluation"
}
复制代码

lograr efecto

cada4c362d948ec96147578893c3a84e.png
imagen.png

Vista previa frontal de pptx

Principalmente a través de la biblioteca jszip, cargue el archivo binario y luego a través de una serie de procesamiento y conversión para lograr el efecto de vista previa, es más problemático de implementar, por lo que no pegaré el código.Si está interesado, puede descargar el código para ver.

lograr efecto

95003b74b0e1aaac37bc4605bd460f21.png
imagen.png

Resumir

Principalmente presenta la forma de obtener una vista previa de archivos de Word, Excel y PDF. El mejor efecto de obtener una vista previa de la interfaz es PDF, y no habrá problemas de caracteres ilegibles y caracteres ilegibles. Por lo tanto, la buena solución general es cooperar con el back-end para convertir archivos de diferentes formatos. Conviértalo a pdf, y luego realice el efecto de vista previa en el front-end, que conservará algunos efectos de estilo del archivo. Para la realización de imágenes y archivos txt, puede ver el código si estás interesado.

código de dirección

github.com/zhuye1993/f…[2]:https://github.com/zhuye1993/file-view

Acerca de este artículo

Autor: Industria del Bambú

https://juejin.cn/post/7071598747519549454

Node 社群


我组建了一个氛围特别好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你对Node.js学习感兴趣的话(后续有计划也可以),我们可以一起进行Node.js相关的交流、学习、共建。下方加 考拉 好友回复「Node」即可。

如果你觉得这篇内容对你有帮助,我想请你帮我2个小忙:

1. 点个「在看」,让更多人也能看到这篇文章2. 订阅官方博客 www.inode.club 让我们一起成长

点赞和在看就是最大的支持❤️

Supongo que te gusta

Origin blog.csdn.net/xgangzai/article/details/123725420
Recomendado
Clasificación