프로그래밍/Python

PDF 에서 사진만빼서 다시 PDF 만들기

CHIqueen 2020. 3. 13. 03:21

스캐너 지잉지잉 너무 오래걸리고 귀찮아서 캠뭐시기 어플을 애용하고 있다.

하지만 pdf로 변환하고 나면 밑에 있는 scan by ~ 가 다른 사람한테 전달할때 좀 그래서 전에 질문을 받은적이 있다....

 

그래서 이걸 없애 보려는데

 

다행히 스캔한거 위에 올려서 아예 이미지로 만들지 않아서 이미지랑 분리 할 수 있다.

 

 

라이브러리는 os, PyPDF2, img2pdf, PIL을 사용할 것이다.

 

(하나로 처리하면 좋지만 자료랑 doc이 너무 구리다)

 

import os
import PyPDF2
from img2pdf import convert
from PIL import Image

file_pdf = PyPDF2.PdfFileReader(open("test.pdf","rb"))
pages = file_pdf.getNumPages()
name = file_pdf.documentInfo.subject
for i in range(pages):
    page0 = file_pdf.getPage(i)
    if '/XObject' in page0['/Resources']:
        xObject = page0['/Resources']['/XObject'].getObject()
        for obj in xObject:
            if xObject[obj]['/Subtype'] == '/Image':
                data = xObject[obj]._data
                       
                img = open(str(i)+".jpg", "wb")
                img.write(data)
                img.close()
    else:
        print("No image found.")
    
for i in range(pages):
    image = Image.open(str(i)+".jpg")
    c = image.resize((827,1169))
    c.save(str(i)+".jpg","JPEG",quality=95)

with open(name+".pdf", "wb") as f:
    f.write(convert([str(i)+".jpg" for i in range(pages)]))
            
    
for i in range(pages):
    os.remove(str(i)+".jpg")

방식은 이러하다

pdf 파일 open -> 페이지 별로 xObject 찾음 -> 뽑음 -> 이미지를 A4에 크기 맞춤 -> 이미지를 모아 pdf로 저장

 

원래 data = xObject[obj]._data 이부분은 doc상으론 ._data가 아니라 .getData()로 가져오는건데 안되길래 스택오버플로 뒤져보다가 _data로 했길래 해봤더니 성공

 

이미지를 뽑아보고 그냥 pdf로 만들어보면 너무 큰것을 알 수 있다. 핸드폰으로 찍은 이미지다 보니까 몇천 * 몇천 사이즈 인데 이것도 그냥 크기를 줄여봤다.

정확하게 A4 사이즈 맞출려고 resize를 몇번 했는지 모르겠다.

 

PyPDF2랑 PIL로 PDF 만들 수 있는데 PyPDF2는 설명이 너무 구려서 패스 PIL은 어떻게 여러 이미지를 불러올지 고민하다 그냥 패스함