2017-02-21 7 views
2

Я использую библиотеку pdfmake для создания PDF-документов в своем экспресс-приложении узла и хочу, чтобы они были отправлены прямо назад клиенту, чтобы заставить браузер автоматически загружать файл.Обслуживание содержимого в формате PDF в браузере с помощью узла Express с помощью pdfMake

В качестве ориентира я использую следующие примеры для моего прямого промежуточного слоя:

https://gist.github.com/w33ble/38c5e0220d491148de1c https://github.com/bpampuch/pdfmake/issues/489

Я выбрал для отправки буферного ответа обратно, поэтому ключевая часть моего промежуточного слоя выглядит это:

function createPDFDocument(docDefinition, callback) { 
    var fontDescriptors = { 
    Roboto: { 
     normal: './src/server/fonts/Roboto-Regular.ttf', 
     bold: './src/server/fonts/Roboto-Medium.ttf', 
     italics: './src/server/fonts/Roboto-Italic.ttf', 
     bolditalics: './src/server/fonts/Roboto-MediumItalic.ttf' 
    } 
    }; 

    var printer = new Printer(fontDescriptors); 
    var pdfDoc = printer.createPdfKitDocument(docDefinition); 

    // buffer the output 
    var chunks = []; 

    pdfDoc.on('data', function(chunk) { 
    chunks.push(chunk); 
    }); 
    pdfDoc.on('end', function() { 
    var result = Buffer.concat(chunks); 
    callback(result); 
    }); 
    pdfDoc.on('error', callback); 

    // close the stream 
    pdfDoc.end(); 

} 

В моем угловом приложении я использую службу $ ресурсов и конечная точка определяется следующим образом:

this.resource = $resource('api/document-requests/', 
    null, 
    <any>{ 
     'save': { 
      method: 'POST', 
      responseType: 'arraybuffer' 
     } 
}); 

Когда я пытаюсь это, я не получаю любой браузер скачать ноги в, ответ я получаю выглядит следующим образом при поиске в Chrome:

enter image description here

И заголовки ответа следующим образом:

enter image description here

Так что, похоже, я не миллион миль, я искал вокруг и нашел решения, упоминающие о преобразовании в бл ob, но я думаю, что это имеет значение только в том случае, если я возвращаю строку с кодировкой Base64 в документе.

Может кто-нибудь предложить, что может быть моей проблемой здесь?

Благодаря

+0

Я нашел способ на самом деле, но я должен был использовать phantomjs Pdf особенность – akinjide

ответ

0

Все кажется хорошо для меня, единственное, что отсутствует логика, чтобы инициировать загрузку.

Отметьте это CodePen в качестве примера.

Здесь я использую base64 кодированные данные, но вы можете просто использовать двоичные данные, а также, только не забудьте изменить href, где я упоминаю scope.dataURL = base64....

0

Я имел вопрос обслуживания PDF файлов из Node.js, поэтому я использовал фантомы. Вы можете проверить это repository для полной кодовой базы и реализации.

console.log('Loading web page') 

const page = require('webpage').create() 
const args = require('system').args 
const url = 'www.google.com' 

page.viewportSize = { width: 1024, height: 768 } 
page.clipRect = { top: 0, left: 0 } 

page.open(url, function(status) { 
    console.log('Page loaded') 

    setTimeout(function() { 
    page.render('docs/' + args[1] + '.pdf') 
    console.log('Page rendered') 
    phantom.exit() 
    }, 10000) 
}) 
+0

Я предпочел бы знать, почему мое текущее решение не будет работать, вместо того, чтобы использовать другую библиотеку – mindparse

+0

Это предложение – akinjide