joermd commited on
Commit
f9a3e7b
·
verified ·
1 Parent(s): 1e2fa4c

Update ocrpro.html

Browse files
Files changed (1) hide show
  1. ocrpro.html +248 -7
ocrpro.html CHANGED
@@ -101,6 +101,31 @@
101
  .logo span {
102
  color: #bfdbfe;
103
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  </style>
105
  </head>
106
  <body>
@@ -111,6 +136,19 @@
111
  <p class="mb-0">استخراج النصوص من الصور والملفات متعددة الصفحات</p>
112
  </div>
113
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  <!-- بطاقة تحميل الملف -->
115
  <div class="card">
116
  <h3>تحميل الملف</h3>
@@ -156,6 +194,7 @@
156
  <!-- عرض النتائج -->
157
  <div id="resultsCard" class="card d-none">
158
  <h3>النص المستخرج</h3>
 
159
  <div id="resultText" class="result-text mt-3">
160
  لم يتم استخراج نص بعد.
161
  </div>
@@ -179,6 +218,23 @@
179
  let documentPages = [];
180
  let selectedPages = [];
181
  let extractedTexts = [];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182
 
183
  // عناصر DOM
184
  const fileInput = document.getElementById('fileInput');
@@ -194,9 +250,12 @@
194
  const extractTextBtn = document.getElementById('extractTextBtn');
195
  const resultsCard = document.getElementById('resultsCard');
196
  const resultText = document.getElementById('resultText');
 
197
  const copyTextBtn = document.getElementById('copyTextBtn');
198
  const downloadTextBtn = document.getElementById('downloadTextBtn');
199
  const downloadWordBtn = document.getElementById('downloadWordBtn');
 
 
200
 
201
  // إضافة مستمعات الأحداث
202
  document.addEventListener('DOMContentLoaded', function() {
@@ -210,6 +269,22 @@
210
  downloadWordBtn.addEventListener('click', downloadWord);
211
  });
212
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
213
  // معالجة الملف
214
  async function processFile() {
215
  if (!fileInput.files || fileInput.files.length === 0) {
@@ -232,6 +307,7 @@
232
  documentPages = [];
233
  selectedPages = [];
234
  extractedTexts = [];
 
235
 
236
  try {
237
  const fileType = file.name.split('.').pop().toLowerCase();
@@ -494,6 +570,7 @@
494
 
495
  try {
496
  extractedTexts = [];
 
497
 
498
  // معالجة كل صفحة
499
  for (let i = 0; i < pagesToProcess.length; i++) {
@@ -506,13 +583,21 @@
506
  // استخراج النص من الصورة باستخدام OCR API
507
  const pageText = await extractTextFromImage(page.imageData, page.pageNumber);
508
  extractedTexts.push(pageText);
 
509
  }
510
 
 
 
 
511
  // جمع النصوص المستخرجة
512
  const combinedText = extractedTexts.join('\n\n');
513
 
514
  // عرض النص المستخرج
515
  resultText.textContent = combinedText;
 
 
 
 
516
  resultsCard.classList.remove('d-none');
517
 
518
  // إخفاء حالة المعالجة
@@ -527,6 +612,49 @@
527
  }
528
  }
529
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
530
  // استخراج النص من صورة باستخدام API4AI OCR
531
  async function extractTextFromImage(imageData, pageNumber) {
532
  try {
@@ -600,18 +728,131 @@
600
  URL.revokeObjectURL(url);
601
  }
602
 
603
- // تنزيل النص إلى Word
604
  function downloadWord() {
605
  const text = resultText.textContent;
606
  if (!text || text === 'لم يتم استخراج نص بعد.') {
607
  alert('لا يوجد نص للتنزيل');
608
  return;
609
  }
610
- // تغليف النص ببنية HTML بسيطة لتكون قابلة للعرض في Word
611
- const header = "<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/REC-html40'><head><meta charset='utf-8'><title>Document</title></head><body>";
612
- const footer = "</body></html>";
613
- const sourceHTML = header + text + footer;
614
- const blob = new Blob(['\ufeff', sourceHTML], { type: 'application/msword' });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
615
  const url = URL.createObjectURL(blob);
616
  const a = document.createElement('a');
617
  a.href = url;
@@ -623,4 +864,4 @@
623
  }
624
  </script>
625
  </body>
626
- </html>
 
101
  .logo span {
102
  color: #bfdbfe;
103
  }
104
+ .stats-badge {
105
+ background-color: #3b82f6;
106
+ color: white;
107
+ font-size: 14px;
108
+ padding: 5px 10px;
109
+ border-radius: 20px;
110
+ margin-right: 10px;
111
+ }
112
+ .stats-container {
113
+ display: flex;
114
+ align-items: center;
115
+ margin-bottom: 15px;
116
+ }
117
+ .page-preview {
118
+ margin-bottom: 10px;
119
+ border: 1px solid #ddd;
120
+ border-radius: 5px;
121
+ padding: 10px;
122
+ }
123
+ .page-preview h4 {
124
+ background-color: #f0f8ff;
125
+ padding: 5px;
126
+ border-radius: 3px;
127
+ margin-bottom: 10px;
128
+ }
129
  </style>
130
  </head>
131
  <body>
 
136
  <p class="mb-0">استخراج النصوص من الصور والملفات متعددة الصفحات</p>
137
  </div>
138
 
139
+ <!-- بطاقة الإحصائيات -->
140
+ <div class="card" id="statsCard">
141
+ <h3>إحصائيات النظام</h3>
142
+ <div class="stats-container">
143
+ <div class="stats-badge">
144
+ عدد الصفحات المعالجة: <span id="ocrCounter">0</span>
145
+ </div>
146
+ <div class="stats-badge">
147
+ تاريخ آخر معالجة: <span id="lastOcrDate">-</span>
148
+ </div>
149
+ </div>
150
+ </div>
151
+
152
  <!-- بطاقة تحميل الملف -->
153
  <div class="card">
154
  <h3>تحميل الملف</h3>
 
194
  <!-- عرض النتائج -->
195
  <div id="resultsCard" class="card d-none">
196
  <h3>النص المستخرج</h3>
197
+ <div id="resultPreview"></div>
198
  <div id="resultText" class="result-text mt-3">
199
  لم يتم استخراج نص بعد.
200
  </div>
 
218
  let documentPages = [];
219
  let selectedPages = [];
220
  let extractedTexts = [];
221
+ let extractedPageNumbers = [];
222
+ let ocrPagesCount = 0; // عداد لعدد الصفحات المعالجة
223
+
224
+ // استرداد العداد من localStorage عند تحميل الصفحة
225
+ document.addEventListener('DOMContentLoaded', function() {
226
+ const savedCount = localStorage.getItem('ocrPagesCount');
227
+ const lastDate = localStorage.getItem('lastOcrDate');
228
+
229
+ if (savedCount) {
230
+ ocrPagesCount = parseInt(savedCount);
231
+ document.getElementById('ocrCounter').textContent = ocrPagesCount;
232
+ }
233
+
234
+ if (lastDate) {
235
+ document.getElementById('lastOcrDate').textContent = lastDate;
236
+ }
237
+ });
238
 
239
  // عناصر DOM
240
  const fileInput = document.getElementById('fileInput');
 
250
  const extractTextBtn = document.getElementById('extractTextBtn');
251
  const resultsCard = document.getElementById('resultsCard');
252
  const resultText = document.getElementById('resultText');
253
+ const resultPreview = document.getElementById('resultPreview');
254
  const copyTextBtn = document.getElementById('copyTextBtn');
255
  const downloadTextBtn = document.getElementById('downloadTextBtn');
256
  const downloadWordBtn = document.getElementById('downloadWordBtn');
257
+ const ocrCounter = document.getElementById('ocrCounter');
258
+ const lastOcrDate = document.getElementById('lastOcrDate');
259
 
260
  // إضافة مستمعات الأحداث
261
  document.addEventListener('DOMContentLoaded', function() {
 
269
  downloadWordBtn.addEventListener('click', downloadWord);
270
  });
271
 
272
+ // تحديث عداد OCR
273
+ function updateOcrCounter(count) {
274
+ ocrPagesCount += count;
275
+ ocrCounter.textContent = ocrPagesCount;
276
+
277
+ // حفظ العداد في localStorage
278
+ localStorage.setItem('ocrPagesCount', ocrPagesCount);
279
+
280
+ // تحديث تاريخ آخر معالجة
281
+ const now = new Date();
282
+ const formattedDate = `${now.getFullYear()}-${(now.getMonth()+1).toString().padStart(2, '0')}-${now.getDate().toString().padStart(2, '0')} ${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}`;
283
+
284
+ lastOcrDate.textContent = formattedDate;
285
+ localStorage.setItem('lastOcrDate', formattedDate);
286
+ }
287
+
288
  // معالجة الملف
289
  async function processFile() {
290
  if (!fileInput.files || fileInput.files.length === 0) {
 
307
  documentPages = [];
308
  selectedPages = [];
309
  extractedTexts = [];
310
+ extractedPageNumbers = [];
311
 
312
  try {
313
  const fileType = file.name.split('.').pop().toLowerCase();
 
570
 
571
  try {
572
  extractedTexts = [];
573
+ extractedPageNumbers = [];
574
 
575
  // معالجة كل صفحة
576
  for (let i = 0; i < pagesToProcess.length; i++) {
 
583
  // استخراج النص من الصورة باستخدام OCR API
584
  const pageText = await extractTextFromImage(page.imageData, page.pageNumber);
585
  extractedTexts.push(pageText);
586
+ extractedPageNumbers.push(page.pageNumber);
587
  }
588
 
589
+ // تحديث عداد OCR
590
+ updateOcrCounter(pagesToProcess.length);
591
+
592
  // جمع النصوص المستخرجة
593
  const combinedText = extractedTexts.join('\n\n');
594
 
595
  // عرض النص المستخرج
596
  resultText.textContent = combinedText;
597
+
598
+ // عرض معاينة مرئية منظمة للصفحات
599
+ generateResultPreview();
600
+
601
  resultsCard.classList.remove('d-none');
602
 
603
  // إخفاء حالة المعالجة
 
612
  }
613
  }
614
 
615
+ // إنشاء معاينة منظمة للنتائج
616
+ function generateResultPreview() {
617
+ resultPreview.innerHTML = '';
618
+
619
+ if (extractedTexts.length === 0) {
620
+ return;
621
+ }
622
+
623
+ // عرض أول ثلاث صفحات كمعاينة
624
+ const previewPages = Math.min(extractedTexts.length, 3);
625
+
626
+ for (let i = 0; i < previewPages; i++) {
627
+ const pageText = extractedTexts[i];
628
+ const pageNumber = extractedPageNumbers[i];
629
+
630
+ // إنشاء معاينة للصفحة
631
+ const previewDiv = document.createElement('div');
632
+ previewDiv.className = 'page-preview';
633
+
634
+ const pageTitle = document.createElement('h4');
635
+ pageTitle.textContent = `صفحة ${pageNumber}`;
636
+
637
+ const textPreview = document.createElement('p');
638
+ // عرض أول 100 حرف من كل صفحة
639
+ const textContent = pageText.replace(`=== صفحة ${pageNumber} ===\n`, '');
640
+ textPreview.textContent = textContent.length > 100 ?
641
+ textContent.substring(0, 100) + '...' :
642
+ textContent;
643
+
644
+ previewDiv.appendChild(pageTitle);
645
+ previewDiv.appendChild(textPreview);
646
+ resultPreview.appendChild(previewDiv);
647
+ }
648
+
649
+ // إضافة رسالة إذا كان هناك المزيد من الصفحات
650
+ if (extractedTexts.length > 3) {
651
+ const morePages = document.createElement('p');
652
+ morePages.className = 'text-muted';
653
+ morePages.textContent = `+ ${extractedTexts.length - 3} صفحات أخرى...`;
654
+ resultPreview.appendChild(morePages);
655
+ }
656
+ }
657
+
658
  // استخراج النص من صورة باستخدام API4AI OCR
659
  async function extractTextFromImage(imageData, pageNumber) {
660
  try {
 
728
  URL.revokeObjectURL(url);
729
  }
730
 
731
+ // تنزيل النص إلى Word بصورة منظمة ومقسمة
732
  function downloadWord() {
733
  const text = resultText.textContent;
734
  if (!text || text === 'لم يتم استخراج نص بعد.') {
735
  alert('لا يوجد نص للتنزيل');
736
  return;
737
  }
738
+
739
+ // تقسيم النص إلى صفحات بناءً على علامات الصفحات
740
+ const pageTexts = [];
741
+ let currentPageText = '';
742
+ const lines = text.split('\n');
743
+
744
+ for (let i = 0; i < lines.length; i++) {
745
+ const line = lines[i];
746
+
747
+ // إذا كان السطر يشير إلى بداية صفحة جديدة
748
+ if (line.startsWith('=== صفحة ') && line.endsWith(' ===')) {
749
+ // إذا كان هناك نص تم استخراجه بالفعل، قم بإضافته إلى المصفوفة
750
+ if (currentPageText) {
751
+ pageTexts.push(currentPageText);
752
+ currentPageText = '';
753
+ }
754
+
755
+ // ابدأ النص الجديد بعنوان الصفحة
756
+ currentPageText = line + '\n';
757
+ } else {
758
+ // إضافة السطر إلى النص الحالي
759
+ currentPageText += line + '\n';
760
+ }
761
+ }
762
+
763
+ // إضافة آخر صفحة
764
+ if (currentPageText) {
765
+ pageTexts.push(currentPageText);
766
+ }
767
+
768
+ // إنشاء مستند Word
769
+ let wordContent = `
770
+ <!DOCTYPE html>
771
+ <html xmlns:o='urn:schemas-microsoft-com:office:office'
772
+ xmlns:w='urn:schemas-microsoft-com:office:word'
773
+ xmlns='http://www.w3.org/TR/REC-html40'>
774
+ <head>
775
+ <meta charset='utf-8'>
776
+ <title>موندو لينجوا - نص OCR</title>
777
+ <style>
778
+ @page {
779
+ size: 21cm 29.7cm;
780
+ margin: 2cm;
781
+ }
782
+ body {
783
+ font-family: 'Arial', sans-serif;
784
+ direction: rtl;
785
+ text-align: right;
786
+ }
787
+ .page-title {
788
+ font-size: 18px;
789
+ font-weight: bold;
790
+ color: #3b82f6;
791
+ margin-bottom: 15px;
792
+ padding-bottom: 5px;
793
+ border-bottom: 1px solid #ccc;
794
+ }
795
+ .page-content {
796
+ margin-bottom: 15px;
797
+ line-height: 1.5;
798
+ page-break-after: always;
799
+ }
800
+ .footer {
801
+ font-size: 10px;
802
+ text-align: center;
803
+ color: #666;
804
+ margin-top: 20px;
805
+ }
806
+ .header {
807
+ text-align: center;
808
+ margin-bottom: 20px;
809
+ }
810
+ .header h1 {
811
+ color: #3b82f6;
812
+ margin-bottom: 5px;
813
+ }
814
+ .date {
815
+ font-size: 12px;
816
+ color: #666;
817
+ }
818
+ </style>
819
+ </head>
820
+ <body>
821
+ <div class="header">
822
+ <h1>موندو لينجوا - نص مستخرج بتقنية OCR</h1>
823
+ <div class="date">تاريخ الاستخراج: ${new Date().toLocaleDateString('ar-EG')}</div>
824
+ </div>
825
+ `;
826
+
827
+ // إضافة كل صفحة إلى المستند
828
+ pageTexts.forEach((pageText, index) => {
829
+ // استخراج رقم الصفحة من العنوان
830
+ const titleMatch = pageText.match(/=== صفحة (\d+) ===/);
831
+ const pageNumber = titleMatch ? titleMatch[1] : (index + 1);
832
+
833
+ // استبدال عنوان الصفحة بتنسيق أفضل
834
+ const formattedPageText = pageText.replace(/=== صفحة \d+ ===\n/, '');
835
+
836
+ // إضافة صفحة جديدة إلى المستند
837
+ wordContent += `
838
+ <div class="page-content">
839
+ <div class="page-title">صفحة ${pageNumber}</div>
840
+ <div>${formattedPageText.replace(/\n/g, '<br>')}</div>
841
+ </div>
842
+ `;
843
+ });
844
+
845
+ // إضافة تذييل المستند
846
+ wordContent += `
847
+ <div class="footer">
848
+ تم إنشاء هذا المستند بواسطة نظام موندو لينجوا للتعرف الضوئي على النصوص
849
+ </div>
850
+ </body>
851
+ </html>
852
+ `;
853
+
854
+ // تنزيل المستند
855
+ const blob = new Blob(['\ufeff', wordContent], { type: 'application/msword' });
856
  const url = URL.createObjectURL(blob);
857
  const a = document.createElement('a');
858
  a.href = url;
 
864
  }
865
  </script>
866
  </body>
867
+ </html>