首页 > 其他分享 >PDFProfile.vue代码存档

PDFProfile.vue代码存档

时间:2024-12-05 17:23:53浏览次数:11  
标签:vue console log URL 存档 PDFProfile PDF const pdf

xx教学模式下生物课程某素养能力的提升探究

<template>

  

  <v-container>
    <v-row>
      <v-col cols="12">
        <div ref="pdfViewerContainer" class="pdf-viewer-container"></div>
      </v-col>
    </v-row>

  </v-container>

  <v-app>

    <!-- 左侧按钮 -->
    <v-btn color="success" class="left-button" @click="handleLeftButtonClick">
      Left Button
    </v-btn>

    <!-- 按钮控制部分 -->
    <v-btn color="primary" class="drawer-toggle-btn" @click="toggleDrawer">
      <v-icon>{{ drawer ? 'mdi-chevron-right' : 'mdi-chevron-left' }}</v-icon>
    </v-btn>


    <!-- 抽屉 -->
    <v-navigation-drawer v-model="drawer" location="right" app temporary :width="drawerWidth" class="custom-drawer"
      :scrim="false" @click:outside="handleOutsideClick">
      <!-- 抽屉内容 -->
      <v-list>
        <!-- <v-list-item>
      <v-list-item-avatar>
        <v-img src="https://randomuser.me/api/portraits/men/78.jpg" />
      </v-list-item-avatar>
      <v-list-item-content>
        <v-list-item-title>John Leider</v-list-item-title>
      </v-list-item-content>
    </v-list-item> -->

        <!-- <v-divider></v-divider> -->

        <v-list density="compact" nav>
          <v-row>
            <v-list-item prepend-icon="mdi-view-dashboard" title="信息" value="home"></v-list-item>
            <v-list-item prepend-icon="mdi-forum" title="书中图片" value="about"></v-list-item>
            <v-list-item prepend-icon="mdi-account" title="外部资源" value="profile"></v-list-item>
            <v-list-item prepend-icon="mdi-cog" title="智能问答" value="settings"></v-list-item>
          </v-row>

        </v-list>
      </v-list>
    </v-navigation-drawer>


  </v-app>



</template>

<script>
  import { onMounted, ref } from 'vue';
  import * as pdfjsLib from 'pdfjs-dist';

  export default {
    name: 'TextbookDetail',
    data () {
      return {
        textbookId: this.$route.params.id,  // 获取教材的ID
        pdfUrl: '',  // 用于存储 PDF 文件的 URL

        //关于抽屉组件
        drawer: false, // 控制抽屉显示/隐藏状态
        drawerWidth: 600, // 抽屉宽度
      };
    },
    methods: {
      async fetchPdfUrl () {
        try {
          const response = await fetch(`http://127.0.0.1:8000/api/get_textbook_pdf/${this.textbookId}/`);
          if (!response.ok) {
            throw new Error('Failed to fetch PDF URL');
          }
          else console.log("yes")

          // const responseText = await response.text();  // 获取原始响应内容
          // console.log('Response Text:', responseText); // 输出响应内容

          const data = await response.json();
          console.log('Returned data:', data);

          this.pdfUrl = data.pdf_url;
          console.log('PDF URL:', this.pdfUrl);

          //  this.renderPdf(); //渲染PDF

        } catch (error) {
          console.error('Failed to fetch PDF URL:', error);
        }
      },
      async renderPdf() {
    if (!this.pdfUrl) return;

    const fullPdfUrl = `${this.pdfUrl}`;

    // 设置 PDF.js 的 worker 路径
    pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.10.377/pdf.worker.min.js';

    console.log("Fetching PDF from URL:", fullPdfUrl);

    const pdf = await pdfjsLib.getDocument(fullPdfUrl).promise;

    const numPages = pdf.numPages;
    console.log("PDF successfully fetched. Total pages:", numPages);

    const container = this.$refs.pdfViewerContainer;
    container.innerHTML = ''; // 清空已有内容

    for (let pageNum = 1; pageNum <= numPages; pageNum++) {
        const page = await pdf.getPage(pageNum);
        const scale = 1.5; // 缩放比例
        const viewport = page.getViewport({ scale });

        // 创建页面容器
        const pageDiv = document.createElement('div');
        pageDiv.setAttribute('id', `page-${page.pageIndex + 1}`);
        pageDiv.setAttribute('style', 'position: relative; margin-bottom: 20px;');
        container.appendChild(pageDiv);

        // 创建 Canvas 渲染图层
        const canvas = document.createElement('canvas');
        pageDiv.appendChild(canvas);
        const context = canvas.getContext('2d');
        canvas.height = viewport.height;
        canvas.width = viewport.width;

        const renderContext = {
            canvasContext: context,
            viewport: viewport,
        };

        // 渲染 Canvas 图层
        await page.render(renderContext).promise;

        // 渲染文本图层
        const textContent = await page.getTextContent();
        
        // 创建文本图层的容器
        const textLayerDiv = document.createElement('div');
        textLayerDiv.setAttribute('class', 'text-layer');
        textLayerDiv.setAttribute('style', 'position: absolute; top: 0; left: 0; width: 100%; height: 100%;');
        pageDiv.appendChild(textLayerDiv);

        // PDF.js 提供的 TextLayer 渲染文本内容
        pdfjsLib.renderTextLayer({
            textContent: textContent,
            container: textLayerDiv,
            viewport: viewport,
            textDivs: [] // 用于存放文本div元素
        });
    }
},



      //抽屉判断  
      toggleDrawer () {
        this.drawer = !this.drawer;
        console.log('按钮点击,当前状态:', this.drawer);
      },

      // 处理点击空白区域的事件
      handleOutsideClick () {
        // 这里阻止默认行为,确保点击空白区域不关闭抽屉
      },

      //占位:左侧按钮
      handleLeftButtonClick () {
        console.log("Left button clicked!"); // 左侧按钮的点击处理
      },
    },
    mounted () {
      this.fetchPdfUrl();
    }
  };
