Fpdf2 kodunu fonksiyona cevirme

pdf sayfalari üretmek icin fpdf2 modulünün dokümantayonunda buldugum bir örnek kodu kullaniyorum. Bu kodu bir push buttona basarak calistirmak icin bir fonksiyon (def) altinda toplamayi basaramadim. def header ve def footer fonksiyonlarini yeni olusacak bir fonksiyona entegre edemiyorum.
Yardimlarinizi rica ederim. Eldeki kod söyle:

from fpdf import FPDF

class PDF(FPDF):
    def header(self):
        # Setting font: helvetica bold 15
        self.set_font("helvetica", "B", 15)
        # Moving cursor to the right:
        self.cell(80)
        # Printing title:
        self.cell(30, 10, "Title", border=1, align="C")
        # Performing a line break:
        self.ln(20)

    def footer(self):
        # Position cursor at 1.5 cm from bottom:
        self.set_y(-15)
        # Setting font: helvetica italic 8
        self.set_font("helvetica", "I", 8)
        # Printing page number:
        self.cell(0, 10, f"Page {self.page_no()}/{{nb}}", align="C")


# Instantiation of inherited class
pdf = PDF()
pdf.add_page()
pdf.add_font("OpenSans-Regular", style="", fname=r"C:\\Users\\Anwender\\AppData\\Local\\Microsoft\\Windows\\Fonts\\OpenSans-Regular.ttf")
pdf.set_font("OpenSans-Regular", size=12)

for i in range(1, 41):
    pdf.cell(0, 10, f"Printing line number {i}", new_x="LMARGIN", new_y="NEXT")
pdf.output("new-tuto2.pdf")
1 Beğeni

Merhabalar,

Sorunuzu gozden gecirip bozuk cikmis kodu duzelttiginiz icin tesekkurler.

Butun kodu bir fonksiyon altina koyabilirsiniz:

def fn():
    from fpdf import FPDF

    class PDF(FPDF):
        def header(self):
            # Setting font: helvetica bold 15
            self.set_font("helvetica", "B", 15)
            # Moving cursor to the right:
            self.cell(80)
            # Printing title:
            self.cell(30, 10, "Title", border=1, align="C")
            # Performing a line break:
            self.ln(20)

        def footer(self):
            # Position cursor at 1.5 cm from bottom:
            self.set_y(-15)
            # Setting font: helvetica italic 8
            self.set_font("helvetica", "I", 8)
            # Printing page number:
            self.cell(0, 10, f"Page {self.page_no()}/{{nb}}", align="C")


    # Instantiation of inherited class
    pdf = PDF()
    pdf.add_page()
#    pdf.add_font("OpenSans-Regular", style="", fname=r"C:\\Users\\Anwender\\AppData\\Local\\Microsoft\\Windows\\Fonts\\OpenSans-Regular.ttf")
#    pdf.set_font("OpenSans-Regular", size=12)

    for i in range(1, 41):
        pdf.cell(0, 10, f"Printing line number {i}", new_x="LMARGIN", new_y="NEXT")
    pdf.output("new-tuto2.pdf")

fn()
1 Beğeni

Cok tesekkür ederim. Tam istenen sekilde calisiyor. Kodun kullanilir hale gelmesi 2 sorunu ortaya cikardi. Biri sizin icin cok kolay. Digeri belki mümkün degil.

  1. Kodu bir formdan bir push button ile cagiriyorum.
    Sizin kapattiginiz os.startfile(“C:/Users/Anwender/new-tuto2.pdf”) komutu üretilen PDF’i ekranda görüntülüyor. Kullanici PDF’i hemen ekrandan printere gönderebiliyor.
    PDF ekranda görüntülendigi anda kodu cagirdigim form hemen kapaniyor. Bu formun baska PDF islemleri icin acik kalmasi lazim.
    Bunu nasil yapabiiriz ?

  2. Türkce harfler kullanildiginda fpdf2’nin icindeki 3 yazi tipi bunlari desteklemedigi icin program cöküyor. Onun icin add.font ile bir ttf tipi harf ailesi yüklüyorum. Calisiyor.
    Ancak header ve footer bölümlerinde bu yeni ttf cagrilamiyor, dolayisiyla Türkce harfler kullanilamiyor.
    TTF tipi harfleri header ve footer’e nasil yükleyebiiriz? Belki de bu mümkün olmayacak.

