需要ZipArchive
,GD
,simplesoftwareio/qrcode
public function batch_print(Request $request)
{
// TODO
$query = Product::whereNull('deleted_at');
if ($request->input('ids') === 'all') {
} else {
$id_array = explode(',', $request->input('ids'));
if (!empty($id_array)) {
$query->whereIn('id', $id_array);
}
}
// 数据源
$list = $query->get();
// 定义二维码文件存储路径
$filepath = alias('@base/public/uploadfiles/product_qrcodes');
// 创建路径,设置权限
if (!file_exists($filepath)) {
mkdir($filepath, 0777, true);
}
// 压缩包文件名
$zip_name = 'uploadfiles/product_qrcodes/' . time() . '.zip';
// 压缩文件路径
$zip_path = alias('@base/public/' . $zip_name);
// 建立压缩包实例
$zip = new \ZipArchive();
// 制作标签时,用到的字体
$font = public_path('fonts/fangsong_GB2312.ttf');
// 创建压缩包
if ($zip->open($zip_path, \ZipArchive::CREATE) === TRUE) {
foreach ($list as $k => $v) {
// 二维码文件名
$qrcode_png = $filepath . '/' . $v['product_sn'] . '.png';
$content = $v['product_sn'];
// 生成二维码
(new Generator())->format('png')->size(300)->margin(0)->generate($content, $qrcode_png);
// 创建标签空白文件
$bg_img = imagecreate(340, 420);
// 创建标签中使用的颜色,这里是白色
$white = imagecolorallocate($bg_img, 255, 255, 255);
//填充标签背景
imagefill($bg_img, 0, 0, $white);
// 打开二维码png图片资源
$qr = imagecreatefrompng($qrcode_png);
// 复制二维码图片资源到标签上,并在标签上设置定位
imagecopy($bg_img, $qr, 20, 20, 0, 0, 300, 300);
// 创建标签中使用的颜色,这里是黑色
$black = imagecolorallocate($bg_img, 0, 0, 0);
// 文字内容
$text = [
$v['product_name'],
$v['product_sn'],
'¥' . $v['sale_price']
];
// 居中时,计算x轴的位置
foreach ($text as $tk => $t){
// 获取ttf文字区域的定位点数值
$font_bbox = imagettfbbox(15, 0, $font, $t);
// 计算文字居中时,文字区域在标签上的起点坐标
$x = (340 - ($font_bbox[2] - $font_bbox[0])) / 2;
// 将文字定位在标签区域上
imagettftext($bg_img, 15, 0, $x, $tk*24+350, $black, $font, $t);
}
// 生成png图片,这里是替换原来的二维码图片
imagepng($bg_img, $qrcode_png);
// 将图片加入到压缩包中,并设置在压缩包中的文件名
$zip->addFile($qrcode_png, $v['product_name'] . '_' . $v['product_sn'] . '.png');
}
$zip->close();
}
return response_json(1, [
'fileurl' => get_file_url($zip_name)
]);
}