如何将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
相关产品推荐
相关产品推荐

