이북 캡쳐 PDF - ibug kaebchyeo PDF

* 네이버 소프트웨어 자료등록(추가내용)

https://infinitt.tistory.com/292

(pyinstaller , virusTotal, trojan) 파이썬 매크로 프로그램 - 네이버 소프트웨어 자료등록

https://infinitt.tistory.com/291 " data-og-description="* 목적 아이패드를 산김에 ebook을 구매해보았다. 교보문고에서 구매했는데, 파일을 저작권 문제 때문인지 자사에서 제공하는 어플리케이션으로만 열리

infinitt.tistory.com

이북 캡쳐 PDF - ibug kaebchyeo PDF

(결론은 실패했다는 내용)


* 목적

아이패드를 산김에 ebook을 구매해보았다. 교보문고에서 구매했는데, 파일을 저작권 문제 때문인지 자사에서 제공하는 어플리케이션으로만 열리게 해놓았다. 근데,, 교보eBook 이라는 어플리케이션이 별점 1점답게 필기기능조차 제공하지 않았다. 나는 문제집을 샀는데.... 그래서 예전부터 한번 해봐야지 해봐야지 하던 파이썬 라이브러리를 사용하여 매크로를 만들어 보았다.


* 프로그램 다운로드

맨 위에 링크를 참고하면 알겠지만 프로그램 인증서, 전자서명이 없어 위험한 파일이라고 경고창이 발생할 수 있다. (하지만 악성코드는 없다!!)

이북 캡쳐 PDF - ibug kaebchyeo PDF

https://github.com/Youjunyong/ebook_to_pdf

GitHub - Youjunyong/ebook_to_pdf: html , js , css using local storage

html , js , css using local storage. Contribute to Youjunyong/ebook_to_pdf development by creating an account on GitHub.

github.com

이북 캡쳐 PDF - ibug kaebchyeo PDF

*사용한 라이브러리

pyautogui - > 매크로 작동부분, 마우스와 키보드 조작해준다.

pyqt5 -> Gui를 구현한다.

pynput -> 마우스 리스너를 통해, 마우스 위치 좌표값을 읽을 수 있다. 

pyinstaller -> 파이썬이 없는 컴퓨터에서도 작동 가능하도록 exe파일로 만들어 준다. (window환경에서만 실행가능)

*Pyqt5 _Gui 프로그램 모습

이북 캡쳐 PDF - ibug kaebchyeo PDF

실행파일이다. 아이콘은 power point에 있는 이미지로 만들었다. 

이북 캡쳐 PDF - ibug kaebchyeo PDF
이북 캡쳐 PDF - ibug kaebchyeo PDF

생긴건 보잘것 없지만,, 원하는 내가 필요로하는 기능을 한다는것에 만족했다. 


* 사용방법

이북 캡쳐 PDF - ibug kaebchyeo PDF

1. 캡쳐할 페이지 수를 입력한다.

2. 캡쳐할 이미지 영역의 좌측상단, 그리고 우측 하단을 클릭하여 프로그램에 좌표를 입력해준다.

3. 다음페이지 버튼도 마찬가지 방법으로 입력해준다.

4. 프로그램이 로딩시간까지 계산하여, 다음페이지 버튼을 누르고 0.8초 후에 선택한 영역을 캡쳐하여 순서대로 저장한다. 그리고 목표 페이지수 만큼 이것을 반복한다.

5. 이미지는 PNG, 그리고 이름은 0.png, 1.png, 2.png, 3.png 와 같은 규칙으로 저장된다. 윗부분에 PDF만들기를 누르면 파일 다이어로그가 나오고, 파일을 선택하여 넣어주면 파일이름 순서대로 PDF로 합쳐진다.

이북 캡쳐 PDF - ibug kaebchyeo PDF
저장된 이미지
이북 캡쳐 PDF - ibug kaebchyeo PDF
합쳐진 PDF

이로써 필기가 안되는 Ebook에 필기를 할 수 있게 되었다.

*Python code
import sys
from PyQt5.QtWidgets import QProgressBar,QMainWindow, QFileDialog,QInputDialog,  QApplication, QWidget, QPushButton, QToolTip, QAction, qApp, QFileDialog
from PyQt5.QtGui import QIcon
import pyautogui
import time
from pynput import mouse
import PyQt5
from PIL import Image

page = 0   # 찍을 페이지 수  
picture_size = [] #왼쪽 상단 좌표 , 오른쪽 하단 좌표

next_page = []  #다음 페이지의 좌표
msg = "순서대로 진행하세요. 버튼에 마우스를 올리면 설명이 나옵니다."

def get_mouse_point(x, y, button, pressed):
    if pressed and button==mouse.Button.left: 
        print('입력받은 좌표 : ', (x, y))
        picture_size.append(x)
        picture_size.append(y)
    return False

def png_to_pdf(fname):
    imglist = []
    for idx, file in enumerate(fname):
        globals()['img_{}'.format(idx)] = (Image.open(file)).convert("RGB")
        imglist.append(globals()['img_{}'.format(idx)])
    img_0.save('New_pdf.pdf',save_all=True, append_images=imglist)

