(python) Ebook , ์ด๋ฏธ์ง, ์คํฌ๋ฆฐ์ท์ pdf ๋ณํ ๋งคํฌ๋ก(macro) <pyautogui , pyqt5 , pynput , pyinstaller >
- -
* ๋ค์ด๋ฒ ์ํํธ์จ์ด ์๋ฃ๋ฑ๋ก(์ถ๊ฐ๋ด์ฉ)
https://infinitt.tistory.com/292
(๊ฒฐ๋ก ์ ์คํจํ๋ค๋ ๋ด์ฉ)
* ๋ชฉ์
์์ดํจ๋๋ฅผ ์ฐ๊น์ ebook์ ๊ตฌ๋งคํด๋ณด์๋ค. ๊ต๋ณด๋ฌธ๊ณ ์์ ๊ตฌ๋งคํ๋๋ฐ, ํ์ผ์ ์ ์๊ถ ๋ฌธ์ ๋๋ฌธ์ธ์ง ์์ฌ์์ ์ ๊ณตํ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ผ๋ก๋ง ์ด๋ฆฌ๊ฒ ํด๋์๋ค. ๊ทผ๋ฐ,, ๊ต๋ณดeBook ์ด๋ผ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ณ์ 1์ ๋ต๊ฒ ํ๊ธฐ๊ธฐ๋ฅ์กฐ์ฐจ ์ ๊ณตํ์ง ์์๋ค. ๋๋ ๋ฌธ์ ์ง์ ์๋๋ฐ.... ๊ทธ๋์ ์์ ๋ถํฐ ํ๋ฒ ํด๋ด์ผ์ง ํด๋ด์ผ์ง ํ๋ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋งคํฌ๋ก๋ฅผ ๋ง๋ค์ด ๋ณด์๋ค.
* ํ๋ก๊ทธ๋จ ๋ค์ด๋ก๋
๋งจ ์์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ์๊ฒ ์ง๋ง ํ๋ก๊ทธ๋จ ์ธ์ฆ์, ์ ์์๋ช ์ด ์์ด ์ํํ ํ์ผ์ด๋ผ๊ณ ๊ฒฝ๊ณ ์ฐฝ์ด ๋ฐ์ํ ์ ์๋ค. (ํ์ง๋ง ์ ์ฑ์ฝ๋๋ ์๋ค!!)
์ ์ฌ์ฉํ์ จ๋ค๋ฉด ๊นํ๋ธ Star ํ๋ฒ ๋๋ฌ์ฃผ์ธ์!! (์๋์ฌ์ง ์ฐธ๊ณ )
https://github.com/Youjunyong/ebook_to_pdf
*์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
pyautogui - > ๋งคํฌ๋ก ์๋๋ถ๋ถ, ๋ง์ฐ์ค์ ํค๋ณด๋ ์กฐ์ํด์ค๋ค.
pyqt5 -> Gui๋ฅผ ๊ตฌํํ๋ค.
pynput -> ๋ง์ฐ์ค ๋ฆฌ์ค๋๋ฅผ ํตํด, ๋ง์ฐ์ค ์์น ์ขํ๊ฐ์ ์ฝ์ ์ ์๋ค.
pyinstaller -> ํ์ด์ฌ์ด ์๋ ์ปดํจํฐ์์๋ ์๋ ๊ฐ๋ฅํ๋๋ก exeํ์ผ๋ก ๋ง๋ค์ด ์ค๋ค. (windowํ๊ฒฝ์์๋ง ์คํ๊ฐ๋ฅ)
*Pyqt5 _Gui ํ๋ก๊ทธ๋จ ๋ชจ์ต
์คํํ์ผ์ด๋ค. ์์ด์ฝ์ power point์ ์๋ ์ด๋ฏธ์ง๋ก ๋ง๋ค์๋ค.
์๊ธด๊ฑด ๋ณด์๊ฒ ์์ง๋ง,, ์ํ๋ ๋ด๊ฐ ํ์๋กํ๋ ๊ธฐ๋ฅ์ ํ๋ค๋๊ฒ์ ๋ง์กฑํ๋ค.
* ์ฌ์ฉ๋ฐฉ๋ฒ
1. ์บก์ณํ ํ์ด์ง ์๋ฅผ ์ ๋ ฅํ๋ค.
2. ์บก์ณํ ์ด๋ฏธ์ง ์์ญ์ ์ข์ธก์๋จ, ๊ทธ๋ฆฌ๊ณ ์ฐ์ธก ํ๋จ์ ํด๋ฆญํ์ฌ ํ๋ก๊ทธ๋จ์ ์ขํ๋ฅผ ์ ๋ ฅํด์ค๋ค.
3. ๋ค์ํ์ด์ง ๋ฒํผ๋ ๋ง์ฐฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ ฅํด์ค๋ค.
4. ํ๋ก๊ทธ๋จ์ด ๋ก๋ฉ์๊ฐ๊น์ง ๊ณ์ฐํ์ฌ, ๋ค์ํ์ด์ง ๋ฒํผ์ ๋๋ฅด๊ณ 0.8์ด ํ์ ์ ํํ ์์ญ์ ์บก์ณํ์ฌ ์์๋๋ก ์ ์ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชฉํ ํ์ด์ง์ ๋งํผ ์ด๊ฒ์ ๋ฐ๋ณตํ๋ค.
5. ์ด๋ฏธ์ง๋ PNG, ๊ทธ๋ฆฌ๊ณ ์ด๋ฆ์ 0.png, 1.png, 2.png, 3.png ์ ๊ฐ์ ๊ท์น์ผ๋ก ์ ์ฅ๋๋ค. ์๋ถ๋ถ์ 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_())
๋ถ๋ฒ ์ฉ๋๋ก๋ ์ฌ์ฉํ์ง ๋ง์์ฃผ์๊ธธ...
+ ๋ง๋ ์ง ์ค๋๋ ํ๋ก๊ทธ๋จ์ ๋๋ค. ์ฝ๋ ๊ฐ์ ์ฌํญ์ด ์๋ค๋ฉด ์ธ์ ๋ PullRequestํด์ฃผ์ธ์ ใ ใ
'๐ฟ ๊ธฐํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค