使用PDFKIT使用nodejs生成PDF
Using PDFKIT to generate PDF using nodejs
我写了一个 node.js 服务器来使用 pdfkit 生成 PDF 和 return 它而不保存到文件:
var http = require('http');
var PDFDocument = require('pdfkit');
var server = http.createServer();
server.on('request', function(request, response) {
console.log('request - ' + new Date());
buildReport(request, response);
});
server.listen(3000);
console.log('Servidor iniciado em localhost:3000. Ctrl+C para encerrar…');
function buildReport(request, response) {
var PDFDoc = new PDFDocument();
response.writeHead(200, {
'Content-Type': 'application/pdf',
'Access-Control-Allow-Origin': '*'
});
PDFDoc.pipe(response);
PDFDoc.font('fonts/DroidSans.ttf')
.fontSize(25)
.text('Some text with an embedded font!', 100, 100);
// Finalize PDF file
PDFDoc.end();
}
如果我转到浏览器并输入 http:\localhost:3000
它工作正常。 PDF 出现在浏览器上 window。
但问题是我必须将此请求的结果放在 iframe 中。下一行有效:
$('#iframe').attr('src', 'http://localhost:3000');
但是因为我必须将参数传递给我使用的服务器 ajax 然后它不起作用。在客户端我有:
$.ajax({
url: 'http://localhost:3000',
data: {
reportData: reportData,
reportMetadata: reportMetadata,
reportLogo: reportLogo
}
}).done(function(data) {
$('#iframe').attr('src', data);
});
但这不起作用。我尝试将完成的功能更改为:
.done(function(data) {
var PDFOutput = 'data:application/pdf;charset=UTF-8,'+data;
$('#iframe').attr('src', PDFOutput);
});
但是也不行...
returned 到 done
函数内的数据变量的值是一个以以下内容开头的字符串:
"%PDF-1.3 %���� 5 0 obj << /Type /Page /Parent 1 0 R /MediaBox [0 0 612 792] /Contents 3 0 R /Resources 4 0 R >> endobj 4 0 obj << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F2 6 0 R >> >> endobj 7 0 obj << /Producer (PDFKit) /Creator (PDFKit) /CreationDate (D:20151010210841Z) >> endobj 9 0 obj << /Type /FontDesc (...)
我错过了什么?
提前致谢!
你不能那样做。
在您的 done
函数中,data
包含您的 PDF 文件的正文。
iframe 应该从 url 加载内容,因此对于 JQuery,只需更改 src
属性,如下所示:
$('#iframe').attr('src', 'http://localhost:3000?reportData='+reportData+'& reportMetadata='+reportMetadata+'&reportLogo='+reportLogo);
由于您不能 POST
数据到 iframe(不是通过干净的方式),您将不得不使用 GET
参数。也许您传递的数据太重,GET
无法传递,因此您将不得不寻找另一种方法...
我写了一个 node.js 服务器来使用 pdfkit 生成 PDF 和 return 它而不保存到文件:
var http = require('http');
var PDFDocument = require('pdfkit');
var server = http.createServer();
server.on('request', function(request, response) {
console.log('request - ' + new Date());
buildReport(request, response);
});
server.listen(3000);
console.log('Servidor iniciado em localhost:3000. Ctrl+C para encerrar…');
function buildReport(request, response) {
var PDFDoc = new PDFDocument();
response.writeHead(200, {
'Content-Type': 'application/pdf',
'Access-Control-Allow-Origin': '*'
});
PDFDoc.pipe(response);
PDFDoc.font('fonts/DroidSans.ttf')
.fontSize(25)
.text('Some text with an embedded font!', 100, 100);
// Finalize PDF file
PDFDoc.end();
}
如果我转到浏览器并输入 http:\localhost:3000
它工作正常。 PDF 出现在浏览器上 window。
但问题是我必须将此请求的结果放在 iframe 中。下一行有效:
$('#iframe').attr('src', 'http://localhost:3000');
但是因为我必须将参数传递给我使用的服务器 ajax 然后它不起作用。在客户端我有:
$.ajax({
url: 'http://localhost:3000',
data: {
reportData: reportData,
reportMetadata: reportMetadata,
reportLogo: reportLogo
}
}).done(function(data) {
$('#iframe').attr('src', data);
});
但这不起作用。我尝试将完成的功能更改为:
.done(function(data) {
var PDFOutput = 'data:application/pdf;charset=UTF-8,'+data;
$('#iframe').attr('src', PDFOutput);
});
但是也不行...
returned 到 done
函数内的数据变量的值是一个以以下内容开头的字符串:
"%PDF-1.3 %���� 5 0 obj << /Type /Page /Parent 1 0 R /MediaBox [0 0 612 792] /Contents 3 0 R /Resources 4 0 R >> endobj 4 0 obj << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F2 6 0 R >> >> endobj 7 0 obj << /Producer (PDFKit) /Creator (PDFKit) /CreationDate (D:20151010210841Z) >> endobj 9 0 obj << /Type /FontDesc (...)
我错过了什么?
提前致谢!
你不能那样做。
在您的 done
函数中,data
包含您的 PDF 文件的正文。
iframe 应该从 url 加载内容,因此对于 JQuery,只需更改 src
属性,如下所示:
$('#iframe').attr('src', 'http://localhost:3000?reportData='+reportData+'& reportMetadata='+reportMetadata+'&reportLogo='+reportLogo);
由于您不能 POST
数据到 iframe(不是通过干净的方式),您将不得不使用 GET
参数。也许您传递的数据太重,GET
无法传递,因此您将不得不寻找另一种方法...