Мій код генерує PDF звіт з добре структурованим макетом, використовуючи дані та зображення. Він застосовує такі інструменти, як шаблони Jinja2 для рендерингу HTML, WeasyPrint для генерації PDF та Python для обробки даних і зображень.
Початкове зображення відрендереної карти + одна з перших версій звіту
Зміст
- Вступ
- Ключові характеристики
- Виклики
- Як це зроблено
- ІНСТРУМЕНТИ
Перехід від традиційних інструментів, таких як MS Word, до автоматизованих рішень — це великий крок для мене. Для звіту Maritime Per Week я вирішив використовувати навички програмування для автоматизації генерації PDF. Це забезпечує постійну якість, масштабованість та професіоналізм.
Ключові характеристики та інновації
- Автоматизація PDF: Мій код генерує добре структурований PDF звіт з динамічними даними та зображеннями. Він використовує:
- Jinja2: Динамічно заповнює заповнювачі в HTML-шаблоні за допомогою актуальних даних.
- WeasyPrint: Перетворює стилізований HTML-шаблон у привабливі PDF-файли.
- Base64 Encoding: Вбудовує зображення безпосередньо в HTML для зручної інтеграції.
2. Інтеграція машинного навчання: Прогнозні моделі аналізують тенденції та прогнозують рентабельність маршрутів танкерів, наприклад, оцінюючи зміни TCE (Time Charter Equivalent) на основі історичних даних та ринкової динаміки. Це дає змогу зацікавленим сторонам приймати обґрунтовані рішення.
Додаткові аспекти проекту:
Проект також включає передові функції, які будуть розширені в окремій ініціативі, включаючи:
- Аналіз настроїв для новин морської галузі: Використання інструментів, таких як NLTK та VADER для аналізу настроїв ринку на основі новин з глобальних тем судноплавства та торгівлі.
- Інтеграція даних: Завантаження та зберігання макроекономічних даних (наприклад, ціни на нафту, рівень інфляції) та тарифів на вантажоперевезення з API, таких як Alpha Vantage та Baltic Exchange.
- Реальні потоки даних: Автоматизація оновлень за допомогою API та інструментів планування для забезпечення регулярних та своєчасних даних.
Ітерації різних версій стилізації.
Виклики та рішення
Перша ітерація була найбільш складною. Інтеграція даних Baltic в чистий автоматизований процес вимагала створення багаторазових шаблонів, обробки різних форматів даних і забезпечення того, щоб макет PDF відповідав професійним стандартам. Записування процесу допомогло мені зберігати фокус і подолати складність, розбиваючи її на керовані етапи.
html інструкція для додавання кольору до стрілок, що показують зміни в таблицях
Інструменти та технології
- WeasyPrint: Перетворює HTML і CSS в PDF. Він використовується для програмного створення візуально привабливих документів.
HTML (string-rendered_html).write_pdf(output_pdf_path)
Це перетворює відрендерений HTML в PDF.
- Jinja2: Двигун шаблонів для Python, який використовується для динамічного генерування HTML з заповнювачами та логікою.
Заповнює заповнювачі в HTML-шаблоні фактичними даними.
Template(compact_table_template).render(...)
- Base64: Кодує бінарні дані (наприклад, зображення) в текст, що дозволяє зручно включати зображення безпосередньо в HTML як рядки.
Перетворює зображення в рядок Base64:
base64.b64encode(image_file.read()).decode('utf-8')
- os: Надає функції для взаємодії з файловою системою, наприклад, для побудови абсолютних шляхів до файлів.
Конструює шляхи, що працюють на різних операційних системах
os.path.join(base_dir, "images/...")
Покроково
- Обробка зображень: Зображення, такі як карти маршрутів та діаграми, перетворюються на рядки Base64 для вбудовування безпосередньо в HTML.
def encode_base64(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
2. HTML Шаблон: Визначає макет та стилі для PDF.
- Динамічні заповнювачі, такі як {{ title }}, {{ mapimage }}_ та {{ highestchanges }}_ замінюються даними за допомогою движка шаблонів Jinja2
- CSS Стилі — Визначають вигляд тексту, таблиць та зображень (поля, шрифти, кольори).
2. Обробка даних
- Дані маршруту: Містить деталі маршруту доставки, включаючи описи, значення Worldscale, ставки TCE та зміни
full_routes = [
{"Route": "TD27", "Description": "130k Guyana to ARA", "Worldscale": 71.11, "TCE": 23150, "Change (TCE)": 2138},
Графіки та діаграми вбудовуються за допомогою абсолютних шляхів для забезпечення портативності.
- Оновлення даних звіту: Усі динамічні дані організовуються в словнику.
updated_report_data_with_all_routes = {
"title": "Maritime Per Week",
"date": "13 січня 2025",
"highest_changes": ...,
"remaining_routes": ...,
"refinery_images": [...],
"market_images": [...],
}
- Рендеринг HTML
- Рендеринг шаблону:
- compacttemplate_: HTML структура (шаблон)
- .render(…): Заповнює заповнювачі значеннями з updatedreport_
template = Template(compact_template)
rendered_html= template.render(**updated_data_with_routes)
- Генерація PDF
- WeasyPrint: — Перетворює відрендерений HTML (з стилями та даними) в PDF.
- Outputpath_ : Шлях до збереження згенерованого PDF.
HTML(string=rendered_html).write_pdf(output_path)
Автоматизація виробництва Maritime Per Week перетворила процес, який раніше був вручну, в масштабовану, професійну робочу процедуру. В подальшому я планую вдосконалити автоматизацію та поглибити використання оновлень у реальному часі через API для ще більшої ефективності.
Перекладено з: Maritime Per Week