Ontwikkel een PHP script voor geautomatiseerde PDF-rapportage
description
Met deze prompt kun je eenvoudig professionele PDF-rapporten automatiseren in PHP zonder externe tools. Het helpt je tijd te besparen, consistente rapporten te creëren en data overzichtelijk te presenteren, wat beter is dan handmatige rapportage of losse scripts zonder standaardisatie.
prompt
Help me een PHP script te ontwikkelen dat automatisch PDF-rapporten genereert op basis van de volgende gegevens: <voer de gegevensbron in, bijvoorbe ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hieronder vind je een overzicht en voorbeeld van hoe je een PHP-script kunt ontwikkelen dat automatisch PDF-rapporten genereert op basis van gegevens uit je MySQL-database 'sales_data'. Ik zal de stappen uitleggen, inclusief opmaak, toevoegen van tabellen en grafieken, en het exporteren naar PDF.
1. Vereisten installeren:
- PHP (met PDO voor databaseverbinding)
- Composer (voor afhankelijkheden)
- Bibliotheken:
- TCPDF of FPDF voor PDF-generatie
- pChart of andere grafiekbibliotheken (optioneel, voor grafieken)
Bijvoorbeeld, je kunt TCPDF installeren via Composer:
```bash
composer require tecnickcom/tcpdf
```
2. Verbinden met de database:
```php
<?php
// Verbinding maken met MySQL
$host = 'localhost';
$dbname = 'sales_data';
$username = 'jouw_gebruikersnaam';
$password = 'jouw_wachtwoord';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
} catch (PDOException $e) {
die("Fout bij verbinding: " . $e->getMessage());
}
?>
```
3. Data ophalen:
```php
// Voorbeeld: verkoopgegevens ophalen
$stmt = $pdo->prepare("SELECT product, verkoop_aantal, omzet, verkoop_datum FROM verkoop");
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
```
4. PDF genereren met TCPDF:
```php
require_once('vendor/autoload.php');
use TCPDF;
// Maak nieuw PDF-document
$pdf = new TCPDF();
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Jouw Naam');
$pdf->SetTitle('Sales Rapport');
$pdf->AddPage();
// Opmaak titel
$pdf->SetFont('helvetica', 'B', 16);
$pdf->Cell(0, 10, 'Sales Rapport', 0, 1, 'C');
$pdf->Ln(10);
// Toevoegen van een tabel
$pdf->SetFont('helvetica', '', 12);
$html = '<table border="1" cellpadding="4">
<tr>
<th>Product</th>
<th>Verkoop Aantal</th>
<th>Omzet</th>
<th>Datum</th>
</tr>';
foreach ($data as $row) {
$html .= '<tr>
<td>' . htmlspecialchars($row['product']) . '</td>
<td>' . htmlspecialchars($row['verkoop_aantal']) . '</td>
<td>' . htmlspecialchars($row['omzet']) . '</td>
<td>' . htmlspecialchars($row['verkoop_datum']) . '</td>
</tr>';
}
$html .= '</table>';
$pdf->writeHTML($html, true, false, false, false, '');
// Toevoegen van een grafiek (bijvoorbeeld omzet per product)
// Hiervoor moet je een grafiek genereren, opslaan als afbeelding en invoegen
// Voorbeeld: genereren grafiek met pChart of GD
// (Deze stap kan complex zijn; hier een eenvoudig voorbeeld met GD)
$im = imagecreate(600, 400);
$background = imagecolorallocate($im, 255, 255, 255);
$line_color = imagecolorallocate($im, 0, 0, 0);
// Simpele grafiek tekenen
// (Echt grafiek maken vereist meer code)
imageline($im, 50, 350, 550, 350, $line_color); // X-as
imageline($im, 50, 50, 50, 350, $line_color); // Y-as
// Opslaan als afbeelding
$imagePath = 'grafiek.png';
imagepng($im, $imagePath);
imagedestroy($im);
// Afbeelding invoegen in PDF
$pdf->Ln(10);
$pdf->Image($imagePath, '', '', 180, 100, 'PNG');
// PDF output
$pdf->Output('sales_rapport.pdf', 'I');
?>
```
Samenvatting:
- Maak verbinding met je database en haal relevante gegevens op.
- Gebruik TCPDF om een nieuw PDF-document te maken.
- Voeg koppen, tabellen en eventueel grafieken toe voor visuele rapportages.
- Exporteer het document direct naar PDF-bestand.
Voor een professionele rapportage kun je de opmaak verder aanpassen, meer grafieken toevoegen en dynamisch rapport genereren op basis van je data.
provider: deepseek
model: deepseek-chat
Zeker! Ik help je graag een PHP-script te ontwikkelen voor het genereren van PDF-rapporten. Hier is een complete uitleg:
## 1. Vereiste Bibliotheken
Installeer eerst de benodigde bibliotheken via Composer:
```bash
composer require mpdf/mpdf
composer require phpoffice/phpspreadsheet
```
## 2. Databaseverbinding
```php
<?php
require_once 'vendor/autoload.php';
require_once 'vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php';
use Mpdf\Mpdf;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf as PdfWriter;
class PDFReportGenerator {
private $db;
public function __construct() {
$this->db = new mysqli('localhost', 'gebruikersnaam', 'wachtwoord', 'sales_data');
if ($this->db->connect_error) {
die("Databaseverbinding mislukt: " . $this->db->connect_error);
}
}
```
## 3. Data Ophalen uit Database
```php
private function haalSalesDataOp() {
$query = "
SELECT
product_naam,
SUM(verkochte_aantal) as totaal_verkocht,
SUM(omzet) as totale_omzet,
AVG(verkoopprijs) as gemiddelde_prijs,
MONTH(verkoopdatum) as maand
FROM sales
WHERE YEAR(verkoopdatum) = YEAR(CURDATE())
GROUP BY product_naam, MONTH(verkoopdatum)
ORDER BY maand, totale_omzet DESC
";
$result = $this->db->query($query);
$data = [];
while ($row = $result->fetch_assoc()) {
$data[] = $row;
}
return $data;
}
```
## 4. HTML Template voor Rapport
```php
private function genereerHTMLTemplate($data) {
$html = '
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Sales Rapport</title>
<style>
body { font-family: Arial, sans-serif; margin: 40px; }
.header { text-align: center; margin-bottom: 30px; }
.tabel { width: 100%; border-collapse: collapse; margin: 20px 0; }
.tabel th, .tabel td { border: 1px solid #ddd; padding: 8px; text-align: left; }
.tabel th { background-color: #f2f2f2; }
.totaal-row { font-weight: bold; background-color: #e8f4ff; }
.grafiek-container { margin: 30px 0; text-align: center; }
.footer { margin-top: 50px; text-align: center; font-size: 12px; color: #666; }
</style>
</head>
<body>
<div class="header">
<h1>Sales Rapport ' . date('Y') . '</h1>
<p>Automatisch gegenereerd op: ' . date('d-m-Y H:i') . '</p>
</div>
';
// Voeg tabel toe
$html .= $this->genereerSalesTabel($data);
// Voeg samenvatting toe
$html .= $this->genereerSamenvatting($data);
$html .= '
<div class="footer">
<p>© 2024 Jouw Bedrijf - Dit is een automatisch gegenereerd rapport</p>
</div>
</body>
</html>
';
return $html;
}
```
## 5. Tabel Genereren
```php
private function genereerSalesTabel($data) {
$html = '
<h2>Verkoopoverzicht per Product</h2>
<table class="tabel">
<tr>
<th>Product</th>
<th>Maand</th>
<th>Aantal Verkocht</th>
<th>Totale Omzet</th>
<th>Gemiddelde Prijs</th>
</tr>
';
$totaalOmzet = 0;
$totaalAantal = 0;
foreach ($data as $row) {
$html .= '
<tr>
<td>' . htmlspecialchars($row['product_naam']) . '</td>
<td>' . $this->getMaandNaam($row['maand']) . '</td>
<td>' . number_format($row['totaal_verkocht'], 0, ',', '.') . '</td>
<td>€ ' . number_format($row['totale_omzet'], 2, ',', '.') . '</td>
<td>€ ' . number_format($row['gemiddelde_prijs'], 2, ',', '.') . '</td>
</tr>
';
$totaalOmzet += $row['totale_omzet'];
$totaalAantal += $row['totaal_verkocht'];
}
$html .= '
<tr class="totaal-row">
<td colspan="2"><strong>Totaal</strong></td>
<td><strong>' . number_format($totaalAantal, 0, ',', '.') . '</strong></td>
<td><strong>€ ' . number_format($totaalOmzet, 2, ',', '.') . '</strong></td>
<td></td>
</tr>
</table>
';
return $html;
}
```
## 6. Grafieken Toevoegen (SVG)
```php
private function genereerGrafiek($data) {
// Groepeer data per maand voor de grafiek
$maandData = [];
foreach ($data as $row) {
$maand = $row['maand'];
if (!isset($maandData[$maand])) {
$maandData[$maand] = 0;
}
$maandData[$maand] += $row['totale_omzet'];
}
ksort($maandData);
// Genereer SVG grafiek
$maxWaarde = max($maandData);
$svgWidth = 600;
$svgHeight = 300;
$barWidth = 40;
$spacing = 20;
$svg = '<svg width="' . $svgWidth . '" height="' . $svgHeight . '">';
$x = 50;
foreach ($maandData as $maand => $omzet) {
$barHeight = ($omzet / $maxWaarde) * 200;
$y = 250 - $barHeight;
$svg .= '
<rect x="' . $x . '" y="' . $y . '" width="' . $barWidth . '" height="' . $barHeight . '" fill="#4CAF50"/>
<text x="' . ($x + $barWidth/2) . '" y="270" text-anchor="middle">' . $this->getMaandNaam($maand) . '</text>
<text x="' . ($x + $barWidth/2) . '" y="' . ($y - 5) . '" text-anchor="middle">€' . number_format($omzet, 0, ',', '.') . '</text>
';
$x += $barWidth + $spacing;
}
$svg .= '</svg>';
return '
<div class="grafiek-container">
<h2>Maandelijkse Omzet</h2>
' . $svg . '
</div>
';
}
```
## 7. PDF Genereren
```php
public function genereerPDFRapport() {
$data = $this->haalSalesDataOp();
$html = $this->genereerHTMLTemplate($data);
// Configureer mPDF
$mpdf = new Mpdf([
'mode' => 'utf-8',
'format' => 'A4',
'margin_left' => 15,
'margin_right' => 15,
'margin_top' => 25,
'margin_bottom' => 25,
'margin_header' => 10,
'margin_footer' => 10
]);
$mpdf->SetHeader('Sales Rapport||Pagina {PAGENO}');
$mpdf->SetFooter('© 2024 Jouw Bedrijf|{PAGENO}|');
$mpdf->WriteHTML($html);
// Output PDF
$bestandsnaam = 'sales_rapport_' . date('Y-m-d') . '.pdf';
$mpdf->Output($bestandsnaam, 'D'); // 'D' voor download, 'I' voor inline weergave
}
private function getMaandNaam($maandNummer) {
$maanden = [
1 => 'Januari', 2 => 'Februari', 3 => 'Maart', 4 => 'April',
5 => 'Mei', 6 => 'Juni', 7 => 'Juli', 8 => 'Augustus',
9 => 'September', 10 => 'Oktober', 11 => 'November', 12 => 'December'
];
return $maanden[$maandNummer] ?? 'Onbekend';
}
}
// Gebruik:
$generator = new PDFReportGenerator();
$generator->genereerPDFRapport();
?>
```
## 8. Extra Functionaliteiten
**Email verzending:**
```php
public function verstuurRapportPerEmail($email) {
$data = $this->haalSalesDataOp();
$html = $this->genereerHTMLTemplate($data);
$mpdf = new Mpdf();
$mpdf->WriteHTML($html);
$pdfContent = $mpdf->Output('', 'S');
// Email verzenden met PHPMailer of mail() functie
mail($email, "Sales Rapport", "Bijlage: Sales Rapport", [
'From' => 'noreply@jouwbedrijf.nl',
'Content-Type' => 'multipart/mixed'
]);
}
```
## 9. Tips voor Optimalisatie
1. **Caching**: Sla gegenereerde rapporten tijdelijk op
2. **Paginering**: Voor grote datasets gebruik `LIMIT` en `OFFSET`
3. **Stijling**: Gebruik CSS voor professionele opmaak
4. **Beveiliging**: Valideer alle gebruikersinput
5. **Error handling**: Voeg try-catch blokken toe
Dit script geeft je een solide basis voor het genereren van professionele PDF-rapporten vanuit je MySQL database!