如何获取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
相关产品推荐
相关产品推荐

