9.8 PDF 내보내기
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 슬롯에 연결하는 구조는
다른 메뉴 항목들과 동일한 패턴을 따른다 - 학생들이 이 패턴에 익숙해지면
이후 편집 기능, 문자 스타일, 문단 정렬, 폰트/컬러/도움말까지
동일한 방식으로 확장할 수 있다
단계별 완성 파일




