You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js中使用pdfmake实现圆形图片效果

问题:如何在pdfmake中将图片转为圆形显示?

我正在Node.js环境中使用pdfmake生成PDF文件,相关代码如下:

const imageBuffer = await imageToBase64('image path'); //image from azure blob storage
const pdfData = {
    content: [
        {
          image: `data:image/jpeg;base64,${imageBuffer}`,
          width: 100,
          height: 100,
        }
    ]
};

----rest of the pdf logic goes here----

目前生成的PDF中图片为默认矩形,我知晓pdfmake的样式中没有border-radius属性,但必须坚持使用pdfmake,因此希望将imageBuffer转换为圆形图片,请问是否有合适的npm包或其他实现方式?


解决方案

由于pdfmake本身不支持图片圆角,你可以在传入pdfmake之前,用Node.js图像处理库将图片预转为圆形,以下是两种可行方案:

方案1:使用jimp库(轻量易用)

  1. 安装依赖
npm install jimp
  1. 编写圆形转换函数
const Jimp = require('jimp');

async function convertToCircle(imageBuffer) {
  const targetSize = 100; // 和pdfmake中设置的尺寸一致
  const image = await Jimp.read(imageBuffer);
  
  // 先将图片缩转为正方形
  image.resize(targetSize, targetSize);
  
  // 创建圆形遮罩:白色圆形,透明背景
  const mask = new Jimp(targetSize, targetSize, 0x00000000);
  const bitmap = mask.bitmap;
  
  // 遍历像素,绘制圆形区域
  for (let x = 0; x < targetSize; x++) {
    for (let y = 0; y < targetSize; y++) {
      const distance = Math.sqrt(Math.pow(x - targetSize/2, 2) + Math.pow(y - targetSize/2, 2));
      if (distance <= targetSize/2) {
        const pixelIndex = (x + y * targetSize) * 4;
        bitmap.data[pixelIndex] = 255;     // R
        bitmap.data[pixelIndex + 1] = 255; // G
        bitmap.data[pixelIndex + 2] = 255; // B
        bitmap.data[pixelIndex + 3] = 255; // A(不透明)
      }
    }
  }
  
  // 给原图应用遮罩,导出为base64格式
  image.mask(mask);
  return await image.getBase64Async(Jimp.MIME_JPEG);
}
  1. 在pdfmake中使用处理后的图片
const originalBuffer = await imageToBase64('image path');
const circularImage = await convertToCircle(originalBuffer);

const pdfData = {
    content: [
        {
          image: circularImage,
          width: 100,
          height: 100,
        }
    ]
};

方案2:使用sharp库(高性能,适合批量处理)

sharp基于libvips,处理速度更快,适合大量图片场景:

  1. 安装依赖
npm install sharp
  1. 编写转换函数
const sharp = require('sharp');

async function convertToCircle(imageBuffer) {
  const targetSize = 100;
  // 生成圆形遮罩的SVG
  const maskSvg = Buffer.from(`
    <svg width="${targetSize}" height="${targetSize}">
      <circle cx="${targetSize/2}" cy="${targetSize/2}" r="${targetSize/2}" fill="white"/>
    </svg>
  `);
  
  // 调整图片尺寸,应用遮罩(dest-in模式保留遮罩内的像素)
  const processedBuffer = await sharp(imageBuffer)
    .resize(targetSize, targetSize)
    .composite([{
      input: maskSvg,
      blend: 'dest-in'
    }])
    .jpeg()
    .toBuffer();
  
  // 转为pdfmake支持的base64格式
  return `data:image/jpeg;base64,${processedBuffer.toString('base64')}`;
}
  1. 集成到pdfmake的方式和方案1一致。

内容的提问来源于stack exchange,提问作者Code The World

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:52:49