๐Ÿ’ป ๊ฐœ๋ฐœ/๐ŸŽธ ETC

E-Book์„ PDF๋กœ ์ถ”์ถœํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ๋งŒ๋“ค๊ธฐ (23.09.06. ์‹คํ–‰ํŒŒ์ผ ์ถ”๊ฐ€)

EastShine_ 2023. 1. 29. 23:28

 

* 2023.09.06 ์ถ”๊ฐ€

 

์ข€ ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ๋กœ ๋นŒ๋“œํ•˜์˜€๋‹ค. mac์šฉ ์‹คํ–‰ ํŒŒ์ผ๋„ ๋ฐฐํฌํ•˜๋ ค ํ–ˆ์ง€๋งŒ, ์•Œ ์ˆ˜ ์—†๋Š” ์—๋Ÿฌ๋กœ ์ธํ•ด ํ•˜๋ฃจ๋ฅผ ๊ผฌ๋ฐ• ์จ๋„ ์›์ธ์„ ๋ชป ์ฐพ์•„ ์šฐ์„  ์œˆ๋„์šฐ์šฉ ์‹คํ–‰ ํŒŒ์ผ๋งŒ ๊นƒํ—ˆ๋ธŒ์— ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.

์•„ ๊ทธ๋ฆฌ๊ณ , ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ถˆํŽธํ•œ ์ ์ด์—ˆ๋˜ ์บก์ฒ˜ ์†๋„ ์กฐ์ ˆ์„ GUI์—์„œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€ํ•˜์˜€๊ณ , ์ดˆ๊ธฐํ™” ๋ฒ„ํŠผ๋„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.

์บก์ณ ์†๋„๋ฅผ ์ถ”๊ฐ€ํ•œ ์ด์œ ๋Š”, ์‹คํ–‰ํ•˜๋Š” ํ™˜๊ฒฝ๋งˆ๋‹ค e-book์—์„œ ๋‹ค์Œ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ, ํ™”๋ฉด ๋กœ๋”ฉ์ด ๋А๋ฆฐ ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์—ˆ๋‹ค. ๋•Œ๋ฌธ์— ์บก์ฒ˜ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ๋„˜๊ฒจ๋ณด๋ฉด์„œ ์–ด๋А ์ •๋„์˜ ํ…€์œผ๋กœ ์บก์ฒ˜ํ• ์ง€ ํŒ๋‹จํ•˜์—ฌ ์ง€์ •ํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

 

ํ•ด๋‹น ํŒŒ์ผ์€ ์•„๋ž˜ ๊นƒํ—ˆ๋ธŒ ๋งํฌ๋กœ ๋“ค์–ด๊ฐ€์„œ dist ํด๋” ์•ˆ์— ebook_to_pdf.exe์„ ๋ฐ›์œผ๋ฉด ๋œ๋‹ค.

์‹คํ–‰ ์‹œ ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋œฌ๋‹ค๋ฉด ์‹คํ–‰์„ ๋ˆŒ๋Ÿฌ์ค˜์•ผ ๋œ๋‹ค.

 

 

 

์‹คํ–‰์„ ๋ˆ„๋ฅด๋ฉด ์•„๋ž˜ GUI ํ™”๋ฉด์ด ๋œฌ๋‹ค.

 

 

 

์‚ฌ์šฉ๋ฒ•๊ณผ ์‹คํ–‰ ์‹œ ์œ ์˜์‚ฌํ•ญ์€ ๊นƒํ—ˆ๋ธŒ Readme์— ์ž‘์„ฑํ•ด ๋‘์—ˆ์œผ๋‹ˆ ๊ผญ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ํ•˜๋‚˜ ๋‹น๋ถ€์˜ ๋ง์„ ์ „ํ•˜๋ฉด ์žฌ๋ฐฐํฌ๋Š” ์•ˆํ•ด์ฃผ์…จ์œผ๋ฉด ํ•˜๊ณ .. ๊ผญ ๊ฐœ์ธ ์‚ฌ์šฉ ์šฉ๋„๋กœ๋งŒ ํ™œ์šฉํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค. ๋ฐ‘์—๋„ ์ ์–ด๋†จ์ง€๋งŒ ๋งŒ๋“ค์–ด์ง„ pdf๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๋ฒ•์ด๋ฉฐ, ๋ณธ์ธ์ด ์ฑ…์ž„์ ธ์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿผ ์ž˜ ํ™œ์šฉํ•˜์‹œ๊ธธ..!

 

 

 

 


 

