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
相关产品推荐
相关产品推荐

