Skip to content

Öğretici

Metodların tam dökümantasyonu: fpdf.FPDF API dökümanı

Öğretici 1 - Minimal Örnek

Hadi klasik bir örnekle başlayalım:

from fpdf import FPDF

pdf = FPDF()
pdf.add_page()
pdf.set_font("helvetica", "B", 16)
pdf.cell(40, 10, "Hello World!")
pdf.output("tuto1.pdf")

Sonuç PDF

Kütüphaneyi dahil ettikten sonra, FPDF objesi oluşturuyoruz. FPDF oluşturucusu buradaki varsayılan değerleri kullanır: sayfalar dikey A4 formatında ve milimetre cinsinden ölçülüdür. Ayrıca bu şekilde açıkça da belirtilebilir:

pdf = FPDF(orientation="P", unit="mm", format="A4")

Diğer sayfa formatları (Letter ve Legal gibi) ve ölçü birimleri (pt, cm, in) de kullanılabilir.

Şu an için bir sayfamız yok, bu yüzden bir tane eklememiz gerekiyor add_page. Başlangıç noktası sol üst köşededir ve geçerli konum varsayılan olarak sınırlardan 1 cm uzağa yerleştirilir; kenar boşlukları set_margins ile değiştirilebilir.

Metni yazdırmadan önce, aşağıdaki özelliklere sahip bir yazı tipi seçmek zorunludur set_font, aksi takdirde belge geçersiz olur. Helvetica bold 16'yı seçiyoruz:

pdf.set_font('helvetica', 'B', 16)

Yazı tipi stilleriyle oynayabiliriz. Örneğin, italikleri I ile, altı çizgili U ile veya düz bir yazı tipiyle boş bir dizeyle (veya herhangi bir kombinasyonla) belirtebiliriz. Yazı tipi boyutu puan cinsinden belirtilir, milimetre (veya başka bir kullanıcı birimi) değil; bu tek istisnadır. Diğer yerleşik yazı tipleri Times, Courier, Symbol ve ZapfDingbats'tir.

Artık bir hücreyi cell ile yazdırabiliriz. Hücre, muhtemelen çerçeveli, metin içeren bir dikdörtgen alanıdır. Hücre geçerli konumda oluşturulur. Boyutlarını, metnini (merkezlenmiş veya hizalanmış), çerçevelerinin çizilip çizilmeyeceğini ve sonrasında nereye gidileceğini (sağa, aşağıya veya bir sonraki satırın başına) belirtiriz. Bir çerçeve eklemek için şunu yapabiliriz:

pdf.cell(40, 10, 'Merhaba Dünya!', 1)

Yanına merkezlenmiş metin eklemek ve bir sonraki satıra gitmek için, şunu yapabiliriz:

pdf.cell(60, 10, 'FPDF tarafından oluşturuldu.', new_x="LMARGIN", new_y="NEXT", align='C')

Not: Satır sonu ayrıca ln ile de yapılabilir. Bu metot ayrıca, satır aralığını belirtmeye de olanak tanır.

Son olarak, belge kapatılır ve verilen dosya yoluna kaydedilir. output. Herhangi bir parametre sağlanmadığında, output() PDF bytearray buffer değerini döndürür.

Öğretici 2 - Başlık, altbilgi, sayfa sonu ve resim

Şimdi bir başlık, altbilgi ve logo içeren iki sayfalık bir örnek yapalım:

from fpdf import FPDF


class PDF(FPDF):
    def header(self):
        # Rendering logo:
        self.image("../docs/fpdf2-logo.png", 10, 8, 33)
        # 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.set_font("Times", 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")

Sonuç PDF

Bu örnek, sayfa başlıklarını ve altbilgilerini işlemek için header ve footer metodlarını kullanır. Bunlar otomatik olarak çağrılır. Bu özellikler FPDF sınıfında zaten mevcuttur ancak varsayılan olduklarından boşturlar, bu yüzden sınıfı genişletmeli ve içeriklerini doldurarak onları özelleştirmeliyiz.

Logo, image metoduyla üst sol köşesini ve genişliğini belirterek yazdırılır. Yükseklik otomatik olarak hesaplanır ve resmin oranlarını korumak için kullanılır.

