JavaScript实现pdf文件导出和在线预览功能

 更新时间:2024年11月27日 10:44:05   作者:haorooms  
这篇文章主要为大家详细介绍了如何通过JavaScript实现在线导出pdf文件,及office文件如何在线预览,感兴趣的小伙伴可以跟随小编一起学习一下

本文是js文件导出系列第二期,主要讲讲如何在线导出pdf文件,及office文件如何在线预览。目前前端实现这些技术已经比较成熟,都有比较成熟的技术库,下面来和大家一起过一下吧。

纯前端导出pdf

这里就不造轮子了,说一说纯前端导出pdf的几个流行的前端库,大家可以根据不同场景使用。

1、pdfmake

github地址:github.com/bpampuch/pdfmake

pdf能够支持中文,具有部分自适应布局功能,需要引入字体库。

//npm 或者cdn引入文件
// 引入字体库
pdfmake.addFonts(Roboto);
// 创建文档流
let docDefinition={}
var pdf = pdfmake.createPdf(docDefinition);
pdf.write('pdfs/absolute.pdf').then(() => {
	console.log(new Date() - now);
}, err => {
	console.error(err);
});

本方案适用于排版相对不是太精美的文档流,生成方便。无在线预览,直接下载pdf的情况

2、jsPDF

github地址:

github.com/parallax/jsPDF

使用简单,官方推荐html2canvas 配合使用,html2canvas生成图片。

// webpack.config.js
module.exports = {
  // ...
  externals: {
    // only define the dependencies you are NOT using as externals!
    canvg: "canvg",
    html2canvas: "html2canvas",
    dompurify: "dompurify"
  }
};

使用很简单

// Landscape export, 2×4 inches
const doc = new jsPDF({
  orientation: "landscape",
  unit: "in",
  format: [4, 2]
});

doc.text("Hello world!", 1, 1);
doc.save("two-by-four.pdf");

支持引入字体

const doc = new jsPDF();

const myFont = ... // load the *.ttf font file as binary string

// add the font to jsPDF
doc.addFileToVFS("MyFont.ttf", myFont);
doc.addFont("MyFont.ttf", "MyFont", "normal");
doc.setFont("MyFont");

3、html2pdf

Html可以直接导出pdf,github地址 github.com/eKoopmans/html2pdf.js

适合比较复杂排版的场景,所见即所得,可以导出pdf。适合预览一起做的场景。

office在线预览

pdf在线预览,我们一般用pdf.js

首先npm i pdfjs-dist

设置PDFJS.GlobalWorkerOptions.workerSrc的地址

通过PDFJS.getDocument处理pdf数据,返回一个对象pdfDoc

通过pdfDoc.getPage单独获取第1页的数据

创建一个dom元素,设置元素的画布属性

通过page.render方法,将数据渲染到画布上

html:

<div class="showContent" id="canvasWrap"></div>

js:

import pdfjsLib from 'pdfjs-dist'
import pdfwprker from 'pdfjs-dist/build/pdf.worker.js'
// let pdfPath = 'http://cdn.mozilla.net/pdfjs/tracemonkey.pdf'

 pdfjsLib.GlobalWorkerOptions.workerSrc = pdfwprker
  const wrapBox = document.getElementById('canvasWrap')
this.renderPdfs(wrapBox,pdfPath )

  //渲染函数
    async renderPdfs(element, url) {
    //  console.log(url,"psfurl")
      const loadingTask = pdfjsLib.getDocument(url)
      const pdfDocument = await loadingTask.promise
      // console.log(pdfDocument, 'pdf')
      for (let i = 1; i <= pdfDocument.numPages; i++) {
        const canvas = document.createElement('canvas')
        // 动态创建canvas
        element.appendChild(canvas);
        (async function(n) {
          const pdfPage = await pdfDocument.getPage(n)
          // Display page on the existing canvas with 100% scale.
          const viewport = pdfPage.getViewport(1.5)
          canvas.id = `theCanvas${n}`
          canvas.width = viewport.width
          canvas.height = viewport.height
          var ctx = canvas.getContext('2d')
          var renderTask = pdfPage.render({
            canvasContext: ctx,
            viewport: viewport
          })
          return renderTask.promise
        })(i)
      }
    }

docx文件实现前端预览

