본문 바로가기

일상

흩어진 PDF 수십 개를 순서대로 합치기 (파일명 정렬 함정과 누락 검증)

반응형

화면 설계서를 받았는데 파일이 41개로 쪼개져 있었습니다. 하나로 합쳐서 봐야 하는데, 파일명 순서대로 붙이면 순서가 뒤죽박죽이 됩니다. 이걸 제대로 합치는 과정을 정리한 글입니다.


1. 파일 하나로 합치는 건 어렵지 않습니다

파이썬에서 PDF를 붙이는 건 몇 줄이면 됩니다. 진짜 문제는 두 가지입니다.

- 어떤 순서로 붙일 것인가

- 붙이고 나서 빠진 게 없다는 것을 어떻게 확인할 것인가

두 번째가 더 중요합니다. 41개 중 하나가 빠져도 결과물은 아무 오류 없이 잘 만들어지기 때문입니다.


2. 함정 1 - 파일명 정렬은 사람이 세는 순서가 아닙니다

가장 먼저 부딪히는 문제입니다.

파일명을 그냥 정렬하면 10번이 2번보다 앞에 옵니다. 문자로 비교하기 때문에 첫 글자 1이 2보다 작다고 판단하는 것입니다.

해결은 간단합니다. 이름을 숫자와 글자로 쪼개서, 숫자 부분은 숫자로 비교하도록 키를 만들어 주면 됩니다. 흔히 자연 정렬이라고 부릅니다.


3. 그런데 자연 정렬로도 부족했습니다

번호를 제대로 세게 만들어도 결과가 이상했습니다. 서로 다른 섹션의 1번들이 뒤섞였기 때문입니다.

이유는 단순합니다. 파일마다 번호가 자기 섹션 안에서만 매겨져 있었습니다. 로그인 쪽 1번과 관리 쪽 1번이 따로 존재하니, 이름만 봐서는 전체 순서를 알 수 없습니다.

즉 순서 정보는 파일명이 아니라 문서 구조 쪽에 있었습니다.


4. 구분 표지를 앵커로 삼습니다

다행히 받은 파일 안에 간지, 그러니까 섹션 표지 역할을 하는 PDF가 섞여 있었습니다. 이게 목차 역할을 합니다.

그래서 순서를 이렇게 정했습니다.

- 간지 파일만 뽑아 섹션의 순서를 확정한다

- 각 간지 뒤에 그 섹션에 속하는 화면들을 자연 정렬해서 붙인다

- 어디에도 속하지 않은 파일은 따로 표시해 둔다

여기서 used 집합을 쓰는 이유가 있습니다. 파일이 두 섹션에 중복으로 들어가는 것을 막고, 동시에 끝까지 한 번도 배치되지 않은 파일을 걸러내기 위해서입니다. 이 집합이 다음 단계에서 검증 재료가 됩니다.


5. 진짜 일은 병합이 아니라 검증입니다

앞서 말했듯 파일 하나가 통째로 빠져도 병합은 성공합니다. 결과물을 열어봐도 겉보기에는 멀쩡합니다. 그래서 기계가 확인할 수 있는 조건을 걸어둬야 합니다.

두 가지를 봅니다.

- 쪽수 합계 : 입력 파일들의 페이지 수를 다 더한 값이 결과물의 페이지 수와 같은가

- 미배치 목록 : 전체 파일 집합에서 배치된 파일 집합을 뺐을 때 남는 게 있는가

앞의 것은 내용이 빠지지 않았음을, 뒤의 것은 파일이 누락되지 않았음을 각각 보장합니다. 둘 다 통과하면 41개 전부가 정확히 한 번씩 들어갔다고 말할 수 있습니다.

눈으로 넘겨보며 확인하는 것과는 신뢰도가 다릅니다. 41개는 그럭저럭 셀 수 있지만 100개가 되면 사람 눈으로는 못 셉니다.


6. 실제로 돌려보니

간지를 앵커로 잡은 뒤에는 순서가 업무 흐름대로 정리됐습니다. 검증도 통과했습니다.

- 입력 파일 전부가 정확히 한 번씩 사용됨

- 미배치 파일 없음

- 입력 쪽수 합계와 결과물 쪽수 일치

여기서 얻은 것은 합쳐진 PDF 한 개가 아니라, 빠진 게 없다고 말할 근거였습니다.


7. 정리

- 파일명 정렬은 자연 정렬로 바꿉니다. 10이 2보다 앞에 오는 문제부터 잡습니다

- 그래도 순서가 안 맞으면, 순서 정보가 파일명에 없다는 뜻입니다

- 문서 안의 구분 표지를 앵커로 삼아 섹션을 만듭니다

- 병합 후에는 쪽수 합계와 미배치 목록을 기계로 확인합니다

- 결과물이 잘 만들어졌다는 것은 아무것도 보장하지 않습니다

파일을 다루는 자동화에서 가장 위험한 실패는 오류가 나는 실패가 아니라, 조용히 성공한 것처럼 보이는 실패입니다. 검증 두 줄이 그걸 막아줍니다.


여기까지 흩어진 PDF를 섹션 기준으로 병합하는 방법에 대해서 작성해봤습니다. 여기까지 읽어주셔서 감사합니다!

반응형