Power Automate
Azure
PDF

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.

BiznesRewolucje.ai

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

  1. Bitrix24 - CRM, źródło danych o kliencie i dealu
  2. Power Automate - orkiestracja procesu
  3. Azure Functions - generowanie PDF
  4. Azure Blob Storage - przechowywanie wygenerowanych PDF
  5. 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

  1. Przejdź do Azure Portal
  2. Utwórz nową Function App
  3. Wybierz runtime: Node.js lub Python
  4. 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

  1. Przejdź do Power Automate
  2. Utwórz nowy Automated cloud flow
  3. 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']}

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ż:

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.