首先npm i docx-preview

引入renderAsync方法

将blob数据流传入方法中,渲染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, // 启用额外的日志记录
   }
);

excel实现前端预览

exceljs github库 github.com/exceljs/exceljs

下载exceljs、handsontable的库

通过exceljs读取到文件的数据

通过workbook.getWorksheet方法获取到每一个工作表的数据,将数据处理成一个二维数组的数据

通过settings属性,将一些配置参数和二维数组数据传入组件,渲染成excel样式,实现预览

// 加载excel的数据
(new ExcelJS.Workbook().xlsx.load(buffer)).then(workbook=>{
   // 获取excel的第一页的数据
   const ws = workbook.getWorksheet(1);
   // 获取每一行的数据
   const data = ws.getRows(1, ws.actualRowCount);
 })
 
 
// 渲染页面
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"
}

excel的另外的预览,可以采用 github.com/SheetJS/sheetjs

nodejs 或者纯客户端都可以使用,纯客户端react的使用案例如下:

参考demo github.com/SheetJS/sheetjs/tree/master/demos/react

pptx的前端预览

github地址:github.com/meshesha/PPTXjs

这个库采用jquery,和jszip ,假如不想引入jquery,可以自己改造一下使用。

还有种方式就是将ppt转为pdf,通过预览pdf的方式来预览,这样比较通用,也比较方便。

小结

除了上面的纯前端方式,其实微软和谷歌也提供了在线预览api,这个预览其实效果会更好,更加简单。 谷歌在线预览接口

https://docs.google.com/viewer?url=预览文档地址

微软预览地址:

https://view.officeapps.live.com/op/view.aspx?src=预览文档指定

到此这篇关于JavaScript实现pdf文件导出和在线预览功能的文章就介绍到这了,更多相关JavaScript pdf文件导出内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Javascript 错误处理的几种方法

    Javascript 错误处理的几种方法

    浏览器不会抛出Error类型的exception异常,所以如果捕获到Error类型的异常,可以确定这个异常是用户代码抛出的,不是浏览器抛出的。
    2009-06-06
  • 微信小程序轮播图swiper代码详解

    微信小程序轮播图swiper代码详解

    swiper组件是滑块视图容器,主要用来做图片轮播。这篇文章主要给大家介绍了关于微信小程序轮播图swiper代码的相关资料,需要的朋友可以参考下
    2020-12-12
  • es6 filter() 数组过滤方法总结

    es6 filter() 数组过滤方法总结

    这篇文章主要介绍了es6 filter() 数组过滤方法总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • layer.open回调获取弹出层参数的实现方法

    layer.open回调获取弹出层参数的实现方法

    今天小编就为大家分享一篇layer.open回调获取弹出层参数的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • 使用原生JS添加进场和退场动画详解

    使用原生JS添加进场和退场动画详解

    总所周知啊,身为一个合格的前端搬砖工,会编写并且添加一些基础的动画效果可谓是比较基础且轻车熟路的技能了。本文将教大家如何使用原生JS添加进场和退场动画,感兴趣的可以了解一下
    2022-10-10
  • js实现键盘Enter键提交表单的方法

    js实现键盘Enter键提交表单的方法

    这篇文章主要介绍了js实现键盘Enter键提交表单的方法,涉及javascript键盘事件的相关操作技巧,需要的朋友可以参考下
    2015-05-05
  • Javascript无阻塞加载具体方式

    Javascript无阻塞加载具体方式

    这篇文章介绍了JS无阻塞加载,有需要的朋友可以参考一下
    2013-06-06
  • js确认框confirm()用法实例详解

    js确认框confirm()用法实例详解

    这篇文章主要针对js确认框confirm()用法进行实例讲解,介绍了javascript确认框的三种使用方法,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • 利用JS响应式修改vue实现页面的input值

    利用JS响应式修改vue实现页面的input值

    这篇文章主要给大家介绍了关于如何利用JS响应式修改vue实现页面的input值,文中通过示例代码介绍的非常详细,对大家学习或者使用JS具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • JAVA中截取字符串substring用法详解

    JAVA中截取字符串substring用法详解

    这篇文章主要介绍了JAVA截取字符串 substring方法,要的朋友可以参考下
    2017-04-04

最新评论