</script>

<style scoped>
  .pdf-viewer-container {
    width: 100%;
    height: 100%;
    overflow: auto;
    position: relative;
    padding: 20px;
  }

  .text-layer {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    pointer-events: none; /* 防止文本层阻挡交互 */
    z-index: 2; /* 确保文本层在 canvas 上方 */
}


  /* 调整抽屉样式 */
  .custom-drawer {
    height: 100vh;
    /* 抽屉高度占满页面 */
    background-color: #f8f9fa;
    /* 浅灰色背景 */
    border-left: 1px solid #ddd;
  }

  /* 调整按钮位置 */
  .drawer-toggle-btn {
    position: fixed;
    /* 固定定位 */
    top: 50%;
    /* 距离顶部 50% */
    right: 0;
    /* 靠页面最右边 */
    transform: translate(50%, -50%);
    /* 微调位置居中对齐 */
    z-index: 1000;
    /* 确保按钮在页面内容上方 */
    border-radius: 50%;
    width: 48px;
    height: 48px;
    box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);
    display: flex;
    justify-content: center;
    align-items: center;
  }

  /*-----------------------------------------------*/

  canvas {
    display: block;
    margin-bottom: 20px;
  }
</style>

标签:vue,console,log,URL,存档,PDFProfile,PDF,const,pdf
From: https://www.cnblogs.com/Akimizuss101/p/18588996

相关文章

  • Vue学习-watch函数的用法
    1.基本使用--侦听单个元素1.导入watch函数2.执行watch函数以及传入需要侦听的响应式数据(ref对象)和回调函数举个例子:代码示例:<scriptsetup>//导入watch函数import{ref,watch}from'vue'constcount=ref(0)constaddcount=()=>{count.value++}//调用watch......
  • vue学习-组合式API下的父子通信
    1.父传子基本思想:1;父组件给子组件绑定属性2:子组件内部通过props选项接收示例:父组件示例:子组件接收:运行代码打开浏览器,展示结果:这里看到子组件收到了父组件传过来的message成功接收并渲染出来。2.子传父基本思想:1.父组件中给子组件标签通过@绑定事件2.组组件内部......
  • 一文教你用vite创建vue3项目初始化并添加router、axios、Pinia保姆级教程
    文章目录一、什么是vite二、什么是vue3三、什么是router四、什么是axios五、什么是pinia六、详细教程1.查看nodejs版本2.使用vite最新版3.配置@指代src目录(可选)4.安装router5.引入axios6.引入pinia一、什么是viteVite是新一代的前端构建工具,在尤雨溪开发Vue3.0的......
  • 保姆级教程用vite创建vue3项目并初始化添加PrimeVue UI踩坑实录
    文章目录一、什么是PrimeVue二、详细教程1.添加PrimeVue2.配置main.js3.添加自动引入4.配置vite.config.js5.创建测试页面一、什么是PrimeVuePrimeVue是一个用于Vue.js3.x开发的一款高质量、广受欢迎的WebUI组件库。官网地址:https://primevue.org/二......
  • vue3 + TS,使用pinia,实现长连接推送数据的全局更新
    项目中经常会遇到一个长连接推送多个页面数据的情况,针对这种情况,如果每个需要推送数据的页面都写一个长连接,肯定维护起来比较麻烦,那该如何解决呢?话不多说,直接上干活。下载pinia,在maint.ts中进行导入//下载npminstallpinia//main.tsimport{createApp}from"vu......
  • 解决webstorm无法识别@等,无法ctrl跳转问题,vue项目配置
    1.1.配置webpack.config.js文件/*为了webstorm识别vite中设置的别名*/'usestrict'constpath=require('path')module.exports={context:path.resolve(__dirname,'./'),resolve:{extensions:['.js','.vue'......
  • vue3 使用 inject provide 提供全局变量 报错 [Vue warn]: inject() can only be used
    报错:vue3使用injectprovide提供全局变量报错[Vuewarn]:inject()canonlybeusedinsidesetup()orfunctionalfunctionalcomponents.场景main.js//main.js使用provide提供全局变量,做图片的urlapp.provide('imgurl','http://api.baidu.com/')pro.js......
  • VUE-UNI事件转发监听
    VUE以及uni-app如果在项目中事件转发以及监听事件在业务页面a.vue里面,调用了一个第三方接口,这个接口的回调是在项目的app.vue的onShow里面给的回调,那我现在在a.vue里面怎么处理。这个时候就需要做事件的转发,在a页面做事件的监听方法:store下边新建一个jseventBus.jsi......
  • 【SpringBoot+Vue】x-admin管理系统跟做
    技术栈前端技术说明Vue前端框架Vuex全局状态管理框架ElementUI前端UI框架Axios前端HTTP框架vue-element-admin项目脚手架后端技术说明SpringBoot容器+MVC框架MyBatisORM框架MyBatis-plusMyBatis增强工具Redis非关系型数据库Swagger接口文档框架Jwt登录校验令牌根据数据库......
  • 【期末项目】适合大学生的springboot+vue3完成中国铁路12306网站的业务实现【原创】
        ......