生成充满用户/通行证的盒子页面的代码未包装并且变得太高

问题描述 投票:0回答:1

我想更改此代码,使其尽可能地将表格包裹在每一页中,以避免打印出太多纸张。 例如,生成 256 个用户需要我打印 14 页,随着时间的推移会浪费太多纸张

PS:欢迎您更改表格样式

以下是代码:

import random
import string
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, Spacer
from reportlab.lib import colors
from reportlab.platypus import TableStyle
from reportlab.lib.units import inch
from reportlab.lib.pagesizes import portrait, A4

# Function to generate random passwords based on the selected format
def generate_password(format):
    if format == '1':
        return username
    elif format == '2':
        return ''.join(random.choice(characters) for _ in range(3))
    elif format == '3':
        return ''.join(random.choice(characters) for _ in range(4))
    elif format == '4':
        return ''.join(random.choice(characters) for _ in range(5))
    else:
        return ''

print(
    """
=====================================
HOTSPOT TICKET GENERATOR FOR MIKROTIK
=====================================
BY ALI

"""
)

print("Enter the number of users: ")
numOfUsers = int(input())

print("Enter the rate limit [Up/Down] (ex: 1M/2M):")
rateLimit = input(str())

print("Enter username format (ex: user_, user-..): ")
usernameFormat = input(str())

print("Enter password format (1 for pass=user, 2 for 3-chars, 3 for 4-chars, 4 for 5-chars): ")
passwordFormat = input()

print("Enter limit uptime (ex: 1d, 1h, 1m): ")
limitUpTime = input(str())

print("Enter limit bytes total (ex: 1K, 1M, 1G): ")
limitBytesTotal = input(str())

characters = string.ascii_letters + string.digits

# Create a list to store usernames and passwords
usernames_passwords = []

# Generate usernames and passwords
for i in range(1, numOfUsers + 1):
    username = usernameFormat + str(i)
    password = generate_password(passwordFormat)
    usernames_passwords.append((username, password))

# Create a PDF document
doc = SimpleDocTemplate("usernames_and_passwords.pdf", pagesize=portrait(A4))

# Create a list to store content
story = []

# Create a table for displaying usernames and passwords
table_data = []

for username, password in usernames_passwords:
    table_data.append([f"Username: {username}", f"Password: {password}"])
    table_data.append([Spacer(1, 10)])  # Add 10-pixel space between rows

# Define table style
table_style = TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), colors.beige),  # Header row background color
    ('TEXTCOLOR', (0, 0), (-1, 0), colors.black),  # Header text color
    ('ALIGN', (0, 0), (-1, -1), 'CENTER'),  # Center text horizontally
    ('FONTNAME', (0, 0), (-1, 0), 'Helvetica'),  # Header font
    ('BACKGROUND', (0, 1), (-1, -1), colors.beige),  # Data rows background color
    ('LEFTPADDING', (0,0), (-1,-1), 0),
    ('GRID', (0, 0), (-1, -1), 1, colors.black)  # Border for data rows
])

# Create a table and apply the style
table = Table(table_data)
table.setStyle(table_style)

# Add the table to the story
story.append(table)

# Build the PDF document
doc.build(story)

print("PDF generated successfully.")

这就是我得到的(更多说明):

...

这就是我希望它看起来像的样子,如果你明白的话,在每一页中容纳尽可能多的内容,这样我就可以比平时打印更少的页数 (PS:不需要显示“无会员”和编号“1、2、3...”,只需每个用户并传递一个带有少量空白/填充的框,以便我可以剪切它们稍后出来。)

...

python reportlab
1个回答
0
投票

这就是你想要的。您可以考虑将输入数据作为命令行参数而不是输入传递。这使得连续运行多个变得更加容易。

而且,

input(str())
也不是你想要的。
input
的参数是使用提示。

import random
import string
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from reportlab.lib import colors
from reportlab.lib.units import inch
from reportlab.lib.pagesizes import portrait, A4

# Function to generate random passwords based on the selected format
def generate_password(format):
    if format == '1':
        return username
    else:
        return ''.join(random.choice(characters) for _ in range(int(format)+1))

print( """
=====================================
HOTSPOT TICKET GENERATOR FOR MIKROTIK
=====================================
BY ALI

"""
)

#numOfUsers = int(input("Enter the number of users: "))
#
#rateLimit = input("Enter the rate limit [Up/Down] (ex: 1M/2M): ")
#
#usernameFormat = input("Enter username format (ex: user_, user-..): ")
#
#passwordFormat = input("Enter password format (1 for pass=user, 2 for 3-chars, 3 for 4-chars, 4 for 5-chars): ")
#
#limitUpTime = input("Enter limit uptime (ex: 1d, 1h, 1m): ")
#
#limitBytesTotal = input("Enter limit bytes total (ex: 1K, 1M, 1G): ")


numOfUsers = 45
usernameFormat = 'user'
passwordFormat = '4'

# A box is 1.5" by 5/8".
# We have 1/2" margin on all sides, leaving 4 boxes across.

PAGE = portrait(A4)
MARGIN = 36
BOXW = 1.5 * inch
BOXH = 5 * inch / 8
ACROSS = (PAGE[0] - 2*MARGIN) // BOXW
DOWN = (PAGE[1] - 2*MARGIN) // BOXH

def createLabel( doc, x, y, ord, user, password ):
   doc.setStrokeColor( (0,0,0) )
   doc.rect( x, y-BOXH, BOXW, BOXH )
   doc.line( x, y-12, x+BOXW, y-12 )
   doc.setFillColor( (0,0,0) )
   doc.drawString( x+3, y-9, "member-free" )
   doc.drawRightString( x+BOXW-3, y-9, str(ord) )
   doc.drawString( x+3, y-24, "Username:" )
   doc.drawString( x+3, y-36, "Password:" )
   doc.setFillColor( colors.purple )
   doc.drawString( x+69, y-24, user )
   doc.drawString( x+69, y-36, password )

def coords(n):
   x = MARGIN + (BOXW+3)*(n % ACROSS)
   y = PAGE[1] - MARGIN - (BOXH+3)*((n // ACROSS) % DOWN)
   return x,y

characters = string.ascii_letters + string.digits

# Create a PDF document
doc = canvas.Canvas("usernames_and_passwords.pdf", pagesize=PAGE)
doc.setLineWidth( 0.5 )
doc.setFont( 'Helvetica', 9 )

# Generate usernames and passwords
for i in range(numOfUsers):
    # Have we started a new page?
    if i and not i % (ACROSS*DOWN):
        doc.savePage()
    username = usernameFormat + str(i+1)
    password = generate_password(passwordFormat)
    x,y = coords(i)
    createLabel( doc, x, y, i+1, username, password )


doc.save()

print("PDF generated successfully.")

输出:

© www.soinside.com 2019 - 2024. All rights reserved.