前端pdf-阅读器-3d版

这篇具有很好参考价值的文章主要介绍了前端pdf-阅读器-3d版。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、基于pdf.js、turnjs4封装的3d翻页效果pdf文件阅读器、pdf文件url拼接地址栏就可以展示、兼容pc端、H5端

二、效果展示图

三、部分源码

四、点赞关注加收藏私信我发源码(记得私信我、发邮箱哈)


一、基于pdf.js、turnjs4封装的3d翻页效果pdf文件阅读器、pdf文件url拼接地址栏就可以展示、兼容pc端、H5端

二、效果展示图

js pdf的翻页效果,3d,javascript

 js pdf的翻页效果,3d,javascript

三、部分源码

js pdf的翻页效果,3d,javascript文章来源地址https://www.toymoban.com/news/detail-842998.html

<script>
    /*定义变量参数 */
    // 定义一个空字符串变量用于存储PDF文件的URL
    var pdfurl = "";
    // 获取flipbook元素,该元素将被用来呈现翻页效果
    var flipbook = $("#flipbook");
    // 初始化当前页码为1
    var pageCurrent = 0;
    // 设置书本ID,可以根据需要进行更改
    var bid = 1;
    // 初始化缩放比例和旋转角度为1(即不缩放、不旋转)
    var scale = 1;
    var rotate = 1;
    // 初始化画布宽度和高度为空值,在后续代码中会动态设置这些值
    var canvasWidth = null;
    var canvasHeight = null;

    const getUrlParam = (name) => {
      var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
      var r = window.location.search.substring(1).match(reg); //匹配目标参数
      if (r != null) return decodeURI(r[2]);
      return null; //返回参数值
    };

    const isMobile = () => {
      // 检查用户代理是否包含“Mobi”子字符串
      return /Mobi/.test(navigator.userAgent);
    };

    const disableScroll = () => {
      // 获取当前垂直滚动位置
      let scrollTop = window.pageYOffset || document.documentElement.scrollTop;
      // 禁用默认的窗口滚动行为
      const preventDefault = (e) => {
        e.preventDefault();
      };
      // 在触摸设备上,禁用touchmove事件来防止页面滑动。
      document.body.addEventListener("touchmove", preventDefault, {
        passive: false,
      });
      //在非触摸设备上,阻止窗口滚动事件并将其替换为preventDefault函数。
      window.addEventListener("scroll", preventDefault);
      // 将body元素的样式设置为固定,并将其上一个滚动位置应用于它。
      document.body.style.position = "fixed";
      document.body.style.top = -scrollTop + "px";
    };

    const preloadPdf = async (url) => {
      const response = await fetch(url);
      const arrayBuffer = await response.arrayBuffer();
      return pdfjsLib.getDocument(arrayBuffer);
    };

    // 在页面加载时就开始预加载PDF文件
    window.addEventListener("load", async () => {
      if (getUrlParam("pdfurl") != null) {
        pdfurl = getUrlParam("pdfurl");
        getpdf(pdfurl);
        var vConsole = new VConsole();
        disableScroll();
        console.log(pdfurl);
      } else {
        alert("文件为空");
      }
    });

    const getpdf = async (url) => {
      const loadingTask = pdfjsLib.getDocument(url);
      const pdf = await loadingTask.promise;
      // 获取第一页的视图,并根据其宽度设置 flipbook 的宽度
      const firstPage = await pdf.getPage(1);
      const viewport = firstPage.getViewport({ scale: scale });
      const mobieWidth = viewport.width * 2;
      const pcWidth = viewport.width * 2;
      const pdfWidth = isMobile() ? mobieWidth : pcWidth;
      const canvasCache = {};
      // 一次性获取所有页面的canvas对象,并将其缓存起来
      for (let i = 1; i <= pdf.numPages; i++) {
        const id = "canvaspage" + i;
        const div = document.createElement("div");
        div.innerHTML = `<canvas id="${id}" class="page"></canvas>`;
        flipbook.append(div);
        const page = await pdf.getPage(i);
        const canvas = await setcanvas(page, id);
        canvasCache[id] = canvas;
      }
      // 加载turn.js并设置参数
      await new Promise((resolve) => {
        yepnope({
          test: Modernizr.csstransforms,
          yep: ["./JS/turnjs4/lib/turn.js"],
          complete: () => {
            $("#flipbook").turn({
              width: pdfWidth,
              height: viewport.height,
              elevation: 50,
              display: isMobile() ? "single" : "double",
              autoCenter: true,
              duration: 1000,
              gradients: true,
              disable: true,
              // 添加turn.js的turned事件回调函数,用于预加载相邻页面
              // 预加载相邻页面的数量可以根据实际情况调整
              turned: async function (event, page = 1) {
                console.log(event, page, "33333333333333");
                const prevPage = page - 1;
                const nextPage = page + 1;
                // 预加载当前页面的相邻页面
                if (prevPage > 0 && !canvasCache[prevPage]) {
                  const id = "canvaspage" + prevPage;
                  const div = document.createElement("div");
                  div.innerHTML = `<canvas id="${id}" class="page"></canvas>`;
                  flipbook.append(div);
                  const page = await pdf.getPage(prevPage);
                  const canvas = await setcanvas(page, id);
                  canvasCache[prevPage] = canvas;
                }
                if (nextPage <= pdf.numPages && !canvasCache[nextPage]) {
                  const id = "canvaspage" + nextPage;
                  const div = document.createElement("div");
                  div.innerHTML = `<canvas id="${id}" class="page"></canvas>`;
                  flipbook.append(div);
                  const page = await pdf.getPage(nextPage);
                  const canvas = await setcanvas(page, id);
                  canvasCache[nextPage] = canvas;
                }
                // 移除未缓存的旧页面
                const unloadPage = isMobile() ? page + 2 : page + 4;
                const unloadPage2 = isMobile() ? page - 2 : page - 4;
                if (canvasCache[unloadPage]) {
                  const canvas = canvasCache[unloadPage];
                  delete canvasCache[unloadPage];
                  canvas.parentNode.remove();
                }
                if (canvasCache[unloadPage2]) {
                  const canvas = canvasCache[unloadPage2];
                  delete canvasCache[unloadPage2];
                  canvas.parentNode.remove();
                }
              },
            });
            resolve();
          },
        });
      });

      // 预加载所有canvas对象的图像数据
      Object.values(canvasCache).forEach((canvas) => {
        const context = canvas.getContext("2d");
        const imageData = context.getImageData(
          0,
          0,
          canvas.width,
          canvas.height
        );
      });
      // 使用pdf.js库解析PDF文档并返回Promise对象,在解析完成后隐藏遮罩层。
      const response = await fetch(url);
      const arrayBuffer = await response.arrayBuffer();
      const pdfData = new Uint8Array(arrayBuffer);
      await pdfjsLib.getDocument(pdfData).promise;
      $("#overlay").hide();
    };

    const canvasCache = {};

    const setcanvas = async (page, id) => {
      const canvas = document.getElementById(id);
      const canvasRect = canvas.getBoundingClientRect();
      const isVisible =
        canvasRect.bottom > 0 &&
        canvasRect.top < window.innerHeight &&
        canvasRect.right > 0 &&
        canvasRect.left < window.innerWidth;
      if (isVisible) {
        // 如果 canvas 可见,则将其添加到缓存中
        canvasCache[id] = canvas;
      } else {
        // 如果 canvas 不可见,则从缓存中删除它
        delete canvasCache[id];
      }
      if (!canvas) {
        console.log("Canvas element with ID " + id + " not found.");
        return;
      }
      const context = canvas.getContext("2d");
      if (!context) {
        console.log("Could not get 2D context for canvas element.");
        return;
      }
      const viewport = page.getViewport({ scale: scale });
      const screenWidth = Math.min(window.innerWidth, window.innerHeight);
      const newScale = screenWidth / viewport.width;
      const newViewport = page.getViewport({ scale: newScale });
      const outputScale = window.devicePixelRatio;
      canvas.width = Math.floor(newViewport.width * outputScale);
      canvas.height = Math.floor(newViewport.height * outputScale);
      canvas.style.width = "100%";
      canvas.style.height = "100%";
      const transform =
        outputScale !== 1 ? [outputScale, 0, 0, outputScale, 0, 0] : null;
      const renderContext = {
        canvasContext: context,
        transform: transform,
        viewport: newViewport,
      };
      await page.render(renderContext).promise;
      return canvas;
    };

    $(function () {
      $(".flip_button_left").bind("click", function () {
        $("#flipbook").turn("previous");
      });
      $(".flip_button_right").bind("click", function () {
        $("#flipbook").turn("next");
      });
    });
  </script>

