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

在Google Cloud Functions处理PDF时遇spawn pdftotext ENOENT错误的解决方法

解决Google Cloud Functions中使用pdf-text-extract时的pdftotext缺失问题

你猜的没错——这个spawn pdftotext ENOENT错误就是因为Google Cloud Functions的默认运行环境里没有预装pdftotext工具,而pdf-text-extract这个Node.js包底层完全依赖它来完成PDF文本提取。下面给你两种可行的解决思路,按需选择:

方法一:改用纯JavaScript的PDF解析库(推荐)

这种方法不需要依赖任何外部系统工具,更适合Serverless环境(冷启动更快,部署更简单)。比如用pdf-parse这个包,它完全用JS实现PDF解析。

步骤如下:

  1. 安装依赖:
npm install pdf-parse
  1. 修改你的代码,替换原来的pdf-text-extract调用逻辑:
const pdfParse = require('pdf-parse');
const fs = require('fs');
// 保留你原来的gcs、path、os相关代码...

return gcsBucket.file(name).download({ destination: tempFilePath })
  .then(() => {
    // 读取本地临时文件并解析
    return pdfParse(fs.readFileSync(tempFilePath))
      .then(parsedData => {
        // parsedData.text是提取到的完整文本
        // 如果需要按页拆分,可以进一步处理(pdf-parse默认返回全文,若需分页可考虑pdfjs-dist)
        resolve(parsedData.text.split('\n'));
      })
      .catch(err => reject(err));
  });

方法二:在Cloud Functions环境中安装pdftotext

如果你不想修改现有代码逻辑,可以通过自定义构建步骤在Cloud Functions的运行环境中安装pdftotext(它属于poppler-utils包的一部分)。

步骤如下:

  1. 在你的函数项目根目录创建一个名为install_pdftotext.sh的脚本文件,内容:
#!/bin/bash
apt-get update && apt-get install -y poppler-utils
  1. 修改package.json,添加preinstall脚本,让部署时自动执行安装:
{
  "scripts": {
    "preinstall": "bash install_pdftotext.sh"
  }
}

部署时,Cloud Functions的构建环境会自动运行这个脚本,安装所需的工具。不过要注意,这会增加部署时间和冷启动时间,因为每次冷启动可能需要重新依赖环境缓存完成安装。


你的原始代码:

const extract = require('pdf-text-extract') 
... 
const gcsBucket = gcs.bucket(bucket) 
const tempFilePath = path.join(os.tmpdir(), path.basename(name)) 
return gcsBucket.file(name).download({ destination: tempFilePath }) 
.then(() => { 
  return new Promise((resolve, reject) => { 
    extract(tempFilePath, (err, pages) => { 
      if (err) return reject(err) 
      // I think it fails here 
      return resolve(pages) 
    }) 
  }) 
})

报错信息:

Error: spawn pdftotext ENOENT 
at exports._errnoException (util.js:1020:11) 
at Process.ChildProcess._handle.onexit (internal/child_process.js:197:32) 
at onErrorNT (internal/child_process.js:376:16) 
at _combinedTickCallback (internal/process/next_tick.js:80:11) 
at process._tickDomainCallback (internal/process/next_tick.js:128:9)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:40:57