سؤال

I'm writing a little program to produce a bunch of BINGO cards.

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import landscape, letter
from reportlab.lib.units import inch
import random


def set_ranges():
    r = {
        "b": [1, 15, 0],
        "i": [16, 30, 0],
        "n": [31, 45, 0],
        "g": [46, 60, 0],
        "o": [61, 75, 0]
    }
    return r

def set_canvas():
    c = canvas.Canvas("bingo.pdf")
    c.setPageRotation(90)
    c.setFont('Helvetica-Bold', 14)
    print type(c)
    return c

def print_card(ranges, canvas):
    # Set a page gutter
    gutter = 1 * inch
    x = gutter
    y = 8.5 * inch - 2 * gutter
    # First draw the letters themselves
    for letter in "bingo":
        canvas.drawString(x, y, letter)
        # Print X and Y to troubleshoot
        # print('%s, %d, %d' % (letter, x, y))
        # Add the X value for each letter to the dictionary
        ranges[letter][2] = x
        x = x + 1 * inch
    y_reset = y - 1 * inch
    # Then pull the numbers for each square
    for letter in "bingo":
        row = random.sample(range(ranges[letter][0], ranges[letter][1] + 1), 5)
        if letter == "n":
            row[2] = "FREE"            
        x = ranges[letter][2]
        y = y_reset
        for col in row:
            # Print X and Y to troubleshoot
            # print('%d, %d, %d' % (col, x, y))
            canvas.drawString(x, y, str(col))
            y = y - 1 * inch
    canvas.save()

I still have some work to do ("FREE" should be centered! and I need to draw lines) but this basically works. I do r = set_ranges() and c = set_canvas() and then for i in range (1,25): print_card(r,c) to create a PDF full of basic cards.

But after the first page, the font ceases to be bold. Where would it be getting reset?

هل كانت مفيدة؟

المحلول

What version of ReportLab are you using? Version 1.1.0 (2012-12-18) has a bug that resets fonts before rendering sometimes...

نصائح أخرى

From the reportlab reference:

def save(self): Saves and close the PDF document in the file. If there is current data a ShowPage is executed automatically. After this operation the canvas must not be used further.

So it's weird that your code works. You could just generate all tables and then call canvas.save() afterwards.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top