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

如何将jSignature生成的svg64格式签名转成可插入Excel的图片(PHP实现)

没问题,我之前刚好做过类似的需求,完全可以实现!下面一步步给你拆解整个流程:

1. 先处理前端传来的svg64数据

前端用jSignature提交的svg64格式数据,其实就是带前缀的Base64编码SVG字符串,第一步要把它解码成原始SVG内容:

// 获取POST传递的签名数据
$svg64 = $_POST['signature'];
// 移除"data:image/svg+xml;base64,"前缀(如果存在),然后Base64解码
$rawSvg = base64_decode(preg_replace('#^data:image/svg\+xml;base64,#', '', $svg64));
2. 将SVG转换为适合插入Excel的图片(推荐PNG格式)

Excel对PNG图片的支持最好,而且签名一般需要透明背景,PNG刚好满足。这里有两种实现方式,优先推荐Imagick(兼容性更强):

方法一:用Imagick处理(推荐)

先确保你的服务器已经安装了Imagick扩展(大部分云服务器可以通过面板一键安装),代码如下:

// 初始化Imagick对象
$imagick = new Imagick();
// 读取SVG字符串
$imagick->readImageBlob($rawSvg);
// 设置输出格式为PNG
$imagick->setImageFormat('png');
// 可选:调整图片尺寸,比如固定宽度300,高度按比例自适应
$imagick->scaleImage(300, 0);
// 获取PNG的二进制数据
$pngBinary = $imagick->getImageBlob();
// 清理资源
$imagick->destroy();

方法二:用GD库处理(需服务器支持SVG解析)

如果服务器没装Imagick,也可以用GD,但要注意GD默认不支持SVG,需要服务器安装libsvg依赖(Linux下可以通过apt-get install libsvg-dev安装,Windows需要额外配置):

// 创建临时SVG文件(GD只能从文件读取SVG)
$tempSvgPath = tempnam(sys_get_temp_dir(), 'sig_svg');
file_put_contents($tempSvgPath, $rawSvg);
// 加载SVG为GD资源
$gdImage = imagecreatefromsvg($tempSvgPath);
// 输出PNG到缓冲区
ob_start();
imagepng($gdImage);
$pngBinary = ob_get_clean();
// 清理资源和临时文件
imagedestroy($gdImage);
unlink($tempSvgPath);
3. 将图片插入Excel文件

这里推荐用PhpSpreadsheet(它是PHPExcel的官方替代版,已经停止维护的PHPExcel不建议再用),先通过Composer安装:

composer require phpoffice/phpspreadsheet

然后用以下代码插入图片:

require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;

// 创建Excel实例
$spreadsheet = new Spreadsheet();
$activeSheet = $spreadsheet->getActiveSheet();

// 初始化Drawing对象处理图片插入
$drawing = new Drawing();
$drawing->setName('客户签名');
$drawing->setDescription('客户签名');

// 把PNG二进制数据写入临时文件(PhpSpreadsheet需要文件路径)
$tempPngPath = tempnam(sys_get_temp_dir(), 'sig_png');
file_put_contents($tempPngPath, $pngBinary);
$drawing->setPath($tempPngPath);

// 设置图片插入的单元格位置(比如A1)
$drawing->setCoordinates('A1');
// 可选:调整图片显示大小
$drawing->setWidth(180);
$drawing->setHeight(60);
// 将图片绑定到工作表
$drawing->setWorksheet($activeSheet);

// 保存Excel文件
$writer = new Xlsx($spreadsheet);
$writer->save('./客户签名文件.xlsx');

// 清理临时文件
unlink($tempPngPath);
关键注意事项
  • 服务器环境:必须确保安装了Imagick(或带SVG支持的GD)和PhpSpreadsheet的依赖。
  • 临时文件:所有临时文件记得用完就删除,避免占用服务器磁盘空间。
  • 图片尺寸:可以根据Excel的单元格大小调整图片的宽度和高度,让显示效果更自然。

内容的提问来源于stack exchange,提问作者G. Cassini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:53:42