How to make inline bold text using PyFPDF?

Question:

from fpdf import FPDF

pdf1 = FPDF

pdf1.multi_cell(0, 5, 'This is my disclaimer. THESE WORDS NEED TO BE BOLD. These words do not need to be bold.', 0, 0, 'L')

pdf1.output("sample.pdf")
Asked By: vivek

||

Answers:

I use fpdf for php and had the same need.
But as Olivier mentioned in the comments it is not possible. So I wrote a quick workaround, I have written a rough python implementation below.
Probably not the most beautiful solution but it might serve you.

from fpdf import FPDF

class FPDF_bold_multicell(FPDF):

    def write_multicell_with_styles(self,max_width, cell_height, text_list):
        startx = self.get_x()
        self.set_font('Arial', '', 16)

        #loop through differenct sections in different styles
        for text_part in text_list:
            #check and set style
            try:
                current_style = text_part['style']
                self.set_font('Arial', current_style, 16)
            except KeyError:
                self.set_font('Arial', '', 16)

            #loop through words and write them down
            space_width = self.get_string_width(' ')
            for word in text_part['text'].split(' '):
                current_pos = self.get_x()
                word_width = self.get_string_width(word)
                #check for newline
                if (current_pos + word_width) > (startx + max_width):
                    #return 
                    self.set_y(self.get_y() + cell_height)
                    self.set_x(startx)
                pdf1.cell(word_width, 5, word)
                #add a space
                self.set_x(self.get_x() + space_width)



pdf1 = FPDF_bold_multicell()
pdf1.add_page()

text_list = [{'text':'This is my disclaimer.'},
            {'style':'B','text':'THESE WORDS NEED TO BE BOLD.'},
            {'text':'These words do not need to be bold.'},]

pdf1.write_multicell_with_styles(50, 5, text_list)
pdf1.output("sample.pdf")
Answered By: Sebastian

I’ve tried this solution and it is helpfull. I added a new command after the comment #check for newline.

#check for newline
if max_width == 0:
    max_width = self.w - self.r_margin - self.x

So, this command will verify the width and if was 0 will use the all line.

from fpdf import FPDF

class FPDF_bold_multicell(FPDF):

def write_multicell_with_styles(self,max_width, cell_height, text_list):
    startx = self.get_x()
    self.set_font('Arial', '', 16)

    #loop through differenct sections in different styles
    for text_part in text_list:
        #check and set style
        try:
            current_style = text_part['style']
            self.set_font('Arial', current_style, 16)
        except KeyError:
            self.set_font('Arial', '', 16)

        #loop through words and write them down
        space_width = self.get_string_width(' ')
        for word in text_part['text'].split(' '):
            current_pos = self.get_x()
            word_width = self.get_string_width(word)
            #check for newline
            if max_width == 0:
                max_width = self.w - self.r_margin - self.x
            if (current_pos + word_width) > (startx + max_width):
                #return 
                self.set_y(self.get_y() + cell_height)
                self.set_x(startx)
            pdf1.cell(word_width, 5, word)
            #add a space
            self.set_x(self.get_x() + space_width)


pdf1 = FPDF_bold_multicell()
pdf1.add_page()

text_list = [{'text':'This is my disclaimer.'},
        {'style':'B','text':'THESE WORDS NEED TO BE BOLD.'},
        {'text':'These words do not need to be bold.'},]

pdf1.write_multicell_with_styles(0, 5, text_list)
pdf1.output("sample.pdf")
Answered By: Bruno O. Cardoso
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.