Vue中接收二进制文件流实现pdf预览

Vue中接收二进制文件流实现pdf预览

后台Controller

@RequestMapping("/getPDFStream")
@ResponseBody
public void getPDFStream(HttpServletRequest request,HttpServletResponse response) {
	try {
		request.setCharacterEncoding("utf-8");
	} catch (UnsupportedEncodingException e) {
		logger.error("设置字符集UnsupportedEncodingException");
	}
	String fileName = request.getParameter("fileName");
	//文件路径
	String filePathname = Const.UPLOAD_HBFILE_PATH + "/" + fileName
			+ ".pdf";
	File file = new File(filePathname);
	byte[] data = null;
	if (!file.exists()) {
		logger.error("Sorry File does not Exists!");
	} else {
		try {
			FileInputStream input = new FileInputStream(file);
			data = new byte[input.available()];
			input.read(data);
			response.getOutputStream().write(data);
			input.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			logger.error("pdf文件处理异常");
		}
	}
}

前台接收

  1. 封装axios, request.js
    import axios from 'axios'
    /**
     * 封装axios异步请求的方法==================
     */
    //创建一个axios对象-----------
    const request = axios.create({
        //baseURL:'/dev-api',//基础路径
        baseURL:process.env.VUE_APP_BASE_API,//根据不同的环境,加载不同的常量值
      //  baseURL: '/',
        timeout: 50000,//请求超时,50000毫秒
    })
    //设置请求拦截器====================================
    //对拦截进行请求--------------------
    request.interceptors.request.use(config => {
        //请求拦截
        config.data = {
            ...config.data,
            userId: sessionStorage.getItem('userId')
        }
        return config;
    }, error => {
        //出现异常
        return Promise.reject(error);//es6写法
    });
    //设置响应拦截器==================================
    //对拦截进行响应--------------------
    request.interceptors.response.use(response =>{
        if(!response.data||response.data==""){
            return '{"flag":"failure","msg":"未知错误"}';
        }
        return response.data;
    },error =>{
        return Promise.reject(error);
    })
    export default request //导出自定义创建的axios对象,供其他组件进行使用
    
  2. 定义方法 common.js
    import request from '@/utils/request' //导入已经封装好的axios请求方式
    export function getPDFStream(param) {
       return request({
            url: 'xxxxxx/getPDFStream',
            method: 'post',
            //传递参数
            data: param,
            headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            responseType: 'blob',
            transformRequest: function(obj) {
                var str = [];
                for (var p in obj)
                    str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
                return str.join("&");
            },
     })
    }
    
  3. 页面代码
     <a-modal
      width="900px"
      title="文件查看"
      v-model="lookPdfFile"
      :footer="null"
      :forceRender="true"
      @ok="lookPdfFile"
    >
      <div :style="{ height: '600px', minHeight: '500px', margin: '8px 0px' }">
         <iframe :src="pdfUrl" id="previewPdf" frameborder="0" style="width: 100%; height: 100%"></iframe>
      </div>
    </a-modal>
    
    //导入方法
    import {getPDFStream} from "@/api/common";
    //定义data
    lookPdfFile:false,//预览pdf
    pdfUrl:'',// pdf路径
    
    关键代码(获取文件名称后调用getPDFStream方法获取文件流)
     let _this = this;
     if(suffix == 'pdf'){
       getPDFStream({
         fileName: filename,
       }).then(res => {
         let reader = new window.FileReader();
         // 使用readAsArrayBuffer读取文件, result属性中将包含一个 ArrayBuffer 对象以表示所读取文件的数据
         reader.readAsArrayBuffer(res);
         reader.onload = function(e) {
           const result = e.target.result
           const contentType = res.type
           // 生成blob图片,需要参数(字节数组, 文件类型)
           const blob = new Blob([result], { type: 'application/pdf' })
           // 使用 Blob 创建一个指向类型化数组的URL, URL.createObjectURL是new Blob文件的方法,可以生成一个普通的url,可以直接使用,比如用在img.src上
           if (window.createObjectURL != undefined) { // basic
             _this.pdfUrl = window.createObjectURL(blob)+'#toolbar=0'
           } else if (window.webkitURL != undefined) { // webkit or chrome
             try {
               _this.pdfUrl = window.webkitURL.createObjectURL(blob)+'#toolbar=0'
             } catch (error) {
    
             }
           } else if (window.URL != undefined) { // mozilla(firefox)
             try {
               _this.pdfUrl = window.URL.createObjectURL(blob)+'#toolbar=0'
             } catch (error) {
    
             }
           }
         }
         this.$nextTick(() => {
           this.lookPdfFile = true;
         })
       })
       return;
     }
    
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3 本身并没有提供直接的 PDF 预览功能,但你可以借助第三方库来实现 PDF 预览。 一个常用的库是 `pdf.js`,它是 Mozilla 开发的一个 JavaScript 解析和渲染 PDF 的库。你可以在 Vue3 使用 `pdf.js` 来实现 PDF 预览。 首先,你需要安装 `pdf.js`: ```bash npm install pdfjs-dist ``` 然后在你的 Vue3 项目,你可以创建一个组件来加载和渲染 PDF 文件。以下是一个简单的示例: ```vue <template> <div> <canvas ref="canvas"></canvas> </div> </template> <script> import * as pdfjsLib from 'pdfjs-dist' export default { name: 'PDFPreview', mounted() { this.loadPDF() }, methods: { async loadPDF() { try { const pdfData = await this.fetchPDF() // 使用 fetch 或其他方法获取 PDF 文件二进制数据 const pdf = await pdfjsLib.getDocument({ data: pdfData }).promise const page = await pdf.getPage(1) // 加载第一页 const canvas = this.$refs.canvas const context = canvas.getContext('2d') const viewport = page.getViewport({ scale: 1.5 }) // 设置缩放比例 canvas.width = viewport.width canvas.height = viewport.height await page.render({ canvasContext: context, viewport: viewport }) } catch (error) { console.error(error) } }, fetchPDF() { // 使用 fetch 或其他方法获取 PDF 文件二进制数据 // 返回一个 Promise,resolve 时带上 PDF 文件二进制数据 }, }, } </script> <style scoped> canvas { border: 1px solid #ccc; } </style> ``` 在上面的示例,我们首先安装了 `pdfjs-dist` 包,并在组件引入了 `pdfjsLib` 对象。在 `loadPDF` 方法,我们使用 `pdfjsLib.getDocument` 方法加载 PDF 文件并获取第一页的数据。然后,我们创建了一个 canvas 元素来渲染 PDF 页面,并使用 `page.render` 方法将页面渲染到 canvas 上。 请注意,上述示例的 `fetchPDF` 方法并没有实现具体的获取 PDF 文件的逻辑,你需要根据自己的实际情况来实现该方法。 最后,你可以在其他的 Vue 组件使用这个 PDF 预览组件: ```vue <template> <div> <PDFPreview /> </div> </template> <script> import PDFPreview from './PDFPreview.vue' export default { name: 'App', components: { PDFPreview }, } </script> ``` 这样,你就可以在 Vue3 项目实现 PDF 预览功能了。希望对你有所帮助!如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值