Sayfa numarasını yazdırmak için, hücre genişliği olarak null bir değer geçilir. Bu, metnin sağ kenarına kadar uzanması gerektiği anlamına gelir; metni ortalamak için kullanışlıdır. Geçerli sayfa numarası page_no metodu ile alınır; toplam sayfa sayısı ise belge kapatıldığında {nb} ile değiştirilecek özel bir değerle alınır (bu özel değer alias_nb_pages() ile değiştirilebilir). Not olarak, set_y metodu, sayfanın üstünden veya altından başlayarak mutlak bir konum belirlemeye izin verir.

Burada kullanılan başka ilginç bir özellik de otomatik sayfa sınırlandırmalarıdır. Bir hücre sayfanın bir sınırını geçeceği anda (varsayılan olarak alttan 2 cm uzakta) bir kesme gerçekleştirilir ve yazı tipi geri yüklenir. Başlık ve altbilgi kendi yazı tipini (helvetica) seçerken, gövde Times ile devam eder. Bu otomatik geri yükleme mekanizması, renkler ve çizgi kalınlığı için de geçerlidir. Sayfa kesimlerini tetikleyen sınır, set_auto_page_break ile ayarlanabilir.

Öğretici 3 - Satır sonları ve renkler

Şimdi, paragrafları hizalayarak yazdıran bir örneğe devam edelim. Ayrıca renklerin nasıl kullanılacağını gösterir.

from fpdf import FPDF


class PDF(FPDF):
    def header(self):
        # Setting font: helvetica bold 15
        self.set_font("helvetica", "B", 15)
        # Calculating width of title and setting cursor position:
        width = self.get_string_width(self.title) + 6
        self.set_x((210 - width) / 2)
        # Setting colors for frame, background and text:
        self.set_draw_color(0, 80, 180)
        self.set_fill_color(230, 230, 0)
        self.set_text_color(220, 50, 50)
        # Setting thickness of the frame (1 mm)
        self.set_line_width(1)
        # Printing title:
        self.cell(
            width,
            9,
            self.title,
            border=1,
            new_x="LMARGIN",
            new_y="NEXT",
            align="C",
            fill=True,
        )
        # Performing a line break:
        self.ln(10)

    def footer(self):
        # Setting position at 1.5 cm from bottom:
        self.set_y(-15)
        # Setting font: helvetica italic 8
        self.set_font("helvetica", "I", 8)
        # Setting text color to gray:
        self.set_text_color(128)
        # Printing page number
        self.cell(0, 10, f"Page {self.page_no()}", align="C")

    def chapter_title(self, num, label):
        # Setting font: helvetica 12
        self.set_font("helvetica", "", 12)
        # Setting background color
        self.set_fill_color(200, 220, 255)
        # Printing chapter name:
        self.cell(
            0,
            6,
            f"Chapter {num} : {label}",
            new_x="LMARGIN",
            new_y="NEXT",
            align="L",
            fill=True,
        )
        # Performing a line break:
        self.ln(4)

    def chapter_body(self, filepath):
        # Reading text file:
        with open(filepath, "rb") as fh:
            txt = fh.read().decode("latin-1")
        # Setting font: Times 12
        self.set_font("Times", size=12)
        # Printing justified text:
        self.multi_cell(0, 5, txt)
        # Performing a line break:
        self.ln()
        # Final mention in italics:
        self.set_font(style="I")
        self.cell(0, 5, "(end of excerpt)")

    def print_chapter(self, num, title, filepath):
        self.add_page()
        self.chapter_title(num, title)
        self.chapter_body(filepath)


pdf = PDF()
pdf.set_title("20000 Leagues Under the Seas")
pdf.set_author("Jules Verne")
pdf.print_chapter(1, "A RUNAWAY REEF", "20k_c1.txt")
pdf.print_chapter(2, "THE PROS AND CONS", "20k_c1.txt")
pdf.output("tuto3.pdf")

Sonuç PDF

Jules Verne metni

