将PDF文件从AngularJS发送到NodeJS

时间:2014-07-03 10:19:22

标签: node.js angularjs

我需要从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;

 };

1 个答案:

答案 0 :(得分:1)

我刚刚尝试过这个,我想出了这个。从长远的角度来看,这不是生产准备,也许你发现它很有用。它没有前端库(Angular ofcourse除外),但假设您正在使用Express 4x和body-parser。

结果:

在浏览器中:

enter image description here

在服务器上:

enter image description here

您所看到的内容:

您将看到一个小型节点服务器,提供静态index.html和angular文件,以及一个POST路由,它接收HTML文件读取器API提供的base64中的PDF,并将其保存到磁盘。

您可以将其作为电子邮件附件发送,而不是保存到磁盘。有关相关信息,请参阅herehere

下面的示例假定用户通过文件输入上传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);
});