๋“ค์–ด๊ฐ€๊ธฐ ์•ž์„œ..

 ์˜ˆ์ „ ๊ฐœ๋ฐœ์„ ํ•œ์ฐฝ ์ž…๋ฌธํ•˜๋˜ ์‹œ๊ธฐ์— ๊ฐœ๋ฐœ ๊ด€๋ จ ์„œ์ ๋“ค์„ ๊ตฌ๋งคํ•˜์—ฌ ์˜คํ”„๋ผ์ธ ์Šค์บ” ๋งค์žฅ์— ๊ฐ€์„œ PDF๋กœ ์ถ”์ถœํ•ด์„œ ์•„์ดํŒจ๋“œ๋กœ ๊ณต๋ถ€ํ•˜๊ณค ํ•˜์˜€๋‹ค. ์›Œ๋‚™ ๊ฐœ๋ฐœ ์„œ์ ์€ ํŽ˜์ด์ง€ ์ˆ˜๋„ ๋งŽ๊ณ , ๋“ค๊ณ  ๋‹ค๋‹ˆ๊ธฐ์—” ํž˜๋“  ๋ถ€๋ถ„์ด ๋งŽ์•„ ํŒจ๋“œ๋กœ ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ํŽธ๋ฆฌํ•˜์˜€๊ณ , ๋˜ ๋ฐ‘์ค„, ํ•„๊ธฐ, ๊ฒ€์ƒ‰ ๋“ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฑด ๋Šฅ๋ฅ ๋„ ๋งค์šฐ ํ–ฅ์ƒ๋˜๋Š” ์ด์ ์ด ์žˆ์—ˆ๋‹ค.
 
 ์ตœ๊ทผ ์ฑ…๋“ค์„ ๋ณผ ์ผ๋“ค์ด ์ƒ๊ฒผ๊ณ , ๋˜ ์ฑ…์„ ์‚ฌ์„œ ์˜คํ”„๋ผ์ธ ๋งค์žฅ์— ๊ฐ€์„œ ์Šค์บ”ํ•˜๊ณ  ์ผ์ด ๋„ˆ๋ฌด ๊ท€์ฐฎ๊ณ  ๋ฒˆ๊ฑฐ๋กœ์›Œ์„œ e-book์„ ๊ตฌ๋งคํ•˜๋ฉด ๋˜๊ฒ ๋‹ค ์ƒ๊ฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ง‰์ƒ ์ฐพ์•„๋ณด๋‹ˆ ์œ ๋ช… ์„œ์ ์—์„œ ๊ตฌ๋งคํ•˜๋Š” e-book๋“ค์€ DRM์ด ๊ฑธ๋ ค์žˆ์—ˆ๊ณ , ๊ฐ ์—…์ฒด๋งˆ๋‹ค ์ œ๊ณตํ•˜๋Š” ๋ทฐ์–ด์—์„œ๋งŒ ์ฝ์„ ์ˆ˜๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋‚˜๋Š” ๊ตฟ๋…ธํŠธ๋‚˜ ํ”Œ๋ ‰์Šฌ๊ฐ™์€ ์–ดํ”Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„๊ธฐ๊ฐ€ ์ œ๊ณต๋˜๊ณ , ๋ฌธ์ž ๊ฒ€์ƒ‰(OCR)์ด ํ•„์š”ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ pdf ํŒŒ์ผ๋กœ ๋ณ€ํ™˜์ด ํ•„์š”ํ–ˆ๋‹ค.
 
 ๋ฐฉ๋ฒ•์„ ์ฐพ๋˜ ์ค‘ ํ•œ ์œ ํŠœ๋ธŒ ์˜์ƒ์—์„œ ์•„์ดํŒจ๋“œ E-Book ๋ทฐ์–ด ์•ฑ์„ ํ†ตํ•ด ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ์บก์ฒ˜ํ•˜๊ณ , pdf๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ตฟ๋…ธํŠธ ์•ฑ์—์„œ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๋‹ค. ํ•ด๋‹น ์œ ํŠœ๋ฒ„๊ฐ€ ์—…์ฒด์— ์ง์ ‘ ๋ฌธ์˜ํ•ด๋ณด๋‹ˆ ‘ํƒ€์ธ์—๊ฒŒ ๊ณต์œ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๊ฐœ์ธ์ ์œผ๋กœ ์‚ฌ์šฉ์˜ ๊ฒฝ์šฐ ์ €์ž‘๊ถŒ ์œ„๋ฐ˜์— ํ•ด๋‹น๋˜์ง€ ์•Š๋Š”๋‹ค ‘ ๋ผ๋Š” ๋‹ต๋ณ€์„ ๋ฐ›์•˜๊ณ , ๊ฒฐ๋ก ์€ ๊ฐœ์ธ์  ์‚ฌ์šฉ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
 
 
