2015년 3월 25일 수요일

tiff로 스캔받은것 pdf로 변환

처음부터 pdf로 받으면 되는데 사정상 이리 됨.


150메가정도 되는 multi page tiff file을 pdf로 변환하려고 하는데 적당한 툴을 못찾겠다.
웹에서 무료변환해주는 사이트나 툴이 몇개 있는데 두세개 해보니 모두 메모리 부족.
(총 104페이지로 분량이 많은건 아닌데 full color가 들어있어서 중간에 메모리가 많이 필요한것 같았다. 하나씩 분리한 뒤 보니 가장 큰 페이지가 22M정도.)
acrobat XI pro 로 한번에 import 한 뒤 변환하려 했는데 이것도 에러남.




tiff를 하나씩 split한 다음 다시 pdf로 합하는 방법을 쓰기로 했다.
tiff splitter만 성공했다. 다른것들은 모두 메모리 부족. imagemagick도 받아서 convert를 썼는데 역시 메모리 부족이었다.


이렇게 해서 다 나누고 나니 페이지가 돌아가 있어서 바로 돌리고,
 for i in {3..104}; do  convert page\ \($i\).tif -rotate 270 p$i.tif ; done

이제 acrobat XI에서 모두 import하면 pdf를 얻는다.

pdf에서 한쪽이 다음과 같은 모양이어서,


split.py를 이용해 pdf의 각 페이지를 자른다.
(이게 출처가 기억이 안남..)

(split.py 코드)
import copy
import math
import pyPdf

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

input = pyPdf.PdfFileReader(src_f)
output = pyPdf.PdfFileWriter()

for i in range(input.getNumPages()):
p = input.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)

output.addPage(p)
output.addPage(q)

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


그럼 끝.