当前位置: 首页 > article >正文

企业级-pdf预览-前后端

作者:fyupeng
技术专栏:☞ https://github.com/fyupeng
项目地址:☞ https://github.com/fyupeng/distributed-blog-system-api


留给读者

本文

一、介绍

对于PDF预览,有很多开发者都遇到过头疼的难题,今天给大家介绍一个比较成熟的浏览器直接提供的预览嵌入Vue组件。

二、代码

  • 快速使用:

html渲染:

    <el-dialog
        :lock-scroll="false"
        custom-class="imgPreview_dia"
        :show-close="true"
        top="5vh"
        width="90vw"
        v-model="dialogVisible"
    >
      <filePreview :fileUrl="fileUrl" width="90vw" height="90vh"></filePreview>
    </el-dialog>

css样式:

.imgPreview_dia {
  border-radius: 0 !important;
  margin: 0;
  left: 5vw;
}

js 处理:

const dialogVisible = ref(false);

const fileUrl = ref("");

const handleYulan = (index: number, row: object) => {
  fileUrl.value =
      // showDocFile() +
      "http://localhost:8086/machine/commonFile/notice/showDocFile" +
      "?fileId=" +
      row.fileId +
      "&pripid=" +
      props.initData?.pripid +
      "&time=" +
      new Date().getTime();
  // fileUrl.value =
  //   showDocFile() +
  //   "?docId=2516&gid=4055fb556a9c440590464017f28aae0e&time=1691460960121";
  dialogVisible.value = true;
};
  • 模板:

后端处理:

 public Boolean showNoticeDocFile(String fileId, HttpServletResponse response) {
        FileInputStream input = null;
        OutputStream output = null;
        try {
            File file = getNoticeDocRowFile(fileId);
            if (file == null || !file.exists()) {
                return false;
            }
            input = new FileInputStream(file);
            int i = input.available(); // 得到文件大小
            byte[] data = new byte[i];
            input.read(data); // 读数据
            response.setContentType("application/pdf"); // 设置返回的文件类型
            response.addHeader("Content-Length", String.valueOf(data.length));  //文件大小
            output = response.getOutputStream(); // 得到向客户端输出二进制数据的对象
            output.write(data); // 输出数据
            output.flush();
            file.delete();
            return true;
        } catch (Exception e) {
            logger.error("==showFile==文件信息回显失败!fileId:{}", fileId, e);
            return false;
        } finally {
            try {
                if (input != null)
                    input.close();
                if (output != null)
                    output.close();
            } catch (IOException e) {
                logger.error(e.getMessage(), e);
            }
        }
    }

前端处理:
filePreview.vue

<template>
  <div class="wrap" v-loading="isLoading">
    <div class="pdf-container">
      <iframe
        id="doc-iframe"
        :src="url"
        :style="{ width: prop.width, height: prop.height, background: '#fff' }"
        class="parintDetailDoc"
        ref="iframeRef"
      ></iframe>
    </div>
  </div>
</template>

<script lang="ts" setup>
import { ref, reactive, watch, defineProps, defineEmits, onMounted } from "vue";
import { ElMessage } from "element-plus";
const emits = defineEmits(["loaded"]);
const prop = defineProps({
  fileUrl: {
    type: String,
    default: "",
  },
  width: {
    type: String,
    default: "800px",
  },
  height: {
    type: String,
    default: "800px",
  },
});
const isLoading = ref(true);
const url = ref("");

watch(
  () => prop.fileUrl,
  () => {
    url.value = prop.fileUrl;
    console.log("--------prop.fileUrl", prop.fileUrl);
  },
  { immediate: true }
);
onMounted(() => {
  let iframeDom = document.getElementById("doc-iframe") || {};
  iframeDom.onload = function () {
    isLoading.value = false;
    emits("loaded");
  };
});
</script>

<style scoped>
.parintDetailDoc::-webkit-scrollbar {
  display: none;
}
.parintDetailDoc {
  border: none;
  max-width: 100%;
}
</style>


三、总结

简洁、高效、实用!


http://www.kler.cn/a/320635.html

相关文章:

  • uniapp luch-request 使用教程+响应对象创建
  • WebRTC视频 02 - 视频采集类 VideoCaptureModule
  • 深度学习transformer
  • Mac 电池没电关机导致时间不同步
  • 【动手学深度学习Pytorch】1. 线性回归代码
  • vue3点击按钮el-dialog对话框不显示问题
  • 免费开源的AI 智能网盘,图片和媒体管理工具 | 极空间部署『PicHome』
  • GUI编程18:文本框、密码框、文本域
  • MT76X8、MT7621和MT7981 接NOR FALSH分区表
  • Focalboard开源项目管理系统本地Windows部署与远程访问协同办公
  • C语言读取一行字符_只需要看第四条
  • vue3中echarts柱状图横轴文字太多放不下怎么解决
  • 【深度学习】初识神经网络
  • JAVA同城服务场馆门店预约系统支持H5小程序APP源码
  • [vulnhub] pWnOS v2.0
  • 《MATLAB项目实战》,专栏目录和介绍
  • JavaScript 数据可视化:前端开发的核心工具
  • 校园美食地图:Spring Boot实现的探索与分享平台
  • xpath应用大全
  • Relations Prediction for Knowledge Graph Completion using Large Language Models
  • PG逻辑订阅功能
  • 数据分析师之Excel数据清洗
  • 开始场景的制作+气泡特效的添加
  • 【Webpack】实现持久化缓存
  • 两台虚拟机之分布式部署
  • 如何理解MVCC