일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 리눅스
- Linux
- 네트워크
- 티스토리챌린지
- synology
- 나스
- 피날레2005
- 오픈소스
- 오블완
- 사보
- Finale2009
- 수세
- Nas
- 사무실
- openSUSE 11.2
- 시벨리우스
- sibelius5
- 시놀로지
- sibelius4
- MIDI
- 오픈수세
- OpenSuSE
- 오픈수세 11.1
- Finale2005
- 피날레
- 시벨리우스5
- 시벨리우스4
- 미디
- 오픈수세 11.2
- 피날레2009
Archives
- Today
- Total
오브리닷넷(Obbli.net)
페이지 순서가 뒤집히는 책 스캔 PDF 한번에 순서 바로잡기(feat. 파이썬) 본문
반응형
책 또는 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]
로 나뉘어지고 정리된다.
사용법
- 파일 revers-split.py 를 생성하고 아래 소스를 입력시켜 저장한다.
- revers-split.py 를 스캔한 pdf 가 있는 폴더에 같이 넣는다. (가급적 pdf 만 있는 폴더를 따로 만들어 실행한다.)
- 명령어를 실행한다.(아래 실행 명령 코드 참조.)
활용에 따라서는 다중 파일도 손쉽게 명령어 한 번에 변환이 가능하다.
파일명 : 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
반응형