File size: 1,961 Bytes
1ed9d86
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# File: backend/classifier.py
import io
import re
from PyPDF2 import PdfReader

def deep_cloud_classify(filename: str, file_bytes: bytes, file_size_bytes: int) -> str:
    """

    Uses PyPDF2 to inspect the internal metadata and text structure of the file stream.

    Does not read page content, only the metadata dictionary and structural objects.

    """
    if not filename: return "Unknown"
        
    # 1. Filename Fast-Check
    if bool(re.match(r"^camscanner\s\d{2}-\d{2}-\d{4}\s\d{2}\.\d{2}\.\d{2}\.pdf$", filename, re.IGNORECASE)):
        return "Scanned (CamScanner)"
        
    if not filename.lower().endswith(".pdf"):
        return "Native/Text-based"

    # 2. PyPDF2 Internal Metadata & Density Check
    try:
        reader = PdfReader(io.BytesIO(file_bytes))
        metadata = reader.metadata or {}
        
        producer = metadata.get("/Producer", "") or ""
        creator = metadata.get("/Creator", "") or ""
        indicators = ["camscanner", "intsig", "hp scan", "brother", "xerox", "canon"]
        
        if any(i in producer.lower() or i in creator.lower() for i in indicators):
            return "Scanned (Branded)"
            
        # Structural Check: Does this PDF have actual text layers?
        has_text = False
        for page in reader.pages:
            text = page.extract_text()
            if text and len(text.strip()) > 50:
                has_text = True
                break
        
        file_size_mb = file_size_bytes / (1024 * 1024)
        page_count = len(reader.pages)
        density = file_size_mb / page_count if page_count > 0 else 0
        
        if not has_text:
            return "Scanned (Image-Only)"
        elif density > 0.3:
            return "Scanned (High-Density)"
            
        return "Native/Text-based"
    except Exception as e:
        print(f"Classifier error on {filename}: {e}")
        return "Unknown"