Как получить правильные данные ответа от сервера nodejs в браузере

я впервые задаю вопрос здесь. По сути, я хочу экспортировать pdf-файл с японскими символами из браузера с помощью PdfKit (клиентская сторона). Итак, мне нужно отправить файл шрифта с сервера на клиент с помощью буфера. Вот мой код... все это использует node.js с экспрессом:

Серверная часть (Nodejs):

function download_font(req, res) {
var fontpath = path.join(__dirname, 'kochi-gothic-subst.ttf');
fs.readFile(fontpath, function(err, content) {
    if (err) {  // If we couldn't read the file for some reason
        res.writeHead(404, {    // Send a 404 Not Found status
            "Content-Type": "text/plain; charset=UTF-8"});
        res.write(err.message); // Simple error message body
        res.end();              // Done
    }
    else {      // Otherwise, if the file was read successfully.
        res.writeHead(200,  // Set the status code and MIME type
                           {"Content-Type": 'application/octet-stream'});
        res.write(content); // Send file contents as response body
        res.end();          // And we're done
    }
});

Запрос со стороны клиента с использованием javascript:

$.get("/log/font").done(function( data ) {
        var blob = new Blob([data], { type: 'application/octet-stream' });

        var doc = new PDFDocument();
        var stream = doc.pipe(blobStream());

        doc.font(blob).fontSize(25).text('武大郎',100, 100);
        doc.end();

        stream.on('finish', function() {
            blob = stream.toBlob('application/pdf');
            var url = window.URL || window.webkitURL;
            var link = document.createElement('a');
            link.href = url.createObjectURL(blob);
            link.download = 'test.pdf';

            var event = document.createEvent("MouseEvents");
            event.initEvent("click", true, false);
            link.dispatchEvent(event);
        }); 
    });

Но при запуске браузера отображается сообщение об ошибке: Uncaught Error: не поддерживается формат шрифта или стандартный шрифт PDF.

Поэтому я проверяю данные о размере с сервера и клиента. Вот мой код для проверки размера файла:

*$.get("/log/font").done(function( data ) {
        //alert( "Data Loaded: " + data );

        var blob = new Blob([data], { type: 'application/octet-stream' });
        var url  = window.URL || window.webkitURL;
        var link = document.createElement('a');
        link.href = url.createObjectURL(blob);
        link.download = 'kochi-gothic-subst.ttf';

        var event = document.createEvent("MouseEvents");
        event.initEvent("click", true, false);
        link.dispatchEvent(event);
    });

Я вижу два файла не равны. Кто-нибудь может помочь мне экспортировать pdf с японскими символами со стороны браузера?


person user3643255    schedule 16.05.2014    source источник


Ответы (1)


Я думаю, что ошибка в том, что вы передаете объект Blob, где требуется буферный объект.

Попробуйте преобразовать данные, возвращаемые вашим вызовом ajax, в буфер массива с помощью функции str2ab здесь: http://updates.html5rocks.com/2012/06/How-to-convert-ArrayBuffer-to-and-from-String

Затем передайте это в свою функцию doc.font().

На стороне сервера вы можете попробовать использовать экспресс-промежуточное ПО для обслуживания файла статического шрифта (для упрощения):

app.use(express.static(__dirname + '/public'));

Поместите шрифт в общедоступный каталог и запросите оттуда.

person Vinnie Pepi    schedule 16.05.2014
comment
Спасибо за ответ, Винни Пепи, но это все еще не работает. - person user3643255; 20.05.2014