def get_next_page(x, y, button, pressed):
    if pressed and button==mouse.Button.left: 
        next_page.append((x, y))
    return False
class MyApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Ebook_To_Pdf')
        self.statusBar().showMessage(msg)
        #--------ProgressBar
        self.pbar = QProgressBar(self)
        self.pbar.setGeometry(30, 300, 200, 40)
        self.pbar.setValue(0)
# 앞의 두 매개변수는 창의 x, y 위치를 결정하고, 뒤의 두 매개변수는 각각 창의 너비와 높이를 결정합니다.
        openFile = QAction('Open', self)
        openFile.setShortcut('Ctrl+O')
        openFile.setStatusTip("open new file")
        openFile.triggered.connect(self.show_file)

        menubar = self.menuBar()
        menubar.setNativeMenuBar(False)
        filemenu = menubar.addMenu('&★PDF로 변환하기')
        filemenu.addAction(openFile)
        page_btn = QPushButton('1.캡쳐할 페이지 수', self)
        page_btn.resize(page_btn.sizeHint())
        page_btn.move(30, 50)
        page_btn.clicked.connect(self.page_input)

        btn_start_point = QPushButton('2.좌측 상단 좌표 저장', self)
        btn_start_point.setToolTip('이미지의 좌측 상단 꼭지점에 마우스를 올리고, 클릭합니다.')
        btn_start_point.move(30,100)
        btn_start_point.resize(btn_start_point.sizeHint())
        btn_start_point.clicked.connect(self.Event_start_point)
        
        btn_end_point = QPushButton('3.우측 하단 좌표 저장', self)
        btn_end_point.setToolTip('이미지 우측 하단 꼭지점에 마우스를 올리고, 클릭합니다.')
        btn_end_point.move(30,150)
        btn_end_point.resize(btn_end_point.sizeHint())
        btn_end_point.clicked.connect(self.Event_end_point)

        btn_next_page = QPushButton('4.다음 페이지 버튼 좌표 저장', self)
        btn_next_page.setToolTip('다음 이미지로 넘길 버튼에 마우스를 올리고, 클릭합니다.')
        btn_next_page.move(30,200)
        btn_next_page.resize(btn_next_page.sizeHint()) 
        btn_next_page.clicked.connect(self.Event_next_page)

        btn_run = QPushButton('5.실행하기', self)
        btn_run.setToolTip('화면 그대로 찍힙니다. 다른 프로그램이 이미지를 가리지 않도록 해주세요.')
        btn_run.move(30, 250)
        btn_run.resize(btn_run.sizeHint()) 
        btn_run.clicked.connect(self.get_picture)
        self.setGeometry(400,400,500,500)
        self.show()
    def page_input(self):
        global page , picture_size
        picture_size = []
        page, ok = QInputDialog.getText(self, 'Input Dialog', '찍을 페이지 수:')
        if ok:
            page = int(page)
            msg = "찍을 페이지 수 : %d, 예상 소요시간 : %f초"%(page, page*0.8)
            self.status(msg)
            self.pbar.setValue(15)


    def show_file(self):
        fname = QFileDialog.getOpenFileNames(self, 'Open file' , './')
        fname[0].sort()
        if fname[0]:
            png_to_pdf(fname[0])

    def status(self,msg):
        self.statusBar().showMessage(msg)

    def Event_start_point(self):
        with mouse.Listener(on_click=get_mouse_point) as listener:
            listener.join()
            msg = "좌측 상단 좌표 : (%s, %s)"%(picture_size[0],picture_size[1])
            self.status(msg)
            self.pbar.setValue(30)

    def Event_end_point(self):
        with mouse.Listener(on_click=get_mouse_point) as listener:
            listener.join()
            msg = "우측 하단 좌표 : (%s, %s)"%(picture_size[0],picture_size[1])
            self.status(msg)
            self.pbar.setValue(45)
    def Event_next_page(self):
        with mouse.Listener(on_click=get_next_page) as listener:
            listener.join()
            msg = "'다음페이지'버튼 좌표 : %s"%next_page
            self.status(msg)
            self.pbar.setValue(60)
    def get_picture(self):
        rest_of_percent = 40//page
        for i in range(page):
            if len(picture_size) >= 4:
                pyautogui.screenshot("%s.png" % i, region=(picture_size[0], picture_size[1],
                picture_size[2]-picture_size[0],picture_size[3]-picture_size[1]))
            pyautogui.click(*next_page)
            rest_of_percent += 40//page
            self.pbar.setValue(60+rest_of_percent)
            time.sleep(0.8)
        self.pbar.setValue(100)
        msg = "이미지 캡쳐 완료. PDF메뉴를 눌러 PDF로 변환하세요!"
        self.status(msg)
if __name__ == '__main__':
   app = QApplication(sys.argv)
   ex = MyApp()
   sys.exit(app.exec_())

리디북스, 예스24 등의 프로그램은 자체적으로 캡쳐 기능을 막아놓았습니다. 이러한 경우에는 캡쳐가 되지 않으므로 참고해주세요.

불법 용도로는 사용하지 말아주시길...