Make this poster more attractive and convert that way
ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace not found"
mkdir -p /home/daytona/workspace/poster-redesign
~/poster-redesign/poster.html
<!DOCTYPE html>
<html lang="bn">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>সরকারি পরিষেবা সহায়তা কেন্দ্র</title>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Bengali:wght@400;600;700;800;900&display=swap" rel="stylesheet">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Noto Sans Bengali', sans-serif;
background: #0a0a2e;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
padding: 20px;
}
.poster {
width: 800px;
background: linear-gradient(160deg, #0d1b4b 0%, #0a2a6e 40%, #0d1b4b 100%);
border-radius: 24px;
overflow: hidden;
box-shadow: 0 0 60px rgba(0,120,255,0.4), 0 0 120px rgba(0,60,180,0.2);
border: 2px solid rgba(100,180,255,0.3);
position: relative;
}
/* Decorative background dots */
.poster::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background-image: radial-gradient(circle, rgba(255,255,255,0.04) 1px, transparent 1px);
background-size: 30px 30px;
pointer-events: none;
z-index: 0;
}
.poster > * { position: relative; z-index: 1; }
/* ===== HEADER ===== */
.header {
background: linear-gradient(135deg, #1a237e 0%, #0d47a1 50%, #1565c0 100%);
padding: 22px 28px 18px;
position: relative;
overflow: hidden;
}
.header::after {
content: '';
position: absolute;
bottom: 0; left: 0; right: 0;
height: 4px;
background: linear-gradient(90deg, #ffd700, #ff6b00, #ffd700);
}
.header-top {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
}
.header-left {
display: flex;
align-items: center;
gap: 14px;
flex: 1;
}
.logo-circle {
width: 68px;
height: 68px;
background: linear-gradient(135deg, #ffd700, #ff8c00);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 32px;
flex-shrink: 0;
box-shadow: 0 4px 20px rgba(255,215,0,0.4);
border: 3px solid rgba(255,255,255,0.3);
}
.title-block h1 {
font-size: 28px;
font-weight: 900;
color: #ffd700;
line-height: 1.15;
text-shadow: 2px 2px 8px rgba(0,0,0,0.5);
letter-spacing: 0.5px;
}
.title-block h2 {
font-size: 36px;
font-weight: 900;
color: #ffffff;
line-height: 1.1;
text-shadow: 2px 2px 10px rgba(0,0,0,0.5);
letter-spacing: 1px;
}
.badge {
background: linear-gradient(135deg, #c62828, #e53935);
color: white;
border-radius: 14px;
padding: 10px 16px;
text-align: center;
font-size: 13.5px;
font-weight: 700;
line-height: 1.5;
box-shadow: 0 4px 15px rgba(200,0,0,0.4);
border: 2px solid rgba(255,100,100,0.4);
white-space: nowrap;
flex-shrink: 0;
}
.badge .stars { color: #ffd700; font-size: 16px; margin-top: 4px; }
.tagline {
margin-top: 12px;
background: linear-gradient(90deg, rgba(255,255,255,0.08), rgba(255,215,0,0.12), rgba(255,255,255,0.08));
border: 1px solid rgba(255,215,0,0.3);
border-radius: 8px;
padding: 8px 16px;
text-align: center;
color: #fff;
font-size: 15px;
font-weight: 600;
letter-spacing: 0.5px;
}
/* ===== MAIN CONTENT ===== */
.content {
padding: 18px 20px;
display: flex;
flex-direction: column;
gap: 16px;
}
/* ===== SECTION CARD ===== */
.card {
border-radius: 16px;
overflow: hidden;
box-shadow: 0 4px 20px rgba(0,0,0,0.3);
}
.card-header {
padding: 10px 18px;
font-size: 16px;
font-weight: 800;
color: white;
display: flex;
align-items: center;
gap: 8px;
}
/* ===== SERVICES ROW ===== */
.services-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
}
/* Services list */
.services-list {
background: linear-gradient(135deg, rgba(255,255,255,0.06), rgba(255,255,255,0.02));
border: 1.5px solid rgba(100,180,255,0.25);
border-radius: 16px;
overflow: hidden;
}
.service-item {
display: flex;
align-items: center;
gap: 14px;
padding: 13px 16px;
border-bottom: 1px solid rgba(255,255,255,0.07);
transition: background 0.2s;
}
.service-item:last-child { border-bottom: none; }
.service-icon {
width: 44px;
height: 44px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
font-size: 22px;
flex-shrink: 0;
}
.si-green { background: linear-gradient(135deg, #1b5e20, #2e7d32); }
.si-blue { background: linear-gradient(135deg, #0d47a1, #1565c0); }
.si-orange{ background: linear-gradient(135deg, #bf360c, #e64a19); }
.service-text .service-title {
font-size: 15.5px;
font-weight: 800;
color: #ffd700;
line-height: 1.2;
}
.service-text .service-subtitle {
font-size: 13px;
color: rgba(255,255,255,0.75);
margin-top: 2px;
}
.check-badge {
margin-left: auto;
width: 26px;
height: 26px;
background: linear-gradient(135deg, #00c853, #00e676);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
color: white;
flex-shrink: 0;
}
/* Charges card */
.charges-card {
background: linear-gradient(135deg, rgba(255,255,255,0.06), rgba(255,255,255,0.02));
border: 1.5px solid rgba(255,165,0,0.3);
border-radius: 16px;
overflow: hidden;
}
.charges-header {
background: linear-gradient(90deg, #c62828, #b71c1c);
padding: 10px 16px;
color: white;
font-size: 16px;
font-weight: 800;
text-align: center;
}
.charge-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 11px 16px;
border-bottom: 1px solid rgba(255,255,255,0.07);
}
.charge-item:last-child { border-bottom: none; }
.charge-label { font-size: 14px; font-weight: 700; color: white; }
.charge-sub { font-size: 12px; color: rgba(255,255,255,0.6); }
.charge-price {
font-size: 22px;
font-weight: 900;
border-radius: 10px;
padding: 5px 14px;
color: white;
}
.price-green { background: linear-gradient(135deg, #1b5e20, #2e7d32); }
.price-purple { background: linear-gradient(135deg, #4a148c, #6a1b9a); }
.price-orange { background: linear-gradient(135deg, #bf360c, #e64a19); }
/* ===== LOCATION + TIME ROW ===== */
.info-row {
display: grid;
grid-template-columns: 1.1fr 0.9fr;
gap: 16px;
}
.location-card {
background: linear-gradient(135deg, rgba(255,255,255,0.06), rgba(255,255,255,0.02));
border: 1.5px solid rgba(100,220,100,0.25);
border-radius: 16px;
overflow: hidden;
}
.location-header {
background: linear-gradient(90deg, #1b5e20, #2e7d32);
padding: 10px 16px;
color: white;
font-size: 15px;
font-weight: 800;
display: flex;
align-items: center;
gap: 8px;
}
.location-body {
padding: 14px 16px;
color: rgba(255,255,255,0.85);
font-size: 13.5px;
line-height: 1.9;
}
.location-body .highlight { color: #ff6b6b; font-weight: 700; }
.location-body .highlight2 { color: #ffd700; font-weight: 700; }
.map-icon {
background: rgba(255,255,255,0.05);
border-radius: 10px;
margin-top: 10px;
padding: 10px;
text-align: center;
font-size: 36px;
}
.time-card {
background: linear-gradient(135deg, rgba(255,255,255,0.06), rgba(255,255,255,0.02));
border: 1.5px solid rgba(100,180,255,0.25);
border-radius: 16px;
overflow: hidden;
}
.time-header {
background: linear-gradient(90deg, #0d47a1, #1565c0);
padding: 10px 16px;
color: white;
font-size: 15px;
font-weight: 800;
display: flex;
align-items: center;
gap: 8px;
}
.time-body { padding: 14px 16px; }
.time-slot {
background: rgba(255,255,255,0.05);
border: 1px solid rgba(255,255,255,0.1);
border-radius: 12px;
padding: 11px 14px;
margin-bottom: 10px;
display: flex;
gap: 12px;
align-items: flex-start;
}
.time-slot:last-child { margin-bottom: 0; }
.time-slot .t-icon { font-size: 22px; flex-shrink: 0; }
.time-slot .t-day { font-size: 13.5px; font-weight: 800; color: #ffd700; }
.time-slot .t-time { font-size: 13px; color: rgba(255,255,255,0.8); margin-top: 2px; }
/* ===== CONTACT METHODS ===== */
.contact-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
}
.contact-card {
border-radius: 14px;
padding: 14px 16px;
display: flex;
align-items: center;
gap: 14px;
border: 1.5px solid;
}
.cc-visit {
background: linear-gradient(135deg, rgba(255,193,7,0.12), rgba(255,152,0,0.08));
border-color: rgba(255,193,7,0.3);
}
.cc-online {
background: linear-gradient(135deg, rgba(37,211,102,0.12), rgba(0,200,83,0.08));
border-color: rgba(37,211,102,0.3);
}
.cc-icon { font-size: 34px; flex-shrink: 0; }
.cc-text { font-size: 14px; font-weight: 700; color: white; line-height: 1.6; }
.cc-text span { color: #ffd700; }
.or-divider {
display: flex;
align-items: center;
justify-content: center;
}
.or-circle {
background: linear-gradient(135deg, #c62828, #e53935);
color: white;
font-size: 14px;
font-weight: 800;
width: 40px;
height: 40px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 3px 12px rgba(200,0,0,0.4);
}
/* ===== DOCUMENTS ===== */
.docs-card {
background: linear-gradient(135deg, rgba(255,255,255,0.05), rgba(255,255,255,0.02));
border: 1.5px solid rgba(255,215,0,0.2);
border-radius: 16px;
overflow: hidden;
}
.docs-header {
background: linear-gradient(90deg, #4a148c, #6a1b9a);
padding: 10px 18px;
color: white;
font-size: 15px;
font-weight: 800;
display: flex;
align-items: center;
gap: 8px;
}
.docs-grid {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 10px;
padding: 14px 16px;
}
.doc-item {
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
text-align: center;
}
.doc-icon-box {
width: 52px;
height: 52px;
border-radius: 12px;
background: rgba(255,255,255,0.08);
border: 1px solid rgba(255,255,255,0.15);
display: flex;
align-items: center;
justify-content: center;
font-size: 26px;
}
.doc-label {
font-size: 11px;
color: rgba(255,255,255,0.8);
font-weight: 600;
line-height: 1.3;
}
/* ===== WARNING ===== */
.warning-row {
display: grid;
grid-template-columns: 1fr auto;
gap: 14px;
align-items: center;
}
.warning-box {
background: linear-gradient(135deg, rgba(255,193,7,0.12), rgba(255,152,0,0.08));
border: 1.5px solid rgba(255,193,7,0.35);
border-radius: 12px;
padding: 12px 16px;
display: flex;
gap: 10px;
align-items: flex-start;
}
.warning-icon { font-size: 22px; flex-shrink: 0; margin-top: 2px; }
.warning-text { font-size: 12.5px; color: rgba(255,255,255,0.85); line-height: 1.7; font-weight: 500; }
.phone-box {
background: linear-gradient(135deg, #0d47a1, #1565c0);
border-radius: 14px;
padding: 12px 20px;
text-align: center;
border: 2px solid rgba(100,180,255,0.4);
box-shadow: 0 4px 20px rgba(0,80,200,0.3);
white-space: nowrap;
}
.phone-box .phone-label { font-size: 12px; color: rgba(255,255,255,0.75); font-weight: 600; }
.phone-box .phone-icon { font-size: 18px; }
.phone-box .phone-number {
font-size: 24px;
font-weight: 900;
color: #ffd700;
letter-spacing: 1px;
text-shadow: 0 2px 8px rgba(0,0,0,0.4);
}
/* ===== FOOTER ===== */
.footer {
background: linear-gradient(135deg, #1b1b3a, #0d1b4b);
border-top: 2px solid rgba(255,215,0,0.3);
padding: 12px 20px;
}
.footer-line1 {
text-align: center;
color: rgba(255,255,255,0.75);
font-size: 13px;
font-weight: 600;
margin-bottom: 6px;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.footer-line2 {
background: linear-gradient(90deg, #ffd700, #ff8c00, #ffd700);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
text-align: center;
font-size: 15px;
font-weight: 800;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.footer-arrow {
color: #ff6b00;
font-size: 16px;
}
.divider-line {
height: 2px;
background: linear-gradient(90deg, transparent, rgba(100,180,255,0.3), rgba(255,215,0,0.4), rgba(100,180,255,0.3), transparent);
border-radius: 2px;
}
</style>
</head>
<body>
<div class="poster">
<!-- HEADER -->
<div class="header">
<div class="header-top">
<div class="header-left">
<div class="logo-circle">🏛️</div>
<div class="title-block">
<h1>সরকারি</h1>
<h2>পরিষেবা সহায়তা কেন্দ্র</h2>
</div>
</div>
<div class="badge">
বিশ্বাসযোগ্য<br>নির্ভরযোগ্য<br>দ্রুত পরিষেবা
<div class="stars">★★★</div>
</div>
</div>
<div class="tagline">সহজভাবে, দ্রুতভাবে, নির্ভুলভাবে কাজ করানো হয়</div>
</div>
<!-- MAIN CONTENT -->
<div class="content">
<!-- SERVICES + CHARGES -->
<div class="services-row">
<!-- Services list -->
<div class="services-list">
<div class="service-item">
<div class="service-icon si-green">🔗</div>
<div class="service-text">
<div class="service-title">DBT (Direct Benefit Transfer)</div>
<div class="service-subtitle">লিংক করা হয়</div>
</div>
<div class="check-badge">✓</div>
</div>
<div class="service-item">
<div class="service-icon si-blue">🪪</div>
<div class="service-text">
<div class="service-title">ABHA (আভা) কার্ড</div>
<div class="service-subtitle">অ্যাপ্লাই করা হয়</div>
</div>
<div class="check-badge">✓</div>
</div>
<div class="service-item">
<div class="service-icon si-orange">🏺</div>
<div class="service-text">
<div class="service-title" style="color:#ff8c00;">অনুপূর্ণা ভান্ডার ফর্ম</div>
<div class="service-subtitle">অনলাইনে সাবমিট করা হয়</div>
</div>
<div class="check-badge">✓</div>
</div>
</div>
<!-- Charges -->
<div class="charges-card">
<div class="charges-header">💰 পরিষেবার চার্জ</div>
<div class="charge-item">
<div>
<div class="charge-label">DBT লিংক</div>
</div>
<div class="charge-price price-green">₹20</div>
</div>
<div class="charge-item">
<div>
<div class="charge-label">ABHA কার্ড</div>
</div>
<div class="charge-price price-purple">₹25</div>
</div>
<div class="charge-item">
<div>
<div class="charge-label">অনুপূর্ণা ভান্ডার</div>
<div class="charge-sub">অনলাইন ফর্ম</div>
</div>
<div class="charge-price price-orange">₹50</div>
</div>
</div>
</div>
<div class="divider-line"></div>
<!-- LOCATION + TIMING -->
<div class="info-row">
<div class="location-card">
<div class="location-header">📍 লোকেশন</div>
<div class="location-body">
বিষ্ণুপুর স্টেট ব্যাংকের পাশে, রামকৃষ্ণ পল্লী,
<span class="highlight">রাধালয়</span> যাওয়ার রাস্তা,
<span class="highlight">ঠাকুর টেলিকমের</span> পাশের রাস্তা দিয়ে
একদম <span class="highlight2">শেষ বাড়ি</span>।
<div class="map-icon">🗺️🏠</div>
</div>
</div>
<div class="time-card">
<div class="time-header">🕐 পরিষেবার সময়</div>
<div class="time-body">
<div class="time-slot">
<div class="t-icon">📅</div>
<div>
<div class="t-day">প্রত্যেক রবিবার</div>
<div class="t-time">সকাল ১০টা থেকে<br>রাত ৯টা পর্যন্ত</div>
</div>
</div>
<div class="time-slot">
<div class="t-icon">📅</div>
<div>
<div class="t-day">অন্যান্য দিন</div>
<div class="t-time">সন্ধ্যা ৬টা থেকে<br>রাত ৯টা পর্যন্ত</div>
</div>
</div>
</div>
</div>
</div>
<!-- CONTACT METHODS -->
<div style="display:grid; grid-template-columns:1fr 40px 1fr; gap:8px; align-items:center;">
<div class="contact-card cc-visit">
<div class="cc-icon">🏠</div>
<div class="cc-text">
লোকেশনে এসে<br>
<span>কাজ করাতে পারবেন</span>
</div>
</div>
<div class="or-divider">
<div class="or-circle">অথবা</div>
</div>
<div class="contact-card cc-online">
<div class="cc-icon">💬</div>
<div class="cc-text">
WhatsApp/অনলাইনে ডকুমেন্ট<br>
পাঠিয়েও <span>কাজ করাতে পারবেন</span>
</div>
</div>
</div>
<div class="divider-line"></div>
<!-- DOCUMENTS -->
<div class="docs-card">
<div class="docs-header">📁 প্রয়োজনীয় ডকুমেন্টস (যা যা থাকতে পারে)</div>
<div class="docs-grid">
<div class="doc-item">
<div class="doc-icon-box">🪪</div>
<div class="doc-label">আধার কার্ড</div>
</div>
<div class="doc-item">
<div class="doc-icon-box">📔</div>
<div class="doc-label">ব্যাংকের পাসবুক</div>
</div>
<div class="doc-item">
<div class="doc-icon-box">📱</div>
<div class="doc-label">আধারের সঙ্গে লিঙ্ক মোবাইল নম্বর</div>
</div>
<div class="doc-item">
<div class="doc-icon-box">💳</div>
<div class="doc-label">প্যান কার্ড</div>
</div>
<div class="doc-item">
<div class="doc-icon-box">📜</div>
<div class="doc-label">পেনশন কার্ড (যদি থাকে)</div>
</div>
<div class="doc-item">
<div class="doc-icon-box">🗳️</div>
<div class="doc-label">ভোটার কার্ড</div>
</div>
<div class="doc-item">
<div class="doc-icon-box">📄</div>
<div class="doc-label">আয় প্রমাণপত্র (যদি থাকে)</div>
</div>
</div>
</div>
<!-- WARNING + PHONE -->
<div class="warning-row">
<div class="warning-box">
<div class="warning-icon">⚠️</div>
<div class="warning-text">
আসার আগে অবশ্যই ফোন করে জেনে নিন কী কী ডকুমেন্ট লাগবে।<br>
প্রয়োজনীয় ডকুমেন্ট সম্পর্কে নিশ্চিত হয়ে তারপর আসবেন।
</div>
</div>
<div class="phone-box">
<div class="phone-label">📞 যোগাযোগ করুন</div>
<div class="phone-number">76998 44219</div>
</div>
</div>
</div>
<!-- FOOTER -->
<div class="footer">
<div class="footer-line1">
⭐ সময় কোনো বিষয় নয়, যে কোনো দিন যোগাযোগ করতে পারবেন ⭐
</div>
<div class="footer-line2">
<span class="footer-arrow">➤</span>
আপনার সেবা, আমাদের দায়িত্ব
<span class="footer-arrow">➤</span>
</div>
</div>
</div>
</body>
</html>
which chromium-browser || which chromium || which google-chrome || which google-chrome-stable || which puppeteer 2>/dev/null; echo "---"; node --version 2>/dev/null; python3 --version 2>/dev/null; which wkhtmltoimage 2>/dev/null
ls /home/daytona/workspace/poster-redesign/; ls /usr/local/lib/node_modules/ 2>/dev/null | head -20; ls /home/daytona/node_modules/ 2>/dev/null | head -10
cd /home/daytona/workspace/poster-redesign && cat > capture.js << 'EOF' const puppeteer = require('puppeteer'); const path = require('path'); (async () => { const browser = await puppeteer.launch({ executablePath: '/usr/bin/chromium', args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage'] }); const page = await browser.newPage(); await page.setViewport({ width: 850, height: 1200, deviceScaleFactor: 2 }); const htmlPath = 'file://' + path.resolve('/home/daytona/workspace/poster-redesign/poster.html'); await page.goto(htmlPath, { waitUntil: 'networkidle0', timeout: 30000 }); // Wait for fonts await page.waitForTimeout(2000); const element = await page.$('.poster'); await element.screenshot({ path: '/home/daytona/workspace/poster-redesign/poster_redesigned.png', type: 'png' }); await browser.close(); console.log('Done!'); })(); EOF node capture.js
cd /home/daytona/workspace/poster-redesign && npm install puppeteer --prefix . 2>&1 | tail -5
# Try using chromium directly for screenshot /usr/bin/chromium --headless --no-sandbox --disable-gpu --screenshot=/home/daytona/workspace/poster-redesign/poster_redesigned.png --window-size=850,1400 "file:///home/daytona/workspace/poster-redesign/poster.html" 2>&1; echo "Exit: $?"
# Use chromium with --print-to-pdf for full page, then convert; or use a full-height viewport # First check the actual poster height by getting page dimensions /usr/bin/chromium --headless --no-sandbox --disable-gpu \ --virtual-time-budget=5000 \ --run-all-compositor-stages-before-draw \ --screenshot=/home/daytona/workspace/poster-redesign/poster_full.png \ --window-size=860,2200 \ "file:///home/daytona/workspace/poster-redesign/poster.html" 2>&1 | tail -3 ls -la /home/daytona/workspace/poster-redesign/
# Use Python with Pillow to check and optionally crop the image python3 -c " from PIL import Image img = Image.open('/home/daytona/workspace/poster-redesign/poster_full.png') print('Size:', img.size) print('Mode:', img.mode) "
# Check where the poster content ends (find last non-background row) python3 -c " from PIL import Image import numpy as np img = Image.open('/home/daytona/workspace/poster-redesign/poster_full.png') arr = np.array(img) # Background color is roughly (10, 10, 46) from body bg # Find the last row that's NOT background bg_color = np.array([10, 10, 46]) for row in range(arr.shape[0]-1, -1, -1): row_data = arr[row] # check if any pixel differs from bg significantly diff = np.abs(row_data.astype(int) - bg_color).max(axis=1) if diff.max() > 20: print('Last content row:', row) break "
python3 -c " from PIL import Image img = Image.open('/home/daytona/workspace/poster-redesign/poster_full.png') # Crop to content + small padding cropped = img.crop((0, 0, 860, 1700)) cropped.save('/home/daytona/workspace/poster-redesign/poster_final.png', 'PNG', optimize=True) print('Saved:', cropped.size) "
poster final
Image · PNG
poster
HTML File · HTML
Create a printable PDF version of the poster
python3 -c " from PIL import Image from reportlab.lib.pagesizes import A4 from reportlab.platypus import SimpleDocTemplate from reportlab.lib.utils import ImageReader from reportlab.pdfgen import canvas import io # A4 dimensions in points (1 pt = 1/72 inch) A4_W, A4_H = A4 # 595.28 x 841.89 pts # Load the poster image img = Image.open('/home/daytona/workspace/poster-redesign/poster_final.png') img_w, img_h = img.size print(f'Image size: {img_w}x{img_h}') # Calculate scale to fit A4 with 15pt margin on each side margin = 15 usable_w = A4_W - 2 * margin usable_h = A4_H - 2 * margin scale_w = usable_w / img_w scale_h = usable_h / img_h scale = min(scale_w, scale_h) draw_w = img_w * scale draw_h = img_h * scale # Center on page x = (A4_W - draw_w) / 2 y = (A4_H - draw_h) / 2 print(f'Drawing at ({x:.1f},{y:.1f}) size {draw_w:.1f}x{draw_h:.1f} pts') out_path = '/home/daytona/workspace/poster-redesign/poster_printable.pdf' c = canvas.Canvas(out_path, pagesize=A4) c.setTitle('Sarkari Pariseba Sahayata Kendra - Poster') c.setAuthor('Orris') c.setSubject('Government Service Assistance Center') # Draw image c.drawImage( ImageReader('/home/daytona/workspace/poster-redesign/poster_final.png'), x, y, width=draw_w, height=draw_h, preserveAspectRatio=True ) c.save() print('PDF saved to', out_path) "
# First update the HTML slightly for print/A4 sizing, then use Chromium to print to PDF # Check if the HTML already has print styles; add them if needed # Also use chromium --print-to-pdf which gives crisp vector-like rendering /usr/bin/chromium --headless --no-sandbox --disable-gpu \ --print-to-pdf="/home/daytona/workspace/poster-redesign/poster_printable_v2.pdf" \ --print-to-pdf-no-header \ --no-pdf-header-footer \ "file:///home/daytona/workspace/poster-redesign/poster.html" 2>&1 | tail -5 ls -la /home/daytona/workspace/poster-redesign/*.pdf
~/poster-redesign/poster.html
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/poster-redesign/poster.html'
# Generate PDF with A4 paper size flag and no headers/footers /usr/bin/chromium --headless --no-sandbox --disable-gpu \ --print-to-pdf="/home/daytona/workspace/poster-redesign/poster_A4_print.pdf" \ --print-to-pdf-no-header \ --no-pdf-header-footer \ "file:///home/daytona/workspace/poster-redesign/poster.html" 2>&1 | tail -3 echo "---" ls -lh /home/daytona/workspace/poster-redesign/poster_A4_print.pdf
# Verify the PDF page count and dimensions using pypdf python3 -c " from pypdf import PdfReader r = PdfReader('/home/daytona/workspace/poster-redesign/poster_A4_print.pdf') print('Pages:', len(r.pages)) page = r.pages[0] w = float(page.mediabox.width) h = float(page.mediabox.height) print(f'Page size: {w:.1f} x {h:.1f} pts ({w/72*25.4:.1f} x {h/72*25.4:.1f} mm)') # A4 = 595.28 x 841.89 pts = 210 x 297 mm "
~/poster-redesign/poster.html
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/poster-redesign/poster.html'
python3 << 'EOF' from PIL import Image from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4 from reportlab.lib.utils import ImageReader # A4 in points A4_W, A4_H = A4 # 595.28 x 841.89 # Load the poster img = Image.open('/home/daytona/workspace/poster-redesign/poster_final.png') img_w, img_h = img.size # We want the poster to fill the page with small margins margin = 12 # pts ~4mm usable_w = A4_W - 2 * margin usable_h = A4_H - 2 * margin scale = min(usable_w / img_w, usable_h / img_h) draw_w = img_w * scale draw_h = img_h * scale x = (A4_W - draw_w) / 2 y = (A4_H - draw_h) / 2 print(f"Poster draw area: {draw_w:.1f}x{draw_h:.1f} pts at ({x:.1f},{y:.1f})") print(f"Coverage: {draw_w/A4_W*100:.1f}% x {draw_h/A4_H*100:.1f}%") out_path = '/home/daytona/workspace/poster-redesign/Sarkari_Pariseba_Poster_Print.pdf' c = canvas.Canvas(out_path, pagesize=A4) c.setTitle('সরকারি পরিষেবা সহায়তা কেন্দ্র - Printable Poster') c.setAuthor('Orris') c.setSubject('Government Service Assistance Center - Bengali Poster') # Fill background to match poster edges c.setFillColorRGB(0.04, 0.04, 0.18) # #0a0a2e c.rect(0, 0, A4_W, A4_H, fill=1, stroke=0) # Draw the poster image c.drawImage( ImageReader('/home/daytona/workspace/poster-redesign/poster_final.png'), x, y, width=draw_w, height=draw_h, preserveAspectRatio=True ) c.save() print(f"Saved: {out_path}") # Verify from pypdf import PdfReader r = PdfReader(out_path) pg = r.pages[0] print(f"PDF pages: {len(r.pages)}, Size: {float(pg.mediabox.width):.1f}x{float(pg.mediabox.height):.1f} pts") EOF
# Generate a high-res screenshot at exactly A4 proportions (794x1123 px at 96dpi = A4) # Then embed it in a PDF for crisp output /usr/bin/chromium --headless --no-sandbox --disable-gpu \ --screenshot=/home/daytona/workspace/poster-redesign/poster_a4_hires.png \ --window-size=794,1400 \ --force-device-scale-factor=2 \ "file:///home/daytona/workspace/poster-redesign/poster.html" 2>&1 | tail -2 python3 << 'EOF' from PIL import Image import numpy as np img = Image.open('/home/daytona/workspace/poster-redesign/poster_a4_hires.png') arr = np.array(img) # Find last content row bg = np.array([10, 10, 46]) for row in range(arr.shape[0]-1, -1, -1): if np.abs(arr[row].astype(int) - bg).max() > 20: print('Last content row:', row, '/ total:', arr.shape[0]) break cropped = img.crop((0, 0, img.width, row + 20)) cropped.save('/home/daytona/workspace/poster-redesign/poster_a4_cropped.png') print('Cropped size:', cropped.size) EOF
python3 << 'EOF' from PIL import Image from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4 from reportlab.lib.utils import ImageReader from pypdf import PdfReader # A4 in points A4_W, A4_H = A4 # 595.28 x 841.89 # Load the high-res cropped poster img = Image.open('/home/daytona/workspace/poster-redesign/poster_a4_cropped.png') img_w, img_h = img.size print(f"Hi-res image: {img_w}x{img_h}") # Fit to A4 with 8pt margin all around margin = 8 usable_w = A4_W - 2 * margin usable_h = A4_H - 2 * margin scale = min(usable_w / img_w, usable_h / img_h) draw_w = img_w * scale draw_h = img_h * scale x = (A4_W - draw_w) / 2 y = (A4_H - draw_h) / 2 print(f"Draw: {draw_w:.1f}x{draw_h:.1f} pts coverage: {draw_w/A4_W*100:.1f}% x {draw_h/A4_H*100:.1f}%") out_path = '/home/daytona/workspace/poster-redesign/Sarkari_Pariseba_Poster_Print.pdf' c = canvas.Canvas(out_path, pagesize=A4) c.setTitle('সরকারি পরিষেবা সহায়তা কেন্দ্র - Printable Poster') c.setAuthor('Orris') c.setSubject('Government Service Assistance Center') # Dark background matching poster c.setFillColorRGB(0.04, 0.04, 0.18) c.rect(0, 0, A4_W, A4_H, fill=1, stroke=0) c.drawImage( ImageReader('/home/daytona/workspace/poster-redesign/poster_a4_cropped.png'), x, y, width=draw_w, height=draw_h, preserveAspectRatio=True ) c.save() print(f"Saved: {out_path}") r = PdfReader(out_path) pg = r.pages[0] print(f"Pages: {len(r.pages)}, size: {float(pg.mediabox.width):.0f}x{float(pg.mediabox.height):.0f} pts = A4") import os size_kb = os.path.getsize(out_path) // 1024 print(f"File size: {size_kb} KB") EOF
Sarkari Pariseba Poster Print
PDF Document · PDF
print-color-adjust: exact - all gradients, backgrounds and colors are preservedTotaly in english
~/poster-redesign/poster_english.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Government Service Assistance Center</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
@page { size: A4 portrait; margin: 10mm; }
body {
font-family: 'Inter', sans-serif;
background: #0a0a2e;
display: flex;
justify-content: center;
align-items: flex-start;
min-height: 100vh;
padding: 20px;
}
.poster {
width: 800px;
background: linear-gradient(160deg, #0d1b4b 0%, #0a2a6e 40%, #0d1b4b 100%);
border-radius: 24px;
overflow: hidden;
box-shadow: 0 0 60px rgba(0,120,255,0.4), 0 0 120px rgba(0,60,180,0.2);
border: 2px solid rgba(100,180,255,0.3);
position: relative;
}
.poster::before {
content: '';
position: absolute;
inset: 0;
background-image: radial-gradient(circle, rgba(255,255,255,0.04) 1px, transparent 1px);
background-size: 28px 28px;
pointer-events: none;
z-index: 0;
}
.poster > * { position: relative; z-index: 1; }
/* ===== HEADER ===== */
.header {
background: linear-gradient(135deg, #1a237e 0%, #0d47a1 55%, #1565c0 100%);
padding: 22px 26px 16px;
position: relative;
overflow: hidden;
}
.header::after {
content: '';
position: absolute;
bottom: 0; left: 0; right: 0;
height: 4px;
background: linear-gradient(90deg, #ffd700, #ff6b00, #ffd700);
}
.header-top {
display: flex;
align-items: center;
justify-content: space-between;
gap: 14px;
}
.header-left {
display: flex;
align-items: center;
gap: 14px;
flex: 1;
}
.logo-circle {
width: 70px; height: 70px;
background: linear-gradient(135deg, #ffd700, #ff8c00);
border-radius: 50%;
display: flex; align-items: center; justify-content: center;
font-size: 34px; flex-shrink: 0;
box-shadow: 0 4px 20px rgba(255,215,0,0.45);
border: 3px solid rgba(255,255,255,0.35);
}
.title-block .pre-title {
font-size: 15px; font-weight: 700;
color: rgba(255,255,255,0.75);
letter-spacing: 3px; text-transform: uppercase;
margin-bottom: 3px;
}
.title-block h1 {
font-size: 14px; font-weight: 700;
color: #ffd700;
letter-spacing: 2px; text-transform: uppercase;
margin-bottom: 2px;
}
.title-block h2 {
font-size: 32px; font-weight: 900;
color: #ffffff;
line-height: 1.1;
text-shadow: 2px 2px 10px rgba(0,0,0,0.5);
letter-spacing: 0.5px;
}
.badge {
background: linear-gradient(135deg, #c62828, #e53935);
color: white;
border-radius: 14px;
padding: 10px 14px;
text-align: center;
font-size: 12.5px; font-weight: 700;
line-height: 1.6;
box-shadow: 0 4px 15px rgba(200,0,0,0.4);
border: 2px solid rgba(255,120,120,0.35);
flex-shrink: 0;
}
.badge .stars { color: #ffd700; font-size: 15px; margin-top: 4px; }
.tagline {
margin-top: 12px;
background: linear-gradient(90deg, rgba(255,255,255,0.06), rgba(255,215,0,0.1), rgba(255,255,255,0.06));
border: 1px solid rgba(255,215,0,0.3);
border-radius: 8px;
padding: 8px 14px;
text-align: center;
color: #fff; font-size: 14px; font-weight: 600;
letter-spacing: 0.3px;
}
/* ===== CONTENT ===== */
.content { padding: 16px 18px; display: flex; flex-direction: column; gap: 14px; }
.divider {
height: 2px;
background: linear-gradient(90deg, transparent, rgba(100,180,255,0.3), rgba(255,215,0,0.4), rgba(100,180,255,0.3), transparent);
border-radius: 2px;
}
/* ===== SERVICES + CHARGES ===== */
.top-row { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.services-list {
background: linear-gradient(135deg, rgba(255,255,255,0.06), rgba(255,255,255,0.02));
border: 1.5px solid rgba(100,180,255,0.22);
border-radius: 16px; overflow: hidden;
}
.service-item {
display: flex; align-items: center; gap: 12px;
padding: 12px 14px;
border-bottom: 1px solid rgba(255,255,255,0.07);
}
.service-item:last-child { border-bottom: none; }
.s-icon {
width: 44px; height: 44px; border-radius: 12px;
display: flex; align-items: center; justify-content: center;
font-size: 22px; flex-shrink: 0;
}
.s-green { background: linear-gradient(135deg, #1b5e20, #2e7d32); }
.s-blue { background: linear-gradient(135deg, #0d47a1, #1565c0); }
.s-orange { background: linear-gradient(135deg, #bf360c, #e64a19); }
.s-text .s-title { font-size: 14.5px; font-weight: 800; color: #ffd700; }
.s-text .s-sub { font-size: 12px; color: rgba(255,255,255,0.7); margin-top: 2px; }
.check {
margin-left: auto;
width: 26px; height: 26px;
background: linear-gradient(135deg, #00c853, #00e676);
border-radius: 50%;
display: flex; align-items: center; justify-content: center;
font-size: 13px; color: white; flex-shrink: 0;
font-weight: 800;
}
.charges-card {
background: linear-gradient(135deg, rgba(255,255,255,0.06), rgba(255,255,255,0.02));
border: 1.5px solid rgba(255,165,0,0.28);
border-radius: 16px; overflow: hidden;
}
.charges-hdr {
background: linear-gradient(90deg, #c62828, #b71c1c);
padding: 10px 14px;
color: white; font-size: 15px; font-weight: 800; text-align: center;
}
.charge-row {
display: flex; align-items: center; justify-content: space-between;
padding: 11px 14px;
border-bottom: 1px solid rgba(255,255,255,0.07);
}
.charge-row:last-child { border-bottom: none; }
.c-label { font-size: 13.5px; font-weight: 700; color: white; }
.c-sub { font-size: 11.5px; color: rgba(255,255,255,0.55); }
.price {
font-size: 22px; font-weight: 900;
border-radius: 10px; padding: 5px 12px; color: white;
}
.p-green { background: linear-gradient(135deg, #1b5e20, #2e7d32); }
.p-purple { background: linear-gradient(135deg, #4a148c, #6a1b9a); }
.p-orange { background: linear-gradient(135deg, #bf360c, #e64a19); }
/* ===== LOCATION + TIMING ===== */
.mid-row { display: grid; grid-template-columns: 1.15fr 0.85fr; gap: 14px; }
.loc-card {
background: linear-gradient(135deg, rgba(255,255,255,0.06), rgba(255,255,255,0.02));
border: 1.5px solid rgba(100,220,100,0.22);
border-radius: 16px; overflow: hidden;
}
.loc-hdr {
background: linear-gradient(90deg, #1b5e20, #2e7d32);
padding: 9px 14px; color: white; font-size: 14.5px; font-weight: 800;
display: flex; align-items: center; gap: 7px;
}
.loc-body {
padding: 13px 14px;
color: rgba(255,255,255,0.83); font-size: 13px; line-height: 1.85;
}
.loc-body .hl1 { color: #ff6b6b; font-weight: 700; }
.loc-body .hl2 { color: #ffd700; font-weight: 700; }
.map-box {
margin-top: 10px;
background: rgba(255,255,255,0.05);
border-radius: 10px; padding: 9px;
text-align: center; font-size: 30px;
}
.time-card {
background: linear-gradient(135deg, rgba(255,255,255,0.06), rgba(255,255,255,0.02));
border: 1.5px solid rgba(100,180,255,0.22);
border-radius: 16px; overflow: hidden;
}
.time-hdr {
background: linear-gradient(90deg, #0d47a1, #1565c0);
padding: 9px 14px; color: white; font-size: 14.5px; font-weight: 800;
display: flex; align-items: center; gap: 7px;
}
.time-body { padding: 12px 14px; }
.time-slot {
background: rgba(255,255,255,0.05);
border: 1px solid rgba(255,255,255,0.1);
border-radius: 11px; padding: 10px 12px;
margin-bottom: 9px;
display: flex; gap: 10px; align-items: flex-start;
}
.time-slot:last-child { margin-bottom: 0; }
.t-icon { font-size: 20px; flex-shrink: 0; }
.t-day { font-size: 13px; font-weight: 800; color: #ffd700; }
.t-time { font-size: 12px; color: rgba(255,255,255,0.78); margin-top: 2px; line-height: 1.5; }
/* ===== CONTACT METHODS ===== */
.contact-strip {
display: grid;
grid-template-columns: 1fr 44px 1fr;
gap: 8px; align-items: center;
}
.cc {
border-radius: 14px; padding: 13px 14px;
display: flex; align-items: center; gap: 12px;
border: 1.5px solid;
}
.cc-visit { background: linear-gradient(135deg,rgba(255,193,7,.12),rgba(255,152,0,.08)); border-color: rgba(255,193,7,.3); }
.cc-online { background: linear-gradient(135deg,rgba(37,211,102,.12),rgba(0,200,83,.08)); border-color: rgba(37,211,102,.3); }
.cc-icon { font-size: 32px; flex-shrink: 0; }
.cc-text { font-size: 13px; font-weight: 700; color: white; line-height: 1.6; }
.cc-text span { color: #ffd700; }
.or-circle {
background: linear-gradient(135deg, #c62828, #e53935);
color: white; font-size: 11px; font-weight: 800;
width: 40px; height: 40px; border-radius: 50%;
display: flex; align-items: center; justify-content: center;
text-align: center; box-shadow: 0 3px 12px rgba(200,0,0,0.4);
line-height: 1.2;
}
/* ===== DOCUMENTS ===== */
.docs-card {
background: linear-gradient(135deg, rgba(255,255,255,0.05), rgba(255,255,255,0.02));
border: 1.5px solid rgba(255,215,0,0.18);
border-radius: 16px; overflow: hidden;
}
.docs-hdr {
background: linear-gradient(90deg, #4a148c, #6a1b9a);
padding: 9px 16px; color: white; font-size: 14.5px; font-weight: 800;
display: flex; align-items: center; gap: 7px;
}
.docs-grid {
display: grid; grid-template-columns: repeat(7, 1fr);
gap: 8px; padding: 13px 14px;
}
.doc-item { display: flex; flex-direction: column; align-items: center; gap: 5px; text-align: center; }
.doc-icon-box {
width: 50px; height: 50px; border-radius: 11px;
background: rgba(255,255,255,0.08);
border: 1px solid rgba(255,255,255,0.14);
display: flex; align-items: center; justify-content: center;
font-size: 24px;
}
.doc-label { font-size: 10.5px; color: rgba(255,255,255,0.78); font-weight: 600; line-height: 1.3; }
/* ===== WARNING + PHONE ===== */
.bottom-row { display: grid; grid-template-columns: 1fr auto; gap: 12px; align-items: center; }
.warn-box {
background: linear-gradient(135deg, rgba(255,193,7,.12), rgba(255,152,0,.08));
border: 1.5px solid rgba(255,193,7,.32);
border-radius: 12px; padding: 11px 14px;
display: flex; gap: 9px; align-items: flex-start;
}
.warn-icon { font-size: 20px; flex-shrink: 0; margin-top: 2px; }
.warn-text { font-size: 12px; color: rgba(255,255,255,0.84); line-height: 1.7; font-weight: 500; }
.phone-box {
background: linear-gradient(135deg, #0d47a1, #1565c0);
border-radius: 14px; padding: 11px 18px; text-align: center;
border: 2px solid rgba(100,180,255,0.38);
box-shadow: 0 4px 18px rgba(0,80,200,0.3);
white-space: nowrap;
}
.phone-label { font-size: 11px; color: rgba(255,255,255,0.7); font-weight: 600; margin-bottom: 2px; }
.phone-number { font-size: 23px; font-weight: 900; color: #ffd700; letter-spacing: 1.5px; }
/* ===== FOOTER ===== */
.footer {
background: linear-gradient(135deg, #1b1b3a, #0d1b4b);
border-top: 2px solid rgba(255,215,0,0.28);
padding: 11px 18px;
}
.footer-line1 {
text-align: center; color: rgba(255,255,255,0.72);
font-size: 12.5px; font-weight: 600;
margin-bottom: 5px;
}
.footer-line2 {
text-align: center; font-size: 14.5px; font-weight: 800;
background: linear-gradient(90deg, #ffd700, #ff8c00, #ffd700);
-webkit-background-clip: text; -webkit-text-fill-color: transparent;
background-clip: text;
}
</style>
</head>
<body>
<div class="poster">
<!-- HEADER -->
<div class="header">
<div class="header-top">
<div class="header-left">
<div class="logo-circle">🏛️</div>
<div class="title-block">
<div class="pre-title">Official | Trusted | Fast</div>
<h1>Government</h1>
<h2>Service Assistance Center</h2>
</div>
</div>
<div class="badge">
Trustworthy<br>Reliable<br>Fast Service
<div class="stars">★ ★ ★</div>
</div>
</div>
<div class="tagline">✦ Work done easily, quickly and accurately ✦</div>
</div>
<!-- CONTENT -->
<div class="content">
<!-- SERVICES + CHARGES -->
<div class="top-row">
<div class="services-list">
<div class="service-item">
<div class="s-icon s-green">🔗</div>
<div class="s-text">
<div class="s-title">DBT — Direct Benefit Transfer</div>
<div class="s-sub">Linking service available</div>
</div>
<div class="check">✓</div>
</div>
<div class="service-item">
<div class="s-icon s-blue">🪪</div>
<div class="s-text">
<div class="s-title">ABHA (Ayushman Bharat) Card</div>
<div class="s-sub">Application processing done here</div>
</div>
<div class="check">✓</div>
</div>
<div class="service-item">
<div class="s-icon s-orange">🏺</div>
<div class="s-text">
<div class="s-title" style="color:#ff8c00;">Annapurna Bhandar Form</div>
<div class="s-sub">Online submission handled here</div>
</div>
<div class="check">✓</div>
</div>
</div>
<div class="charges-card">
<div class="charges-hdr">💰 Service Charges</div>
<div class="charge-row">
<div><div class="c-label">DBT Linking</div></div>
<div class="price p-green">₹20</div>
</div>
<div class="charge-row">
<div><div class="c-label">ABHA Card</div></div>
<div class="price p-purple">₹25</div>
</div>
<div class="charge-row">
<div>
<div class="c-label">Annapurna Bhandar</div>
<div class="c-sub">Online Form</div>
</div>
<div class="price p-orange">₹50</div>
</div>
</div>
</div>
<div class="divider"></div>
<!-- LOCATION + TIMING -->
<div class="mid-row">
<div class="loc-card">
<div class="loc-hdr">📍 Location</div>
<div class="loc-body">
Near <strong>Bishnupur State Bank</strong>, Ramakrishna Pally,<br>
on the road towards <span class="hl1">Radhaloy</span>,<br>
through the lane next to <span class="hl1">Thakur Telecom</span> —<br>
the very <span class="hl2">last house</span> at the end of the road.
<div class="map-box">🗺️ 🏠</div>
</div>
</div>
<div class="time-card">
<div class="time-hdr">🕐 Service Hours</div>
<div class="time-body">
<div class="time-slot">
<div class="t-icon">📅</div>
<div>
<div class="t-day">Every Sunday</div>
<div class="t-time">10:00 AM – 9:00 PM</div>
</div>
</div>
<div class="time-slot">
<div class="t-icon">📅</div>
<div>
<div class="t-day">Other Days</div>
<div class="t-time">6:00 PM – 9:00 PM</div>
</div>
</div>
</div>
</div>
</div>
<!-- CONTACT METHODS -->
<div class="contact-strip">
<div class="cc cc-visit">
<div class="cc-icon">🏠</div>
<div class="cc-text">
Visit us in person<br>
<span>and get your work done</span>
</div>
</div>
<div class="or-circle">OR</div>
<div class="cc cc-online">
<div class="cc-icon">💬</div>
<div class="cc-text">
Send documents via<br>
<span>WhatsApp / Online</span>
</div>
</div>
</div>
<div class="divider"></div>
<!-- DOCUMENTS -->
<div class="docs-card">
<div class="docs-hdr">📁 Required Documents (bring whatever you have)</div>
<div class="docs-grid">
<div class="doc-item">
<div class="doc-icon-box">🪪</div>
<div class="doc-label">Aadhaar Card</div>
</div>
<div class="doc-item">
<div class="doc-icon-box">📔</div>
<div class="doc-label">Bank Passbook</div>
</div>
<div class="doc-item">
<div class="doc-icon-box">📱</div>
<div class="doc-label">Mobile No. linked to Aadhaar</div>
</div>
<div class="doc-item">
<div class="doc-icon-box">💳</div>
<div class="doc-label">PAN Card</div>
</div>
<div class="doc-item">
<div class="doc-icon-box">📜</div>
<div class="doc-label">Pension Card (if any)</div>
</div>
<div class="doc-item">
<div class="doc-icon-box">🗳️</div>
<div class="doc-label">Voter ID Card</div>
</div>
<div class="doc-item">
<div class="doc-icon-box">📄</div>
<div class="doc-label">Income Certificate (if any)</div>
</div>
</div>
</div>
<!-- WARNING + PHONE -->
<div class="bottom-row">
<div class="warn-box">
<div class="warn-icon">⚠️</div>
<div class="warn-text">
Please call ahead to confirm which documents are required before visiting.<br>
Make sure you have all necessary documents before coming in.
</div>
</div>
<div class="phone-box">
<div class="phone-label">📞 Contact Us</div>
<div class="phone-number">76998 44219</div>
</div>
</div>
</div><!-- /content -->
<!-- FOOTER -->
<div class="footer">
<div class="footer-line1">
⭐ Time is no barrier — feel free to contact us any day ⭐
</div>
<div class="footer-line2">
➤ Your Service, Our Responsibility ➤
</div>
</div>
</div>
</body>
</html>
/usr/bin/chromium --headless --no-sandbox --disable-gpu \ --screenshot=/home/daytona/workspace/poster-redesign/poster_english_raw.png \ --window-size=840,2400 \ --force-device-scale-factor=2 \ "file:///home/daytona/workspace/poster-redesign/poster_english.html" 2>&1 | tail -2 python3 -c " from PIL import Image import numpy as np img = Image.open('/home/daytona/workspace/poster-redesign/poster_english_raw.png') arr = np.array(img) bg = np.array([10,10,46]) for row in range(arr.shape[0]-1,-1,-1): if np.abs(arr[row].astype(int)-bg).max() > 20: print('Last content row:', row, '/ total:', arr.shape[0]) cropped = img.crop((0,0,img.width,row+24)) cropped.save('/home/daytona/workspace/poster-redesign/poster_english_crop.png') print('Cropped size:', cropped.size) break "
python3 << 'EOF' from PIL import Image from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4 from reportlab.lib.utils import ImageReader from pypdf import PdfReader import os A4_W, A4_H = A4 img = Image.open('/home/daytona/workspace/poster-redesign/poster_english_crop.png') img_w, img_h = img.size print(f"Source image: {img_w}x{img_h} px") margin = 10 usable_w = A4_W - 2*margin usable_h = A4_H - 2*margin scale = min(usable_w/img_w, usable_h/img_h) draw_w = img_w * scale draw_h = img_h * scale x = (A4_W - draw_w) / 2 y = (A4_H - draw_h) / 2 print(f"Draw: {draw_w:.1f}x{draw_h:.1f} pts | Coverage: {draw_w/A4_W*100:.1f}% x {draw_h/A4_H*100:.1f}%") out = '/home/daytona/workspace/poster-redesign/Government_Service_Center_Poster.pdf' c = canvas.Canvas(out, pagesize=A4) c.setTitle('Government Service Assistance Center') c.setAuthor('Orris') c.setSubject('Printable Poster - A4') # Dark background c.setFillColorRGB(0.04, 0.04, 0.18) c.rect(0, 0, A4_W, A4_H, fill=1, stroke=0) c.drawImage(ImageReader('/home/daytona/workspace/poster-redesign/poster_english_crop.png'), x, y, width=draw_w, height=draw_h, preserveAspectRatio=True) c.save() r = PdfReader(out) pg = r.pages[0] kb = os.path.getsize(out)//1024 print(f"Saved: {out}") print(f"Pages: {len(r.pages)} | Size: {float(pg.mediabox.width):.0f}x{float(pg.mediabox.height):.0f} pts (A4) | {kb} KB") EOF
Government Service Center Poster
PDF Document · PDF
poster english
HTML File · HTML
| Original (Bengali) | English |
|---|---|
| সরকারি পরিষেবা সহায়তা কেন্দ্র | Government Service Assistance Center |
| DBT লিংক করা হয় | DBT — Direct Benefit Transfer linking |
| ABHA (আভা) কার্ড অ্যাপ্লাই করা হয় | ABHA (Ayushman Bharat) Card application |
| অনুপূর্ণা ভান্ডার ফর্ম | Annapurna Bhandar Form |
| পরিষেবার চার্জ | Service Charges |
| লোকেশন | Location |
| পরিষেবার সময় | Service Hours |
| প্রত্যেক রবিবার / অন্যান্য দিন | Every Sunday / Other Days |
| প্রয়োজনীয় ডকুমেন্টস | Required Documents |
| যোগাযোগ করুন | Contact Us |
| আপনার সেবা, আমাদের দায়িত্ব | Your Service, Our Responsibility |