Form dahil komple kodu asagida veriyorum. Sadece “Daire sakinleri” adli button aktif.
Selamlar, saygilar

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'PrintDaireler.ui'
#
# Created by: PyQt5 UI code generator 5.15.10
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
from fpdf import FPDF
import os

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(640, 480)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pbOturan = QtWidgets.QPushButton(self.centralwidget)
        self.pbOturan.setGeometry(QtCore.QRect(40, 30, 241, 71))
        font = QtGui.QFont()
        font.setPointSize(19)
        self.pbOturan.setFont(font)
        self.pbOturan.setObjectName("pbOturan")
        self.pbSahip = QtWidgets.QPushButton(self.centralwidget)
        self.pbSahip.setGeometry(QtCore.QRect(40, 210, 241, 71))
        font = QtGui.QFont()
        font.setPointSize(19)
        self.pbSahip.setFont(font)
        self.pbSahip.setObjectName("pbSahip")
        self.pbBos = QtWidgets.QPushButton(self.centralwidget)
        self.pbBos.setGeometry(QtCore.QRect(40, 300, 241, 71))
        font = QtGui.QFont()
        font.setPointSize(19)
        self.pbBos.setFont(font)
        self.pbBos.setObjectName("pbBos")
        self.pbKiraci = QtWidgets.QPushButton(self.centralwidget)
        self.pbKiraci.setGeometry(QtCore.QRect(40, 120, 241, 71))
        font = QtGui.QFont()
        font.setPointSize(19)
        self.pbKiraci.setFont(font)
        self.pbKiraci.setObjectName("pbKiraci")
        self.pbSatilik = QtWidgets.QPushButton(self.centralwidget)
        self.pbSatilik.setGeometry(QtCore.QRect(320, 30, 241, 71))
        font = QtGui.QFont()
        font.setPointSize(19)
        self.pbSatilik.setFont(font)
        self.pbSatilik.setObjectName("pbSatilik")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 31))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pbOturan.setText(_translate("MainWindow", "Daire sakinleri"))
        self.pbSahip.setText(_translate("MainWindow", "Kat malikleri"))
        self.pbBos.setText(_translate("MainWindow", "Bos/kiralik daireler"))
        self.pbKiraci.setText(_translate("MainWindow", "Kiracilar"))
        self.pbSatilik.setText(_translate("MainWindow", "Satilik daireler"))

########################### KÖDLAR ##########################
        self.pbOturan.clicked.connect(self.fn)

    def fn(self):
        #from fpdf import FPDF
        #import os

        class PDF(FPDF):
            def header(self):
                # Setting font: helvetica bold 15
                self.set_font("helvetica", "B", 15)
                # Moving cursor to the right:
                self.cell(80)
                # Printing title:
                self.cell(30, 10, "Title", border=1, align="C")
                # Performing a line break:
                self.ln(20)

            def footer(self):
                # Position cursor at 1.5 cm from bottom:
                self.set_y(-15)
                # Setting font: helvetica italic 8
                self.set_font("helvetica", "I", 8)
                # Printing page number:
                self.cell(0, 10, f"Page {self.page_no()}/{{nb}}", align="C")


        # Instantiation of inherited class
        pdf = PDF()
        pdf.add_page()
        pdf.add_font("OpenSans-Regular", style="", fname=r"C:\\Users\\Anwender\\AppData\\Local\\Microsoft\\Windows\\Fonts\\OpenSans-Regular.ttf")
        pdf.set_font("OpenSans-Regular", size=12)

        for i in range(1, 41):
            pdf.cell(0, 10, f"Printing Akış {i}", new_x="LMARGIN", new_y="NEXT")
        pdf.output("new-tuto2.pdf")
        os.startfile("C:/Users/Anwender/new-tuto2.pdf")

        self.fn()        


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()

    sys.exit(app.exec_())

Ben kapatmadim, orijinal kodda yoktu. Olsaydi kapatirdim tabi, zira Anwender isimli bir kullanicinin oldugu Windows makinesi gerektiriyor. Font satirlarini kapattim, benzer nedenlerden oturu.

fn kendini cagirdigi icin sonsuz recursion’a giriyor.

Cunku header ve footer bolumleri yeni font eklenmeden once cagriliyor. Ilk olarak yeni fontu eklerseniz, ekledikten sonra yaptiginiz gibi set_font’u cagirabilirsiniz.

