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

使用pdfjs-dist将PDF转PNG丢失数据的问题求助

PDF转PNG内容丢失的解决办法

我在应用中使用pdfjs-dist结合NodeCanvasFactory实现PDF转PNG,但转换后生成的图片完全空白,所有内容丢失。代码实现如下:

class NodeCanvasFactory {
  create(w, h) {
    if (!w || !h) {
      throw new Error('invalid canvas size');
    }
    const canvas = Canvas.createCanvas(w, h);
    return {
      canvas,
      context: canvas.getContext('2d'),
    };
  }
}
static async toPNG(document, pageNum)
{
    return new Promise((resolve, reject) => {
      document.getPage(pageNum).then((page) => {
        const viewport = page.getViewport({
          scale: 1.0,
        });
        const factory = new NodeCanvasFactory();
        const data = factory.create(viewport.width, viewport.height);
        page.render({
          canvasFactory: factory,
          canvasContext: data.context,
          viewport,
        }).promise.then(() => resolve({
          page: pageNum,
          width: viewport.width,
          height: viewport.height,
          buffer: data.canvas.toBuffer(),
        })).catch(e => reject(e));
      }).catch(e => reject(e));
    });
  }

输入输出情况

  • 输入PDF的可视化内容:输入PDF内容
  • 转换后得到的空白PNG:转换后空白PNG

修复方案

1. 移除冲突的canvasContext配置

page.render()方法中,当传入canvasFactory时,不需要手动指定canvasContext——pdfjs会通过工厂自动创建并使用画布上下文,手动传入会导致渲染目标混乱,无法正确绘制内容。

2. 完善NodeCanvasFactory的实例管理

原工厂没有保存创建的画布实例,需要在类中添加属性记录,方便后续获取渲染后的画布:

class NodeCanvasFactory {
  constructor() {
    this.canvas = null;
  }
  create(w, h) {
    if (!w || !h) {
      throw new Error('invalid canvas size');
    }
    this.canvas = Canvas.createCanvas(w, h);
    return {
      canvas: this.canvas,
      context: this.canvas.getContext('2d'),
    };
  }
}

3. 简化toPNG方法逻辑

改用async/await替代嵌套Promise写法,避免回调嵌套带来的错误:

static async toPNG(document, pageNum) {
  const page = await document.getPage(pageNum);
  const viewport = page.getViewport({ scale: 1.0 });
  const factory = new NodeCanvasFactory();
  
  await page.render({
    canvasFactory: factory,
    viewport,
  }).promise;

  return {
    page: pageNum,
    width: viewport.width,
    height: viewport.height,
    buffer: factory.canvas.toBuffer(),
  };
}

4. 检查依赖兼容性

确保pdfjs-dist(建议3.x+)和canvas库版本匹配当前Node.js环境,若有依赖问题,执行npm rebuild canvas重新编译画布依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:52:49