59 lines
1.3 KiB
Python
Executable file
59 lines
1.3 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
import argparse
|
|
from pathlib import Path
|
|
|
|
import img2pdf
|
|
|
|
|
|
SUPPORTED_EXTENSIONS = {".jpg", ".jpeg", ".png"}
|
|
|
|
|
|
def images_to_pdf(images: list[Path], output: Path) -> None:
|
|
# A4 page dimensions in PDF points (1 point = 1/72 inch).
|
|
a4_size = (img2pdf.mm_to_pt(210), img2pdf.mm_to_pt(297))
|
|
|
|
# Scale images proportionally to fit within A4 pages.
|
|
layout = img2pdf.get_layout_fun(
|
|
pagesize=a4_size,
|
|
fit=img2pdf.FitMode.into,
|
|
auto_orient=True,
|
|
)
|
|
|
|
with output.open("wb") as pdf_file:
|
|
pdf_file.write(
|
|
img2pdf.convert(
|
|
[str(image) for image in images], #type: ignore
|
|
layout_fun=layout,
|
|
)
|
|
)
|
|
|
|
def main() -> None:
|
|
parser = argparse.ArgumentParser(
|
|
description="Convert JPEG/PNG images into a PDF, one image per page."
|
|
)
|
|
|
|
parser.add_argument(
|
|
"images",
|
|
nargs="+",
|
|
type=Path,
|
|
help="Input JPEG/PNG images in page order",
|
|
)
|
|
|
|
parser.add_argument(
|
|
"-o",
|
|
"--output",
|
|
type=Path,
|
|
default=Path("output.pdf"),
|
|
help="Output PDF file (default: output.pdf)",
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
images_to_pdf(args.images, args.output)
|
|
|
|
print(f"Created: {args.output}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|