vue 文件流预览

vue 文件流预览

pdfjs-dist

vue-pdf

  1. 安装
npm install --save vue-pdf
  1. 引入
import pdf from 'vue-pdf'
// 在vue页面中引入组件
components:{
   pdf
 },
  1. 使用
<div class="positionRelative" v-if="pdfUrl != null">
   <div class="changePDFpage">
       <el-button-group>
         <el-button type="primary" icon="el-icon-arrow-left" size="mini" @click="prePage">上一页</el-button>
         <el-button type="primary" size="mini" @click="nextPage">下一页<i class="el-icon-arrow-right el-icon--right"></i></el-button>
       </el-button-group>
       <div style="marginTop: 10px;font-weight: bold; color: #00706B">{{ pageNum }} / {{ pageTotalNum }}</div>
   </div>
   <pdf 
     ref="pdf"
     :src="pdfUrl" 
     :page="pageNum"
     @progress="loadedRatio = $event"
      @page-loaded="pageNum=$event"
     @num-pages="pageTotalNum=$event">
   </pdf>
</div>

data() {
  return {
    pdfUrl:'',
    pageNum: 1,
    pageTotalNum: 1, // 总页数
    loadedRatio: 0, // 当前页面的加载进度,范围是0-1 ,等于1的时候代表当前页已经完全加载完成了
  }
},

method:{
	// 获取文件流并生成url
	getFileBlob(){
      this.$api
        .downloadFile({ fileId: this.pdfid })
        .then((res) => {
          if (res.code) {
            this.$message({
              type: "error",
              message: res.msg,
            });
          } else {
            let blob = new Blob([res],{type: 'application/pdf'}); //文件流处理
            const url = window.URL.createObjectURL(blob);
            this.pdfUrl = url
          }
        })
        .catch((err) => {});
    },
	// 上一页
    prePage() {
      let page = this.pageNum
      page = page > 1 ? page - 1 : this.pageTotalNum
      this.pageNum = page
    },
    // 下一页
    nextPage() {
      let page = this.pageNum
      page = page < this.pageTotalNum ? page + 1 : 1
      this.pageNum = page
    }
}

iframe标签

  1. 使用
 <iframe ref="pdfCotainer" :src="pdfUrl + '#toolbar=0'" width="100%" style="height: 800px; overflow:scroll"></iframe>
  1. 获取pdf文件流并生成url,如上;

注意:

  1. 可以使用pdfUrl + '#toolbar=0’去掉iframe上的操作行,但是无法兼容所有浏览器;
  2. 获取文件流并生成url时,本地没问题,部署线上iframe报错,最后通过在接口处设置 responseType: 'arraybuffer’解决;
 downloadFile: (data) => 
    request({
      url: '/system/file/get',
      method: 'get',
      responseType: 'arraybuffer',
      params: data,
    }),

直接打开新页签

window.open(url, "_blank");

注意,该种方式可预览多种格式的文件,包括:

  1. JPG、PNG、jpg、png
  2. doc、docx、dot、dotx、dox
  3. pdf
  4. wps、wpt、dps、dpt、ppt、pot、pps、pptx、potx、ppsx
  5. xlsx、xls、xlt、et、ett
  6. txt
可以使用 GStreamer 中的多个插件来实现拍照功能,例如 v4l2sink、jpegenc 和 multifilesink。具体程为:先通过 v4l2src 插件采集视频,然后将视频转换为 JPEG 格式并保存到文件中,最后将 JPEG 文件显示在 xvimagesink 上。 以下是一个示例程序,可以启动 MIPI CSI 摄像头的预览,并在按下回车键后拍照并保存 JPEG 文件: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <fcntl.h> #include <termios.h> #include <sys/select.h> #include <sys/time.h> #define WIDTH 720 #define HEIGHT 576 #define FPS 15 int main(void) { // 设置环境变量 setenv("DISPLAY", ":0.0", 1); setenv("XDG_RUNTIME_DIR", "/run/user/1000", 1); // 检查摄像头设备文件是否存在 char *dev_path = NULL; if (access("/dev/video51", F_OK) == 0) { dev_path = "/dev/video51"; } else if (access("/dev/video31", F_OK) == 0) { dev_path = "/dev/video31"; } else if (access("/dev/video11", F_OK) == 0) { dev_path = "/dev/video11"; } else { fprintf(stderr, "Can not find camera!!!\n"); return 1; } // 启动预览 pipeline char cmd[256]; snprintf(cmd, sizeof(cmd), "gst-launch-1.0 v4l2src device=%s io-mode=4 ! video/x-raw,format=NV12,width=%d,height=%d,framerate=%d/1 ! xvimagesink > /dev/null 2>&1 &", dev_path, WIDTH, HEIGHT, FPS); system(cmd); printf("MIPI CSI Camera Preview started!\n"); // 设置串口 struct termios tty; memset(&tty, 0, sizeof(tty)); tty.c_iflag = IGNBRK; tty.c_oflag = 0; tty.c_cflag = CS8 | CREAD | CLOCAL; tty.c_lflag = 0; tty.c_cc[VTIME] = 0; tty.c_cc[VMIN] = 1; cfsetospeed(&tty, B115200); cfsetispeed(&tty, B115200); int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY); tcsetattr(fd, TCSANOW, &tty); fcntl(fd, F_SETFL, O_NONBLOCK); printf("Press Enter to take a photo...\n"); while (1) { fd_set fds; FD_ZERO(&fds); FD_SET(fd, &fds); struct timeval tv = {0}; tv.tv_sec = 1; int ret = select(fd + 1, &fds, NULL, NULL, &tv); if (ret > 0) { char buf[256]; read(fd, buf, sizeof(buf)); if (buf[0] == '\n') { // 拍照 char filename[256]; snprintf(filename, sizeof(filename), "photo-%ld.jpg", time(NULL)); snprintf(cmd, sizeof(cmd), "gst-launch-1.0 v4l2src device=%s ! video/x-raw,format=NV12,width=%d,height=%d,framerate=%d/1 ! jpegenc ! multifilesink location=%s > /dev/null 2>&1", dev_path, WIDTH, HEIGHT, FPS, filename); system(cmd); printf("Photo saved to %s\n", filename); } } } close(fd); return 0; } ``` 在程序中,我们使用了 select 函数来监听串口输入,如果读取到回车键,则执行拍照操作。拍照时,我们使用 jpegenc 插件将视频转换为 JPEG 格式,然后使用 multifilesink 插件将 JPEG 文件保存到指定路径下。同时,预览 pipeline 依然在后台运行,可以在拍照后继续进行预览。 需要注意的是,如果使用该程序,需要在终端上按下 Enter 键才能拍照,而且需要连接串口设备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值