【问题标题】:Using PDFKIT to generate PDF using nodejs使用 PDFKIT 使用 nodejs 生成 PDF
【发布时间】:2016-02-11 21:44:11
【问题描述】:

我编写了一个 node.js 服务器来使用 pdfkit 生成 PDF 并将其返回而不保存到文件中:

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 出现在浏览器窗口中。

但问题是我必须将此请求的结果放入 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 函数更改为:

.done(function(data) {
    var PDFOutput = 'data:application/pdf;charset=UTF-8,'+data;
    $('#iframe').attr('src', PDFOutput);
});

但它也不起作用......

返回给done函数内部的data变量的值是一个以:开头的字符串

"%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 (...)

我错过了什么?

提前致谢!

【问题讨论】:

    标签: javascript node.js pdf pdfkit


    【解决方案1】:

    你不能这样做。

    在您的done 函数中,data 包含您的 PDF 文件的正文。

    iframe 应该从 url 加载内容,因此使用您的 JQuery,只需像这样更改 src 属性:

    $('#iframe').attr('src', 'http://localhost:3000?reportData='+reportData+'& reportMetadata='+reportMetadata+'&reportLogo='+reportLogo);
    

    由于您不能将 POST 数据传输到 iframe(不是通过干净的方式),因此您将不得不使用 GET 参数。也许您传递的数据太重,无法通过GET 传递,所以您必须找到另一种方式...

    【讨论】:

    • 谢谢 Raphael... 这个解决方案有效,但实际上我想知道,如果我不能将我的 PDF 正文转换为像 data:application/PDF;base64,AAAAAAAAAAAAAAAAAAAAA.... 这样的对象 URL
    • 我认为这是不可能的,因为 PDF 文件很大,可能超过 URL 长度限制 (stackoverflow.com/a/417184/3212099)。这样做也将成为性能杀手。
    猜你喜欢
    • 2018-06-18
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2014-05-05
    • 2013-07-28
    • 2022-01-13
    相关资源
    最近更新 更多