Κληροδοτηθέν Σαρωμένα Έγγραφα: GDPR OCR + Ανωνυμοποίηση (2025)
Προκληθείσα Κληροδοτηθέντα Έγγραφα
Πολλές οργανώσεις (ιδίως νόμιμα γραφεία, ασφαλιστικές εταιρείες, κρατικές υπηρεσίες) διαθέτουν μεγάλες αρχείων σαρωμένων εγγράφων από τα 1980-2010:
- Παλιά κατάλογος
- Χαμηλής ανάλυσης σαρώσεις (72-150 DPI)
- Πολλές σελίδες που έχουν σαρωθεί σε ασπρόμαυρο
- Δεν υπάρχει OCR αρχικά (εικόνες μόνο)
Πρόβλημα GDPR: Αυτά τα έγγραφα συχνά περιέχουν ευαίσθητα δεδομένα (όνοματα, διευθύνσεις, αριθμοί ταυτότητας) αλλά δεν μπορούν να ανίχνευση χωρίς πρώτα OCR.
Πρόκληση 1: Χαμηλής Ποιότητας OCR
Η OCR σε χαμηλής ανάλυσης σαρώσεις έχει χαμηλή ακρίβεια:
Παράδειγμα:
- Αρχικό OCR έξοδο: "123l5 l0l456789" (εικόνα ανάγνωση)
- Πραγματικό: "12345 10l456789" (1 διαδοχ 0 ως l)
Αποτέλεσμα: Presidio ή anonym.legal δεν μπορούν να ανιχνεύουν εθνικές αριθμοί που έχουν αποδοθεί OCR ανακριβώς.
Πρόκληση 2: Κρυμμένο Κείμενο σε Εικόνες
Αν το αρχικό σαρώνω είναι πολύ χαμηλό DPI ή παραμορφώθηκε, κανένα OCR δεν θα λάβει σωστά αποτέλεσμα.
Λύση: Χρησιμοποιήστε ανιχνευμένες μοντέλα OCR που έχουν δύο επίπεδα:
- Πρώτο επίπεδο: Tesseract (ασθενή χαμηλής ποιότητας)
- Δεύτερο επίπεδο: PaddleOCR ή EasyOCR (μοντέλα βαθούς μάθησης)
Τεχνική Λύση
Βήμα 1: Βελτίωση Εικόνας
Πρώτα, βελτιώστε την ανάλυση εικόνας χρησιμοποιώντας OpenCV:
import cv2
import numpy as np
def enhance_scanned_document(image_path):
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# Upscale 2x using INTER_CUBIC
img = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
# Denoise
img = cv2.fastNlMeansDenoising(img, None, h=10, templateWindowSize=7, searchWindowSize=21)
# Contrast enhancement
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
img = clahe.apply(img)
# Binarization
_, img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
return img
Βήμα 2: OCR με PaddleOCR
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang=['en', 'el']) # Multi-lang
result = ocr.ocr(enhanced_image, cls=True)
text = '\n'.join([line[0][1] for line in result]) # Extract text
Βήμα 3: Ανίχνευση PII
from presidio_analyzer import AnalyzerEngine
analyzer = AnalyzerEngine()
results = analyzer.analyze(text, language='en')
for entity in results:
print(f"{entity.entity_type}: {text[entity.start:entity.end]}")
Βήμα 4: Ανωνυμοποίηση
from presidio_anonymizer import AnonymizerEngine
anonymizer = AnonymizerEngine()
anonymized_text = anonymizer.anonymize(text, analyzer_results=results)
Μελέτη Περίπτωσης: Δικαστήριο Αρχείων
Ένας νομικός διαχειριστής 2 εκατ. σαρωμένες σελίδες έγγραφα δίκης από τα 1990-2010.
Απαίτηση: Αποδυναμώστε όλα τα ονόματα και διευθύνσεις αγνώρων για νομικές αναφορές χωρίς παραβίαση GDPR.
Ροή:
- Σάρωση εικόνα → 2 εκατ. αρχείων
- Ενισχύτηκα εικόνα (OpenCV)
- OCR (PaddleOCR + Tesseract fallback)
- Ανίχνευση PII (Presidio ή anonym.legal)
- Ανωνυμοποίηση (αντικατάσταση με [PERSON], [ADDRESS], κλπ)
- Εξαγωγή σε PDF με ανώνυμα κείμενο
- Αποθήκευση σε ασφαλή αποθήκη