반응형

안녕하세요.

 

오랜만에 파이썬 응용에 글을 쓰는 것 같습니다.

 

어제 급하게 교수님의 지시하에 책을 스캔떠서 복사했습니다.

 

아무래도 양도 양인 만큼 스캔을 한 페이지 한 페이지 뜨는 것이 너무 힘들어서 파이썬으로 꼼수 좀 사용했습니다. 

 

책 같은 경우는 양면으로 되있기 때문에 스캔을 뜨는 것이 굉장히 어렵습니다. 

 

연속으로 한 면만 스캔 뜰 수 있는 프린트입니다.

 

 20 - 81 page 라면,

 

앞 : 20, 22, 24, 26 ~ 76, 78, 80 Page

뒤 : 21, 23, 25, 27 ~ 77, 79, 81 Page

 

로 스캔을 뜬 후,  저장된 pdf를 각페이지를 교차해서 합쳤습니다. 

 

from PyPDF2 import PdfFileReader, PdfFileWriter
import os


# FIle name
base_path = os.getcwd()
file_name_1 = '앞.pdf'
file_name_2 = '뒤.pdf'
save_name = '교차.pdf'

# Path
file_path_1 = os.path.join(base_path, file_name_1)
file_path_2 = os.path.join(base_path, file_name_2)
save_path = os.path.join(base_path, save_name)
print(file_path_1)
print(file_path_2)
print(save_path)

# PDF Read
pdf_read_1 = PdfFileReader(open(file_path_1, 'rb'))
pdf_read_2 = PdfFileReader(open(file_path_2, 'rb'))

# PDF Write
pdf_writer = PdfFileWriter()

# Get number page
number_pages_1 = pdf_read_1.getNumPages()
number_pages_2 = pdf_read_2.getNumPages()
print(number_pages_1)
print(number_pages_2)

if number_pages_1 >= number_pages_2:
    stop_point = number_pages_2
else:
    stop_point = number_pages_1
# set up
i = 0

while(1):
    if stop_point == i:
        break
    pdf_writer.addPage(pdf_read_1.getPage(i))
    pdf_writer.addPage(pdf_read_2.getPage(i))
    i = i + 1

with open(save_path, 'wb') as f:
    pdf_writer.write(f)

급하게 코드를 짰지만, 동작은 잘 합니다. 

 

외부 라이브러리를 쉽게 불러올 수 있고, 코드 또한 굉장히 간단합니다. 

 

전공적인 부분이 아닌, 논리적인 연결을 시킬 수 있다면 누구나 할 수 접근할 수 있는 것이 파이썬의 강점입니다.

 

정말로 몇 년 뒤면 파이썬을 엑셀처럼 실무에서 사용하는 모습을 볼 수 있을 것 같습니다.

 

python -m pip install PyPDF2  # 설치
728x90
반응형
반응형
import sys
import os

from PyPDF2.pdf import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *


class MainWidget(QWidget):
    def __init__(self):
        super().__init__()
        manual_label = [QLabel("<b>PDF Application"), QLabel("Created by JS")]

        for i in range(0, 2):
            manual_label[i].setStyleSheet("Color : gray")
            manual_label[i].setFont(QFont("", 40 - (12 * i)))

        hbox = [QHBoxLayout(), QHBoxLayout()]
        for i in range(0, 2):
            hbox[i].addStretch(1)
            hbox[i].addWidget(manual_label[i])
            hbox[i].addStretch(1)

        vbox = QVBoxLayout()
        vbox.addStretch(1)
        vbox.addLayout(hbox[0])
        vbox.addLayout(hbox[1])
        vbox.addStretch(1)

        self.setLayout(vbox)