์ด ์˜์ƒ์„ ๋ณด๊ณ  ๋ฐ”๋กœ ๋ฌด์—‡์„ ๋งŒ๋“ค์–ด์•ผ ํ• ์ง€ ์ƒ๊ฐ์ด ๋‚ฌ๋‹ค.

1. ์ผ์ผ์ด ์บก์ฒ˜๋Š” ๊ท€์ฐฎ๋‹ค! → ์ž๋™์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ๋„˜๊ธฐ๋ฉฐ ์บก์ฒ˜ํ•˜๋„๋ก ๊ตฌํ˜„

2. ์ด๋ฏธ์ง€๋ฅผ ๋ชจ์•„ pdf๋กœ ๋งŒ๋“ค์–ด์•ผ ๋œ๋‹ค! → ์ž๋™์œผ๋กœ PDF๋กœ ๋ณ€ํ™˜

๋ฐ”๋กœ ํŒŒ์ด์ฐธ์„ ์„ค์น˜ํ•˜๊ณ  ๊ฐœ๋ฐœ์— ๋“ค์–ด๊ฐ”๋‹ค.

 

 

 

 

๊ฐœ๋ฐœ ํ™˜๊ฒฝ

๋ณธ์ธ์€ ๋งฅ๋ถ ์—์–ด M1์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์€ MacOS์— ๋งž์ถฐ์„œ ๊ฐœ๋ฐœํ•˜์˜€๋‹ค.

 

 

 
 

๊ฐœ๋ฐœ ๊ณผ์ •

1. APP UI

 ๊ธฐ๋Šฅ ๊ตฌํ˜„๋ณด๋‹ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™˜๊ฒฝ ๊ตฌ์ถ•์—์„œ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ ธ๋‹ค. ์•„๋งˆ ์ตœ์‹  MacOS์— ๋Œ€ํ•œ ์ œ์•ฝ ์‚ฌํ•ญ์ด ์ด์ „๋ณด๋‹ค ๋งŽ์•„์ง„ ๋А๋‚Œ์ด์—ˆ๋‹ค. GUI๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด PyQt5๋ฅผ ์‚ฌ์šฉํ•˜๋ ค ํ–ˆ์œผ๋‚˜ ์ด๋ž˜์ €๋ž˜ ์‹œ๋„ํ•ด๋„ ์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๊ฐ€ ์•ˆ๋๋‹ค.. ๊ฒ€์ƒ‰ํ•˜๋‹ค๋ณด๋‹ˆ ์ตœ์‹  OS ์—…๋ฐ์ดํŠธ ์ดํ›„์—๋Š” ์‚ฌ์šฉ์ด ์•ˆ๋œ๋‹ค๋Š” ๊ธ€์„ ๋ดค๊ณ , ๋Œ€์ฒด๋กœ PySide๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๋ง์ด ์žˆ์–ด์„œ ๋ฐ”๋กœ PySide6๋ฅผ ์„ค์น˜ํ•˜์˜€๋‹ค.
 
 

GUI ํ™”๋ฉด

 
 

# ์•ฑ ํƒ€์ดํ‹€
self.setWindowTitle("eBookToPdf")

# ๋ฒ„ํŠผ ์ƒ์„ฑ
self.button1 = QPushButton("์ขŒํ‘œ ์œ„์น˜ ํด๋ฆญ")
self.button2 = QPushButton("์ขŒํ‘œ ์œ„์น˜ ํด๋ฆญ")
self.button3 = QPushButton("PDF๋กœ ๋งŒ๋“ค๊ธฐ")
self.button3.setFixedSize(QSize(430, 60))

# ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ
self.button1.clicked.connect(self.์ขŒ์ธก์ƒ๋‹จ_์ขŒํ‘œ_ํด๋ฆญ)
self.button2.clicked.connect(self.์šฐ์ธกํ•˜๋‹จ_์ขŒํ‘œ_ํด๋ฆญ)
self.button3.clicked.connect(self.btn_click)

self.title = QLabel('E-Book PDF ์ƒ์„ฑ๊ธฐ', self)
self.title.setAlignment(Qt.AlignmentFlag.AlignCenter)
font_title = self.title.font()
font_title.setPointSize(20)
self.title.setFont(font_title)

self.stat = QLabel('', self)
self.stat.setAlignment(Qt.AlignmentFlag.AlignCenter)
font_stat = self.stat.font()
font_stat.setPointSize(18)
font_stat.setBold(True)
self.stat.setFont(font_stat)

self.sign = QLabel('Made By EastShine', self)
self.sign.setAlignment(Qt.AlignmentFlag.AlignRight)
font_sign = self.stat.font()
font_sign.setPointSize(10)
font_sign.setItalic(True)
self.sign.setFont(font_sign)

self.label1 = QLabel('์ด๋ฏธ์ง€ ์ขŒ์ธก์ƒ๋‹จ ์ขŒํ‘œ   ==>   ', self)
self.label1_1 = QLabel('(0, 0)', self)
self.label2 = QLabel('์ด๋ฏธ์ง€ ์šฐ์ธกํ•˜๋‹จ ์ขŒํ‘œ   ==>   ', self)
self.label2_1 = QLabel('(0, 0)', self)
self.label3 = QLabel('์ด ํŽ˜์ด์ง€ ์ˆ˜                       ', self)
self.label4 = QLabel('PDF ์ด๋ฆ„                         ', self)

self.input1 = QLineEdit()
self.input1.setPlaceholderText("์ด ํŽ˜์ด์ง€ ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.")

self.input2 = QLineEdit()
self.input2.setPlaceholderText("์ƒ์„ฑํ•  PDF์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.")

# Box ์„ค์ •
box1 = QHBoxLayout()
box1.addWidget(self.label1)
box1.addWidget(self.label1_1)
box1.addWidget(self.button1)

box2 = QHBoxLayout()
box2.addWidget(self.label2)
box2.addWidget(self.label2_1)
box2.addWidget(self.button2)

box3 = QHBoxLayout()
box3.addWidget(self.label3)
box3.addWidget(self.input1)

box4 = QHBoxLayout()
box4.addWidget(self.label4)
box4.addWidget(self.input2)

box5 = QHBoxLayout()
box5.addWidget(self.stat)
box5.addWidget(self.sign)

# ๋ ˆ์ด์•„์›ƒ ์„ค์ •
layout = QVBoxLayout()
layout.addWidget(self.title)
layout.addStretch(2)
layout.addLayout(box1)
layout.addStretch(1)
layout.addLayout(box2)
layout.addStretch(1)
layout.addLayout(box3)
layout.addStretch(1)
layout.addLayout(box4)
layout.addStretch(4)
layout.addLayout(box5)
layout.addWidget(self.button3)

container = QWidget()
container.setLayout(layout)

self.setCentralWidget(container)

# ์ฐฝ ํฌ๊ธฐ ๊ณ ์ •
self.setFixedSize(QSize(450, 320))

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•˜๊ฒŒ GUI๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค. (๋‚˜์ค‘์— ํ˜น์‹œ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ์‹คํ–‰ํŒŒ์ผ๋กœ ๋ฐฐํฌ๋„ ํ•ด๋ณด๊ณ  ์‹ถ์–ด made by๋„ ๋„ฃ์–ด๋†จ๋‹ค.)
์œ ์ €์—๊ฒŒ ๋ฐ›์•„์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹ฌํ”Œํ•˜๊ฒŒ ๊ตฌ์„ฑํ–ˆ๋‹ค.

 

 

 
 

2. ์ด๋ฏธ์ง€ ์บก์ฒ˜

pdf๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ebook์˜ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ์บก์ฒ˜ํ•˜์—ฌ์•ผ ํ–ˆ๋‹ค. ์บก์ณ๋ฅผ ์œ„ํ•ด PyAutoGUI, mss, pynput ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.
 
 

