""" Author: Ludy87 Description: This script converts a PDF file to WebP images. It includes functionality to resize images if they exceed specified dimensions and handle conversion of PDF pages to WebP format. Example ------- To convert a PDF file to WebP images with each page as a separate WebP file: python script.py input.pdf output_directory To convert a PDF file to a single WebP image: python script.py input.pdf output_directory --single To adjust the DPI resolution for rendering PDF pages: python script.py input.pdf output_directory --dpi 150 """ import argparse import os from pdf2image import convert_from_path from PIL import Image def resize_image(input_image_path, output_image_path, max_size=(16383, 16383)): """ Resize the image if its dimensions exceed the maximum allowed size and save it as WebP. Parameters ---------- input_image_path : str Path to the input image file. output_image_path : str Path where the output WebP image will be saved. max_size : tuple of int, optional Maximum allowed dimensions for the image (width, height). Default is (16383, 16383). Returns ------- None """ try: # Open the image image = Image.open(input_image_path) width, height = image.size max_width, max_height = max_size # Check if the image dimensions exceed the maximum allowed dimensions if width > max_width or height > max_height: # Calculate the scaling ratio ratio = min(max_width / width, max_height / height) new_width = int(width * ratio) new_height = int(height * ratio) # Resize the image resized_image = image.resize((new_width, new_height), Image.LANCZOS) resized_image.save(output_image_path, format="WEBP", quality=100) print( f"The image was successfully resized to ({new_width}, {new_height}) and saved as WebP: {output_image_path}" ) else: # If dimensions are within the allowed limits, save the image directly image.save(output_image_path, format="WEBP", quality=100) print(f"The image was successfully saved as WebP: {output_image_path}") except Exception as e: print(f"An error occurred: {e}") def convert_image_to_webp(input_image, output_file): """ Convert an image to WebP format, resizing it if it exceeds the maximum dimensions. Parameters ---------- input_image : str Path to the input image file. output_file : str Path where the output WebP image will be saved. Returns ------- None """ # Resize the image if it exceeds the maximum dimensions resize_image(input_image, output_file, max_size=(16383, 16383)) def pdf_to_webp(pdf_path, output_dir, dpi=300): """ Convert each page of a PDF file to WebP images. Parameters ---------- pdf_path : str Path to the input PDF file. output_dir : str Directory where the WebP images will be saved. dpi : int, optional DPI resolution for rendering PDF pages. Default is 300. Returns ------- None """ # Convert the PDF to a list of images images = convert_from_path(pdf_path, dpi=dpi) for page_number, image in enumerate(images): # Define temporary PNG path temp_png_path = os.path.join(output_dir, f"temp_page_{page_number + 1}.png") image.save(temp_png_path, format="PNG") # Define the output path for WebP output_path = os.path.join(output_dir, f"page_{page_number + 1}.webp") # Convert PNG to WebP convert_image_to_webp(temp_png_path, output_path) # Delete the temporary PNG file os.remove(temp_png_path) def main(pdf_image_path, output_dir, dpi=300, single_images_flag=False): """ Main function to handle conversion from PDF to WebP images. Parameters ---------- pdf_image_path : str Path to the input PDF file or image. output_dir : str Directory where the WebP images will be saved. dpi : int, optional DPI resolution for rendering PDF pages. Default is 300. single_images_flag : bool, optional If True, combine all pages into a single WebP image. Default is False. Returns ------- None """ if single_images_flag: # Combine all pages into a single WebP image output_path = os.path.join(output_dir, "combined_image.webp") convert_image_to_webp(pdf_image_path, output_path) else: # Convert each PDF page to a separate WebP image pdf_to_webp(pdf_image_path, output_dir, dpi) if __name__ == "__main__": parser = argparse.ArgumentParser(description="Convert a PDF file to WebP images.") parser.add_argument("pdf_path", help="The path to the input PDF file.") parser.add_argument( "output_dir", help="The directory where the WebP images should be saved." ) parser.add_argument( "--dpi", type=int, default=300, help="The DPI resolution for rendering the PDF pages (default: 300).", ) parser.add_argument( "--single", action="store_true", help="Combine all pages into a single WebP image.", ) args = parser.parse_args() os.makedirs(args.output_dir, exist_ok=True) main( args.pdf_path, args.output_dir, dpi=args.dpi, single_images_flag=args.single, )