Jak generować oferty PDF automatycznie (Power Automate + Azure)
Praktyczny przewodnik po automatyzacji generowania ofert PDF za pomocą Power Automate i Azure. Zautomatyzuj proces tworzenia ofert i oszczędzaj czas zespołu sprzedażowego.
Jak generować oferty PDF automatycznie (Power Automate + Azure)
Generowanie ofert PDF to czasochłonny proces, który często zajmuje handlowcom 2-4 godziny na jedną ofertę. Dzięki automatyzacji z Power Automate i Azure możesz zredukować ten czas do kilku minut, a nawet całkowicie zautomatyzować proces. W tym przewodniku pokażemy, jak krok po kroku zbudować system automatycznego generowania ofert PDF.
Dlaczego automatyzować generowanie ofert PDF?
Korzyści biznesowe
- Oszczędność czasu: Redukcja czasu z 2-4 godzin do 5-10 minut
- Spójność: Wszystkie oferty mają jednolity wygląd i strukturę
- Mniej błędów: Automatyzacja eliminuje błędy ręcznego wprowadzania danych
- Szybsza odpowiedź: Oferty mogą być wysyłane natychmiast po utworzeniu deala w CRM
- Skalowalność: System może obsłużyć setki ofert dziennie
ROI automatyzacji
Z naszych wdrożeń wynika, że automatyzacja generowania ofert PDF:
- Oszczędza 15-20 godzin tygodniowo na zespół sprzedażowy
- Zwiększa szybkość odpowiedzi o 80%
- Redukuje błędy w ofertach o 90%
- ROI w ciągu 2-3 miesięcy
Architektura rozwiązania
Komponenty systemu
- Bitrix24 - CRM, źródło danych o kliencie i dealu
- Power Automate - orkiestracja procesu
- Azure Functions - generowanie PDF
- Azure Blob Storage - przechowywanie wygenerowanych PDF
- Power Automate Connector - wysyłka e-mail z PDF
Flow procesu
Deal utworzony w Bitrix24
↓
Power Automate trigger
↓
Pobierz dane klienta i dealu z Bitrix24
↓
Wywołaj Azure Function (generowanie PDF)
↓
Zapisz PDF w Azure Blob Storage
↓
Wyślij e-mail z PDF do klienta
↓
Zaktualizuj deal w Bitrix24 (dodaj link do PDF)
Krok 1: Przygotowanie szablonu PDF
Opcja 1: HTML Template
Utwórz szablon HTML z placeholderami:
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
.header { background: #0066cc; color: white; padding: 20px; }
.content { padding: 20px; }
.footer { background: #f0f0f0; padding: 10px; text-align: center; }
</style>
</head>
<body>
<div class="header">
<h1>Oferta dla {{client_name}}</h1>
<p>Data: {{offer_date}}</p>
</div>
<div class="content">
<h2>Szczegóły oferty</h2>
<p><strong>Produkt:</strong> {{product_name}}</p>
<p><strong>Cena:</strong> {{price}} PLN</p>
<p><strong>Opis:</strong> {{description}}</p>
<h2>Warunki</h2>
<ul>
{{#conditions}}
<li>{{.}}</li>
{{/conditions}}
</ul>
</div>
<div class="footer">
<p>{{company_name}} | {{company_address}}</p>
</div>
</body>
</html>
Opcja 2: Word Template
Utwórz szablon Word (.docx) z placeholderami i użyj biblioteki do konwersji Word → PDF.
Krok 2: Utworzenie Azure Function
2.1. Utwórz Azure Function App
- Przejdź do Azure Portal
- Utwórz nową Function App
- Wybierz runtime: Node.js lub Python
- Wybierz plan: Consumption (pay-as-you-go)
2.2. Implementacja funkcji (Node.js)
const puppeteer = require('puppeteer');
const Handlebars = require('handlebars');
const { BlobServiceClient } = require('@azure/storage-blob');
module.exports = async function (context, req) {
const { template, data } = req.body;
// Renderuj HTML z danymi
const templateCompiled = Handlebars.compile(template);
const html = templateCompiled(data);
// Generuj PDF z Puppeteer
const browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
const page = await browser.newPage();
await page.setContent(html, { waitUntil: 'networkidle0' });
const pdfBuffer = await page.pdf({
format: 'A4',
printBackground: true,
margin: { top: '20mm', right: '20mm', bottom: '20mm', left: '20mm' }
});
await browser.close();
// Zapisz PDF w Azure Blob Storage
const blobServiceClient = BlobServiceClient.fromConnectionString(process.env.AZURE_STORAGE_CONNECTION_STRING);
const containerClient = blobServiceClient.getContainerClient('offers');
const blobName = `offer-${data.deal_id}-${Date.now()}.pdf`;
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
await blockBlobClient.upload(pdfBuffer, pdfBuffer.length, {
blobHTTPHeaders: { blobContentType: 'application/pdf' }
});
const pdfUrl = blockBlobClient.url;
context.res = {
status: 200,
body: {
pdf_url: pdfUrl,
blob_name: blobName
}
};
};
2.3. Implementacja funkcji (Python)
import azure.functions as func
import pdfkit
from azure.storage.blob import BlobServiceClient
import os
from jinja2 import Template
def main(req: func.HttpRequest) -> func.HttpResponse:
req_body = req.get_json()
template = req_body.get('template')
data = req_body.get('data')
# Renderuj HTML z danymi
jinja_template = Template(template)
html = jinja_template.render(**data)
# Generuj PDF
pdf_buffer = pdfkit.from_string(html, False, options={
'page-size': 'A4',
'margin-top': '20mm',
'margin-right': '20mm',
'margin-bottom': '20mm',
'margin-left': '20mm'
})
# Zapisz PDF w Azure Blob Storage
blob_service_client = BlobServiceClient.from_connection_string(
os.environ['AZURE_STORAGE_CONNECTION_STRING']
)
container_client = blob_service_client.get_container_client('offers')
blob_name = f"offer-{data['deal_id']}-{int(time.time())}.pdf"
blob_client = container_client.upload_blob(
name=blob_name,
data=pdf_buffer,
content_settings={'content_type': 'application/pdf'}
)
pdf_url = blob_client.url
return func.HttpResponse(
json.dumps({'pdf_url': pdf_url, 'blob_name': blob_name}),
status_code=200,
mimetype='application/json'
)
Krok 3: Konfiguracja Power Automate
3.1. Utwórz nowy flow
- Przejdź do Power Automate
- Utwórz nowy Automated cloud flow
- Wybierz trigger: When a deal is created (Bitrix24)
3.2. Pobierz dane z Bitrix24
Dodaj akcję Get deal (Bitrix24):
- Deal ID:
triggerOutputs()?['body/deal_id']
Dodaj akcję Get contact (Bitrix24):
- Contact ID:
outputs('Get_deal')?['body/contact_id']
3.3. Przygotuj dane dla szablonu
Dodaj akcję Compose z danymi:
{
"client_name": "@{outputs('Get_contact')?['body/name']}",
"offer_date": "@{formatDateTime(utcNow(), 'yyyy-MM-dd')}",
"product_name": "@{outputs('Get_deal')?['body/title']}",
"price": "@{outputs('Get_deal')?['body/opportunity']}",
"description": "@{outputs('Get_deal')?['body/description']}",
"deal_id": "@{outputs('Get_deal')?['body/id']}",
"conditions": [
"Ważność oferty: 30 dni",
"Płatność: przelew 14 dni",
"Gwarancja: 12 miesięcy"
]
}
3.4. Wywołaj Azure Function
Dodaj akcję HTTP Request:
- Method: POST
- URI:
https://your-function-app.azurewebsites.net/api/GeneratePDF - Headers:
Content-Type: application/json
- Body:
{
"template": "<HTML_TEMPLATE>",
"data": "@{outputs('Compose')}"
}
3.5. Wyślij e-mail z PDF
Dodaj akcję Send an email (V2):
- To:
@{outputs('Get_contact')?['body/email']} - Subject:
Oferta dla @{outputs('Get_contact')?['body/name']} - Body:
Dzień dobry, załączamy ofertę. - Attachments:
- Name:
offer.pdf - Content:
@{body('HTTP_Request')?['pdf_url']}
- Name:
3.6. Zaktualizuj deal w Bitrix24
Dodaj akcję Update deal (Bitrix24):
- Deal ID:
@{outputs('Get_deal')?['body/id']} - Comments:
Oferta PDF wygenerowana automatycznie: @{body('HTTP_Request')?['pdf_url']}
Krok 4: Zaawansowane funkcje
4.1. Personalizacja szablonu
Możesz użyć różnych szablonów w zależności od typu deala:
// W Power Automate - Compose
{
"template_type": "@{if(greater(outputs('Get_deal')?['body/opportunity'], 10000), 'premium', 'standard')}"
}
4.2. Podpisy cyfrowe
Możesz dodać podpis cyfrowy do PDF używając biblioteki PDF-lib:
const { PDFDocument } = require('pdf-lib');
const fs = require('fs');
// Załaduj PDF
const pdfDoc = await PDFDocument.load(pdfBuffer);
// Dodaj podpis
const signature = await pdfDoc.embedPng(fs.readFileSync('signature.png'));
const pages = pdfDoc.getPages();
pages[0].drawImage(signature, {
x: 100,
y: 100,
width: 100,
height: 50
});
// Zapisz
const signedPdf = await pdfDoc.save();
4.3. Wiele języków
Możesz generować oferty w różnych językach:
const language = data.language || 'pl';
const template = language === 'en' ? templateEN : templatePL;
Koszty rozwiązania
Azure Functions
- Consumption Plan: $0.000016/GB-s + $0.000001/execution
- Szacunkowo: $5-15/miesiąc dla 100-200 ofert
Azure Blob Storage
- Hot Tier: $0.0184/GB/miesiąc
- Szacunkowo: $1-3/miesiąc dla 100-200 PDF (każdy ~500KB)
Power Automate
- Per-user plan: $15/user/miesiąc
- Pay-as-you-go: $0.0006/execution
- Szacunkowo: $10-20/miesiąc
Łącznie: $16-38/miesiąc dla małej firmy (100-200 ofert)
Najlepsze praktyki
1. Cache'owanie szablonów
Przechowuj szablony w Azure Blob Storage i cache'uj je w pamięci, aby uniknąć wielokrotnego ładowania.
2. Obsługa błędów
Dodaj try-catch w Power Automate i Azure Function, aby obsłużyć błędy:
try {
// Generuj PDF
} catch (error) {
// Wyślij powiadomienie o błędzie
await sendErrorNotification(error);
throw error;
}
3. Monitoring
Użyj Azure Application Insights do monitorowania:
- Czas wykonania funkcji
- Liczba błędów
- Koszty wykonania
4. Bezpieczeństwo
- Używaj Managed Identity zamiast connection strings
- Szyfruj PDF w Azure Blob Storage
- Ogranicz dostęp do PDF tylko dla autoryzowanych użytkowników
Podsumowanie
Automatyzacja generowania ofert PDF z Power Automate i Azure pozwala:
- ✅ Oszczędzić 15-20 godzin tygodniowo
- ✅ Zwiększyć szybkość odpowiedzi o 80%
- ✅ Redukować błędy o 90%
- ✅ ROI w ciągu 2-3 miesięcy
Zacznij od prostego flow z podstawowym szablonem i stopniowo rozszerzaj o zaawansowane funkcje.
Zobacz też:
- Jak automatyzacje CRM zwiększają sprzedaż - korzyści biznesowe automatyzacji
- Integracja AI z Bitrix24 i Make - przewodnik po integracjach
FAQ
Ile kosztuje automatyzacja generowania PDF?
Szacunkowo $16-38/miesiąc dla małej firmy generującej 100-200 ofert. Koszty zależą od liczby ofert i użycia Azure Functions.
Jak długo trwa wdrożenie?
Proste wdrożenie z podstawowym szablonem zajmuje 1-2 tygodnie. Zaawansowane rozwiązanie z personalizacją i podpisami może zająć 3-4 tygodnie.
Czy mogę użyć innych narzędzi zamiast Azure?
Tak! Możesz użyć:
- AWS Lambda zamiast Azure Functions
- Google Cloud Functions zamiast Azure Functions
- Make (Integromat) zamiast Power Automate
Czy PDF może być generowany w czasie rzeczywistym?
Tak! Azure Functions może wygenerować PDF w ciągu 5-10 sekund, co pozwala na generowanie w czasie rzeczywistym.
Czy mogę dodać logo i branding do PDF?
Tak! Możesz dodać logo, kolory firmowe i inne elementy brandingowe do szablonu HTML, które będą widoczne w wygenerowanym PDF.
Chcesz dowiedzieć się więcej o GEO?
Sprawdź nasze narzędzia do monitorowania widoczności w AI i rozpocznij optymalizację swojej strony.