pdf-lambda-crop/lambda_function.py
2025-10-07 14:17:39 -04:00

55 lines
1.8 KiB
Python

# Crop a single page PDF document.
# This is specifically designed for the letter size UPS shipping label that needs to be cropped for printing.
import base64
import io
from cropper import AutoSettings, ManualSettings, argument_default, auto_crop, manual_crop, messages
from typing import Dict, Any
def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]:
messages.clear()
content = io.BytesIO(base64.b64decode(event['b64_content']))
mode = argument_default(event, 'mode', 'manual', 'string')
messages.append(f"Log stream name is {context.log_stream_name}")
if mode == 'auto':
settings = AutoSettings()
settings.event_argument(event, 'width')
settings.event_argument(event, 'height')
settings.event_argument(event, 'margin')
try:
buffer = auto_crop(content, settings)
except Exception as e:
return {
'statusCode': 400,
'error': str(e),
'messages': messages,
}
elif mode == 'manual':
settings = ManualSettings()
settings.event_argument(event, 'start_x')
settings.event_argument(event, 'start_y')
settings.event_argument(event, 'width')
settings.event_argument(event, 'height')
settings.event_argument(event, 'scale_x')
settings.event_argument(event, 'scale_y')
settings.event_argument(event, 'rotate')
buffer = manual_crop(content, settings)
else:
return {
'statusCode': 400,
'error': 'Invalid mode: (manual|auto)',
'messages': messages,
}
data = base64.b64encode(buffer.getvalue())
return {
'statusCode': 200,
'body': data,
'messages': messages,
}