32 lines
1.1 KiB
Python
32 lines
1.1 KiB
Python
from pathlib import Path
|
|
from zipfile import ZipFile
|
|
from PIL import Image, ImageDraw, ImageFont
|
|
import io, sys
|
|
|
|
src = Path(sys.argv[1])
|
|
out = Path(sys.argv[2])
|
|
out.mkdir(parents=True, exist_ok=True)
|
|
items = []
|
|
with ZipFile(src) as zf:
|
|
for name in zf.namelist():
|
|
if name.startswith("word/media/"):
|
|
data = zf.read(name)
|
|
target = out / Path(name).name
|
|
target.write_bytes(data)
|
|
try:
|
|
im = Image.open(io.BytesIO(data)).convert("RGB")
|
|
items.append((target.name, im.copy(), im.size))
|
|
except Exception:
|
|
pass
|
|
|
|
thumb_w, thumb_h = 300, 220
|
|
sheet = Image.new("RGB", (thumb_w * 4, (thumb_h + 36) * ((len(items)+3)//4)), "white")
|
|
draw = ImageDraw.Draw(sheet)
|
|
for i, (name, im, size) in enumerate(items):
|
|
x, y = (i % 4) * thumb_w, (i // 4) * (thumb_h + 36)
|
|
im.thumbnail((thumb_w-10, thumb_h-10))
|
|
sheet.paste(im, (x + (thumb_w-im.width)//2, y + 5))
|
|
draw.text((x+5, y+thumb_h+3), f"{name} {size[0]}x{size[1]}", fill="black")
|
|
sheet.save(out / "contact_sheet.jpg", quality=90)
|
|
print(f"extracted={len(items)} sheet={out/'contact_sheet.jpg'}")
|