728x90

1. 목표

더보기
  • 현재 QTextEdit 에 작성된 내용을 PDF 파일로 내보내는 기능을 구현한다
  • QPrinter 를 일반 프린터가 아니라 PDF 출력 전용 장치처럼 사용하는 방법을 익힌다
  • 파일 저장 경로를 받기 위해 QFileDialog, 확장자 처리를 위해 QFileInfo 를 활용한다
  • 파이썬 open 함수로 파일을 쓰지 않고 Qt 출력 시스템을 그대로 사용한다

 

2. 전체 로직

더보기
# mainwindow.py

. . .

class MainWindow(QMainWindow):
    def __init__(self, parent=None):

        . . .
        
       self.ui.actionExport_PDF.triggered.connect(self.export_pdf)
 
        . . .

    def export_pdf(self):
        fn, _ = QFileDialog.getSaveFileName(
            self,
            "Export PDF",
            "",
            "PDF Files (*.pdf);;All Files (*)"
        )

        if not fn:
            return

        info = QFileInfo(fn)
        if info.suffix() == "":
            fn += ".pdf"

        printer = QPrinter(QPrinter.PrinterMode.HighResolution)
        printer.setOutputFormat(QPrinter.OutputFormat.PdfFormat)
        printer.setOutputFileName(fn)

        document = self.editor.document()
        document.print_(printer)

        QMessageBox.information(self, "PDF 내보내기", f"PDF 파일로 저장되었습니다.\n\n{fn}")
# main.py

import sys
from PySide6.QtWidgets import QApplication

from mainwindow import MainWindow

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec())

 


 

3. 필요한 import + 주석 설명

더보기

동일



4. 메뉴 액션과 슬롯 연결하기 (actionExport_PDF ↔ preview_dialog)

더보기
class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # QTextEdit 에 자주 접근하므로 별칭을 만들어 둔다
        self.editor = self.ui.textEdit

        # 9.8 PDF 내보내기 기능
        # 파일 메뉴의 Export PDF 항목, 툴바 아이콘, 단축키는
        # 모두 actionExport_PDF 에 연결되어 있고
        # 여기서 그 시그널을 export_pdf 메서드에 연결한다
        self.ui.actionExport_PDF.triggered.connect(self.export_pdf)

 

5. PDF 내보내기 기능 구현 함수

더보기
    def export_pdf(self):
        # 1  저장할 PDF 파일 이름을 사용자에게 입력받는 저장 대화상자를 연다
        #    반환값은 (파일 경로 문자열, 선택된 필터 문자열) 이다
        fn, selected_filter = QFileDialog.getSaveFileName(
            self,
            "Export PDF",             # 대화상자 제목
            "",                       # 초기 디렉터리 (비워 두면 기본 경로 사용)
            "PDF Files (*.pdf);;All Files (*)"  # 파일 형식 필터
        )

        # 2  사용자가 취소를 선택하면 fn 이 빈 문자열이므로 바로 함수 종료
        if not fn:
            return

        # 3  사용자가 .pdf 를 직접 입력하지 않은 경우를 처리하기 위해
        #    QFileInfo 로 확장자를 검사한다
        info = QFileInfo(fn)
        if info.suffix() == "":
            # 확장자가 없으면 pdf 를 자동으로 덧붙인다
            fn += ".pdf"

        # 4  QPrinter 를 생성하고 PDF 출력 전용으로 설정한다
        printer = QPrinter(QPrinter.PrinterMode.HighResolution)

        # 출력 포맷을 PDF 로 지정하면
        # 실제 프린터로 가지 않고 지정한 파일로 출력된다
        printer.setOutputFormat(QPrinter.OutputFormat.PdfFormat)

        # 출력 대상 파일 경로를 위에서 결정한 fn 으로 지정한다
        printer.setOutputFileName(fn)

        # 5  QTextEdit 가 내부적으로 사용하는 QTextDocument 객체를 얻어서
        #    그 문서를 QPrinter 에 출력한다
        document = self.editor.document()
        document.print_(printer)

        # 6  작업이 끝났음을 사용자에게 알려 주는 정보 메시지 박스
        QMessageBox.information(self, "PDF 내보내기", f"PDF 파일로 저장되었습니다.\n\n{fn}")

여기서는 파이썬의 open 함수로 파일을 직접 쓰지 않고
Qt 출력 시스템(QPrinter + QTextDocument.print_)만 사용하고 있다는 점이 중요합니다.


 

6. 실행 테스트

 

7. 학습 주요 포인트

더보기

QPrinter 를 PDF 출력 장치로 사용하는 패턴

  • 원래는 실제 프린터 제어용 클래스지만
    OutputFormat 을 PdfFormat 으로 설정하면
    프린트 미리보기와 거의 같은 경로로 PDF 파일을 생성할 수 있다

 

파일 경로 선택과 확장자 보정

  • QFileDialog.getSaveFileName 으로 사용자에게 경로를 입력받고
  • QFileInfo.suffix 로 확장자를 검사해 자동으로 pdf 를 붙이는 패턴은
    다른 파일 형식 저장 기능에서도 재사용할 수 있다

 

QTextEdit 와 QTextDocument 의 역할 분리

  • 화면에 보이는 위젯은 QTextEdit 이고
    실제 내용을 가지고 있는 객체는 QTextDocument 이다
  • 프린트나 PDF 내보내기는 document.print_ 에게 맡긴다
    덕분에 페이지 나누기, 줄바꿈, 폰트 렌더링 등을 직접 계산할 필요가 없다

 

파이썬 파일 입출력 대신 Qt 출력 시스템 활용

  • open 과 write 로 직접 PDF 파일을 만드는 대신
    QPrinter 와 Qt 의 렌더링 엔진을 사용해
    화면과 동일한 결과를 얻을 수 있다
  • 인쇄 기능(9.6), 프린트 미리보기(9.7), PDF 내보내기(9.8)가
    모두 QPrinter 를 중심으로 같은 출력 경로를 공유한다는 점을 강조하면 좋다

 

UI 설계와 코드 분리

  • form.ui 에서 만든 actionExport_PDF 를
    파이썬 코드에서 export_pdf 슬롯에 연결하는 구조는
    다른 메뉴 항목들과 동일한 패턴을 따른다
  • 학생들이 이 패턴에 익숙해지면
    이후 편집 기능, 문자 스타일, 문단 정렬, 폰트/컬러/도움말까지
    동일한 방식으로 확장할 수 있다

 

단계별 완성 파일