Download apps/image_rotation/services/transform/pdf_transform.py from jun2024/fc: direct link, hf CLI and curl.
- Browser
- Download file 1.59 kB
-
https://huggingface.co/spaces/jun2024/fc/resolve/main/apps/image_rotation/services/transform/pdf_transform.py
- Command line
-
hf download hf://spaces/jun2024/fc/apps/image_rotation/services/transform/pdf_transform.py
-
curl -L -o pdf_transform.py https://huggingface.co/spaces/jun2024/fc/resolve/main/apps/image_rotation/services/transform/pdf_transform.py
1.59 kB
| """Business logic services.""" | |
| import io | |
| import logging | |
| from PIL import Image | |
| logger = logging.getLogger(__name__) | |
| def apply_rotation_for_pdf(image_bytes: bytes, rotation: int) -> bytes: | |
| if rotation not in (0, 90, 180, 270): | |
| rotation = 0 | |
| if rotation == 0: | |
| try: | |
| img: Image.Image = Image.open(io.BytesIO(image_bytes)) | |
| if img.format == "JPEG": | |
| return image_bytes | |
| output = io.BytesIO() | |
| img = _ensure_rgb(img) | |
| img.save(output, format="JPEG", quality=85, optimize=True) | |
| return output.getvalue() | |
| except Exception: | |
| logger.exception("操作失败") | |
| return image_bytes | |
| try: | |
| img2: Image.Image = Image.open(io.BytesIO(image_bytes)) | |
| pillow_angle = (360 - rotation) % 360 | |
| if pillow_angle != 0: | |
| img2 = img2.rotate(pillow_angle, expand=True) | |
| output = io.BytesIO() | |
| img2 = _ensure_rgb(img2) | |
| img2.save(output, format="JPEG", quality=85, optimize=True) | |
| return output.getvalue() | |
| except Exception as e: | |
| logger.warning(f"图片旋转失败,使用原始图片: {e}") | |
| return image_bytes | |
| def _ensure_rgb(img: Image.Image) -> Image.Image: | |
| if img.mode in ("RGBA", "P"): | |
| background = Image.new("RGB", img.size, (255, 255, 255)) | |
| if img.mode == "RGBA": | |
| background.paste(img, mask=img.split()[3]) | |
| else: | |
| background.paste(img) | |
| return background | |
| if img.mode != "RGB": | |
| return img.convert("RGB") | |
| return img | |