ในยุคดิจิตอลของวันนี้ความสามารถในการสกัดข้อความจากภาพจะกลายเป็นสิ่งสําคัญมากขึ้น ไม่ว่าคุณจะจัดการกับเอกสารสแกนบัตรธุรกิจหรือรูปแบบอื่น ๆ ของข้อมูลตามภาพที่สามารถค้นหาและจัดการข้อมูลนี้ได้อย่างมีประสิทธิภาพสามารถประหยัดเวลาและความพยายามมากมาย การสอนนี้จะนําคุณผ่านการสร้างแอพพลิเคชันเว็บแบบโต้ตอบโดยใช้ Aspose.OCR และ ASP.NET Core ซึ่งช่วยให้ผู้ใช้สามารถอัปโหลดภาพค้นหาคําหลักเฉพาะภายในข้อความที่สกปรกและดูผลลัพธ์ในเวลาจริงด้วยการแข่งขันที่เน้น
แหล่งที่มาของความจริง: รหัสและไหลด้านล่างจะสอดคล้องกับหุ้มในตอนท้ายของบทความนี้ (จุดสิ้นสุดของตัวควบคุม AsposeOcr
การใช้และการตอบสนองแบบ JSON)
ตัวอย่างที่สมบูรณ
ข้อกําหนด
- .NET 8 (หรือ .Net 6+) SDK
- Visual Studio / VS รหัส
- การเข้าถึง NuGet สําหรับ
Aspose.OCR
- (ตัวเลือก) ไฟล์ใบอนุญาต Aspose หากคุณวางแผนที่จะเกินข้อ จํากัด การประเมิน
ขั้นตอน 1: สร้าง ASP.NET Core MVC Project
dotnet new mvc -n ImageTextSearchApp -f net8.0
cd ImageTextSearchApp
# Add Aspose.OCR
dotnet add package Aspose.OCR
ทําไม MVC? ก้อนใช้ตัวควบคุม (HomeController
), ครั้งที่เข้าดู, และ คลาสสิค Startup
—รูปแบบที่ง่ายและเป็นที่รู้จักสําหรับอัปโหลดไฟล์ + OCR ด้านเซิร์ฟเวอร์
ขั้นตอนที่ 2: การเตรียมสินทรัพย์คงที่และโฟลเดอร์อัปโหลด
ผู้ดูแลระบบเขียนอัปโหลดภายใต้ wwwroot/uploads
สร้างโฟลเดอร์นี้และให้แน่ใจว่าแอปสามารถเขียนกับมัน
mkdir -p wwwroot/uploads
นอกจากนี้เรายังอนุญาตให้ไฟล์สถิต middleware ใน Startup
(ปรากฏในภายหลัง) ดังนั้น wwwroot
ต้นไม้ได้รับการให้บริการอย่างถูกต้อง
ขั้นตอน 3: เพิ่มตัวควบคุม (อัพโหลด + OCR + ค้นหา)
สร้าง Controllers/HomeController.cs และดําเนินการ Index
+ SearchText
การกระทํานี้บันทึกภาพที่อัปโหลดดําเนินการ OCR ค้นหาคําหลัก (ไม่ไวต่อกรณี) และกลับ JSON
using System;
using System.IO;
using System.Threading.Tasks;
using Aspose.Ocr;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace ImageTextSearchApp
{
public class HomeController : Controller
{
private readonly IWebHostEnvironment _environment;
public HomeController(IWebHostEnvironment environment)
{
_environment = environment;
}
[HttpGet]
public IActionResult Index()
{
return View();
}
[HttpPost]
[RequestSizeLimit(20_000_000)] // ~20MB max, adjust as needed
public async Task<IActionResult> SearchText(IFormFile imageFile, string searchKeyword)
{
if (imageFile == null || imageFile.Length == 0)
return BadRequest("Image file is required.");
if (string.IsNullOrWhiteSpace(searchKeyword))
return BadRequest("Search keyword is required.");
// Ensure uploads directory exists
var uploadsDir = Path.Combine(_environment.WebRootPath, "uploads");
Directory.CreateDirectory(uploadsDir);
// Sanitize filename and save
var safeName = Path.GetFileName(imageFile.FileName);
var filePath = Path.Combine(uploadsDir, safeName);
using (var stream = new FileStream(filePath, FileMode.Create))
{
await imageFile.CopyToAsync(stream);
}
// Perform OCR on the uploaded image
using (var ocrEngine = new AsposeOcr())
{
var extractedText = await ocrEngine.RecognizeImageAsync(filePath);
// Case-insensitive keyword check
var found = extractedText?.IndexOf(searchKeyword, StringComparison.OrdinalIgnoreCase) >= 0;
var searchResult = found ? "Keyword found!" : "Keyword not found.";
// Return minimal JSON (exact shape matches the gist)
return Json(new { extractedText, searchResult });
}
}
}
}
การแจ้งเตือน
- เราได้เพิ่มข้อ จํากัด ขนาดไฟล์ขนาดเล็กและสร้างตารางเพื่อความแข็งแกร่ง
- สําหรับการผลิตประเภทไฟล์ validate (
.png/.jpg/.jpeg/.tif
) และพิจารณาการสแกนไวรัส
ขั้นตอน 4: Wire Up Startup และโปรแกรม
สร้าง Startup.cs และ Programs เช่นเดียวกับตัวกรองเพื่อเปิดใช้งาน MVC, ไฟล์ statique, routing และ HTTPS redirection
การเริ่มต้น.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace ImageTextSearchApp
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles(); // serves wwwroot (including /uploads)
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
**โปรแกรม.cs *
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
namespace ImageTextSearchApp
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
ขั้นตอน 5: สร้าง UI ที่อัพโหลด + ค้นหา (Razor View)
สร้าง ** View/Home/Index.cshtml** ด้วยแบบฟอร์มอัปโหลดที่เรียบง่ายและกล่องค้นหา JavaScript โพสต์ไฟล์ + คําหลักเพื่อ /Home/SearchText
, พิมพ์ข้อความ OCR และเน้นการแข่งขันในเบราว์เซอร์ (ไม่มีการเปลี่ยนแปลงเซิร์ฟเวอร์ที่จําเป็น)
@{
ViewData["Title"] = "Image Text Search";
}
<h1 class="mb-3">Image Text Search (Aspose.OCR + ASP.NET Core)</h1>
<form id="ocrForm" enctype="multipart/form-data" class="mb-4">
<div class="form-group mb-2">
<label for="imageFile">Select image</label>
<input type="file" id="imageFile" name="imageFile" accept=".png,.jpg,.jpeg,.tif,.tiff,.bmp" class="form-control" required />
</div>
<div class="form-group mb-2">
<label for="searchKeyword">Keyword</label>
<input type="text" id="searchKeyword" name="searchKeyword" class="form-control" placeholder="Enter a word to find..." required />
</div>
<button type="submit" class="btn btn-primary">Upload & Search</button>
</form>
<div id="result" class="mt-3">
<h3>Result</h3>
<p id="searchStatus" class="fw-bold"></p>
<pre id="extractedText" style="white-space: pre-wrap"></pre>
</div>
@section Scripts {
<script>
(function () {
const form = document.getElementById('ocrForm');
const statusEl = document.getElementById('searchStatus');
const textEl = document.getElementById('extractedText');
function escapeHtml(s) {
return s.replace(/[&<>"']/g, c => ({
'&': '&', '<': '<', '>': '>', '"': '"', "'": '''
}[c]));
}
function highlight(text, keyword) {
if (!keyword) return escapeHtml(text);
const pattern = new RegExp(`(${keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'gi');
return escapeHtml(text).replace(pattern, '<mark>$1</mark>');
}
form.addEventListener('submit', async (e) => {
e.preventDefault();
statusEl.textContent = 'Processing...';
textEl.textContent = '';
const formData = new FormData(form);
try {
const res = await fetch('/Home/SearchText', {
method: 'POST',
body: formData
});
if (!res.ok) {
const msg = await res.text();
statusEl.textContent = `Error: ${msg}`;
return;
}
const data = await res.json();
statusEl.textContent = data.searchResult || '';
const kw = document.getElementById('searchKeyword').value;
textEl.innerHTML = highlight(data.extractedText || '', kw);
} catch (err) {
statusEl.textContent = 'Unexpected error. See console.';
console.error(err);
}
});
})();
</script>
}
นี้นําไปใช้ การเน้นในเวลาจริงในบล็อกข้อความที่สกัดการจัดอันดับความสําคัญ บนภาพ จะต้องใช้ OCR รอบกล่องและวาดพื้นผิว (ไม่ครอบคลุมโดยหมึก)
ขั้นตอน 6: Run the App
dotnet run
เปิด URL ที่แสดงไว้ในคอนโซล (เช่น https://localhost:5001
).ดาวน์โหลดภาพใส่คําหลักและคลิกที่ อัพโหลดและค้นหา คุณจะเห็น:
Keyword found!
หรือKeyword not found.
(สร้างเซิร์ฟเวอร์)- ข้อความที่สกัด กับด้านลูกค้า
<mark>
ความสูง
ขั้นตอน 7: การพิจารณาเตรียมการผลิต (ตัวเลือก)
- การยืนยันไฟล์: ตรวจสอบประเภท / การขยาย MIME และพิจารณาการสแกนป้องกันไวรัส
- ข้อ จํากัด ขนาด: ใช้
RequestSizeLimit
(แสดง) และขีด จํากัด proxy/web.config ตามที่จําเป็น - Cleanup: ลบไฟล์เก่าจาก
wwwroot/uploads
. - ตําแหน่ง: หากคุณต้องการหลายภาษาตั้งค่าตัวเลือกภาษา OCR ด้านเซิร์ฟเวอร์
- ข้อผิดพลาด UX: เปลี่ยนการแจ้งเตือนด้วยแท่น; เพิ่มหมุนโหลดและแถบขั้นสูง
Troubleshooting
- ผลลัพธ์ OCR ว่างเปล่า: ลอง input คุณภาพสูง orientation หรือรูปแบบที่แตกต่างกัน (PNG / TIFF)
- CORS: หากหน้าต่างจะแยกออกเปิดใช้งาน CORS และใช้ URL API ทั้งหมด
- HTTPS: รับประกัน dev cert ความน่าเชื่อถือ (
dotnet dev-certs https --trust
) หากเบราว์เซอร์บล็อกเนื้อหาผสม