前端预览和下载图片/文档的几种方法

浏览器下载文件主要还是看文件保存的时候有没有设置正确的conten-type,有的话浏览器访问url时会自动打开该文件将内容显示在页面上,前提时浏览器本身能识别这个文件类型,比如图片/文档/文本等,否则浏览器则会默认直接下载该文件。。。当然如果后端能直接返回文件流(bolb类型)的话就好处理了)

用js实现强制下载图片(经测试IE全版本不支持):

downloadIamge(imgsrc, name) {//下载图片
   let image = new Image();
   image.src = imgsrc;
   // 解决跨域 Canvas 污染问题
   image.setAttribute("crossOrigin", "anonymous");
   image.onload = function() {
       let canvas = document.createElement("canvas");
       canvas.width = image.width;
       canvas.height = image.height;
       let context = canvas.getContext("2d");
       context.drawImage(image, 0, 0, image.width, image.height);
       let url = canvas.toDataURL("image/png"); //得到图片的base64编码数据
       let a = document.createElement("a"); // 生成一个a元素
       a.download = name; // 设置图片名称
       a.href = url; // 将生成的URL设置为a.href属性
       a.click()
   }
}

预览PDF(此链接也是pdf.js实现):

let a = document.createElement('a')
a.target = "_blank"
a.href = 'http://mozilla.github.io/pdf.js/web/viewer.html?file='+fileUrl
document.body.appendChild(a)
a.click()

预览文档(利用微软提供的方案):

let a = document.createElement('a')
a.target = "_blank"
a.href = 'https://view.officeapps.live.com/op/view.aspx?src='+fileUrl
document.body.appendChild(a)
a.click()
/*这个文件地址需满足以下几个条件:
(1)在浏览器是可以访问的;
(2)需域名访问,IP无效;
(3)访问端口为80;*/

html内容导出为PDF:

import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
import moment from 'moment'
//分页
export default (title, id)=> {
    var element = document.getElementById(id)
    element.scrollIntoView(true)
    window.scrollTo(0, 0);
    setTimeout(() => {
      html2Canvas(element).then(function(canvas) {
        var contentWidth = canvas.width;
        var contentHeight = canvas.height;

        //一页pdf显示html页面生成的canvas高度;
        var pageHeight = contentWidth / 592.28 * 841.89;
        //未生成pdf的html页面高度
        var leftHeight = contentHeight;
        //页面偏移
        var position = 0;
        var padding = 10
        //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
        var imgWidth = 595.28;
        var imgHeight = 592.28 / contentWidth * contentHeight;

        var pageData = canvas.toDataURL('image/jpeg', 1.0);

        var pdf = new JsPDF('', 'pt', 'a4');

        //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
        //当内容未超过pdf一页显示的范围,无需分页
        if (leftHeight < pageHeight) {
          pdf.addImage(pageData, 'JPEG', padding, padding, imgWidth-padding*2, imgHeight);
        } else {
          while (leftHeight > 0) {
            pdf.addImage(pageData, 'JPEG', padding, position, imgWidth-padding*2, imgHeight)
            leftHeight -= pageHeight;
            position -= 841.89;
            //避免添加空白页
            if (leftHeight > 0) {
              pdf.addPage();
            }
          }
        }
        pdf.save(title + moment(Date.now()).format('YYYY-MM-DD') + '.pdf');
      });
    }, 0);
}
//不分页
const exportPDF = (title, id)=> {
    var element = document.getElementById(id)
    element.scrollIntoView(true)
    window.scrollTo(0, 0);
    setTimeout(() => {
      html2Canvas(element).then(function(canvas) {
        let scale = 2
        const contentWidth = canvas.width / scale
        const contentHeight = canvas.height / scale
        const pdf = new JsPDF('', 'pt', [contentWidth, contentHeight])
        const pageData = canvas.toDataURL('image/jpeg', 1.0)

        pdf.addImage(pageData, 'JPEG', 0, 0, contentWidth, contentHeight)
        pdf.save(title + '.pdf')
      });
    }, 0);
}
// export default exportPDF
Vue.prototype.$exportPDF = exportPDF

流预览、流转base64预览

后端直接返回文件类型,前端请求加一个responseType: 'blob',得到blob对象:

