我需要从angularjs客户端向NodeJS服务发送PDF文件。 我做了angularjs服务,当我收到文件时,它的字符串如下:
%PDF-1.3
3 0 obj
<</Type /Page
/Parent 1 0 R
/Reso
如何在NodeJS中将此字符串重新转换为PDF?
这是客户端代码:
var sendByEmail = function () {
$scope.generatingPdf = true;
$('#budget').show();
var pdf = new JsPDF('p', 'pt', 'letter');
var source = $('#budget')[0];
pdf.addHTML(source, 0, 0, function () {
var resultPdf = pdf.output();
BillService.sendByEmail("rbrlnx@gmail.com", resultPdf).then(function () {
});
$('#budget').hide();
});
};
var sendByEmail = function (email, file) {
var deferred = $q.defer();
var data = {
email: email,
file: file
};
BillService.sendByEmail(data, function (result) {
deferred.resolve(result);
}, function () {
deferred.reject();
});
return deferred.promise;
};
服务器代码控制器为空:
var sendByEmail = function (req, res, next) {
var file = req.body.file;
};
答案 0 :(得分:1)
我刚刚尝试过这个,我想出了这个。从长远的角度来看,这不是生产准备,也许你发现它很有用。它没有前端库(Angular ofcourse除外),但假设您正在使用Express 4x和body-parser。
在浏览器中:
在服务器上:
您将看到一个小型节点服务器,提供静态index.html和angular文件,以及一个POST路由,它接收HTML文件读取器API提供的base64中的PDF,并将其保存到磁盘。
您可以将其作为电子邮件附件发送,而不是保存到磁盘。有关相关信息,请参阅here或here。
下面的示例假定用户通过文件输入上传PDF,但对于将文档发送到后端系统的所有其他方式,这个想法是相同的。 最重要的事情是将pdf数据作为BASE64发送,因为这是大多数文件编写者和电子邮件包使用的格式(而不是例如直接二进制文件..)。这也适用于图像,文档等。
在您的HTML中:
<div pdfs>Your browser doesn't support File API.</div>
一个名为pdfs
的指令:
myApp.directive('pdfs', ['upload', function(upload) {
return {
replace: true,
scope: function() {
files = null;
},
template: '<input id="files" type="file">',
link: function(scope,element) {
element.bind('change', function(evt) {
scope.$apply(function() {
scope.files = evt.target.files;
});
});
},
controller: function($scope, $attrs) {
$scope.$watch('files', function(files) {
//upload.put(files)
if(typeof files !== 'undefined' && files.length > 0) {
for(var i = 0; i<files.length;i++) {
readFile(files[i])
}
}
}, true);
function readFile(file) {
var reader = new FileReader();
reader.addEventListener("loadend", function(evt) {
upload.post({name: file.name, data: reader.result})
})
if(reader.type = 'application/pdf') {
reader.readAsDataURL(file);
}
}
}
}
}]);
小型服务:
myApp.service('upload', function($http) {
this.post = function(file) {
$http.post('/pdf', file);
}
});
节点服务器:
var express = require('express');
var bodyParser = require('body-parser')
var fs = require("fs");
var app = express();
app.use(express.static('.'));
app.use( bodyParser.json({limit: '1mb'}) );
app.post('/pdf', function(req, res){
var name = req.body.name;
var pdf = req.body.data;
var pdf = pdf.replace('data:application/pdf;base64,', '');
res.send('received');
fs.writeFile(name, pdf, 'base64', function(err) {
console.log(err);
});
});
var server = app.listen(3000, function() {
console.log('Listening on port %d', server.address().port);
});