오브리닷넷(Obbli.net)

페이지 순서가 뒤집히는 책 스캔 PDF 한번에 순서 바로잡기(feat. 파이썬) 본문

IT/우분투

페이지 순서가 뒤집히는 책 스캔 PDF 한번에 순서 바로잡기(feat. 파이썬)

아주가끔은 2022. 10. 12. 16:06
반응형

책 스캔 뒤 뒤죽박죽 페이지 뒷처리 방법(?)

책 또는 Booklet 형태로 된 페이지를 펼쳐서 그대로 스캔하게 되면 페이지 순서가 뒤집힌다.

예를 들어 총 8페이지의 책자를 스캔한다고 치면 스캔되는것은 4 페이지가 나오고

그 순서는 인쇄된 순서에 따라

[1], [8]
[7], [2]
[3], [6]
[5], [4]

이 될것이고,

이것을 페이지 중앙을 중심으로 이전 포스트(https://obbli.tistory.com/172)에 따라 단순하게 나누면

[1]
[8]
[7]
[2]
[3]
[6]
[5]
[4]

이 된다.

이러면 순서가 뒤죽박죽이 되어서 페이지를 다시 정리해야하는 번거로움이 생긴다.(스캔된 페이지가 30 페이지를 넘어가게 되면 일일이 페이지를 정리하는것도 부담스럽다.)

저 뒤집힌 순서도 잘 생각해보면 패턴이 있기 때문에 자동화가 가능할것이라 생각되어 스캔된것을 잘라주고 정리해주는 소스를 따로 찾아 봤더니 파이썬으로 가능한 소스가 있었다.(때마침 파이썬 공부하던 중..)

이것을 사용하면

[1], [8]
[7], [2]
[3], [6]
[5], [4]

은 자동으로

[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]

로 나뉘어지고 정리된다.

사용법

  1. 파일 revers-split.py 를 생성하고 아래 소스를 입력시켜 저장한다.
  2. revers-split.py 를 스캔한 pdf 가 있는 폴더에 같이 넣는다. (가급적 pdf 만 있는 폴더를 따로 만들어 실행한다.)
  3. 명령어를 실행한다.(아래 실행 명령 코드 참조.)

활용에 따라서는 다중 파일도 손쉽게 명령어 한 번에 변환이 가능하다.

파일명 : revers-split_pdf.py

# see https://stackoverflow.com/questions/51973437/reverse-pdf-imposition

import copy
import sys
import math
import pyPdf

"""
Reverse imposing:
--A3--         --A4--
[12| 1]         [1]
[ 2|11]         [2]
[10| 3]    =>   [3]
  ...           ...
[ 6| 7]         [6]
                [7]
                ...
               [12]
"""

def split_pages(src, dst):
    src_f = file(src, 'r+b')
    dst_f = file(dst, 'w+b')

    input_PDF = pyPdf.PdfFileReader(src_f)
    num_pages = input_PDF.getNumPages()
    
    first_half, second_half = [], []

    for i in range(num_pages):
        p = input_PDF.getPage(i)
        q = copy.copy(p)
        q.mediaBox = copy.copy(p.mediaBox)

        x1, x2 = p.mediaBox.lowerLeft
        x3, x4 = p.mediaBox.upperRight

        x1, x2 = math.floor(x1), math.floor(x2)
        x3, x4 = math.floor(x3), math.floor(x4)
        x5, x6 = math.floor(x3/2), math.floor(x4/2)

        if x3 > x4:
            # horizontal
            p.mediaBox.upperRight = (x5, x4)
            p.mediaBox.lowerLeft = (x1, x2)

            q.mediaBox.upperRight = (x3, x4)
            q.mediaBox.lowerLeft = (x5, x2)
        else:
            # vertical
            p.mediaBox.upperRight = (x3, x4)
            p.mediaBox.lowerLeft = (x1, x6)

            q.mediaBox.upperRight = (x3, x6)
            q.mediaBox.lowerLeft = (x1, x2)

    
        if i in range(1,num_pages+1,2):
            first_half += [p]
            second_half += [q]
        else:
            first_half += [q]
            second_half += [p]

    output = pyPdf.PdfFileWriter()
    for page in first_half + second_half[::-1]:
        output.addPage(page)

    output.write(dst_f)
    src_f.close()
    dst_f.close()

if len(sys.argv) < 3:
    print("\nusage:\n$ python2 reverse-split_pdf.py input.pdf output.pdf")
    sys.exit()

input_file = sys.argv[1]
output_file = sys.argv[2]

split_pages(input_file,output_file)

그리고 실행 명령(...우분투에서)

mkdir split; for file in *.pdf; do python2 revers-split_pdf.py "$file" "$file-split.pdf"; mv ./*split.pdf ./split; done;

참조한 페이지는 아래와 같다.

출처 : https://stackoverflow.com/questions/51973437/reverse-pdf-imposition

반응형