2014-01-06 2 views
4

У меня есть функция на nodejs, которая генерирует изображение со многих изображений, а затем генерирует из него файл PDF. Im пытается с помощью только одного изображения, но мне нужно, чтобы добавить больше, но это оленья кожа, кажется, работаетКак сделать изображение в формате pdf (canvas и pdfkit)

function HelperHandler() { 
    this.pdf = function(req, res, next) { 
    var doc = new PDFDocument; 
    mergeImages(function(err, image) { 
     if (err) 
     return res.json(err); 

     doc.image(image, 100, 100); 
     doc.output(function(string) { 
     res.contentType = "application/pdf"; 
     res.send(string); 
     }); 
    }) 
    } 
} 

var mergeImages = function(callback) { 
    var Canvas = require("canvas") 
    , fs  = require("fs"); 

    fs.readFile(global.root_path + "/images/bg.jpg", function(err, data) { 
    if (err) 
     callback("error loading image"); 
    else { 
     var canvas = new Canvas(408, 939) 
     , img = new Canvas.Image(data); 
     ctx = canvas.getContext("2d"); 
     img.onload = function() { 
     ctx.drawImage(img, 0, 0, 408, 939); 
     } 
     canvas.toDataURL('image/png', function(err, str) { 
     callback(null, str); 
     }); 
    } 
    }); 
} 

Ошибка

Error: ENAMETOOLONG, name too long 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZgAAAOrCAYAAABqSpB/AAAABmJLR0QA/wD/AP+gvaeTAAAF5UlEQVR4nO3BMQEAAADCoPVPbQo/oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICjAWckAAHF4EUcAAAAAElFTkSuQmCC' 
    at Object.openSync (fs.js:427:18) 
    at Object.readFileSync (fs.js:284:15) 
    at Function.open (/Users/jtomasrl/code/app/server/node_modules/pdfkit/js/image.js:27:28) 
    at PDFDocument.image (/Users/jtomasrl/code/app/server/node_modules/pdfkit/js/mixins/images.js:27:26) 
    at /Users/jtomasrl/code/app/server/lib/handler/current/helper.js:15:11 
    at /Users/jtomasrl/code/app/server/lib/handler/current/helper.js:41:9 
    at /Users/jtomasrl/code/app/server/node_modules/canvas/lib/canvas.js:217:7 

ответ

1

Ошибка в том, что в:

doc.image(image, 100, 100); 

image потребности в путь к файлу, а не URL-адрес данных.

Вам нужно будет выделить временный файл, напишите холст как PNG для этого файла, а затем передайте имя этого временного файла doc.image(path, ...), а затем удалите временный файл.

См http://pdfkit.org/docs/images.html

2

Вы можете использовать a buffer or a path с PDFKit изображения.

Но вы не можете использовать URL-адрес base64, вам нужно декодировать эту строку в буфер.

Чтобы использовать base64 данные:

doc.image(new Buffer(image.replace('data:image/png;base64,',''), 'base64'), 100, 100); // this will decode your base64 to a new buffer 

Больше информации о base64 де/кодирования с узлом буфера here.

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

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