Search code examples
pythonfpdfpyfpdf

How to make inline bold text using PyFPDF?


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

Solution

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