def ์ขŒ์ธก์ƒ๋‹จ_์ขŒํ‘œ_ํด๋ฆญ(self):
	  def on_click(x, y, button, pressed):
	      self.posX1 = int(x)
	      self.posY1 = int(y)
	      self.label1_1.setText(str(f'({int(x)}, {int(y)})'))
	      print('Button: %s, Position: (%s, %s), Pressed: %s ' % (button, x, y, pressed))
	      if not pressed:
	          return False
	
	  with mouse.Listener(on_click=on_click) as listener:
	      listener.join()

์บก์ณํ•  ์˜์—ญ์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด Click Event๋กœ ์ด๋ฏธ์ง€์˜ ๋งจ ์ขŒ์ธก ์ƒ๋‹จ๊ณผ ๋งจ ์šฐ์ธก ํ•˜๋‹จ์˜ ์ขŒํ‘œ๋ฅผ ๊ตฌํ•˜๋„๋ก ํ–ˆ๋‹ค. ๋‘˜๋‹ค ์ž‘๋™ ๋ฐฉ์‹์€ ๋˜‘๊ฐ™์•„์„œ ์ขŒ์ธก์ƒ๋‹จ์˜ ์ขŒํ‘œ ํด๋ฆญ ์ฝ”๋“œ๋งŒ ์ ์–ด๋†“์•˜๋‹ค.
 
 
 

# ํŒŒ์ผ ์ €์žฅ
while self.num <= self.total_page:
    time.sleep(0.1)

    # ์บก์ณํ•˜๊ธฐ
    with mss.mss() as sct:
        # Grab the data
        img = sct.grab(self.region)
        # Save to the picture file
        mss.tools.to_png(img.rgb, img.size, output=f'pdf_images/img_{str(self.num).zfill(4)}.png')

    # ํŽ˜์ด์ง€ ๋„˜๊ธฐ๊ธฐ
    kb_control.press(Key.right)
    kb_control.release(Key.right)

    self.num += 1

 PyAutoGUI์—๋„ ์บก์ฒ˜๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ, mss ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ฑ๋Šฅ๊ณผ ์†๋„๊ฐ€ ๋น„๊ต์  ๋นจ๋ผ์„œ ์บก์ฒ˜๋Š” mss๋ฅผ ํ™œ์šฉํ•˜์˜€๋‹ค.
 'pdf_images' ํด๋”๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ทธ ์•ˆ์— ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜๋„๋ก ํ–ˆ๊ณ , zfill์„ ํ™œ์šฉํ•ด String ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์— ๋ฌธ์ œ๊ฐ€ ์—†๋„๋ก 'img_0001', 'img_0002' ์ด๋Ÿฐ ์‹์œผ๋กœ ํŒŒ์ผ ์ด๋ฆ„์„ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๋‹ค.
 ์บก์ณ ํ›„์—” pynput ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ‚ค๋ณด๋“œ์˜ ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋„ฃ์–ด์ฃผ์–ด ๋‹ค์Œ ํŽ˜์ด์ง€๋กœ ์ „ํ™˜ํ•˜๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.

 

 

 
 

3. PDF ๋ณ€ํ™˜

# ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋ฆฌ์ŠคํŠธ
file_list = os.listdir(path)
file_list = natsort.natsorted(file_list)

# .DS_Store ํŒŒ์ผ์ด๋ฆ„ ์‚ญ์ œ
if '.DS_Store' in file_list:
    del file_list[0]

img_list = []

# PDF ์ฒซ ํŽ˜์ด์ง€ ๋งŒ๋“ค์–ด๋‘๊ธฐ
img_path = 'pdf_images/' + file_list[0]
im_buf = Image.open(img_path)
cvt_rgb_0 = im_buf.convert('RGB')

for i in file_list:
    img_path = 'pdf_images/' + i
    im_buf = Image.open(img_path)
    cvt_rgb = im_buf.convert('RGB')
    img_list.append(cvt_rgb)

del img_list[0]

pdf_name = self.input2.text()
if pdf_name == '':
    pdf_name = 'default'

