当前位置: 首页 > 知识库问答 >
问题:

前端 - PDF.js 转 canvas 页面不平铺的问题?

姬英耀
2023-12-03

使用PDF.js 转成canvas放到页面上不会平铺
目前效果是:
image.png

期望实现的效果:
image.png
请问各位社区大佬应该怎么去解决?

function renderPage(num: number) {  pdfDoc.getPage(num).then((page: any) => {    const canvas: any = document.getElementById(`pdfSource${num}`)    const ctx = canvas.getContext('2d')    const dpr = window.devicePixelRatio || 1    const bsr =      ctx.webkitBackingStorePixelRatio ||      ctx.mozBackingStorePixelRatio ||      ctx.msBackingStorePixelRatio ||      ctx.oBackingStorePixelRatio ||      ctx.backingStorePixelRatio ||      1    const ratio = dpr / bsr    const viewport = page.getViewport({ scale: state.pdfScale })    canvas.width = viewport.width    canvas.height = viewport.height    state.pdfWidth = `${viewport.width}px`    ctx.setTransform(ratio, 0, 0, ratio, 0, 0)    // 将 PDF 页面渲染到 canvas 上下文中    const renderContext = {      canvasContext: ctx,      viewport    }    page.render(renderContext)  })}

目前代码是这样的缩放倍率为1

  • pdf.js的版本是3.2.146
  • vue3+ts+vite

共有1个答案

方波娃
2023-12-03

在创建时 给canvas一个固定宽,渲染后再为这个canvas设置样式width:100%即可解决。

function createTargeCanvas(num) {  let targetContainer = document.getElementById('target')  let canvas = document.createElement('canvas')  canvas.id = 'target' + num  canvas.width = 770  targetContainer?.appendChild(canvas)}
function loadFileTarget(url: string) {  PDF.getDocument(url).promise.then((p: any) => {    pdfDoc = p    const { numPages } = p    state.pdfPages = numPages    targetTotal.value = numPages    CreateCanvasTarget(state.pdfPages)    for (let i = 1; i <= state.pdfPages; i++) {      let canvas = document.getElementById(`target${i}`)      canvas!.style.width = '100%'    }    for (let i = 1; i <= state.pdfPages; i++) {      renderPageTarget(i)    }  })}
 类似资料:
  • 页面布局代码如下,第一次打开页面Column里三个组件是紧挨着的,零点几秒后才MainAxisAlignment.spaceBetween分开,时间虽然不是很久但是肉眼还是可见的有点延迟,请问是因为什么原因?

  • 我正在编程一个小游戏,它是基于瓷砖的。但当我渲染它的时候,有时那些瓷砖之间的一个小空间是可见的,(绿色)背景是暴露的(可以在视频中看到)。 我想知道,是否有一些双缓冲技术,可以解决这个bug,但我读到,双缓冲已经实现了。

  • 将数组平铺到指定的深度。 使用递归,为每个深度级别 depth 递减 1 。 使用 Array.reduce() 和 Array.concat() 来合并元素或数组。 基本情况下,depth 等于 1 停止递归。 省略第二个参数,depth 只能平铺到 1 (单层平铺) 的深度。 const flatten = (arr, depth = 1) => depth != 1 ? arr.

  • 1、变量提升,let,const,var,暂时性死区 2、函数是否存在变量提升? 3、react组件间通信 4、防抖,节流 5、浏览器跨域,跨域产生的原因,怎么解决? 6、浏览器存储,cookie,sessionstorage,localstorage的区别和应用场景? 7、[]==![]输出? 8、其他几道输出题 9、水平垂直居中方法 10、判断数据类型的方法?instanceof和typeof

  • A,B两个系统,用的token是一样的,但是两个前端不在同一服务器上,怎样让B页面能获取到A页面的Cookie,即A系统登录后,通过iframe访问B系统不需要再次登录,实现一个单点登录的效果,由于某些原因,不可以在iframe的src中携带token信息。 目前的想法是想让B系统能获取A系统存在Cookie中的token信息,但是存在跨域问题,不能获取到,有办法实现吗?尝试了利用nginx配置转

  • 前端面试 你可能被问到的问题: 前端工作面试问题 前端开发面试问题 每个 JavaScript 开发者应该知道的 10 个面试问题 前端测验 JavaScript 测验 你可以问的问题: 一个开源的开发人员可以向潜在雇主提问的问题列表 译者补充: 前端开发面试题大收集 前端开发面试问题及答案整理 收集的前端面试题和答案 写给前端面试者 Awesome Interviews