【问题标题】:Add png image in pdf with nodejs and jspdf使用nodejs和jspdf在pdf中添加png图像
【发布时间】:2020-08-21 12:03:55
【问题描述】:

我对@9​​87654321@ 很陌生,我正在尝试在服务器上使用jsPdf 创建一个pdf。

我已经使用 npm install jspdf --save 安装了 jspdf

由于nodeJs不支持在jspdf中使用的atob,所以我添加了

npm install atob --save 并添加

var atob = require('atob');
var PNG = require('png-js');

jspdf 中添加 png 文件需要 png-js。 当我尝试使用以下代码将 PNG 文件添加到 pdf 时

let imgData=request.payload.canvasobj;
let pdfContent = new jsPDF();
pdfContent.addImage(imgData, 'PNG',  40, 20, 0, 0);
let data = pdfContent.output('arraybuffer');
let buffer = Buffer.from(data);
let arraybuffer = Uint8Array.from(buffer);
fs.appendFile('./canvas.pdf', new Buffer(arraybuffer), function (err) {
    if (err) {
        console.log(err);
    } else {
        console.log("PDF created");
    }
});

以下错误被触发

Debug: internal, implementation, error
    TypeError: Uncaught error: Cannot read property 'buffer' of undefined
    at Object.jsPDFAPI.processPNG (C:\LearningPro\NodeJsProjects\pdfexport-nodejs\node_modules\jspdf\dist\jspdf.debug.js:8796:80)
    at Object.jsPDFAPI.addImage (C:\LearningPro\NodeJsProjects\pdfexport-nodejs\node_modules\jspdf\dist\jspdf.debug.js:4696:50)
    at canvas (C:\LearningPro\NodeJsProjects\pdfexport-nodejs\requestHandler.js:105:16)
    at Object.internals.handler (C:\LearningPro\NodeJsProjects\pdfexport-nodejs\node_modules\hapi\lib\handler.js:99:36)
    at request._protect.run (C:\LearningPro\NodeJsProjects\pdfexport-nodejs\node_modules\hapi\lib\handler.js:30:23)
    at internals.Protect.run (C:\LearningPro\NodeJsProjects\pdfexport-nodejs\node_modules\hapi\lib\protect.js:59:12)
    at exports.execute (C:\LearningPro\NodeJsProjects\pdfexport-nodejs\node_modules\hapi\lib\handler.js:24:22)
    at each (C:\LearningPro\NodeJsProjects\pdfexport-nodejs\node_modules\hapi\lib\request.js:382:16)
    at iterate (C:\LearningPro\NodeJsProjects\pdfexport-nodejs\node_modules\hapi\node_modules\items\lib\index.js:36:13)
    at done (C:\LearningPro\NodeJsProjects\pdfexport-nodejs\node_modules\hapi\node_modules\items\lib\index.js:28:25)
Debug: internal, implementation, error
    TypeError: fn is not a function
    at C:\LearningPro\NodeJsProjects\pdfexport-nodejs\node_modules\png-js\png-node.js:246:16
    at Inflate.onEnd (zlib.js:227:5)
    at emitNone (events.js:91:20)
    at Inflate.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickDomainCallback (internal/process/next_tick.js:122:9)

我错过了什么?它适用于 JPEG 图像。

来自日志的图像数据

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...QmCC

【问题讨论】:

    标签: node.js jspdf


    【解决方案1】:

    使用过 jsPDF 库并偶然发现错误的 imageData 输入格式无效,我建议您添加日志记录以确定 imageData 的格式,如下所示:

    let imgData=request.payload.canvasobj;
    console.log(imgData);
    

    确保格式为:

    data:image/png;base64,...
    

    其中 ... 是以 base64 编码的图像数据。

    编辑 我在本地设置了 jsPDF。为了让 jspdf 包(来自 npm)在 Node.JS 4.x 中工作,我必须执行以下操作:

    global.PNG = require('png-js');
    global.window = {document: {createElementNS: () => {return {}} }};
    global.navigator = {};
    global.atob = require('atob');
    

    然后继续创建jsPDF对象成功。

    var fs = require('fs');
    var jsPDF = require('jspdf');
    var imgData = fs.readFileSync('imgdata').toString();
    var pdfContent = new jsPDF();
    var ret = pdfContent.addImage(imgData, 'PNG', 40, 20, 0, 0);
    var data = new Buffer(pdfContent.output('arraybuffer'));
    
    fs.appendFile('./canvas.pdf', data, function (err) {
        if (err) {
            console.log(err);
        } else {
            console.log("PDF created");
        }
    });
    

    我认为我无法复制您的原始问题,因为设置需要在非浏览器环境中进行一些调整。

    【讨论】:

    • 图像数据完美我已经添加了对有问题的图像数据的一瞥
    • 我已经更新了我的答案,有一个自己工作的例子,必须创建一些全局变量供库使用。请看。
    • stock png-js 不能与 jspdf 完美搭配。我已经修改了 png-jspng.js 提供的 jspdf。同样对于文档,我使用了jsdom,因为我需要在我的应用程序中使用更多的 dom 功能。
    【解决方案2】:
    var path_url = '/usr/logo.png', format = 'PNG';    
    //format 'JPEG', 'PNG', 'WEBP'    
    var imgData = fs.readFileSync(path_url).toString('base64');    
    var doc = new jsPDF();    
    doc.addImage(imgData, format, 0, 0, 5, 1)
    

    【讨论】:

    • 不鼓励使用纯代码的答案。请单击edit 并添加一些词来总结您的代码如何解决问题,或者解释您的答案与之前的答案/答案有何不同。 From Review
    猜你喜欢
    • 2013-10-04
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多