Search code examples
pythonpositioningfpdf

Creating PDF with Python using FPDF char by char


I'm trying to create a pdf with python and I want to put a text in pdf char by char. I can't find out how to do it and when it saves output pdf all of the characters are on each other. this is my code snippet:

from fpdf import FPDF

pdf = FPDF('P', 'mm', (100,100))
# Add a page
pdf.add_page()

# set style and size of font
# that you want in the pdf
pdf.add_font('ariblk', '', "ArialBlack.ttf", uni=True)
pdf.set_font("ariblk",size = int(50*0.8))
text = [['a','b','c','d','e','w','q'],['f','g','h','i','j','k','l']]
print("creating pdf...")
line = 0
for w in range(0,len(text)):
    for h in range(0,len(text[w])):
        # create a cell
        r = int (50)
        g = int (100)
        b = int (10)
        pdf.set_text_color(r, g, b) 
        text_out = text[w][h]
        pdf.cell(0,line, txt = text_out, ln = 2)


# save the pdf with name .pdf
pdf.output(name = "img/output.pdf", dest='F')
print("pdf created!")

and this is what my code output is:

(this is copy-paste from the output pdf): iljfbeqaghdckw (this is a screenshot of the output): screenshot


Solution

  • I don't know fpdf module but I think that your problem only comes from the fact that you don't change the X, Y coordinates of printing of each character.

    You have to use 'pdf.set_xy()` to set the X and Y coordinates of each of your characters

    I made small changes to the font and colors for my tests.

    from fpdf import FPDF
    import random
    
    pdf = FPDF('P', 'mm', (100,100))
    # Add a page
    pdf.add_page()
    
    # set style and size of font
    # that you want in the pdf
    #pdf.add_font('ariblk', '', "ArialBlack.ttf", uni=True)
    pdf.set_font("Arial",size = int(24))
    text = [['a','b','c','d','e','w','q'],['f','g','h','i','j','k','l']]
    print("creating pdf...")
    line = 10
    for w in range(len(text)):
        for h in range(len(text[w])):
            # create a cell
            r = random.randint(1, 255)
            g = random.randint(1, 255)
            b = random.randint(1, 255)
            pdf.set_text_color(r, g, b) 
            text_out = text[w][h]
            pdf.set_xy(10*w, 10*h)
            pdf.cell(10, 10, txt=text_out, ln=0, align='C')
    
    # save the pdf with name .pdf
    pdf.output(name = "output.pdf", dest='F')
    print("pdf created!")
    

    Then, you have to adapt the offset of X and/or Y according to the display you want to obtain in print.

    Remark: As you don't change the values of r, g, b in your for loops, the best is to go up the assignment of variables r, g and b before the for loops

    Output in the PDF:

    a f
    b g
    c h
    d i
    e j
    w k
    q l