如何将PDF发送至Watson的文档转换服务而无需先将其写入磁盘?
我试图使用watson-developer-cloud node.js库将this document (http://www.redbooks.ibm.com/redbooks/pdfs/ga195486.pdf)转换为Watson文档转换服务中的单元。如何将PDF发送至Watson的文档转换服务而无需先将其写入磁盘?
在实际的程序(不是这个测试程序)中,我正在检索文档并将其转换,而不是先写入磁盘。我之前已经使用过其他文档,但最新版本的库(v 1.7.0)似乎已经发生了变化,它不再以我使用它的方式工作。但即使在我开始使用最新版本之前,这个特定的文档也不会转换。
我正在使用的带注释的测试代码如下。我尝试了几种方法来实现这一点,其中的变体都在var opts = {以下。您必须一次取消注释其中之一以查看结果。
'use strict';
var bluemix = require('./bluemix');
var extend=require('util')._extend;
var fs=require('fs');
var watson=require('watson-developer-cloud');
var streams = require('memory-streams');
var dcCredentials = extend({
url: '<url>',
version: 'v1',
username: '<username>',
password: '<password>'
}, bluemix.getServiceCreds('document_conversion')); // VCAP_SERVICES
var document_conversion = watson.document_conversion(dcCredentials);
var bookpdf=getBook('ga195486.pdf');
convert(bookpdf);
function getBook(filename)
{
var bl=fs.readFileSync(filename,'utf8');
return bl;
}
function convert(content)
{
var opts={ //uncomment ONE of these
// file: new Buffer(content), //See message #1 below
// file: {value: new Buffer(content), options: {}}, //see message #2 below
// file: {value: new Buffer(content), options: {contentType: "application/pdf"}}, //This used to work. See message #2 (again) below
// file: new streams.ReadableStream(content),//see message #3 below
conversion_target: "ANSWER_UNITS",
content_type:'application/pdf'
};
document_conversion.convert(opts,
function (err, response)
{
if (err)
{
console.log("Error converting doc: ", err);
}
else if (response.answer_units.length==0)
{
var msg="No answer units";
console.log(msg,response);
}
else
{
console.log('Works!');
console.dir(response);
}
}
);
}
//Message #1: This returns:
// No answer units { source_document_id: '',
// timestamp: '2016-05-23T16:18:23.825Z',
// media_type_detected: 'application/pdf',
// metadata: [],
// answer_units: [],
// warnings:
// [ { phase: 'pdf',
// warning_id: 'empty_input_to_converter',
// description: 'The input provided to the converter phase is empty or doesn\'t contain text that can be converted.' },
// { phase: 'normalized_html',
// warning_id: 'empty_input_to_converter',
// description: 'The input HTML document has no body content.' },
// { phase: 'answer_units',
// warning_id: 'empty_input_to_converter',
// description: 'The input provided to the converter phase is empty or doesn\'t contain text that can be converted.' } ] }
//Message #2: These return:
///home/david/git/ccb-contentbridge/node_modules/watson-developer-cloud/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js:33
// source.on('error', function() {});
//
//TypeError: source.on is not a function
// at Function.DelayedStream.create (/home/david/git/ccb-contentbridge/node_modules/watson-developer-cloud/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js:33:10)
// at FormData.CombinedStream.append (/home/david/git/ccb-contentbridge/node_modules/watson-developer-cloud/node_modules/request/node_modules/combined-stream/lib/combined_stream.js:43:37)
// at FormData.append (/home/david/git/ccb-contentbridge/node_modules/watson-developer-cloud/node_modules/request/node_modules/form-data/lib/form_data.js:68:3)
// at appendFormValue (/home/david/git/ccb-contentbridge/node_modules/watson-developer-cloud/node_modules/request/request.js:339:21)
// at Request.init (/home/david/git/ccb-contentbridge/node_modules/watson-developer-cloud/node_modules/request/request.js:352:11)
// at new Request (/home/david/git/ccb-contentbridge/node_modules/watson-developer-cloud/node_modules/request/request.js:142:8)
// at request (/home/david/git/ccb-contentbridge/node_modules/watson-developer-cloud/node_modules/request/index.js:55:10)
// at createRequest (/home/david/git/ccb-contentbridge/node_modules/watson-developer-cloud/lib/requestwrapper.js:134:10)
// at DocumentConversion.convert (/home/david/git/ccb-contentbridge/node_modules/watson-developer-cloud/services/document_conversion/v1.js:134:10)
// at convert (/home/david/git/ccb-contentbridge/testRedbooks.js:35:24)
//Message #3: This returns and then it hangs there:
//Error converting doc: { code: 400, error: 'Error in the web application' }
有人能告诉我我做错了什么吗?
该特定文件大于文档转换服务当前可处理的文件。不幸的是,我现在还没有很好的信息来说明现在的限制,但团队意识到这一点并正在寻求改进。
如果你能提供一个以前工作过的例子,但打破了node.js库的v1.7.0,我会看看它,希望能够提供更好的信息。
哦,并在您的fs.readfileSync()
呼叫中指定'utf8'
可能会导致您遇到的一些麻烦。
显然,我试图转换的所有红皮书文档都超出了大小限制。我没有意识到,甚至有一个大小限制,我收到的错误并没有如此表示。如果我只是使用低于兆字节左右的PDF文件,第一个选项(文件:新缓冲区(内容))似乎工作正常。 关于'utf8'参数,当我把它放在那里时,我不知道我在想什么。这不是“真正”代码的一部分,只是这个测试程序。 –
我正在看这个。你有没有在v1.7.0之前有效的例子,并且在v1.7.0之后不再有效? –