Generowanie pliku pdf z katalogiem
This commit is contained in:
parent
2630bc9dd8
commit
55bc7456bf
241
_print_group_members_pdf.php
Normal file
241
_print_group_members_pdf.php
Normal file
@ -0,0 +1,241 @@
|
||||
<?php
|
||||
// Start output buffering to prevent any accidental output before headers
|
||||
ob_start();
|
||||
|
||||
require_once __DIR__ . '/db/config.php';
|
||||
require_once __DIR__ . '/lib/ErrorHandler.php';
|
||||
require_once __DIR__ . '/lib/tfpdf/tfpdf.php';
|
||||
require_once __DIR__ . '/lib/tfpdf/font/unifont/ttfonts.php';
|
||||
|
||||
// Disable error display to avoid corrupting PDF output
|
||||
ini_set('display_errors', 0);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
$group_name = $_GET['group_name'] ?? '';
|
||||
|
||||
if (empty($group_name)) {
|
||||
while (ob_get_level() > 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;
|
||||
}
|
||||
12
test_tfpdf.php
Normal file
12
test_tfpdf.php
Normal file
@ -0,0 +1,12 @@
|
||||
<?php
|
||||
ob_start();
|
||||
require_once __DIR__ . '/lib/tfpdf/tfpdf.php';
|
||||
require_once __DIR__ . '/lib/tfpdf/font/unifont/ttfonts.php';
|
||||
|
||||
$pdf = new tFPDF();
|
||||
$pdf->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";
|
||||
Loading…
x
Reference in New Issue
Block a user