class ListboxWidget(QListWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setAcceptDrops(True)

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls:
            event.accept()
        else:
            event.ignore()

    def dragMoveEvent(self, event):
        if event.mimeData().hasUrls():
            event.setDropAction(Qt.CopyAction)
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        if event.mimeData().hasUrls():
            event.setDropAction(Qt.CopyAction)
            event.accept()

            links = []

            for i in event.mimeData().urls():
                if str(i).find(".pdf") > 0:
                    if i.isLocalFile():
                        links.append(str(i.toLocalFile()))
                    else:
                        links.append(str(i.toString()))
            self.addItems(links)
        else:
            event.ignore()


class PDFMerge(QWidget):
    def __init__(self):
        super().__init__()
        self.pushButton = QPushButton(self)
        self.pushButton.setGeometry(QRect(20, 440, 451, 31))
        self.pushButton.setText("합치기")

        self.groupBox = QGroupBox(self)
        self.groupBox.setGeometry(QRect(20, 20, 451, 410))
        self.groupBox.setFlat(False)
        self.groupBox.setCheckable(False)
        self.groupBox.setTitle("<PDF 리스트>")

        self.listWidget = ListboxWidget(self.groupBox)
        self.listWidget.setGeometry(QRect(20, 30, 411, 250))

        self.pushButton_4 = QPushButton(self.groupBox)
        self.pushButton_4.setGeometry(QRect(20, 310, 93, 28))
        self.pushButton_4.setText("위 이동")

        self.pushButton_5 = QPushButton(self.groupBox)
        self.pushButton_5.setGeometry(QRect(20, 350, 93, 28))
        self.pushButton_5.setText("아래 이동")

        self.pushButton_6 = QPushButton(self.groupBox)
        self.pushButton_6.setGeometry(QRect(180, 310, 93, 71))
        self.pushButton_6.setText("추 가")

        self.pushButton_7 = QPushButton(self.groupBox)
        self.pushButton_7.setGeometry(QRect(340, 310, 93, 71))
        self.pushButton_7.setText("제 거")

        self.pushButton_6.clicked.connect(self.add_PDF)
        self.pushButton_7.clicked.connect(self.del_PDF)
        self.pushButton_4.clicked.connect(self.up_PDF)
        self.pushButton_5.clicked.connect(self.down_PDF)
        self.pushButton.clicked.connect(self.merge_PDF)

    def add_PDF(self):
        fname = QFileDialog.getOpenFileName(self, "open file", "", "PDF File(*.pdf)")
        self.listWidget.addItem(QListWidgetItem(fname[0]))

    def set_PDF(self):
        dirname = QFileDialog.getExistingDirectory(None)
        self.listWidget_2.clear()
        self.listWidget_2.addItem(QListWidgetItem(dirname))

    def del_PDF(self):
        self.listWidget.takeItem(self.listWidget.currentRow())

    def up_PDF(self):
        row = self.listWidget.currentRow()
        if row > 0:
            item = self.listWidget.takeItem(row)
            self.listWidget.insertItem(row - 1, item)
            self.listWidget.setCurrentRow(row - 1)

    def down_PDF(self):
        row = self.listWidget.currentRow()
        if row < self.listWidget.count() - 1:
            item = self.listWidget.takeItem(row)
            self.listWidget.insertItem(row + 1, item)
            self.listWidget.setCurrentRow(row + 1)

    def merge_PDF(self):
        count = self.listWidget.count()

        if count == 0:
            QMessageBox.information(self, '경고', "저장할 파일이 없습니다.", QMessageBox.Yes)

        else:
            down_path, _ = QFileDialog.getSaveFileName(self, "Open", "", "PDF(*.pdf)")

            if down_path:
                output = PdfFileWriter()
                for x in range(0, count):
                    src = self.listWidget.item(x)

                    inputs = PdfFileReader(open(src.text(), "rb"))
                    for j in range(inputs.getNumPages()):
                        output.addPage(inputs.getPage(j))
                dest = down_path

                with open(dest, "wb") as outstream:
                    output.write(outstream)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # menu bar widget 모음
        menu = self.menuBar()
        menu_pdf = menu.addMenu('    PDF   ')

        self.pdf_merge = QAction('PDF 합치기', self)
        menu_pdf.addAction(self.pdf_merge)  # menu bar 에 lpf 를 붙임
        self.pdf_merge.triggered.connect(lambda x: self.applyfunc('merge'))  # 로우패스필터를 누르면 applyDock 연결

        self.widget = MainWidget()
        self.setCentralWidget(self.widget)

        self.setEnabled(True)
        self.resize(500, 500)
        self.setWindowTitle("PDF Application")  # Program Title
        self.setFixedSize(500, 550)

        self.show()

    def applyfunc(self, function):
        if function == "merge":
            merge_widget = PDFMerge()
            self.setCentralWidget(merge_widget)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec_())
728x90
반응형
반응형

안녕하세요.

 

https://coding-yoon.tistory.com/68

 

[파이썬 응용] QT designer to python code ( .ui -> .py) UI파일을 파이썬 코드로 변환

안녕하세요. 강의자료가 전부 PDF이다보니, PDF로 편집할 일이 있었습니다. Adobe 의 pdf를 사용하고 있는데, 무료버젼이다보니 할 수 있는게 별로 없었습니다. 그래서 파이썬으로 필요한 부분만 만�

coding-yoon.tistory.com

PDF 관련 프로그램을 만드는 동기는 위에 적었었고, 오늘은 제가 가장 많이 사용하는 PDF합치기를 사용하기 편하게 QT로 구현하였습니다. 

 

http://hogulab.egloos.com/6340633

 

[Python] PdfMerge - 여러 pdf 하나로 합치기 (GUI 5편 - 최종)

이제 "합치기"를 구현해보자. 해당 버튼의 코드는 다음과 같다. 123456789101112131415161718def merge_PDF(self):         count = self.listWidget.count()  &nb

hogulab.egloos.com

굳이 제가 처음부터 만들지 않았고, 위 블로그의 코드에 맞춰 제작하였습니다. 

 

제가 추가하고, 없앤 기능은 

 

1. 파일을 Drag & Drop을 하여 list에 추가하게끔 바꿨습니다. 

 

저는 마우스로 클릭하는 것보다 파일을 마우스로 드래그해서 갖다놓는 방식이 더 편하다고 생각했습니다. 

 

2. 저장 폴더 설정 버튼 삭제

 

굳이 다운로드 경로를 설정하는 방식은 너무 귀찮아서 없애버렸습니다. 합치기 버튼을 누르면 다운로드 다이얼 로그가 생성되는 방식으로 바꿨습니다. 

 

 

1. 다이얼로그 방식

 

 

정석 방식

2. 파일 드래그 앤 드롭 방식

 

드래그 앤 드롭방식(PDF이외의 파일형식은 올라가지 않음)

 

만약 저장할 PDF가 없다면.

파일 없을 시 

728x90
반응형

+ Recent posts