"""Image utilities.""" import subprocess from pathlib import Path import click from mycli.utils import handle_errors, run_command @click.group() def image(): """Image manipulation commands.""" pass @image.command("eps-to-pdf") @click.argument("files", nargs=-1, required=True) @click.option("--dry-run", "-n", is_flag=True, help="Show what would be done") @handle_errors def eps_to_pdf(files, dry_run): """Convert EPS files to PDF.""" for pattern in files: for eps_file in Path(".").glob(pattern): if eps_file.suffix.lower() not in (".eps", ".ps"): continue output = eps_file.with_suffix(".pdf") if dry_run: click.echo(f"Would convert: {eps_file} -> {output}") continue click.echo(f"Converting: {eps_file} -> {output}") run_command(["epstopdf", str(eps_file)], check=False) @image.command("eps-fix") @click.argument("file", type=click.Path(exists=True)) @click.option("--dry-run", "-n", is_flag=True, help="Show what would be done") @handle_errors def eps_fix(file, dry_run): """Fix EPS files created by print command.""" path = Path(file) content = path.read_text() if "/f/fill" not in content: click.echo("File already fixed or not created by print command") return if dry_run: click.echo(f"Would fix: {file}") return lines = content.split("\n") new_lines = [] for line in lines: if "/f/fill" in line: line = line.replace("/f/fill", "") new_lines.append(line) path.write_text("\n".join(new_lines)) click.echo(f"Fixed: {file}") @image.command("jpg-to-pdf") @click.argument("files", nargs=-1, required=True) @click.option("--output", "-o", help="Output PDF file") @click.option("--dry-run", "-n", is_flag=True, help="Show what would be done") @handle_errors def jpg_to_pdf(files, output, dry_run): """Convert JPG files to PDF.""" images = [] for pattern in files: for jpg_file in Path(".").glob(pattern): if jpg_file.suffix.lower() in (".jpg", ".jpeg"): images.append(str(jpg_file)) if not images: click.echo("No JPG files found") return output = output or "output.pdf" if dry_run: click.echo(f"Would convert {len(images)} images to {output}") return click.echo(f"Converting {len(images)} images to {output}") run_command(["convert"] + images + [output], check=False) @image.command("tiff-to-pdf") @click.argument("files", nargs=-1, required=True) @click.option("--dry-run", "-n", is_flag=True, help="Show what would be done") @handle_errors def tiff_to_pdf(files, dry_run): """Convert TIFF files to PDF.""" for pattern in files: for tiff_file in Path(".").glob(pattern): if tiff_file.suffix.lower() not in (".tif", ".tiff"): continue output = tiff_file.with_suffix(".pdf") if dry_run: click.echo(f"Would convert: {tiff_file} -> {output}") continue click.echo(f"Converting: {tiff_file} -> {output}") run_command(["convert", str(tiff_file), str(output)], check=False) @image.command("tiff-compress") @click.argument("files", nargs=-1, required=True) @click.option("--dry-run", "-n", is_flag=True, help="Show what would be done") @handle_errors def tiff_compress(files, dry_run): """Compress TIFF files.""" for pattern in files: for tiff_file in Path(".").glob(pattern): if tiff_file.suffix.lower() not in (".tif", ".tiff"): continue if dry_run: click.echo(f"Would compress: {tiff_file}") continue click.echo(f"Compressing: {tiff_file}") run_command( ["convert", str(tiff_file), "-compress", "zip", str(tiff_file)], check=False, )