Я использую 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
Как заставить Weasyprint генерировать одностраничный PDF с динамической высотой для большого содержания ⇐ Html
Программисты Html
1748614001
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 мм, без каких -либо разрывов страниц.
Подробнее здесь: [url]https://stackoverflow.com/questions/79645598/how-to-force-weasyprint-to-generate-a-single-page-pdf-with-dynamic-height-for-la[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия