Skip to content

Handleiding

Methoden volledige documentatie: fpdf.FPDF API doc

Tuto 1 - Minimaal voorbeeld

Eerste, het klassieke voorbeeld:

from fpdf import FPDF

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

Resulting PDF

Nadat u het bibliotheekbestand hebt toegevoegd, maakt u een FPDF-object. De FPDF constructor wordt hier gebruikt met de standaardwaarden: pagina's zijn in A4 staand en de maateenheid is millimeter. Het had expliciet vermeld kunnen worden met:

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

Het is mogelijk om de PDF in landscape-modus (L) te zetten of om andere paginaformaten te gebruiken (zoals Letter en Legal) en maateenheden (pt, cm, in).

Er is momenteel geen pagina, dus we moeten er een toevoegen add_page. De oorsprong bevindt zich in de linkerbovenhoek en de de huidige positie wordt standaard op 1 cm van de randen geplaatst; de marges kunnen worden gewijzigd met set_margins.

Voordat we tekst kunnen afdrukken, is het verplicht om een lettertype te selecteren set_font, anders zou het document ongeldig zijn. Wij kiezen voor Helvetica bold 16:

pdf.set_font('Helvetica', style='B', size=16)

We hadden cursief kunnen specificeren met I, onderstreept met U of een gewoon lettertype met een lege string (of een combinatie daarvan). Houd er rekening mee dat de lettergrootte is opgegeven punten, geen millimeters (of een andere gebruikerseenheid); het is de enige uitzondering. De andere ingebouwde lettertypen zijn Times, Courier, Symbol en ZapfDingbats.

We kunnen nu een cel afdrukken met cell.Een cel is een rechthoekig gebied, eventueel omkaderd, dat wat tekst bevat. Het wordt weergegeven op de huidige positie.

We specificeren de afmetingen, de tekst (gecentreerd of uitgelijnd), of er randen moeten worden getekend en waar de huidige positie daarnaheen beweegt (naar rechts, onder of naar het begin van de volgende regel). Om een frame toe te voegen, doen we dit:

pdf.cell(40, 10, 'Hello World!', 1)

Om er een nieuwe cel met gecentreerde tekst naast toe te voegen en naar de volgende regel te gaan, wij zou doen:

pdf.cell(60, 10, 'Powered by FPDF.', new_x="LMARGIN", new_y="NEXT", align='C')

Let op!: het regeleinde kan ook met ln. Dit methode maakt het mogelijk om bovendien de hoogte van de pauze te specificeren.

Ten slotte wordt het document gesloten en opgeslagen onder het opgegeven bestandspad met behulp van output. Zonder dat er een parameter is opgegeven, wordt output() retourneert de PDF bytearray-buffer.

Tuto 2 - Koptekst, voettekst, pagina-einde en afbeelding

Hier is een voorbeeld van twee pagina's met koptekst, voettekst en logo:

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", style="B", size=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", style="I", size=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")

Resulting PDF

Dit voorbeeld maakt gebruik van de header en footer methoden om paginakop- en voetteksten te verwerken. Zij worden automatisch gebeld. Ze bestaan al in de FPDF-klasse, maar doen niets, daarom moeten we de klasse uitbreiden en overschrijven.

Het logo wordt afgedrukt met de methode image door op te geven de linkerbovenhoek en de breedte ervan. De hoogte wordt automatisch berekend respecteer de beeldverhoudingen.

Om het paginanummer af te drukken, wordt een nulwaarde doorgegeven als celbreedte. Het betekent dat de cel zich moet uitstrekken tot aan de rechtermarge van de pagina; het is handig om middelste tekst. Het huidige paginanummer wordt geretourneerd door de page_no methode; wat betreft het totale aantal pagina's wordt verkregen door middel van de speciale waarde {nb} die wordt vervangen bij het sluiten van het document (deze speciale waarde kan worden gewijzigd door alias_nb_pages()).

Let op het gebruik van de set_y methode waarmee positie op een absolute locatie op de pagina, beginnend vanaf de bovenkant of de onderkant.

Hier wordt een andere interessante functie gebruikt: het automatisch afbreken van pagina's. Zo snel omdat een cel een limiet op de pagina zou overschrijden (op 2 centimeter van de onderkant door standaard), wordt er een pauze uitgevoerd en wordt het lettertype hersteld. Hoewel de kop en voettekst hun eigen lettertype selecteren (helvetica), de hoofdtekst gaat verder met Times. Dit mechanisme van automatisch herstel is ook van toepassing op kleuren en lijndikte. Met de limiet waarmee pagina-einden worden geactiveerd, kan worden ingesteld set_auto_page_break.

Tuto 3 - Line breaks and colors

Laten we doorgaan met een voorbeeld waarin uitgevulde alinea's worden afgedrukt. Het ook illustreert het gebruik van kleuren.

from fpdf import FPDF


class PDF(FPDF):
    def header(self):
        # Setting font: helvetica bold 15
        self.set_font("helvetica", style="B", size=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", style="I", size=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", size=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")

Resulting PDF

Jules Verne text

Met de methode get_string_width kunt u bepalen de lengte van een string in het huidige lettertype, die hier wordt gebruikt om de positie en de breedte van het kader rond de titel. Vervolgens worden de kleuren ingesteld (via set_draw_color, set_fill_color en set_text_color) en de dikte van de lijn is ingesteld tot 1 mm (standaard tegen 0,2) met set_line_width. Ten slotte voeren we de cel uit (de laatste parameter op true geeft aan dat de achtergrond moet worden gevuld).

De methode die wordt gebruikt om de alinea's af te drukken is multi_cell. Tekst wordt standaard uitgevuld. Elke keer dat een regel het rechteruiteinde van de cel bereikt of een regelterugloopteken (\n) wordt tegengekomen, er wordt een regeleinde weergegeven en er wordt automatisch een nieuwe cel aangemaakt onder de huidige. Er wordt automatisch een pauze uitgevoerd op de locatie van de dichtstbijzijnde spatie of het zachte koppelteken (\u00ad) vóór de rechterlimiet. Een zacht afbreekstreepje wordt vervangen door een normaal afbreekstreepje bij het activeren van een regeleinde, en wordt anders genegeerd.

Er worden twee documenteigenschappen gedefinieerd: de titel (set_title) en de auteur (set_author). Eigenschappen kunnen op twee manieren worden bekeken. Ten eerste opent u het document rechtstreeks met Acrobat Reader, ga naar het menu Bestand en kies de optie Documenteigenschappen. De tweede, ook verkrijgbaar bij de plug-in, is door met de rechtermuisknop te klikken en Documenteigenschappen te selecteren.

Tuto 4 - Meerdere kolommen

Dit voorbeeld is een variant van het vorige en laat zien hoe u de tekst over meerdere kolommen kunt plaatsen.

from fpdf import FPDF


class PDF(FPDF):
    def header(self):
        self.set_font("helvetica", style="B", size=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", style="I", size=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", size=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")

Resulting PDF

Jules Verne text

Het belangrijkste verschil met de vorige tutorial is het gebruik van de text_columns methode. Het verzamelt alle tekst, mogelijk in stappen, en verdeelt deze over het gevraagde aantal kolommen, waarbij indien nodig automatisch pagina-einden worden ingevoegd. Houd er rekening mee dat, hoewel de instantie TextColumns actief is als contextmanager, tekststijlen en andere lettertype-eigenschappen kunnen worden gewijzigd. Deze wijzigingen zullen in de context worden opgenomen. Zodra het wordt gesloten, worden de vorige instellingen hersteld.

Tuto 5 - Tabellen maken

In deze tutorial wordt uitgelegd hoe u twee verschillende tabellen kunt maken, om te demonstreren wat met enkele eenvoudige aanpassingen kan worden bereikt.

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")

Resulting PDF - Countries CSV data

Het eerste voorbeeld wordt op de meest basale manier gerealiseerd, door gegevens toe te voeren FPDF.table(). Het resultaat is rudimentair, maar zeer snel te verkrijgen.

De tweede tabel brengt enkele verbeteringen met zich mee: kleuren, beperkte tafelbreedte, verminderde lijnhoogte, gecentreerde titels, kolommen met aangepaste breedtes, cijfers rechts uitgelijnd... Bovendien zijn horizontale lijnen verwijderd. Dit werd gedaan door een borders_layout te kiezen uit de beschikbare waarden: TableBordersLayout.

Tuto 6 - Koppelingen maken en tekststijlen mixen

In deze tutorial worden verschillende manieren uitgelegd om links in een pdf-document in te voegen, evenals het toevoegen van links naar externe bronnen.

Het laat ook verschillende manieren zien waarop we verschillende tekststijlen kunnen gebruiken, (vet, cursief, onderstreept) binnen dezelfde tekst.

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")

Resulting PDF - fpdf2-logo

De nieuwe methode die hier wordt getoond om tekst af te drukken is write() . Het lijkt erg op multi_cell() , de belangrijkste verschillen zijn:

  • Het einde van de regel bevindt zich aan de rechtermarge en de volgende regel begint aan de linkerkant marge.
  • De huidige positie wordt naar het einde van de tekst verplaatst.

Met deze methode kunnen we dus een stuk tekst schrijven, de lettertypestijl wijzigen, en ga verder vanaf de exacte plek waar we gebleven waren. Aan de andere kant is het belangrijkste nadeel dat we de tekst niet kunnen rechtvaardigen wij doen met de multi_cell() methode.

Op de eerste pagina van het voorbeeld gebruikten we write() Voor dit doeleinde. Het begin van de zin is in normale stijl geschreven tekst en gebruik vervolgens de set_font() methode schakelden we over op onderstrepen en maakten de zin af.

Om een interne link toe te voegen die naar de tweede pagina verwijst, hebben we de add_link() methode, die een klikbaar gebied creëert dat we "link" noemden en dat naar een andere pagina in het document verwijst.

Om de externe link te maken met behulp van een afbeelding, hebben we gebruikt image() . De methode heeft de mogelijkheid om een link als een van zijn argumenten door te geven. De link kan zowel intern als extern zijn.

Als alternatief is een andere optie om de lettertypestijl te wijzigen en links toe te voegen het gebruik van de methode write_html(). Het is een html-parser waarmee u tekst kunt toevoegen, de lettertypestijl kunt wijzigen en links kunt toevoegen met behulp van html.