태지쌤

로봇 & 코딩교육 No.1 크리에이터

파이썬

ai파일 pdf변환 후 하나로 합치기(파이썬 활용)

태지쌤 2025. 9. 11. 08:58
반응형

https://link.coupang.com/a/cP6MBx

 

LG전자 2025 그램 16 코어Ultra5 - 노트북 | 쿠팡

쿠팡에서 LG전자 2025 그램 16 코어Ultra5 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 노트북 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

함께 일하는 디자인 회사가 일하는 방식이 완전…(할말은 많지만 하지 않겠습니다 ㅋㅋ)

지난번에는 아웃라인을 제대로 안해서 하루 종일 힘들게 하더니

이번에는 결과물을 .ai 파일로 줍니다.

그것도 페이지별 개별 파일로요.

물론 아래의 fviewer에서 열 수는 있지만 개별 파일 하나씩 업로드해서 불러오는게 귀찮죠.

 

진짜 별로입니다.

게다가 전 디자이너가 아니라서 어도비 프로그램 자체가 제 pc에는 설치되어 있지도 않아요.

그래서 이번에도 파이썬으로 각각의 개별 .ai 파일을 pdf로 변환한 뒤 그걸 다시 하나의 파일로 합쳐봤습니다.

아래의 모듈먼저 설치하구요.

pip install pymupdf

# save_ai_to_pdf_merge.py
# 요구 사항:
# - 폴더: C:\Users\win11-04\OneDrive\문서\카카오톡 받은 파일\ai (1)
# - 파일명: "XXX 카다록2.ai" ~ "XXX 카다록28.ai" (정수 2..28)
# - 각 .ai를 PDF로 변환 후, 숫자 작은 순서로 병합하여 하나의 PDF 생성

from pathlib import Path
import fitz  # PyMuPDF

BASE_DIR = Path(r"C:\Users\win11-04\OneDrive\문서\카카오톡 받은 파일\ai (1)")
START_NUM = 2
END_NUM = 28

# 변환된 개별 PDF를 저장할 하위 폴더
PDF_DIR = BASE_DIR / "_converted_pdf"
PDF_DIR.mkdir(exist_ok=True)

# 최종 병합본 출력 경로
MERGED_PDF = BASE_DIR / "XXX_카다록2-28_병합본.pdf"

def is_pdf_compatible_ai(ai_path: Path) -> bool:
    """AI 파일이 PDF 호환 저장인지 간단히 판별한다: 파일 헤더가 %PDF- 로 시작하면 True."""
    try:
        with ai_path.open("rb") as f:
            head = f.read(8)
        return head.startswith(b"%PDF-")
    except Exception:
        return False

def convert_ai_to_pdf(ai_path: Path, out_pdf_path: Path) -> bool:
    """PyMuPDF로 AI(PDF 호환) 열어 PDF로 저장. 성공 시 True."""
    try:
        doc = fitz.open(ai_path)   # PDF 호환 AI면 열림
    except Exception as e:
        print(f"[건너뜀] 열기 실패: {ai_path.name} ({e})")
        return False

    try:
        # 그대로 PDF로 저장
        doc.save(out_pdf_path, deflate=True)
        doc.close()
        print(f"[완료] 변환: {ai_path.name} -> {out_pdf_path.name}")
        return True
    except Exception as e:
        print(f"[실패] 저장 오류: {ai_path.name} ({e})")
        try:
            doc.close()
        except:
            pass
        return False

def merge_pdfs(pdf_paths, out_path: Path):
    out = fitz.open()
    for p in pdf_paths:
        try:
            src = fitz.open(p)
            out.insert_pdf(src)
            src.close()
            print(f"[병합] 포함: {p.name}")
        except Exception as e:
            print(f"[경고] 병합 실패: {p.name} ({e})")
    # 최종 저장
    out.save(out_path, deflate=True)
    out.close()
    print(f"[완료] 병합본 저장: {out_path}")

def main():
    converted_list = []

    for n in range(START_NUM, END_NUM + 1):
        ai_name = f"XXX 카다록{n}.ai"
        ai_path = BASE_DIR / ai_name

        if not ai_path.exists():
            print(f"[건너뜀] 없음: {ai_name}")
            continue

        if not is_pdf_compatible_ai(ai_path):
            print(f"[건너뜀] PDF 호환 아님: {ai_name}")
            print("         Illustrator에서 'PDF 호환 파일 작성' 옵션으로 다시 저장해야 합니다.")
            continue

        out_pdf = PDF_DIR / f"XXX 카다록{n}.pdf"
        if convert_ai_to_pdf(ai_path, out_pdf):
            converted_list.append(out_pdf)

    if not converted_list:
        print("[중단] 변환된 PDF가 없습니다. PDF 호환 저장 여부를 확인하세요.")
        return

    # 숫자 오름차순으로 이미 정렬된 상태지만, 안전하게 한 번 더 정렬
    converted_list.sort(key=lambda p: int(''.join(filter(str.isdigit, p.stem)) or 0))

    merge_pdfs(converted_list, MERGED_PDF)

if __name__ == "__main__":
    main()
반응형