get_string_width metodu, kullanılan yazı tipindeki bir dizenin uzunluğunu belirlemeye olanak tanır. Bu, başlığı çevreleyen kısmın konumunu ve genişliğini hesaplamak için kullanılır. Ardından renkler ayarlanır (set_draw_color, set_fill_color ve set_text_color) ve çizgi kalınlığı varsayılan 0.2 mm'ye karşı 1 mm'ye ayarlanır set_line_width. Son olarak, hücre çıktısı yapılır (arka planın doldurulması gerektiğini belirten son parametre true'dur).

Paragrafları yazdırmak için kullanılan yöntem multi_cell metotudur. Metin varsayılan olarak hizalanır. Her bir satır sağ sınırı hücrenin sağ kenarına ulaştığında veya bir satır sonu karakteri (\n) karşılaşıldığında, bir satır sonu verilir ve yeni bir hücre otomatik olarak mevcut hücrenin altına oluşturulur. Otomatik bir kesme, en yakın boşluğa veya yumuşak kısa çizgi karakterine (\u00ad) sağ sınıra ulaşıldığında gerçekleştirilir. Bir satır sonu tetiklendiğinde, bir yumuşak kısa çizgi normal bir kısa çizgiyle değiştirilir ve aksi takdirde yoksayılır.

İki belge özelliği tanımlanmıştır: başlık (set_title) ve yazar (set_author). Özellikler iki şekilde görülebilir. İlk olarak, belgeyi doğrudan Acrobat Reader ile açarak, Dosya menüsüne gidin ve Belge Özellikleri seçeneğini seçin. İkincisi, eklentiden de mevcut olan, belge özelliklerini sağ tıklayarak seçmek.

Öğretici 4 - Çoklu Sütunlar

Bu örnek, metni birden fazla sütuna yayarak, metni birden fazla sütuna yayarak nasıl yapılacağını gösterir. This example is a variant of the previous one, showing how to lay the text across multiple columns.

from fpdf import FPDF


class PDF(FPDF):
    def header(self):
        self.set_font("helvetica", "B", 15)
        width = self.get_string_width(self.title) + 6
        self.set_x((210 - width) / 2)
        self.set_draw_color(0, 80, 180)
        self.set_fill_color(230, 230, 0)
        self.set_text_color(220, 50, 50)
        self.set_line_width(1)
        self.cell(
            width,
            9,
            self.title,
            border=1,
            new_x="LMARGIN",
            new_y="NEXT",
            align="C",
            fill=True,
        )
        self.ln(10)

    def footer(self):
        self.set_y(-15)
        self.set_font("helvetica", "I", 8)
        self.set_text_color(128)
        self.cell(0, 10, f"Page {self.page_no()}", align="C")

    def chapter_title(self, num, label):
        self.set_font("helvetica", "", 12)
        self.set_fill_color(200, 220, 255)
        self.cell(
            0,
            6,
            f"Chapter {num} : {label}",
            new_x="LMARGIN",
            new_y="NEXT",
            border="L",
            fill=True,
        )
        self.ln(4)

    def chapter_body(self, fname):
        # Reading text file:
        with open(fname, "rb") as fh:
            txt = fh.read().decode("latin-1")
        with self.text_columns(
            ncols=3, gutter=5, text_align="J", line_height=1.19
        ) as cols:
            # Setting font: Times 12
            self.set_font("Times", size=12)
            cols.write(txt)
            cols.ln()
            # Final mention in italics:
            self.set_font(style="I")
            cols.write("(end of excerpt)")

    def print_chapter(self, num, title, fname):
        self.add_page()
        self.chapter_title(num, title)
        self.chapter_body(fname)


pdf = PDF()
pdf.set_title("20000 Leagues Under the Seas")
pdf.set_author("Jules Verne")
pdf.print_chapter(1, "A RUNAWAY REEF", "20k_c1.txt")
pdf.print_chapter(2, "THE PROS AND CONS", "20k_c1.txt")
pdf.output("tuto4.pdf")

Sonuç PDF

Jules Verne metni

Önceki öğreticiyle ana fark, text_columns metodunun kullanılmasıdır. Metni toplar ve istenen sütun sayısına dağıtır, gerekirse otomatik olarak sayfa kesmeleri ekler. TextColumns örneği bir bağlam yöneticisi olarak etkin olduğunda, metin stilleri ve diğer yazı tipi özellikleri değiştirilebilir. Bu değişiklikler bağlamla sınırlı olacaktır. Kapatıldığında önceki ayarlar yeniden yüklenecektir.

Öğretici 5 - Tablolar Oluşturma

Bu öğretici, iki farklı tablo oluşturmayı açıklar, basit ayarlamalarla nelerin elde edilebileceğini göstermek için.

import csv
from fpdf import FPDF
from fpdf.fonts import FontFace
from fpdf.enums import TableCellFillMode


with open("countries.txt", encoding="utf8") as csv_file:
    data = list(csv.reader(csv_file, delimiter=","))

pdf = FPDF()
pdf.set_font("helvetica", size=14)

# Basic table:
pdf.add_page()
with pdf.table() as table:
    for data_row in data:
        row = table.row()
        for datum in data_row:
            row.cell(datum)

# Styled table:
pdf.add_page()
pdf.set_draw_color(255, 0, 0)
pdf.set_line_width(0.3)
headings_style = FontFace(emphasis="BOLD", color=255, fill_color=(255, 100, 0))
with pdf.table(
    borders_layout="NO_HORIZONTAL_LINES",
    cell_fill_color=(224, 235, 255),
    cell_fill_mode=TableCellFillMode.ROWS,
    col_widths=(42, 39, 35, 42),
    headings_style=headings_style,
    line_height=6,
    text_align=("LEFT", "CENTER", "RIGHT", "RIGHT"),
    width=160,
) as table:
    for data_row in data:
        row = table.row()
        for datum in data_row:
            row.cell(datum)

pdf.output("tuto5.pdf")

Sonuç PDF - Ülkelerin CSV verisi

İlk örnek mümkün olan en basit yöntem ile elde edilebilir, verileri FPDF.table() metoduna vererek. Sonuç basit olsa da çok hızlı bir şekilde elde edilir.

İkinci tablo bazı iyileştirmeler getirir: renkler, sınırlı tablo genişliği, azaltılmış satır yüksekliği, başlıkların ortalanması, özel genişliklere sahip sütunlar, rakamların sağa hizalanması... Ayrıca yatay çizgiler kaldırılmıştır. Bu, mevcut değerler arasından bir borders_layout seçilerek yapılmıştır: TableBordersLayout.

Öğretici 6 - Bağlantılar Oluşturma ve Metin Stillerini Harmanlayarak Kullanma

Bu öğretici, bir pdf belgesi içine bağlantılar eklemenin birkaç yolunu açıklar, ayrıca dış kaynaklara bağlantı eklemeyi gösterir.

Ayrıca, aynı metin içinde farklı metin stillerini (kalın, italik, altı çizili) nasıl kullanabileceğimizi gösterecektir.

from fpdf import FPDF


pdf = FPDF()

# First page:
pdf.add_page()
pdf.set_font("helvetica", size=20)
pdf.write(5, "To find out what's new in self tutorial, click ")
pdf.set_font(style="U")
link = pdf.add_link(page=2)
pdf.write(5, "here", link)
pdf.set_font()

# Second page:
pdf.add_page()
pdf.image(
    "../docs/fpdf2-logo.png", 10, 10, 50, 0, "", "https://py-pdf.github.io/fpdf2/"
)
pdf.set_left_margin(60)
pdf.set_font_size(18)
pdf.write_html(
    """You can print text mixing different styles using HTML tags: <b>bold</b>, <i>italic</i>,
<u>underlined</u>, or <b><i><u>all at once</u></i></b>!
<br><br>You can also insert links on text, such as <a href="https://py-pdf.github.io/fpdf2/">https://py-pdf.github.io/fpdf2/</a>,
or on an image: the logo is clickable!"""
)
pdf.output("tuto6.pdf")

Sonuç PDF - fpdf2-logo

Bu öğreticide, metin yazdırmak için gösterilen yeni yöntem write() . Burada gösterilen yeni yöntem, metni yazdırmak için kullanılan multi_cell() metoduna oldukça benzer, temel farklar şunlardır:

  • Satır sonu sağ kenarda ve bir sonraki satır sol kenarda başlar.
  • işaretçi konum metnin sonuna taşınır.

Bu yöntem, bir metin parçası yazmamıza, yazı tipi stilini değiştirmemize ve kaldığımız yerden devam etmemize olanak tanır. Öte yandan, metni multi_cell() metoduyla olduğu gibi düzgün hizalayamayız.

İlk sayfada, bu amaçla write() kullanıldı. Cümlenin başlangıcı düz yazı tipinde yazıldı, ardından set_font() metoduyla altı çizili haline getirildi ve cümle tamamlandı.

İkinci sayfaya yönlendiren bir iç bağlantı eklemek için, ikinci sayfayı ekledik ve add_link() metoduyla ikinci sayfaya yönlendiren bir bağlantı linki oluşturduk.

Dış bağlantı oluşturmak için bir resim kullanarak dış bağlantı oluşturduk image() . Metodun bir bağlantıyı bir argüman olarak geçme seçeneği vardır. Bağlantı hem iç hem de dış bağlantı olabilir.

Alternatif olarak, yazı tipi stilini değiştirmek ve bağlantılar eklemek için başka bir seçenek de write_html() yöntemini kullanın. Metin eklemeyi sağlayan bir html ayrıştırıcıdır, yazı tipi stilini değiştirme ve html kullanarak bağlantı ekleme özelliklerine sahiptir.