【发布时间】:2022-12-15 01:51:41
【问题描述】:
我正在为 OCR 处理器使用 Google Cloud Document AI,并且随机遇到代码 3“不支持的输入文件格式”。错误。
我可以提交同一个文件 5 次,而这个错误可能会在 5 次中出现 1-2 次。其他时候,处理器完全按预期工作。
我正在使用在线处理器端点,并且正在使用 PDFBox 将较大的 pdf 分成 10 个块。我已经进行了检查以验证发送到 Document AI 的 pdf 是否出错或没有损坏或任何东西。我已尽我所能确保我这边没有任何问题,一切都指向 Document AI 上的某些内容。我已经研究了这个错误,但没有发现可能发生的事情。有任何想法吗?
编辑: 一些附加信息……这是我用来将 PDF 分成 10 页的组的 PDFBox 代码:
File file = new File(doc);
PDDocument document = Loader.loadPDF(file);
Splitter splitter = new Splitter();
splitter.setSplitAtPage(pageSplits);
List<PDDocument> splittedList = splitter.split(document);
List<String> base64List = new ArrayList<String>();
for (PDDocument listDoc : splittedList) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
listDoc.save(baos);
String base64String = Base64.getEncoder().encodeToString(baos.toByteArray());
base64List.add(base64String);
listDoc.close();
}
System.out.println("{\"pages\":" + document.getNumberOfPages() + ", \"pdfs\":[" + wrapWithQuotesAndJoin(base64List)+ "]}");
document.close();
我从来没有对它产生的输出有任何问题。就像我上面说的,每当我从任何输出数组中收到“不支持的输入文件格式”错误时,我都会将 base64 转换并保存到磁盘以检查是否损坏,并且文件永远不会损坏。
我发送到 Document AI 的代码:
const location = 'us';
...
const name = `projects/${projectId}/locations/${location}/processors/${processorId}`;
const keys = require('./google-service-account-credentials.json');
// Instantiates a client
const client = new DocumentProcessorServiceClient({
authClient: new JWT({
email: keys.client_email,
key: keys.private_key,
scopes: ['https://www.googleapis.com/auth/cloud-platform'],
})
});
...
const output = await exec('java -jar ./docSplitter.jar '+ '"'+filePath.replace(/\&/g, "\\$&")+'"', {maxBuffer: 1000000000}); // 1GB buffer
let pages = JSON.parse(output.stdout);
const numSplits = Math.ceil(pages.pages / 10);
...
for(let i=0; i<numSplits; i++) {
const request = {
name,
rawDocument: {
content: output.pdfs[i],
mimeType: 'application/pdf',
},
};
try {
const [result] = await client.processDocument(request);
console.log("processDocument complete "+i)
}
catch(e) {
// THIS IS WHERE THE ERROR IS BEING CAUGHT
// THE CODE BELOW SAVES THE 'FAILED' CHUNK AND IS NEVER CORRUPT
fs.writeFileSync("failedChunk.pdf", json.pdfs[i], 'base64');
}
}
【问题讨论】:
-
你能分享你使用的代码 sn-p 吗?拆分可能会增加内容损坏的风险。也许尝试另一个图书馆来拆分 pdf 或考虑发送批量请求,如果是一个文档,因为它一次支持 200 页。
-
我可以为此请求一个示例文件吗?您也可以为此提供复制步骤吗? @Yannick 提到的 Python 客户端库和代码 sn-ps。
-
我实际上也遇到过几次这个问题。您能否提供您用于发送文档和示例文件的代码?如果您有操作 ID,那也会有所帮助。
-
@HoltSkinner 我添加了拆分代码和提交代码的代码示例。我无法提供 pdf 示例,因为文档不是公开的,但我使用的文件是 3145 页。
标签: google-cloud-platform cloud-document-ai