2016-06-18 2 views
0

Я использую pdfmake для создания pdf в nodejs и отправки данных на страницу углового запроса. Я могу создать pdf. но моя проблема заключается в том, когда я загружаю pdf, его имя выглядит так: «16064905-c4aa-4d40-96db-ca7464c38858.pdf». Как я могу установить собственное имя в мой .pdf-файл?Проблема с созданием pdf с пользовательским именем с использованием pdfmake и nodejs

вот мой код

pdfHandler.createPdfBinary(courseDetail, function(binary) { 
    res.header('content-type', 'application/pdf');         
    res.send(binary); 
}, function(error) { 
    res.send('ERROR:' + error); 
}); 

exports.createPdfBinary = function(courseDetail,callback) { 
    var docDefinition = {...}; 
    var pdfDoc = printer.createPdfKitDocument(docDefinition); 
    var chunks = []; 
    var result; 

    pdfDoc.on('data', function(chunk) { 
     chunks.push(chunk); 
    }); 

    pdfDoc.on('end', function() { 
     result = Buffer.concat(chunks); 
     callback(result); 

    }); 

    pdfDoc.end(); 
} 

ответ

1

внутри pdfDoc.on('end', function()

callback(null, result.toString('base64')); 

При получении результата от обратного вызова добавить следующий код и передать свой результат методу

внутри обратного вызова результата

b64toBlob(result, 'application/pdf'); 

файл метод загрузки

function b64toBlob(b64Data, contentType, sliceSize) { 
    contentType = contentType || ''; 
    sliceSize = sliceSize || 512; 

    var byteCharacters = atob(b64Data); 
    var byteArrays = []; 

    for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) { 
    var slice = byteCharacters.slice(offset, offset + sliceSize); 

    var byteNumbers = new Array(slice.length); 
    for (var i = 0; i < slice.length; i++) { 
     byteNumbers[i] = slice.charCodeAt(i); 
    } 

    var byteArray = new Uint8Array(byteNumbers); 

    byteArrays.push(byteArray); 
    } 

    var blob = new Blob(byteArrays, { 
    type: contentType 
    }); 
    if (blob) { 
    saveAs(blob, 'your_file_name.pdf'); /// TODO change with your filename 
    } else { 
    throw 'Could not generate blob'; 
    } 
} 

вам понадобится еще один пакет, чтобы добавить в код FileSaver

более подробно проверить мой пример GitHub https://github.com/daupawar/MeteorAsyncPdfmake

0

Я бы сделал это облегченная бит более разный. Btw Content-Disposition - это то, что вы можете использовать для установки пользовательского имени для файлов

let fileName = 'sample.pdf' 
let stream = pdfHandler.createPdfBinary(courseDetail) 
res.header('Content-Type', 'application/pdf') 
res.header('Content-Disposition', 'attachment; filename=' + fileName) 
stream.pipe(res) 

// instead of buffering all chunks and concatenating everything 
// we simply just return the stream, so no callback is necessary 
// ...this is also better for memory 
exports.createPdfBinary = courseDetail => { 
    var docDefinition = {...} 
    return printer.createPdfKitDocument(docDefinition) 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^