后端node canvas繪制圖片/pdf(補充ing)

node-canvas
上面這個鏈接有官方寫的一些基礎(chǔ)的使用方法和示例

官方api文檔
這個是詳細的畫圖的api文檔

因為是后端生成圖片,所以用node-canvas。
嗯雖然我還有點迷糊的地方,我們先安裝一下吧,看文檔是可以實現(xiàn)我需要的功能的

繪制圖片的部分官網(wǎng)的方法使用不了,所以我就找了前人的代碼。雖然有點老,但還是很有借鑒意義。
nodejs繪制生成圖像
源代碼

常用對照表
文件擴展名 和 Content-Type(Mime-Type)

下面是我基于egg框架寫的,其他框架大概改一下格式就行
pdf的在前面,圖片的在后面,異曲同工,為了不造成理解的困擾,把兩個分別粘出來

如果有任何問題也可以給我留言~ 下面代碼的分享者是agiamason哦~(也就是我啦)

繪制pdf的

代碼示例:

//繪制pdf
const path = require('path');
const { promisify } = require('util');
const fs = require('fs');//在網(wǎng)上查到的readFile同步方式
const readFile = promisify(fs.readFile);
const qr = require('qr-image'); //這個插件是用來畫二維碼的也很好用
const Canvas = require('canvas');

    const canvas = new Canvas(1158, 1012, 'pdf');
    const ctx = canvas.getContext('2d');

    // 繪制背景
    const filePath = path.join(__dirname, <你的圖片存放地址>);
    const background = await readFile(filePath);//載入圖片時也可以用其他的方式
    const backgroundImg = new Canvas.Image();
    backgroundImg.src = background;
    ctx.drawImage(backgroundImg, 0, 0, 1158, 1012);

    // 畫二維碼(這里多加了個畫二維碼的,希望能對你有用)
    const qrUrl = <這里是你二維碼上帶的信息>;
    const qrcode = qr.imageSync(qrUrl, { type: 'png', size: 4, margin: 1 });//可以修改size,margin等格式
    const qrcodeImg = new Canvas.Image();
    qrcodeImg.src = qrcode;
    //這里的位置分別是(開始位置x坐標,開始位置的y坐標,二維碼的寬,高)
    ctx.drawImage(qrcodeImg, 850, 420, 260, 260);

    // 生成最終pdf
    const data = canvas.toDataURL('application/pdf');
    // 去掉圖片base64碼前面部分data:image/png;base64
    const base64 = data.replace(/^data:image\/\w+;base64,/, '');
    const picBuffer = new Buffer(base64, 'base64'); // 把base64碼轉(zhuǎn)成buffer對象,
     this.ctx.set('Content-Type', 'application/pdf');
     this.ctx.body=picBuffer
//這時候請求接口就能收到畫好的pdf文件了

繪制png

//繪制png
const path = require('path');
const { promisify } = require('util');
const fs = require('fs');//在網(wǎng)上查到的readFile同步方式
const readFile = promisify(fs.readFile);
const qr = require('qr-image'); //這個插件是用來畫二維碼的也很好用
const Canvas = require('canvas');

    const canvas = new Canvas(寬, 高);
    const ctx = canvas.getContext('2d');

/*下面這部分和生成pdf的一模一樣,可以不用看
    // 繪制背景
    const filePath = path.join(__dirname, <你的圖片存放地址>);
    const background = await readFile(filePath);//載入圖片時也可以用其他的方式
    const backgroundImg = new Canvas.Image();
    backgroundImg.src = background;
    ctx.drawImage(backgroundImg, 0, 0, 1158, 1012);

    // 畫二維碼(這里多加了個畫二維碼的,希望能對你有用)
    const qrUrl = <這里是你二維碼上帶的信息>;
    const qrcode = qr.imageSync(qrUrl, { type: 'png', size: 4, margin: 1 });//可以修改size,margin等格式
    const qrcodeImg = new Canvas.Image();
    qrcodeImg.src = qrcode;
    //這里的位置分別是(開始位置x坐標,開始位置的y坐標,二維碼的寬,高)
    ctx.drawImage(qrcodeImg, 850, 420, 260, 260);

從這里開始不一樣了*/

    // 生成最終pdf
    const data = await promisify(canvas.toDataURL).call(canvas, 'image/jpeg');
        const base64 = data.replace(/^data:image\/\w+;base64,/, '');// 去掉圖片base64碼前面部分data:image/png;base64
        const picUrl = new Buffer(base64, 'base64'); // 把base64碼轉(zhuǎn)成buffer對象,
        this.ctx.set('Content-Type', 'image/jpeg');
        this.ctx.body = picUrl;
//這時候請求接口就能收到畫好的png文件了
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容