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 ์Šฌ๋กฏ์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ตฌ์กฐ๋Š”
    ๋‹ค๋ฅธ ๋ฉ”๋‰ด ํ•ญ๋ชฉ๋“ค๊ณผ ๋™์ผํ•œ ํŒจํ„ด์„ ๋”ฐ๋ฅธ๋‹ค
  • ํ•™์ƒ๋“ค์ด ์ด ํŒจํ„ด์— ์ต์ˆ™ํ•ด์ง€๋ฉด
    ์ดํ›„ ํŽธ์ง‘ ๊ธฐ๋Šฅ, ๋ฌธ์ž ์Šคํƒ€์ผ, ๋ฌธ๋‹จ ์ •๋ ฌ, ํฐํŠธ/์ปฌ๋Ÿฌ/๋„์›€๋ง๊นŒ์ง€
    ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค

 

๋‹จ๊ณ„๋ณ„ ์™„์„ฑ ํŒŒ์ผ