Cok tesekkür.
Son satirdaki fn() cagrisini dediginiz gibi cikardim. Sorun cözüldü.

TTF font’u add.font komutunu header() ve footer() fonksiyonlarinin önüne almakla eklemeyi basaramadim. Is sadece add.font satirini öne kaydirmak degil anlasilan.

Bana bu sorunda da yardimci olabilir misiniz?
Simdiden tesekkürler…

add_page’den once cagirmayi deneyin.

add_page’den önce cagirmayi denedim. Olmadi. Söyle bir hata veriyor:
File “C:\Users\Anwender\AppData\Local\Programs\Python\Python312\Lib\site-packages\fpdf\fpdf.py”, line 1947, in set_font
raise FPDFException(
fpdf.errors.FPDFException: Undefined font: opensans-regularB - Use built-in fonts or FPDF.add_font() beforehand

Kullandigim ve sizin de elden gecirdiginiz kodun yazari (sanirim aslinda fpdf2 modülünün yazari) youtube’da sadece bu sorun icin bir video cekmis. Hemen class PDF(FPDF): satirinin altina üc satirlik su def’i ekliyor:

def__init__(self,**kwargs):
super(PDF, self).init(**kwargs)
self.add_font (…ve devami)

Bu da calismiyor. add_font’un hemen önündeki self’i tanimiyor.

header, footer sevdasindan vazgecmem mi gerekir yoksa hala bir ümit var mi?
Konuya zaman ayirdiginiz icin cok tesekkür.

Bende calisiyo

        pdf = PDF()
        pdf.add_font("DejaVu", style="I", fname="/usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf")
        pdf.add_font("DejaVu", style="B", fname="/usr/share/fonts/truetype/dejavu/DejaVuSerif-Italic.ttf")
        pdf.add_page()
            def header(self):
                # Setting font: helvetica bold 15
                self.set_font("DejaVu", "B", 15)

Eklediginiz fontla kullandiginiz fontun ayni oldugundan emin olun.

Gereksiz yere degerli zamaninizi isgal ettim. Kusura bakmayin. Bende de calisiyor.
Yaptigim tek degisiklik su: Kodu tek basina o is icin yaptigim bir deneme sayfasinda calistiriyordum. Tüm denemeler basarisiz oldu. Bu arada kodu oradan alip ileride kesin olarak yer alacagi, baska bir yigin kodun da oldugu bir constructoru bulunan sayfaya yerlestirmistim. Öneriniz o ortam icinde calisti.
Cok tesekkürler…

1 Beğeni

Rica ederim.
Vakit almasi da sorun degil, karsi taraf kendisi de vakit harcadigi surece bosa gitmis hissetmiyor insan.

O yuzden bazen “sunun sundan once/sonra calismasi lazim” diyorum. Karsi taraf kodun akisini bilmiyor ve ogrenmesi lazim olabilir, ama bu cok temel ve ogrenmesi kolay oldugu kadar da gerekli bir sey ise, ogrendigi yanina kar kalir.

Bazen de “sunu soyle yap duzelecek” yerine “surada su hata var” deyip cozumu karsiya birakmak beceri hissini arttiriyor. Ogrenilen seylerin sayisini da.

Vaktiniz oldugunda bu tur seylerin tam olarak neden oldugunu ogrenmek de uzun vadede cok faydali oluyor bu arada. Vaktiniz oldugunda.

1 Beğeni

Youtube’da oldukca fazla sayida video ile Python dersleri veren bir egitmenin arada bir söyle konustugunu gördüm:
“Programcilik demek kodlari oradan buradan kopya edip birbirine yapistirmaktir. Isimiz gücümüz kod kopyalamak zaten.”
Bu görüsün biraz yaygin oldugunu görüp üzülüyorum.
Sizin gibi forumlarda aktif olan kisilerin bana yazdiginiz ilkeleri sürekli yineleyerek insanlarin kafasina yerlestirmeye calismasi sart.
Benim artik zaman sorunum yok. Bu nedenle her sorunun ayrintilarina girip konuyu tam kavrayincaya kadar günler harcayabiiiyorum. Yillar önce php ve MsAccess’in Visual Basic’ini de bu sekilde calisarak okula, kursa falan gitmeden ögrenmistim.
Iyi günler, basarilar dilerim.