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

TypeScript(NestJS)中pdf-to-img报错:esModule() is not a function及替代方案咨询

问题解决与替代方案

先解决pdf-to-img的报错

TypeError: esModule() is not a function 通常是ES模块与CommonJS模块互操作导致的,可按以下步骤排查:

  • 检查导入方式:确保正确导入库,尝试两种写法:
    import pdfToImg from 'pdf-to-img';
    // 或
    import * as pdfToImg from 'pdf-to-img';
    
  • 调整TypeScript配置:在tsconfig.json中设置module: "ESNext"或"CommonJS",同时确保moduleResolution对应为"NodeNext"或"Node"。
  • 调整库版本:执行npm install pdf-to-img@latest更新到最新稳定版,或尝试降级到已知兼容版本(如v2.1.0)。

无需额外系统依赖的替代方案

方案1:pdfjs-dist + canvas

基于Mozilla官方PDF解析库pdfjs-dist,配合canvas实现PDF转图片,无需额外安装系统级依赖(canvas会预编译二进制包适配多数环境)。

安装依赖

npm install pdfjs-dist canvas
npm install -D @types/pdfjs-dist @types/canvas

示例代码

import * as pdfjsLib from 'pdfjs-dist';
import * as pdfjsWorker from 'pdfjs-dist/build/pdf.worker.entry';
import { createCanvas } from 'canvas';

// 设置PDF worker路径
pdfjsLib.GlobalWorkerOptions.workerSrc = pdfjsWorker;

async convertPdfToImages(pdfBuffer: Buffer): Promise<Buffer[]> {
  const pdfDoc = await pdfjsLib.getDocument({ data: pdfBuffer }).promise;
  const imageBuffers: Buffer[] = [];

  // 遍历每一页生成图片
  for (let pageNum = 1; pageNum <= pdfDoc.numPages; pageNum++) {
    const page = await pdfDoc.getPage(pageNum);
    // 设置缩放比例,值越大图片越清晰(按需调整)
    const viewport = page.getViewport({ scale: 2.0 });

    // 创建Canvas实例
    const canvas = createCanvas(viewport.width, viewport.height);
    const ctx = canvas.getContext('2d');

    // 渲染PDF页面到Canvas
    await page.render({
      canvasContext: ctx,
      viewport: viewport
    }).promise;

    // 将Canvas转为PNG Buffer
    imageBuffers.push(canvas.toBuffer('image/png'));
    // 清理页面资源
    page.cleanup();
  }

  return imageBuffers;
}

注意事项

  • 若TypeScript编译时报类型冲突,可在tsconfig.json中添加"skipLibCheck": true。
  • 可通过调整scale参数控制图片清晰度与文件大小的平衡。

方案2:pdf-image-converter

这是基于pdfjs-dist封装的轻量级库,API更简洁,同样无需系统依赖。

安装依赖

npm install pdf-image-converter
npm install -D @types/pdf-image-converter

示例代码

import { convert } from 'pdf-image-converter';

async convertPdfToImages(pdfBuffer: Buffer): Promise<Buffer[]> {
  // 第二个参数为缩放比例,第三个参数指定输出格式为PNG
  const imageBuffers = await convert(pdfBuffer, 2.0, 'png');
  return imageBuffers;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 09:25:09