ABOUT ME

-

Total
-
  • Python: 사진 to pdf 파일 변환
    컴퓨터/파이썬 2021. 10. 23. 23:56
    728x90
    반응형

    사진 파일들을 pdf에 담을 간단한 작업이 자주 필요했다.

    아래를 실행하면 원하는 사진들이 "~~. pdf"로 저장된다.

     

    사용법

    pdf.py에 코드를 저장하고 argument를 전달한다.

    -f (필수) 뒤 사진들 | -p (옵션) 저장할 경로 | -n (옵션) 원하는 pdf 이름

    # 사용법
    python pdf.py -f 1.jpg E:\2.jpg
    
    python pdf.py -f 1.jpg E:\2.jpg -p "E:\"

     

    pdf.py

    from argparse import ArgumentParser
    
    from PIL import Image
    
    import os
    import random
    
    # 기본 저장되는 경로
    PATH = "C:\\Users\\user\\Desktop\\"
    
    if __name__ == "__main__":
        parser = ArgumentParser()
        parser.add_argument("--files", "-f", type=str, required=True, nargs="+")
        parser.add_argument("--path", "-p", type=str)
        parser.add_argument("--name", "-n", type=str)
    
        args = parser.parse_args()
    
        img_list = []
        base_img = Image.open(args.files[0]).convert("RGB")  # PNG는 RGBA -> RGB
        for img_path in args.files[1:]:
            img_list.append(Image.open(img_path))
    
        if args.name and not args.name.endswith(".pdf"):
            args.name = ".pdf"
    
        image_name = args.name if args.name else f"이름_{random.randint(1, 100)}.pdf"
    
        if args.path:
            pdf_path = os.path.join(args.path, image_name)
        else:
            pdf_path = os.path.join(PATH, image_name)
    
        base_img.save(
            pdf_path, "PDF", resolution=100.0, save_all=True, append_images=img_list
        )
    
        print(f"Saved to {pdf_path}")

     

    Rust pyo3

    use pyo3::prelude::*;
    use pyo3::wrap_pyfunction;
    use pyo3::types::PyTuple;
    
    use std::path::Path;
    
    use image::{ImageFormat, RgbImage};
    
    #[pyfunction]
    fn merge_images(py: Python, files: &PyTuple, path: Option<&str>, name: Option<&str>) -> PyResult<()> {
        let files: Vec<String> = files.iter().map(|x| x.extract().unwrap()).collect();
    
        let mut images = Vec::new();
        let base_img = image::open(&Path::new(&files[0])).unwrap().into_rgb();
        for img_path in &files[1..] {
            images.push(image::open(&Path::new(img_path)).unwrap().into_rgb());
        }
    
        let image_name = if let Some(name) = name {
            if !name.ends_with(".pdf") {
                format!("{}.pdf", name)
            } else {
                name.to_string()
            }
        } else {
            format!("이름_{}.pdf", random::<u32>())
        };
    
        let pdf_path = if let Some(path) = path {
            Path::new(path).join(&image_name)
        } else {
            Path::new("C:\\Users\\user\\Desktop\\").join(&image_name)
        };
    
        base_img.save(
            &pdf_path,
            ImageFormat::Pdf,
            &images,
        )?;
    
        println!("Saved to {}", pdf_path.display());
    
        Ok(())
    }
    
    #[pymodule]
    fn image_merge(_py: Python, m: &PyModule) -> PyResult<()> {
        m.add_wrapped(wrap_pyfunction!(merge_images))?;
        Ok(())
    }
    728x90

    댓글