ListFlowable() приводит к прекращению рисования PDF-файла с использованием ReportLab в DjangoPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 ListFlowable() приводит к прекращению рисования PDF-файла с использованием ReportLab в Django

Сообщение Anonymous »

Я создаю проект Django, в котором могу хранить рецепты. Каждый рецепт можно экспортировать в PDF-файл. При создании файла PDF я добавляю каждый абзац с помощью Paragraph() в PDF, за исключением части ингредиентов, которая должна представлять собой список с помощью ListFlowable() .
Если я добавляю ListFlowable() в список истории, экспортированный PDF-файл перестает рисоваться в момент его вызова, и в файл не добавляются никакие дополнительные абзацы (включая ListFlowable ()). Тем не менее, если я исключим ListFlowable() из истории, каждый абзац будет отображаться в PDF-файле. Кто-нибудь знает, что вызывает это?
generate_report.py:

Код: Выделить всё

from io import BytesIO
from reportlab.pdfgen import canvas
from reportlab.platypus import Paragraph, Frame, ListFlowable, ListItem
from reportlab.lib.styles import ParagraphStyle

from reportlab.lib.units import mm
from reportlab.lib.pagesizes import A4

from .models import RecipeIngredients
from django.shortcuts import get_object_or_404

LEFT_MARGIN = 10*mm
RIGHT_MARGIN = 10*mm
TOP_MARGIN = 20*mm
BOTTOM_MARGIN = 20*mm

PAGE_WIDTH, PAGE_HEIGHT = A4
TEXT_WIDTH = PAGE_WIDTH - LEFT_MARGIN - RIGHT_MARGIN
TEXT_HEIGHT = PAGE_HEIGHT - TOP_MARGIN - BOTTOM_MARGIN

HEADING_1 = ParagraphStyle('Heading1',
fontName="Helvetica",
fontSize=16,
alignment=0,
spaceAfter=30)

HEADING_2 = ParagraphStyle('Heading2',
fontName="Helvetica",
fontSize=12,
alignment=0,
spaceAfter=20)

NORMAL = ParagraphStyle('Normal',
fontName="Helvetica",
fontSize=11,
alignment=0,
spaceAfter=10)

def generate_pdf_recipe(recipe_slug):

buffer = BytesIO()
p = canvas.Canvas(buffer, pagesize=A4)

# Variables

recipe = get_object_or_404(Recipes, slug=recipe_slug)
ingredients = RecipeIngredients.objects.filter(recipe = recipe.pk)

story = []

recipe_title = f"{recipe.name}"
top_of_text = TEXT_HEIGHT + BOTTOM_MARGIN

# Create a PDF document

story.append(Paragraph(
recipe_title,
HEADING_1
))

story.append(Paragraph(
f'FOO:',
HEADING_2
))

story.append(
ListFlowable(
[
ListItem(
Paragraph(
x.ingredient.name,
NORMAL
),
leftIndent=35,
bulletColor='black',
value='circle'
)
for x in ingredients
],
bulletType='bullet'
))

story.append(Paragraph(
f'BAR:',
HEADING_2
))

frame = Frame(
LEFT_MARGIN,
top_of_text - 0.2*TEXT_HEIGHT,
TEXT_WIDTH, 0.2*TEXT_HEIGHT,
showBoundary=True)

frame.addFromList(story, p)

p.showPage()
p.save()

buffer.seek(0)
return buffer
в view.py:

Код: Выделить всё

def generate_pdf(request, recipe_slug):
recipe = get_object_or_404(Recipes, slug=recipe_slug)

recipe_name = f'{recipe.name}'

response = FileResponse(generate_pdf_recipe(recipe_slug),
as_attachment=True,
filename=f'FOO_{recipe_name}.pdf')
return response
в models.py:

Код: Выделить всё

class Recipes(models.Model):
name = models.CharField(
max_length=64,
unique=True
)
slug = models.SlugField(
default="",
null=False
)

class Ingredients(models.Model):
name = models.CharField(
max_length=64,
unique=True
)

class RecipeIngredients(models.Model):
recipe = models.ForeignKey(
Recipes,
on_delete=models.CASCADE,
related_name="recipe_ingredients_recipe"
)
ingredient = models.ForeignKey(
Ingredients,
on_delete=models.CASCADE,
related_name="recipe_ingredients_ingredient"
)
в urls.py

Код: Выделить всё

recipes_edit_patterns = [
path('generate-pdf/',
views.generate_pdf,
name='generate_pdf'
),
]
Я пытался обернуть ListFlowable() в список, а также пытался добавить его как переменную перед вызовом метода.

Подробнее здесь: https://stackoverflow.com/questions/790 ... -in-django
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»