60 lines
1.8 KiB
Python
60 lines
1.8 KiB
Python
"""Quick probe of sample documents for chunking strategy planning."""
|
|
import re
|
|
import zipfile
|
|
from pathlib import Path
|
|
|
|
DATA = Path(__file__).resolve().parent.parent / "data"
|
|
|
|
|
|
def probe_docx(p: Path) -> None:
|
|
with zipfile.ZipFile(p) as z:
|
|
media = [n for n in z.namelist() if n.startswith("word/media/")]
|
|
xml = z.read("word/document.xml").decode("utf-8", errors="ignore")
|
|
headings = len(re.findall(r'w:pStyle w:val="Heading', xml))
|
|
tables = xml.count("<w:tbl")
|
|
drawings = xml.count("<w:drawing") + xml.count("<w:pict")
|
|
print(f" media: {len(media)}, tables: {tables}, drawings: {drawings}, heading_styles: {headings}")
|
|
|
|
|
|
def probe_pdf(p: Path) -> None:
|
|
import fitz
|
|
|
|
doc = fitz.open(p)
|
|
imgs = sum(len(doc[i].get_images()) for i in range(len(doc)))
|
|
text_len = sum(len(doc[i].get_text()) for i in range(len(doc)))
|
|
print(f" pages: {len(doc)}, embedded_images: {imgs}, text_chars: {text_len}")
|
|
doc.close()
|
|
|
|
|
|
def probe_xlsx(p: Path) -> None:
|
|
import openpyxl
|
|
|
|
wb = openpyxl.load_workbook(p, read_only=True, data_only=True)
|
|
print(f" sheets: {len(wb.sheetnames)} -> {wb.sheetnames[:5]}")
|
|
for sn in wb.sheetnames[:2]:
|
|
ws = wb[sn]
|
|
print(f" {sn}: rows={ws.max_row}, cols={ws.max_column}")
|
|
wb.close()
|
|
|
|
|
|
def main() -> None:
|
|
for p in sorted(DATA.iterdir()):
|
|
if not p.is_file():
|
|
continue
|
|
print(f"=== {p.name} ({p.stat().st_size} bytes) ===")
|
|
ext = p.suffix.lower()
|
|
try:
|
|
if ext == ".docx":
|
|
probe_docx(p)
|
|
elif ext == ".pdf":
|
|
probe_pdf(p)
|
|
elif ext in (".xlsx", ".xls"):
|
|
probe_xlsx(p)
|
|
except Exception as e:
|
|
print(f" ERROR: {e}")
|
|
print()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|