尝试合并节点中的pdf文件:PDFUnite + Nodejs

我有一个关于heroku的网站,我正在使用HyPDF插件,它允许您以多种方式操纵pdf。 具体来说,我正在试图合并两个我有URL的PDF。

但是,它不工作。 我正在使用请求来拉取PDF文件,然后使用请求来调用PDFUnite。 这也是一个callback地狱,所以如果你有任何关于如何解决这个问题的build议,我会非常感激!

谢谢!

request({url: 'http://www.sesamestreet.org/cms_services/services?action=download&uid=4010e80d-9106-4824-95ab-799ec81c7fd0', encoding: null}, function(err, res, body) { var pdf1 = body; request({url: 'http://www.sesamestreet.org/cms_services/services?action=download&uid=28a388c6-ca0e-45a1-9aaf-9b6688c5a557', encoding: null}, function(err2, res2, body2){ var pdf2 = body2; request.post( 'https://www.hypdf.com/htmltopdf', { json: { user: HY_USER, password: HY_PASS, file_1: pdf1, file_2: pdf2 } }, function (error3, res3, body3) { if (!error && res2.statusCode == 200) { console.log('Public URL: ', body3.url); console.log('Number of pages: ', res3.headers['hypdf-pages']); } }); }) }); 

/ **************** UDPATED ***************** /

我已经更新了代码,使用https://gist.github.com/redfield/6724717作为指导。 不同之处在于代码示例使用了文件,而我正在使用URL。

我试图适当地修改它,但显然有些东西是closures的…如果我使用body或body.toString('base64')作为pdf1和pdf2,那么我得到一个400状态错误。 否则,如果我使用res作为pdf文件,那么我得到一个504错误。 我不确定我应该如何发送文件,所以这只是猜测和检查。 感谢帮助!

 request({url: 'http://www.sesamestreet.org/cms_services/services?action=download&uid=4010e80d-9106-4824-95ab-799ec81c7fd0', encoding: null}, function(err, res, body) { var pdf1 = body; request({url: 'http://www.sesamestreet.org/cms_services/services?action=download&uid=28a388c6-ca0e-45a1-9aaf-9b6688c5a557', encoding: null}, function(err2, res2, body2){ var pdf2 = body2; var form = new FormData(); form.append('user', HYPDF_USER); form.append('password', HYPDF_PASSWORD); form.append('test', 'true'); // form.append('bucket', 'hypdf_test'); form.append('key', 'hypdf_test.pdf'); form.append('public', 'true'); form.append('file1', pdf1); form.append('file2', pdf2); form.submit('https://www.hypdf.com/pdfunite', function(err, res) { console.log('err ', err); // res – response object (http.IncomingMessage) console.log(res.statusCode, res.resume()); }); }) }); 

更新#2我已经更新了代码结合我的代码与@remus'代码下面。 但是,我仍然在request.post行发生错误 – “无法调用方法”hasOwnProperty'null'“。 有什么想法吗?

 request({url: 'http://www.sesamestreet.org/cms_services/services?action=download&uid=4010e80d-9106-4824-95ab-799ec81c7fd0', encoding: null}, function(err, res, body) { var pdf1 = body.toString('base64'); request({url: 'http://www.sesamestreet.org/cms_services/services?action=download&uid=28a388c6-ca0e-45a1-9aaf-9b6688c5a557', encoding: null}, function(err2, res2, body2){ var pdf2 = body2.toString('base64'); var form = new FormData(); form.append('user', HY_UN); form.append('password', HY_PASS); form.append('public', 'true'); form.append('file1', fs.createReadStream(pdf1)); form.append('file2', fs.createReadStream(pdf1)); request.post({ url: 'https://www.hypdf.com/pdfunite', formData: form }, function(e, r, body) { // body should be the binary result of the merged .pdf console.log('e', e); console.log('body', body); }); }) }); 

更新3

request.post错误堆栈 – 我已经尝试了一些东西,无法摆脱它。 有什么想法吗?

 TypeError: Cannot call method 'hasOwnProperty' of null at appendFormValue (/node_modules/request/request.js:340:17) at Request.init (/node_modules/request/request.js:354:11) at new Request (/node_modules/request/request.js:140:8) at request (/node_modules/request/index.js:55:10) at Function.post (/node_modules/request/index.js:63:12) **at Request._callback (/server/api/emailInvoice/emailInvoice.controller.js:34:12)** at Request.self.callback (/node_modules/request/request.js:198:22) at Request.emit (events.js:98:17) at Request.<anonymous> (/node_modules/request/request.js:1073:14) at Request.emit (events.js:117:20) at IncomingMessage.<anonymous> (/node_modules/request/request.js:1019:12) at IncomingMessage.emit (events.js:117:20) at _stream_readable.js:929:16 at process._tickCallback (node.js:419:13) 

首先,主要的问题是你正在尝试在你的上一个POST请求中POST二进制数据(.pdf)作为JSON。 我想这是不行的 – 也许它期望多部分文件数据? 其次,一个简单的方法来修复你的callback地狱是使用节点asynchronous :

 var request = require('request'); var async = require('async'); async.parallel(function(callback) { pdf1: function(callback) { request.get({ url: 'http://www.sesamestreet.org/cms_services/services?action=download&uid=4010e80d-9106-4824-95ab-799ec81c7fd0' }, function(err, r, body) { callback(err, body); }); }, pdf2: function(callback) { request.get({ url: 'http://www.sesamestreet.org/cms_services/services?action=download&uid=28a388c6-ca0e-45a1-9aaf-9b6688c5a557' }, function(err, r, body) { callback(err, body); }); }, function(err, results) { var formData = { user: HY_USER, password: HY_PASS, file_1: fs.createReadStream(results.pdf1), file_2: fs.createReadStream(results.pdf2) } request.post({ url: 'https://www.hypdf.com/pdfunite', formData: formData }, function(e, r, body) { // body should be the binary result of the merged .pdf }); }); }); 

注意二进制数据stream中的fs.createReadStream以及使用pdfunite的正确URL。

您可能还想查看hypdf NPM模块 – 我没有对它进行testing,但它可能比手动构build请求更容易。

**** ****更新

问题是使用FormData()。 由于某种原因,request.post不喜欢它。 我也能够通过将请求stream直接注入到表单中来删除callback。 另外请注意,您必须将编码设置为空。

  var finalpdf; var formData = { 'user': HY_USER, 'password': HY_PASSWORD, 'test': 'true', 'public': 'true', 'file1': request({url: 'http://www.sesamestreet.org/cms_services/services?action=download&uid=4010e80d-9106-4824-95ab-799ec81c7fd0', encoding: null}), 'file2': request({url: 'http://www.sesamestreet.org/cms_services/services?action=download&uid=28a388c6-ca0e-45a1-9aaf-9b6688c5a557', encoding: null}) } request.post({url: 'https://www.hypdf.com/pdfunite', encoding: null, formData: formData}, function(err, res3, body3){ finalPdf = body3.toString('base64'); });