Önceki bir yazımda YSK'nın yayınladığı sandık sonuçlarının analiz edilmesi zor bir PDF rapor formatında yayınlandığından bahsetmiştim. Bu PDF dokümanları bilgisayarda işlenebilir hale getirmek için yaptığım çalışmayı ise burada anlatacağım.
Öncelikle PDF dokümanları metin formatına çevirmek için bir yazılım arayışına girdim. Bir PDF dokümanı içerisinde metinler okunuş sırasına göre değil, rastgele dağnık olarak bulunabilirler. Her metin "nesnesi" koordinatları ve yönü ile birlikte saklandığı için örneğin her kelime hatta her harf dosya içerisinde farklı bir dizilişte bulunabilir. Bu nedenle, tabloları düz metne çevirmeye çalıştığınızda ortaya bir harf çorbsı çıkabilir.
Denediğim yazılımlardan birincisi
xpdf paketi içerisindeki
pdftotext programı oldu. Ancak elde ettiğim sonuç pek başarılı değildi...
pdftotext -enc UTF-8 yenimahalle1-P.pdf
298/108 Kanun M;2839/32,Geçici 5.
MİLLETVEKİLİ SEÇİMİNDE İLÇE SEÇİM KURULLARINCA DÜZENLENECEK SİYASİ PARTİLERİN VE BAĞIMSIZ ADAYLARIN ALDIKLARI OYLARIN SAYISINI GÖSTEREN BİRLEŞTİRME TUTANAĞI
SİYASİ PARTİ/BAĞIMSIZ ADAY GÖZLEMCİLERİ Partinin Adı CHP SP MHP Gözlemcileri Soyadı TOKER ÖZTÜRK TÜRKEL ÜNSAL EROL ALİ İHSAN Adı SİYASİ PARTİ/BAĞIMSIZ ADAY GÖZLEMCİLERİ Partinin Adı Gözlemcileri Soyadı Adı SİYASİ PARTİ/BAĞIMSIZ ADAY GÖZLEMCİLERİ Partinin Adı Gözlemcileri Soyadı Adı
...
...
Tüm içerik mevcut olmasına rağmen bunları ayırmak ve hatasız olarak bir tablo haline getirmek mümkün değil.
Denediğim ikinci yazılım bir perl modülü olan
CAM::PDF oldu. Bu paketin içerisindeki örnek betiklerden olan
renderpdf.pl bana değişik ama kullanılabilir bir çıktı üretti:
renderpdf.pl yenimahalle1-P.pdf 1
( 0.00, 595.00) ( 0.00, 595.00)
( 139.43, 563.76) ( 139.43, 563.76) MİLLETVEKİLİ SEÇİMİNDE İLÇE SEÇİM KURULLARINCA DÜZENLENECEK SİYASİ PARTİLERİN VE BAĞIMSIZ ADAYLARIN ALDIKLARI
( 298.72, 552.91) ( 298.72, 552.91) OYLARIN SAYISINI GÖSTEREN BİRLEŞTİRME TUTANAĞI
( 30.00, 569.27) ( 30.00, 569.27) 298/108
( 30.00, 561.87) ( 30.00, 561.87) Kanun M;2839/32,Geçici 5.
( 784.00, 568.27) ( 784.00, 568.27) Örnek 90
( 33.33, 409.98) ( 33.33, 409.98) KÖY VE MAHALLE
( 50.83, 403.73) ( 50.83, 403.73) ADI
( 90.40, 379.74) ( 104.74, 344.60) Sandık Kurulu Numaraları
( 108.40, 358.20) ( 101.20, 344.60) Seçmen Listesinde Yazılı Seçmenlerin Sayısı
( 126.40, 372.65) ( 133.65, 344.60) Oy Kullanan Seçmenlerin Sayısı
( 141.52, 366.96) ( 145.96, 347.48) İtiraz Edilmeksizin Geçerli Sayılan Oy
( 147.77, 386.27) ( 165.27, 341.23) Pusulalarının Sayısı
( 159.52, 366.96) ( 163.96, 347.48) İtiraz Edilen Fakat Geçerli Sayılan Oy
( 165.77, 386.27) ( 183.27, 341.23) Pusulalarının Sayısı
( 180.40, 371.68) ( 186.68, 344.60) Geçerli Oy Pusulalarının Toplamı
( 480.82, 454.22) ( 480.82, 454.22) SİYASİ PARTİLER
( 192.31, 537.22) ( 192.31, 537.22) SİYASİ PARTİ/BAĞIMSIZ ADAY GÖZLEMCİLERİ
( 183.49, 522.22) ( 183.49, 522.22) Partinin Adı
( 282.50, 527.22) ( 282.50, 527.22) Gözlemcileri
( 259.66, 517.22) ( 259.66, 517.22) Soyadı
Her metin bloğu koordinatları ile birlikte verildiğinde, tabloyu yeniden oluşturmak için tahminlerde bulunmak gerekmeyecekti. Tek sorun, bu betiğin çok yavaş çalışması ve çok bellek tüketmesiydi. Bu nedenle çareyi pdftotext programına benzer bir çıktı üretecek bir
yama yapmakta buldum. Bu yama
pdftotext programına
-dump anahtarı ekleyerek her metin nesnesini koordinatları ile yazdırmayı sağlamaktadır. Bu sayede pdftotext ile metin koordinatlarını almak mümkün oldu:
pdftotext -enc UTF-8 -raw -dump yenimahalle1-P.pdf
139 25 199 33 MİLLETVEKİLİ
201 25 251 33 SEÇİMİNDE
254 25 274 33 İLÇE
276 25 305 33 SEÇİM
307 25 377 33 KURULLARINCA
379 25 452 33 DÜZENLENECEK
455 25 484 33 SİYASİ
487 25 540 33 PARTİLERİN
542 25 554 33 VE
557 25 600 33 BAĞIMSIZ
602 25 653 33 ADAYLARIN
656 25 702 33 ALDIKLARI
299 36 338 44 OYLARIN
341 36 379 44 SAYISINI
381 36 432 44 GÖSTEREN
434 36 494 44 BİRLEŞTİRME
497 36 542 44 TUTANAĞI
30 21 52 27 298/108
30 29 47 34 Kanun
49 29 96 34 M;2839/32,Geçici
Dikkat ederseniz, xpdf metin bloklarını da bölerek her kelime için ayrı bir çıktı oluşturuyor. Bu sonraki işlemleri biraz güçleştirse de hız avantajı ve her kelimeyi çevreleyen kutuyu doğru olarak hesaplaması büyük fayda sağladı.
Bu çıktıyı işleyerek tablo haline getirmek amacıyla yazdığım programı da bir sonraki bölümde anlatacağım.