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

如何获取Cloud Vision API处理PDF后的GCS结果文件名?

如何获取Cloud Vision API异步PDF文本检测的结果文件名?

我尝试用Cloud Vision API检测PDF文本,把结果存到Google Cloud Storage里,但调用asyncBatchAnnotateFiles后返回的destinationUri只到目录,没有具体的文件名。比如我设置的gcsDestinationUri是gs://my-bucket/index/,返回的destinationUri是gs://my-bucket/index,但实际生成的文件是output-1-to-1.json。我检查了operation和filesResponse对象,都没找到文件名,该怎么解决?

这个问题我之前也碰到过,Vision API的异步批量标注确实不会直接返回具体的结果文件名,不过有两种靠谱的解决方法:

方法1:利用Vision API固定的结果文件名规则

Vision API对异步批量标注的结果文件有固定的命名格式:output-{起始页码}-to-{结束页码}.json。

  • 如果你的PDF只有1页,那结果文件名就是output-1-to-1.json
  • 如果PDF有多页,API默认会按每20页一个批次拆分生成文件(可以通过请求里的batchSize参数自定义批次大小),比如1-20页对应output-1-to-20.json,21-40页对应output-21-to-40.json,以此类推。

你可以直接根据这个规则拼接出完整的GCS路径:

// 单页PDF的情况
const fullResultUri = `${destinationUri}/output-1-to-1.json`;
console.log('完整结果文件路径:', fullResultUri);

如果是多页PDF,你可以先通过PDF解析工具(比如pdf-parse)获取总页数,再结合批次大小计算出所有可能的文件名。

方法2:调用GCS API列出结果目录下的文件

如果不想依赖命名规则,更稳妥的方式是直接调用Google Cloud Storage的API,列出你指定的结果目录下的所有文件,筛选出JSON格式的结果文件。

首先确保安装了@google-cloud/storage库:

npm install @google-cloud/storage

然后修改你的代码,在异步操作完成后添加文件列表查询逻辑:

const vision = require('@google-cloud/vision').v1;
const {Storage} = require('@google-cloud/storage');

// 初始化客户端
const visionClient = new vision.ImageAnnotatorClient();
const storageClient = new Storage();

async function processPDFAndGetResultFiles() {
  const bucketName = '你的存储桶名称';
  const fileName = '待处理的PDF文件名.pdf';
  const outputPrefix = 'index';
  
  const gcsSourceUri = `gs://${bucketName}/${fileName}`;
  const gcsDestinationUri = `gs://${bucketName}/${outputPrefix}/`;

  const inputConfig = {
    mimeType: 'application/pdf',
    gcsSource: { uri: gcsSourceUri },
  };
  const outputConfig = {
    gcsDestination: { uri: gcsDestinationUri },
  };
  const features = [{type: 'DOCUMENT_TEXT_DETECTION'}];
  
  const request = {
    requests: [
      { inputConfig, features, outputConfig },
    ],
  };

  // 发起异步标注请求
  const [operation] = await visionClient.asyncBatchAnnotateFiles(request);
  const [filesResponse] = await operation.promise();
  const destinationUri = filesResponse.responses[0].outputConfig.gcsDestination.uri;
  
  // 解析存储桶和前缀路径
  const [bucketPath, ...prefixParts] = destinationUri.replace('gs://', '').split('/');
  const prefix = prefixParts.join('/') + '/';

  // 列出存储桶中匹配前缀的文件
  const [files] = await storageClient.bucket(bucketName).getFiles({prefix});
  
  // 筛选出JSON结果文件
  const resultFiles = files.filter(file => file.name.endsWith('.json'));
  
  console.log('生成的结果文件路径如下:');
  resultFiles.forEach(file => {
    console.log(`gs://${bucketName}/${file.name}`);
  });
}

// 执行函数
processPDFAndGetResultFiles().catch(err => {
  console.error('处理过程出错:', err);
});

这样就能准确获取到所有生成的结果文件名了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:47:37