You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Canvas多视角(前后左右)截图并将图片整合导出为PDF

Canvas多视角截图合并PDF实现方案

核心实现流程

分为三个核心环节:视角切换控制、多视角异步采集、多图合并导出PDF。

1. 视角切换逻辑

你需要先确定当前Canvas使用的渲染框架,以常用的Three.js 3D场景为例,前后左右四个视角对应相机沿Y轴分别旋转0°、90°、180°、270°,每次切换视角后需要等待场景渲染完成再执行截图操作,避免捕获到未渲染完成的帧。
提前定义好四个视角的配置:

// 四个视角对应的Y轴旋转弧度
const viewAngles = [0, Math.PI / 2, Math.PI, Math.PI * 3 / 2]
// 存储所有采集到的视角图片base64
const viewImages = []

2. 多视角异步采集

因为视角切换和渲染都是异步操作,不能用同步循环采集,需要封装异步采集逻辑保证顺序执行:

// 单视角截图函数,返回Promise保证异步执行顺序
function captureSingleView() {
  return new Promise((resolve) => {
    // 等待浏览器下一帧渲染完成后再截图
    requestAnimationFrame(() => {
      const canvas = document.getElementsByTagName("canvas")[0]
      // 第二个参数为导出PNG的质量,范围0-1,可按需调整
      const imgBase64 = canvas.toDataURL("image/png", 0.9)
      resolve(imgBase64)
    })
  })
}

// 批量采集四个视角
async function captureAllViews() {
  viewImages.length = 0
  for (let i = 0; i < viewAngles.length; i++) {
    // 此处替换为你的项目实际的视角切换逻辑
    // 如果是Three.js场景且用OrbitControls控制视角,写法如下:
    camera.rotation.y = viewAngles[i]
    controls.update()
    // 等待当前视角截图完成再切换下一个
    const currentImg = await captureSingleView()
    viewImages.push(currentImg)
  }
  // 全部采集完成后生成PDF
  generatePDF()
}

3. 多图合并生成PDF

图片合并需要用到前端PDF处理库jsPDF,你可以提前将该库的UMD格式离线包引入到项目中,无需额外后端支持。
PDF生成逻辑示例:

function generatePDF() {
  const { jsPDF } = window.jspdf
  // 初始化PDF:纵向排版、单位pt、尺寸为A4
  const doc = new jsPDF('p', 'pt', 'a4')
  const pageWidth = doc.internal.pageSize.getWidth()
  const pageHeight = doc.internal.pageSize.getHeight()
  // 自定义边距
  const padding = 20
  // 单张图片的宽高,四图纵向排列在同一页的计算方式
  const imgWidth = pageWidth - padding * 2
  const imgHeight = (pageHeight - padding * 5) / 4

  for (let i = 0; i < viewImages.length; i++) {
    // 计算每张图的纵向位置
    const imgY = padding + i * (imgHeight + padding)
    doc.addImage(viewImages[i], 'PNG', padding, imgY, imgWidth, imgHeight)
    // 如果需要每个视角单独占一页,替换为以下逻辑:
    // doc.addImage(viewImages[i], 'PNG', padding, padding, imgWidth, pageHeight - padding * 2)
    // if (i !== viewImages.length - 1) doc.addPage()
  }
  // 导出PDF文件
  doc.save('车棚多视角图纸.pdf')
}

4. 修改触发逻辑

替换你原来的点击事件绑定即可:

document.getElementById('save').onclick = () => {
  captureAllViews()
}

注意事项

  • 如果你使用的不是Three.js框架,只需替换视角切换部分的代码为项目当前的视角控制逻辑即可
  • 如果Canvas加载了跨域纹理资源,需要提前给资源配置跨域响应头,否则toDataURL会触发安全报错
  • 若导出的图片模糊,可调整toDataURL的质量参数,或导出2倍分辨率的Canvas后再缩放到PDF中

内容的提问来源于stack exchange,提问作者Hueytown hhsales

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:24:06