callback: (res)=>{
   if(res){
          let blob = new Blob([res], {type: "application/pdf"})
          //1.将blob转base64通过内嵌iframe预览
          var reader = new FileReader()
          reader.readAsDataURL(blob);
          reader.onload = function(){
             console.log(reader.result); 
             sessionStorage.PDF = reader.result
             window.open('/PDFviewer')
          };
          //2.直接预览
          if (window.navigator && window.navigator.msSaveOrOpenBlob){
              window.navigator.msSaveOrOpenBlob(blob,'');
          }else{
              window.open(window.URL.createObjectURL(blob))
          }
    }else{
        message.warning(res.msg)
    }
}
async downloadFn() {//下载
   let res = await this.$store.dispatch('cpcenter/resumeDownload',{id: this.id})
   // response.setHeader("FileName", URLEncoder.encode(fileName, "UTF-8")) 后台
   let fileName = decodeURI(res.headers['filename'])
   let blob = new Blob([res.data], {type: "application/pdf"})
   if (window.navigator && window.navigator.msSaveOrOpenBlob){
          // window.navigator.msSaveOrOpenBlob(blob,'')
          window.navigator.msSaveBlob(blob, fileName);
   }else{
          let url = window.URL.createObjectURL(blob)
          const link = document.createElement('a')
          link.style.display = 'none'
          link.href = url
          link.setAttribute('download', fileName)
          document.body.appendChild(link)
          link.click()
          document.body.removeChild(link)
   }
}

 

### 回答1: docxpreview是一种可以在前端实现的文档预览工具,可以方便地预览和浏览.docx格式的文档。实现docxpreview前端主要包括以下几个步骤。 首先,前端需要通过接口或后端提供的服务获取.docx文件的二进制数据或URL。可以使用AJAX技术进行异步请求,并将获取到的文件数据存储在前端。 接下来,前端需要将获取到的.docx文件进行解析,提取其中的文本和格式信息,并根据需要进行样式的调整和布局的优化。可以使用第三方的JavaScript库,如JSZip和officegen来帮助解析.docx文件。 然后,前端需要将解析后的文本和格式信息渲染到HTML页面上,以便用户可以直接在前端页面上进行预览。可以使用HTML和CSS来创建页面结构和样式,并将解析后的文本插入到相应的元素中。 在渲染过程中,前端还可以添加一些交互功能,例如放大缩小、翻页和搜索等,以提升用户体验。可以使用JavaScript来实现这些功能,并与HTML和CSS进行交互。 最后,前端需要进行一些错误处理和异常处理,确保在预览过程中出现错误时能够及时提示用户或提供相关的错误信息。 综上所述,docxpreview文档预览前端实现主要包括获取.docx文件数据,解析文本和格式信息,渲染到HTML页面,并添加交互功能和错误处理等步骤。通过这些步骤可以实现一个简单但功能完善的.docx文档预览前端。 ### 回答2: docxpreview文档预览是一种前端实现的技术,它通过使用一些特定的技术和工具,在网页上实现对docx文档预览功能。 首先,实现docx文档预览的前提是需要将docx文档转换成可被网页展示的格式。这可以通过一些在线的或者本地的转换工具来实现,比如使用Microsoft Office自带的Office Online服务,或者使用一些第三方的开源库,如Apache POI等。这些工具可以将docx文档转换为HTML、PDF或者其他网页可以读取和展示的格式。 然后,在前端页面上实现docx文档预览功能需要引入一些前端技术和工具。常见的有使用HTML、CSS和JavaScript来实现网页的布局和交互效果。我们可以在网页上嵌入一个可以显示HTML或者PDF内容的iframe,通过将转换后的文档内容加入到该iframe中,就可以在网页上实现对docx文档预览功能。 另外,为了提升用户体验和功能完善,我们可以引入一些额外的功能。比如,可以添加页面导航按钮,让用户可以在预览文档时进行翻页操作;也可以添加搜索功能,让用户可以根据关键词在文档中进行搜索;还可以添加缩放功能,让用户可以根据自己的需求对文档进行放大或缩小等等。 综上所述,docxpreview文档预览前端实现需要将docx文档转换为可被网页展示的格式,然后在前端页面上通过HTML、CSS和JavaScript等技术进行实现。同时,为了提升用户体验和功能完善,可以添加一些额外的功能。 ### 回答3: docxpreview文档预览前端实现是指通过前端技术实现对docx格式文档进行预览的功能。实现该功能需要以下步骤: 1. 获取docx文件:用户在前端页面上选择docx文件,通过文件上传功能将文件传输到后台服务器。 2. 后台处理:后台服务器接收到传输的docx文件后,需要对文件进行解析和处理。可以使用开源的文档处理库,如Apache POI或Aspose Words等,对docx文件进行解析,提取其中的内容和格式信息。 3. 前端渲染:后台处理完成后,将提取的内容和格式信息传输到前端前端可以使用HTML和CSS技术对提取的内容进行渲染和展示。可以将文本内容显示为段落、标题、表格等形式,并自定义样式,如字体、大小、颜色等。 4. 图片预览:如果docx文件中包含图片前端需要将这些图片进行处理并显示。可以通过解析docx文件中的图片路径,并将图片转换成base64编码格式,以便在前端页面上显示。 5. 页面交互:为了提升用户体验,可以在前端页面上添加一些交互功能。比如,支持缩放、滚动、跳转页等操作,让用户能够更方便地浏览和阅读文档。 总之,实现docxpreview文档预览前端功能,需要通过后台解析和处理docx文件,并将提取的内容和格式信息传输到前端进行渲染和展示。同时,还需要处理文档中的图片,并提供一些交互功能,以提升用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值