| Year | URL |
|---|---|
| 2025 (recent rolls) | https://voters.eci.gov.in/download-eroll |
| 2002 (historical WB) | https://ceowestbengal.wb.gov.in/Roll_ps/`<AC_NUMBER>` |
- State →
West Bengal(codeS25) - Year of Revision → e.g.
2025 - Roll Type →
Final Roll 2025 - District → e.g.
DARJEELING - Assembly Constituency → e.g.
25 - Matigara-Naxalbari - Language →
BENGALI
- Use the Search box to filter by part number (e.g.
259) - Check the checkbox next to the matching part
⚠️ The checkbox unchecks itself after every CAPTCHA attempt — always re-check it before clicking Download
- Always zoom in on the CAPTCHA image before reading it
- Click the ↻ refresh icon to get a new CAPTCHA if unsure
- A
400response = wrong CAPTCHA - A
200response = accepted ✓
1. POST → gateway-voters.eci.gov.in/api/v1/printing-publish/generate-published-pdfs
← { "payload": ["<fileId>"], "status": "Success" }
2. XHR GET → gateway-vpd.eci.gov.in/api/v1/ext-printing-publish/get-published-file?fileId=<fileId>
← { "payload": "<base64 PDF>", "refId": "<filename>.pdf" }
⚠️ ThefileIdexpires very quickly — capture the XHR response immediately after clicking Download. The two gateways are different:gateway-votersfor POST,gateway-vpdfor GET.
window._fullPdfPayload = null;
window._fullPdfFilename = null;
const origOpen = XMLHttpRequest.prototype.open;
const origSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.open = function(m, url, ...r) {
this._url2 = url;
return origOpen.apply(this, [m, url, ...r]);
};
XMLHttpRequest.prototype.send = function(b) {
if ((this._url2 || '').includes('get-published-file')) {
this.addEventListener('load', function() {
const data = JSON.parse(this.responseText);
if (data.payload && data.payload.length > 100) {
window._fullPdfPayload = data.payload;
window._fullPdfFilename = data.refId || 'voter_roll.pdf';
}
});
}
return origSend.apply(this, [b]);
};const bytes = new Uint8Array(atob(window._fullPdfPayload).split('').map(c => c.charCodeAt(0)));
const blob = new Blob([bytes], { type: 'application/pdf' });
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = window._fullPdfFilename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);- Go to
https://ceowestbengal.wb.gov.in/Roll_ps/<AC_NUMBER>(e.g./Roll_ps/25for AC 25) - Find the Part row and click the Final Roll link
- Solve the CAPTCHA in the dialog that appears
window.open = function(url) {
window._capturedPdfUrl = url;
return null;
};fetch(window._capturedPdfUrl, { credentials: 'include' })
.then(r => r.blob())
.then(blob => {
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = '2002_WB_AC025_Part042.pdf';
document.body.appendChild(a);
a.click();
});2025-EROLLGEN-S25-25-FinalRoll-Revision1-BEN-259-WI.pdf
│ │ │
│ │ └─ Part number (259 = North Bengal University Primary School)
│ └─ Assembly Constituency number (25 = Matigara-Naxalbari)
└─ State code (S25 = West Bengal)
| Segment | Meaning |
|---|---|
S25 |
West Bengal state code |
25 |
Assembly Constituency number |
FinalRoll |
Roll type |
BEN |
Bengali language |
259 |
Part number |
WI |
Women Inclusive / Ward Index suffix |
Both PDFs are scanned images — pdfplumber and PyPDF2 won't work. Use EasyOCR with the Bengali model.
import fitz
import easyocr
import numpy as np
reader = easyocr.Reader(['bn'], gpu=False)
doc = fitz.open("voter_roll.pdf")
for i, page in enumerate(doc):
# Render at 3x zoom for better OCR accuracy
pix = page.get_pixmap(matrix=fitz.Matrix(3, 3))
img = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.h, pix.w, pix.n)
results = reader.readtext(img, detail=0)
for text in results:
if "নন্দ" in text or "আশীষ" in text or "সৌরদীপ" in text:
print(f"Page {i+1}: {text}")
⚠️ The 2002 PDF uses a non-Unicode legacy Bengali font — the text layer is garbage. OCR is the only reliable method for both PDFs.
| AC No. | Name | Notes |
|---|---|---|
| 23 | Darjeeling | |
| 24 | Kurseong | |
| 25 | Matigara-Naxalbari | North Bengal University area |
| 26 | Siliguri | Called "Siliguri" in 2002 rolls |
| 27 | Phansidewa |
Part 259 of AC 25 = North Bengal University Primary School Part 42 of AC 25 = same area in the 2002 roll