일단 한 대 쳐 보고

PDF 여러 개를 하나로 합치는 무료 방법: 파일을 올리지 않고 내 PC에서 합치기

PDF 여러 개를 무료로 하나로 합치는 방법 중 이 글에서 실제로 돌려 확인한 것은 파이썬 라이브러리 pypdf로 내 PC 안에서 합치는 방법입니다. 아래 스크립트를 폴더에 넣고 실행하면 그 폴더의 PDF가 이름 순서대로 한 파일로 합쳐지고, 원본 파일 이름이 책갈피로 붙습니다. 파일이 인터넷으로 나가지 않으므로 계약서나 개인정보가 든 문서에도 쓸 수 있습니다. 쪽수 2+3+1=6쪽과 책갈피 3개를 직접 확인했습니다. 암호가 걸린 PDF가 섞여 있으면 합치기가 멈추니 먼저 암호를 풀어야 합니다.

확인한 환경

OS: Windows-11-10.0.26200-SP0 (한국어)
Python: 3.14.7
pypdf: 6.21.4

PDF를 만들고 합치고 확인하는 모든 단계를 이 PC에서 실행했습니다. pip install pypdf부터 시작하는 단계는 아무것도 설치되지 않은 새 파이썬 환경에서 따로 실행해 합치기까지 성공했습니다. 이 글은 파이썬으로 합치는 방법을 다룹니다.

합치는 방법

코드를 몰라도 됩니다. 할 일은 파이썬 설치, 명령 두 줄 입력, 메모장에 스크립트 한 개 저장입니다. 명령을 입력하는 창은 시작 메뉴에서 "PowerShell"을 검색하면 열립니다.

  1. 합칠 PDF를 새 폴더 하나에 모읍니다. 합친 결과는 그 폴더 밖에 저장하는 것이 안전합니다.
  2. 파이썬이 없으면 python.org에서 설치합니다. 있는지 모르겠으면 PowerShell에 python --version을 입력해 보세요. Python 3.14.7처럼 버전이 나오면 설치된 것입니다.
  3. PowerShell에서 pip install pypdf를 실행합니다. 새 파이썬 환경에서 이 명령으로 설치되어 아래 스크립트가 돌아가는 것을 확인했습니다.
  4. 아래 스크립트를 메모장에 붙여 merge_pdfs.py로 저장합니다(인코딩 UTF-8). 저장할 때 파일 형식을 "모든 파일"로 두고 이름 끝이 .txt가 되지 않게 하세요.
import re, sys
from pathlib import Path
from pypdf import PdfWriter

def natural_key(p):
    return [int(t) if t.isdigit() else t for t in re.split(r"(\d+)", p.stem)]

folder, out = Path(sys.argv[1]), Path(sys.argv[2])
files = [f for f in folder.glob("*.pdf") if f.resolve() != out.resolve()]
files.sort(key=(lambda f: f.stem) if "--lexical" in sys.argv else natural_key)
w = PdfWriter()
for f in files:
    w.append(str(f), outline_item=f.stem)   # 책갈피 이름 = 원본 파일 이름
    print("추가:", f.name)
w.write(out)
w.close()
print("저장:", out.name)
  1. 실행합니다. 첫 칸은 PDF가 모인 폴더, 둘째 칸은 저장할 파일 이름입니다.
python merge_pdfs.py C:\합칠파일 C:\결과\합친결과.pdf

append로 파일을 이어 붙이면서 책갈피를 함께 만드는 기능은 pypdf 공식 문서의 병합 안내에 있습니다.

실제로 합친 결과

연습용 PDF 3개(견적서 2쪽, 계약서 3쪽, 첨부자료 1쪽)를 만들어 합쳤습니다. 한글 본문이 들어 있고, 합치기 전 원본은 모두 책갈피가 없었습니다.

견적서.pdf: 2쪽, 22,263바이트
계약서.pdf: 3쪽, 23,385바이트
첨부자료.pdf: 1쪽, 21,365바이트

합친 뒤입니다.

추가: 견적서.pdf
추가: 계약서.pdf
추가: 첨부자료.pdf
저장: 합친결과.pdf

합친결과.pdf: 6쪽, 61,981바이트
책갈피:
- 견적서
- 계약서
- 첨부자료
쪽별 첫 줄: ['견적서', '견적서', '계약서', '계약서', '계약서', '첨부자료']

걸림돌 1: 파일 순서가 뒤섞일 때

문서1, 문서2, 문서10 세 파일을 글자 순서로 정렬하면 문서1, 문서10, 문서2가 됩니다. 위 스크립트는 기본으로 숫자를 숫자로 보고 정렬합니다. 옵션 --lexical을 붙여 글자 순서로 합친 결과와 비교했습니다.

글자 순서(--lexical):  책갈피 문서1, 문서10, 문서2   쪽별 첫 줄 ['문서1', '문서10', '문서2']
숫자 순서(기본):       책갈피 문서1, 문서2, 문서10   쪽별 첫 줄 ['문서1', '문서2', '문서10']

번호 순서대로 합치고 싶으면 기본값으로 쓰면 됩니다. 파일 이름이 제1장, 제2장처럼 숫자가 앞뒤로 흩어져 있으면 합친 뒤에 책갈피 순서를 꼭 확인하세요.

걸림돌 2: 원본에 책갈피가 있을 때

원본에 책갈피가 있으면 합친 파일에서 그 파일 이름 책갈피 아래에 이어 붙습니다. 계약서에 제1조~제3조 책갈피를 넣고 견적서와 합친 결과입니다.

book_out.pdf: 5쪽, 42,629바이트
책갈피:
- 견적서
- 계약서
  - 제1조
  - 제2조
  - 제3조

걸림돌 3: 암호 걸린 PDF가 섞여 있을 때

열 때 암호를 입력하는 PDF를 폴더에 같이 두면 합치기가 중간에 멈추고 결과 파일은 만들어지지 않았습니다.

pypdf.errors.FileNotDecryptedError: File has not been decrypted

암호를 알고 있다면 PdfReader에 암호를 지정해서 열면 됩니다. 위 스크립트의 셋째 줄 from pypdf import PdfWriter를 from pypdf import PdfReader, PdfWriter로 바꾸고, 잠긴 파일은 아래처럼 따로 붙입니다. 암호 있는 1쪽짜리 파일과 견적서(2쪽)를 이 방식으로 합치자 3쪽이 나왔고, 결과 파일은 암호 없이 열렸습니다.

w.append(PdfReader("잠금문서.pdf", password="1234"), outline_item="잠금문서")
결과: 3쪽, 암호 필요=False
쪽별 첫 줄: ['잠금문서', '견적서', '견적서']

이 경우 결과 파일에는 암호가 남지 않으니 보관할 때 주의하세요. 암호를 모르는 파일은 합칠 수 없습니다. 이 글의 암호는 연습용 1234입니다.

온라인 합치기 사이트에 올려도 되나

'PDF 합치기'를 검색하면 파일을 올리는 사이트가 많이 나옵니다. 간단하지만 이 글에서는 이 사이트들을 직접 시험하지 않았고, 올린 파일을 어떻게 다루는지는 사이트마다 다릅니다. 근거가 있는 위험은 다음 정도입니다.

그래서 계약서, 신분증 사본, 급여·거래 내역, 고객 정보가 든 문서는 올리지 않는 쪽이 안전합니다. 공개해도 되는 자료만 합친다면 사이트를 쓸 수 있습니다. 이때 사이트가 파일 대신 실행 파일(.exe, .bat 등)을 내려받으라고 하면 받지 않는 것이 좋습니다.

정리