From 55bc7456bff3a90c803ee134616ecde8dd799bc2 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 2 Mar 2026 20:46:20 +0000 Subject: [PATCH] Generowanie pliku pdf z katalogiem --- _print_group_members_pdf.php | 241 +++++++++++++++++++++++++++++++++++ test.pdf | Bin 0 -> 11578 bytes test_tfpdf.php | 12 ++ 3 files changed, 253 insertions(+) create mode 100644 _print_group_members_pdf.php create mode 100644 test.pdf create mode 100644 test_tfpdf.php diff --git a/_print_group_members_pdf.php b/_print_group_members_pdf.php new file mode 100644 index 0000000..0e765d2 --- /dev/null +++ b/_print_group_members_pdf.php @@ -0,0 +1,241 @@ + 0) ob_end_clean(); + http_response_code(400); + header('Content-Type: application/json'); + echo json_encode(['success' => false, 'error' => 'Parameter group_name is required']); + exit; +} + +try { + $db = db(); + + // 1. Fetch group by name + $stmt = $db->prepare('SELECT id, name FROM bni_groups WHERE LOWER(name) = LOWER(?)'); + $stmt->execute([trim($group_name)]); + $group = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$group) { + while (ob_get_level() > 0) ob_end_clean(); + http_response_code(404); + header('Content-Type: application/json'); + echo json_encode(['success' => false, 'error' => 'Group not found']); + exit; + } + + $groupId = $group['id']; + $groupRealName = $group['name']; + + // 2. Fetch members + $stmt = $db->prepare(' + SELECT + p.first_name, + p.last_name, + p.person_photo_path, + p.company_name, + p.company_logo_path, + p.business_description, + p.industry, + p.company_size + FROM people p + WHERE p.bni_group_id = ? + ORDER BY p.last_name ASC, p.first_name ASC + '); + $stmt->execute([$groupId]); + $members = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if (empty($members)) { + while (ob_get_level() > 0) ob_end_clean(); + http_response_code(404); + header('Content-Type: application/json'); + echo json_encode(['success' => false, 'error' => 'No members found in this group']); + exit; + } + + // Helper to validate images before adding to PDF + $tempFiles = []; + function getVerifiedImagePath($path, &$tempFiles) { + if (empty($path)) return null; + + // Local file + if (strpos($path, 'http') !== 0) { + $localPath = rtrim(realpath(__DIR__), '/') . '/' . ltrim($path, '/'); + if (!file_exists($localPath)) return null; + $info = @getimagesize($localPath); + if ($info && in_array($info[2], [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG])) { + return $localPath; + } + return null; + } + + // URL + $ch = curl_init($path); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 3); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + $data = curl_exec($ch); + $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + if ($code >= 200 && $code < 300 && $data) { + $tmp = tempnam(sys_get_temp_dir(), 'pdfimg_'); + file_put_contents($tmp, $data); + $info = @getimagesize($tmp); + if ($info && in_array($info[2], [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG])) { + $tempFiles[] = $tmp; + return $tmp; + } + @unlink($tmp); + } + return null; + } + + // 3. Create PDF + $pdf = new tFPDF(); + $pdf->AddFont('DejaVu', '', 'DejaVuSans.ttf', true); + $pdf->AddFont('DejaVu', 'B', 'DejaVuSans-Bold.ttf', true); + + $pdf->SetMargins(15, 20, 15); + $pdf->SetAutoPageBreak(true, 15); + + foreach ($members as $member) { + $pdf->AddPage(); + + // --- HEADER --- + $pdf->SetFont('DejaVu', 'B', 12); + $pdf->SetTextColor(150, 150, 150); + $pdf->Cell(0, 10, 'Grupa: ' . $groupRealName, 0, 1, 'R'); + $pdf->Ln(5); + $pdf->SetTextColor(0, 0, 0); + + // --- IMAGES --- + $yStart = $pdf->GetY(); + $minY = $yStart; + + // Left - Photo + if (!empty($member['person_photo_path'])) { + $validPath = getVerifiedImagePath($member['person_photo_path'], $tempFiles); + if ($validPath) { + @$pdf->Image($validPath, 15, $yStart, 40); + $minY = max($minY, $yStart + 50); + } + } + + // Right - Logo + if (!empty($member['company_logo_path'])) { + $validPath = getVerifiedImagePath($member['company_logo_path'], $tempFiles); + if ($validPath) { + @$pdf->Image($validPath, 155, $yStart, 40); + $minY = max($minY, $yStart + 50); + } + } + + // --- MAIN INFO --- + $pdf->SetY($yStart + 10); + + $name = trim($member['first_name'] . ' ' . $member['last_name']); + if ($name === '') { + $name = 'Nieznany członek'; + } + + $pdf->SetFont('DejaVu', 'B', 22); + // Add margins for text so it doesn't overlap images + $pdf->SetLeftMargin(55); + $pdf->SetRightMargin(55); + + $pdf->Cell(100, 12, $name, 0, 1, 'C'); + + $companyName = trim($member['company_name'] ?? ''); + if ($companyName !== '') { + $pdf->SetFont('DejaVu', 'B', 16); + $pdf->SetTextColor(80, 80, 80); + $pdf->MultiCell(100, 8, $companyName, 0, 'C'); + $pdf->SetTextColor(0, 0, 0); + } + + // Reset margins + $pdf->SetLeftMargin(15); + $pdf->SetRightMargin(15); + $pdf->SetX(15); + + // Ensure we draw details below the images + if ($pdf->GetY() < $minY) { + $pdf->SetY($minY + 5); + } else { + $pdf->Ln(10); + } + + // --- DETAILS --- + $pdf->SetFont('DejaVu', 'B', 12); + + // Industry + $pdf->Cell(45, 8, 'Branża:', 0, 0); + $pdf->SetFont('DejaVu', '', 12); + $industry = trim($member['industry'] ?? ''); + $pdf->Cell(0, 8, $industry !== '' ? $industry : '-', 0, 1); + + // Company Size + $pdf->SetFont('DejaVu', 'B', 12); + $pdf->Cell(45, 8, 'Wielkość firmy:', 0, 0); + $pdf->SetFont('DejaVu', '', 12); + $companySize = trim($member['company_size'] ?? ''); + $pdf->Cell(0, 8, $companySize !== '' ? $companySize : '-', 0, 1); + + $pdf->Ln(8); + + // Description + $pdf->SetFont('DejaVu', 'B', 12); + $pdf->Cell(0, 8, 'Opis:', 0, 1); + + $pdf->SetFont('DejaVu', '', 11); + $desc = trim($member['business_description'] ?? ''); + if ($desc === '') { + $desc = 'Brak opisu.'; + } + + $pdf->MultiCell(0, 6, $desc); + } + + // Clear buffer before sending headers + while (ob_get_level() > 0) ob_end_clean(); + + $safeName = preg_replace('/[^a-zA-Z0-9_\-]/', '_', strtolower($groupRealName)); + $filename = 'lista_czlonkow_' . $safeName . '.pdf'; + + header('Content-Type: application/pdf'); + header('Content-Disposition: attachment; filename="' . $filename . '"'); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + + // Output directly + $pdf->Output('D', $filename); + + // Cleanup + foreach ($tempFiles as $tmp) { + @unlink($tmp); + } + + exit; + +} catch (Exception $e) { + while (ob_get_level() > 0) ob_end_clean(); + http_response_code(500); + header('Content-Type: application/json'); + echo json_encode(['success' => false, 'error' => 'Wystąpił błąd podczas generowania PDF', 'details' => $e->getMessage()]); + exit; +} \ No newline at end of file diff --git a/test.pdf b/test.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8d5a683dc025d27c22c4083263c9de965ee3c09a GIT binary patch literal 11578 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 literal 0 HcmV?d00001 diff --git a/test_tfpdf.php b/test_tfpdf.php new file mode 100644 index 0000000..0a50b6c --- /dev/null +++ b/test_tfpdf.php @@ -0,0 +1,12 @@ +AddPage(); +$pdf->AddFont('DejaVu','','DejaVuSans.ttf',true); +$pdf->SetFont('DejaVu','',14); +$pdf->Cell(0,10,'Zażółć gęślą jaźń',0,1); +$pdf->Output('F', __DIR__ . '/test.pdf'); +echo "Done\n"; \ No newline at end of file