四、点赞关注加收藏私信我发源码(记得私信我、发邮箱哈)

到了这里,关于前端pdf-阅读器-3d版的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在VSCode中使用LaTex+(grammarly语法检测,chatgpt翻译,Sumatra PDF 轻量级pdf阅读器)

    整个文章分为以下几个内容,打 * 的是必须要安装的 latex的下载安装可参考:LaTex(2021)安装教程 VSCode下载:VSCode官网 VSCode的安装非常简单,几乎不需要什么操作 先把中文包下载下来,重启生效 下载 LaTex Workshop 下载完之后,在界面下按下 Ctrl+Shift+P,然后键入“setjson”,点

    2024年02月06日
    浏览(49)
  • irreader RSS 订阅源阅读器工具软件 - 一款强大的网络内容阅读器

    irreader 是一款强大的网络内容阅读器,不仅支持订阅 RSS 文章,还能够订阅网站、播客等内容,将众多订阅源聚合于一处,告别纷杂的互联网信息。     方便的内置订阅源 软件界面采取源列表、文章列表和内容区三栏式布局,内置的「源市场」整合多种热门订阅源,并按照互

    2024年02月01日
    浏览(35)
  • 漫画聚合阅读器Tachidesk

    今天是老苏居家隔离的第 50 天。 周三没做核酸,还以为暂时不用做了,但是周四、周五一早又是抗原又是核酸,而且间隔就半个小时; 最近 https://cdn.jsdelivr.net 访问不了了, https://unpkg.com 也是,所以老苏的博客的图片和评论都要用点特殊手段才能看到。暂时就这样吧,反正

    2024年02月06日
    浏览(34)
  • javaoop项目:书虫阅读器

    2024年02月04日
    浏览(60)
  • iOS Epub阅读器改造记录

    六个月前在这个YHEpubDemo阅读器的基础上做了一些优化,这里做一下记录。 1.首行缩进修复 由于分页的存在,新的一页的首行可能是新的一行,则应该缩进;也可能是前面一页段落的延续,这时候不应该缩进。YHEpubDemo基于XDSReader,XDSReader目前存在新页首行没有缩进的问题。

    2024年02月12日
    浏览(27)
  • 【Swift】拆分小说阅读器功能,分享内部实现

    公司项目结束了,公司估计也快黄了,年底事少,也给了我不少时间来维护博客。 公司的项目是一个类似于简书的创作平台,涵盖写作、小说、插画内容。 本期主要先下小说阅读部分,UI样式仿照的是微信读书样式,因之前也写过小说阅读器,但是代码并没有解耦,这次彻彻

    2024年01月20日
    浏览(40)
  • Dynamsoft 条形码阅读器 10.0.0 Crack

    将来自不同来源的图像数据转换为标准输入图像数据。 7月 06, 2023 - 10:32新版本 特征 SDK经过重构,与DynamsoftCaptureVision(DCV)架构集成,该架构包括: ImageSourceAdapter(ISA) - 用于将来自不同源的图像数据转换为标准输入图像数据的标准输入接口。此外,ISA还集成了一个图像

    2024年02月12日
    浏览(26)
  • 基于微信小程序的小说阅读器小程序

    小说阅读器小程序 当今时代,是信息大爆炸的时代,人们每天都能接收到数不清的各类信息,其形式不仅包含传统的文字和图片,还有视频、音频等多阅读资料源也较以往增长了太多。因此市面上各种阅读类应用的用户体验参差不齐,所以设计一个通用的阅读器,小说阅读器

    2024年01月17日
    浏览(48)
  • Koodo Reader : 一个开源免费的电子书阅读器

    今天在浏览 GitHub 的时候,偶然发现了一个非常有趣的开源项目——Koodo Reader。这个项目是一款开源免费的电子书阅读器,支持多种格式。它具有一些非常独特的功能,深深地吸引了我的注意。在接下来的内容中,我将为大家详细介绍一下这个备受关注的阅读器项目。 Koodo

    2024年01月22日
    浏览(33)
  • Xpdf 阅读器源码编译后查看文件中文乱码问题解决

    经查阅,是由于缺少中文字体包: 第一步: 下载所需要的字体包 下载https://dl.xpdfreader.com/xpdf-t1fonts.tar.gz 包含 下载中文字体包(非嵌入字体) http://ftp.gnu.org/gnu/non-gnu/chinese-fonts-truetype/gkai00mp.ttf.gz http://ftp.gnu.org/gnu/non-gnu/chinese-fonts-truetype/gbsn00lp.ttf.gz 完整包含中文字体文件如

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包