OcrController.php
3.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?php
namespace App\Http\Controllers;
use App\Models\DtTemplate;
use App\Models\MstTemplate;
use Illuminate\Http\Request;
class OcrController extends Controller
{
public function index()
{
return view('ocr.index');
}
public function store(Request $request)
{
$request->validate([
'customer_name_text' => 'required|string',
'customer_name_xy' => 'required|string',
'template_name' => 'unique:mst_template,tpl_name',
]);
// Lưu vào bảng mst_template
$mst = MstTemplate::create([
'tpl_name' => $request->template_name,
'tpl_text' => $request->customer_name_text,
'tpl_xy' => $request->customer_name_xy,
]);
// Lưu các field khác vào dt_template
foreach ($request->fields as $field) {
DtTemplate::create([
'tpl_id' => $mst->id,
'field_name' => $field['name'],
'field_xy' => $field['xy'],
]);
}
return response()->json(['success' => true, 'message' => 'Lưu template thành công']);
}
public function getData()
{
// Giả sử file OCR JSON & ảnh nằm trong storage/app/public/image/
$jsonPath = public_path("image/data_picking_detail_1754967679.json");
$imgPath = ("image/data_picking_detail_1754967679.jpg");
$templateName = 'nemo';
/// Lấy từ request hoặc mặc định
if (!file_exists($jsonPath)) {
return response()->json(['error' => 'File not found'], 404);
}
$ocrData = json_decode(file_get_contents($jsonPath), true);
$formData = [];
if ($templateName) {
$mst = MstTemplate::where('tpl_name', $templateName)->first();
if ($mst) {
// Lấy detail của template
$details = DtTemplate::where('tpl_id', $mst->id)->get();
foreach ($details as $detail) {
$coords = array_map('intval', explode(',', $detail->field_xy));
// coords = [x1, y1, x2, y2]
// Tìm text OCR nằm trong bbox này
$text = $this->findTextInBBox($ocrData, $coords);
// field_name => text
$formData[$detail->field_name] = $text;
}
} else{
$formData = [
'export_date' => "",
'order_code' => "",
'customer' => "",
'address' => "",
'staff' => "",
'customer_name' => ""
];
}
}
return response()->json([
'ocrData' => $ocrData,
'pdfImageUrl' => $imgPath,
'formData' => $formData,
'fieldOptions' => [
[ 'value' => 'template_name', 'label' => 'Tên Mẫu PDF' ],
[ 'value' => 'customer_name', 'label' => 'Tên khách hàng' ],
[ 'value' => 'export_date', 'label' => 'Ngày xuất' ],
[ 'value' => 'order_code', 'label' => 'Mã đơn hàng' ],
[ 'value' => 'customer', 'label' => 'Khách hàng' ],
[ 'value' => 'address', 'label' => 'Địa chỉ' ],
[ 'value' => 'staff', 'label' => 'Nhân viên' ],
]
]);
}
private function findTextInBBox($ocrData, $coords)
{
[$x1, $y1, $x2, $y2] = $coords;
foreach ($ocrData as $item) {
[$ix1, $iy1, $ix2, $iy2] = $item['bbox'];
// Kiểm tra nếu bbox OCR nằm trong vùng bbox template
if ($ix1 >= $x1 && $iy1 >= $y1 && $ix2 <= $x2 && $iy2 <= $y2) {
return $item['text'];
}
}
return '';
}
}