Как заставить Weasyprint генерировать одностраничный PDF с динамической высотой для большого содержанияHtml

Программисты Html
Ответить Пред. темаСлед. тема
Anonymous
 Как заставить Weasyprint генерировать одностраничный PDF с динамической высотой для большого содержания

Сообщение Anonymous »

Я использую Weasyprint с Fastapi и Jinja2, чтобы генерировать резюме PDF из структуры данных JSON. Резюме отображается как HTML с использованием шаблона Jinja2 и преобразуется в PDF с Weasyprint. Моя цель - убедиться, что PDF всегда представляет собой одну страницу с шириной A4 (210 мм) и динамической высотой, которая приспособлена к содержанию, даже если содержание большое. Однако, когда содержание обширно (например, многие записи испытывают или длинные описания), PDF разбивается на две страницы, которых я хочу избежать.



{{ resume.basicDetails.name }} - {{ resume.basicDetails.position }}
[*]

@page {
size: 210mm auto;
margin: 5mm;
padding: 0;
}
html, body {
margin: 0;
padding: 0;
font-family: 'Source Sans Pro', sans-serif;
line-height: 1.4;
color: #333;
width: 210mm;
height: auto;
page-break-inside: avoid;
}
.container {
width: 100%;
max-width: 210mm;
height: auto;
padding: 10mm;
page-break-inside: avoid;
}
.section, .entry, .header, .achievements, .skills {
page-break-inside: avoid;
}
/* Additional styles for sections, entries, etc. */





{{ resume.basicDetails.name|upper }}
{{ resume.basicDetails.position }}






< /code>
код Python (Generate_Resume_from_json) < /p>
from weasyprint import HTML, CSS
from fastapi.templating import Jinja2Templates
import os
import uuid

async def generate_resume_from_json(resume_data):
templates = Jinja2Templates(directory="templates")
PDF_DIR = "generated_pdfs"
os.makedirs(PDF_DIR, exist_ok=True)
filename = f"resume_{uuid.uuid4().hex}.pdf"
pdf_path = os.path.join(PDF_DIR, filename)

# Format resume_data into structured format
formatted_data = {
"basicDetails": { /* Name, position, email, etc. */ },
"summary": resume_data.get("Professional Summary", "")[:150],
"experience": [ /* Limited to 2 entries with 2 bullets each */ ],
"education": [ /* Limited to 1 entry */ ],
"skills": resume_data.get("Skills", [])[:8],
"certifications": [ /* Limited to 2 entries */ ],
"projects": [ /* Limited to 1 entry */ ]
}

html_content = templates.get_template("resume/resume.html").render(resume=formatted_data)

try:
HTML(string=html_content, base_url=os.path.dirname(os.path.abspath(__file__))).write_pdf(
pdf_path,
stylesheets=[CSS(string='''
@page {
size: 210mm auto;
margin: 5mm;
padding: 0;
}
@media print {
html, body {
width: 210mm;
height: auto !important;
margin: 0;
padding: 0;
page-break-inside: avoid;
font-size: 12px;
}
.container, .section, .entry, .header, .achievements, .skills {
page-break-inside: avoid;
}
.section { margin-bottom: 5mm; }
.entry { margin-bottom: 3mm; }
}
''')]
)
return {"filename": filename, "pdf_path": pdf_path}
except Exception as e:
print(f"Error: {str(e)}")
return None
< /code>
Проблема
Несмотря на использование размера: 210 мм Auto в @page и страницах-нарушении: избегайте HTML, тела и основных контейнеров, PDF распадается на две страницы, когда содержание большое (например, несколько записей опыта с длинными описаниями). Мне нужна одностраничная PDF с динамической высотой, которая растут, чтобы соответствовать всем контенту, даже если он превышает стандартную высоту A4 (297 мм). < /P>
то, что я попробовал < /p>

set size: 210 мм Auto в шаблоне и Weasyprint css, чтобы позволить динамическую высоту. Пейдж-разрыв в внутренней стороне: избегайте и нарушайте внутреннюю часть: избегайте HTML, тела и всех основных контейнеров.
[*] Уменьшенные размеры шрифтов (например, 12px) и поля (например, 5 мм), чтобы сделать контент более компактным.
Созданная высота: Auto! /> Однако PDF все еще разбивается на две страницы для большого содержания. Я подозреваю, что Weasyprint не выполняет высоту A4 (297 мм) для страниц, игнорируя автоматическую высоту. < /P>
Вопросы < /p>

Как я могу заставить Weasyprint генерировать одностраничный PDF с динамической высотой? Параметры Weasyprint, чтобы полностью предотвратить разрывы страниц? Установите весь контент, даже если он длиннее 297 мм, без каких -либо разрывов страниц.

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

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

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

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

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

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

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