cvt_rgb_0.save(pdf_name+'.pdf', save_all=True, append_images=img_list)
print("PDF ๋ณ€ํ™˜ ์™„๋ฃŒ!")
self.stat.setText('PDF ๋ณ€ํ™˜ ์™„๋ฃŒ!')
shutil.rmtree('pdf_images/')

 pdf_image ํด๋”์— ์žˆ๋Š” ํŒŒ์ผ์„ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ํ›„ ‘.DS_Store’ ํŒŒ์ผ์ด ๊ณ„์† ํฌํ•จ๋˜๊ธธ๋ž˜(MacOS ์‹œ์Šคํ…œ์ด finder๋กœ ์ ‘๊ทผํ•  ๋•Œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ํŒŒ์ผ์ด๋‹ค.) ํŒŒ์ผ List์—์„œ ์‚ญ์ œํ•ด์ฃผ์—ˆ๊ณ , PIL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด PDF ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ์—ˆ๋‹ค.
 ์ฒซ ํŽ˜์ด์ง€๋กœ ํ‹€์„ ๋งŒ๋“ค์–ด๋‘๊ณ , ์ฒซ ํŽ˜์ด์ง€๊ฐ€ ์ œ์™ธ๋œ ์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ‹€์— append ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. (๊ณ„์† ์ฒซํŽ˜์ด์ง€๊ฐ€ 2์žฅ์ด ๋˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ฒผ์—ˆ๋‹ค..)
 PDF ๋ณ€ํ™˜ ํ›„์—๋Š” ์ด๋ฏธ์ง€ ์บก์ฒ˜ ํด๋”๋ฅผ ํ†ต์œผ๋กœ ์‚ญ์ œํ•ด์ฃผ์—ˆ๋‹ค.

 

 

 

 

์ „์ฒด ์ฝ”๋“œ

https://github.com/eastshine12/eBookToPdf.git
์œ„์˜ ๊นƒํ—ˆ๋ธŒ ๋งํฌ๋ฅผ ํ†ตํ•ด ์ „์ฒด ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!

 

 
 

์‚ฌ์šฉ ์‹œ ์œ ์˜์‚ฌํ•ญ

  1. ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์€ mac ์ „์šฉ app์ด๋‹ค.
  2. ์ด๋ฏธ์ง€ ์ขŒํ‘œ ์˜์—ญ์ด ๋ทฐ์–ด ์˜์—ญ์„ ๋ฒ—์–ด๋‚˜๋ฉด ์•ˆ๋œ๋‹ค.
  3. ํ‚ค๋ณด๋“œ ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅํ‚ค๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ํŽ˜์ด์ง€ ์ „ํ™˜์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.
  4. ํŽ˜์ด์ง€ ์ˆ˜๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ PDF ์šฉ๋Ÿ‰์ด ๊ฝค ๋˜๋ฏ€๋กœ HDD ์šฉ๋Ÿ‰์ด ์—ฌ์œ ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

 
 

๋งˆ์น˜๋ฉฐ..

์ฐธ๊ณ ๋กœ ๋ช‡ ์—…์ฒด์˜ ๋ทฐ์–ด๋Š” ์บก์ฒ˜ ์‹œ ํ•ด๋‹น ๋ทฐ์–ด์˜ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚˜์งˆ ์•Š๋Š”๋‹ค. ์บก์ฒ˜ ์กฐ์ฐจ ๋ง‰์•„๋‘” ๊ฒƒ์ด๋‹ค. ๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธํ•œ ๋ทฐ์–ด๋Š” ์•Œx๋”˜ ๋งฅ ์ „์šฉ ๋ทฐ์–ด์ด๋‹ค.
ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์€ ๋‚˜์˜ ํŽธ๋ฆฌํ•จ์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด๋ฉฐ, ๋งŒ์•ฝ ํ•„์š”ํ•œ ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ๊ฐœ์ธ ์‚ฌ์šฉ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค. ์œ„์—๋„ ๋ช…์‹œํ–ˆ์ง€๋งŒ ๊ฐœ์ธ ์™ธ ํƒ€์ธ ๊ณต์œ ๋Š” ์ €์ž‘๊ถŒ ๋ฒ•์— ์œ„๋ฐฐ๋˜๋ฉฐ ์ด์— ๋Œ€ํ•œ ์ฑ…์ž„์€ ์‚ฌ์šฉ์ž ๋ณธ์ธ์ด ์ง€๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์‹ฌํ•˜์—ฌ ์‚ฌ์šฉํ•˜์‹œ๊ธธ..