Python ve OpenOffice¶
Not
Bu makale henüz taslak halindedir. Zamanla bu makale içindeki bilgiler geliştirilecek ve buraya yeni bilgiler de eklenecektir. Eğer bu makaleye katkıda bulunmak veya makalede bulduğunuz hataları bildirmek isterseniz kistihza [at] yahoo [nokta] com adresinden bana ulaşabilirsiniz.
Çoğu kimsenin bildiği gibi, Sun Microsystems firmasının etkin desteğiyle geliştirilen OpenOffice adlı bir özgür yazılımı, Microsoft firmasının özgür olmayan ofis paketine alternatif olarak bilgisayarlarımızda kullanabiliyoruz. OpenOffice hem GNU/Linux’ta hem de Windows’ta çalışabiliyor. Özellikle GNU/Linux kullanıcıları, OpenOffice’nin GNU/Linux’taki birincil ve en gelişmiş ofis paketi olmasından ötürü, OpenOffice’yi Windows kullanıcılarına nazaran çok daha yakından tanır... Biz bu bölümde OpenOffice ve Python’u nasıl bağdaştırabileceğimizi, Python’u kullanarak OpenOffice belgelerini nasıl yönetebileceğimizi öğrenmeye çalışacağız.
OpenOffice; Writer, Calc ve öbür ofis bileşenlerini yönetmek, evirip çevirmek, düzenlemek veya değiştirmek için programcılara oldukça gelişmiş bir API (uygulama programlama arayüzü) sunuyor. OpenOffice API’sinin özelliği dilden bağımsız olmasıdır. Yani farklı programlama dillerini kullanan programcılar (örneğin C++, Java, Python, CLI, StarBasic, JavaScript, OLE programcıları), OpenOffice API’sine erişerek ofis bileşenlerini yönetebilirler...
API’ye erişebilmek için “UNO” (Universal Network Objects — Evrensel Ağ Nesneleri) adlı bileşen modelinden faydalanıyoruz. Farklı programlama dilleri, kendilerine özgü bir UNO köprüsü (UNO bridge) kullanarak OpenOffice’nin UNO bileşenlerine ve dolayısıyla OpenOffice’nin API’sine erişebilirler. Şu anda kullanılabilecek olan UNO köprüleri şöyle listelenebilir:
- Uno/Binary
- Uno/CLI
- Uno/Cpp
- Uno/Delphi
- Uno/Java
- Uno/OLE
- Uno/PyUno
- Uno/Remote
- Perl Uno
- Tcl Uno
Gördüğünüz gibi, listede “Uno/PyUno” da var. İsminden de anlaşılacağı gibi, bu köprü, Python ile OpenOffice’nin bileşen modeli arasında bağlantı kurabilmemizi sağlıyor.
PyUno’nun Kurulumu¶
Daha önce de dediğimiz gibi, Python ve OpenOffice’yi birlikte kullanabilmek için PyUno adlı bir yazılıma ihtiyacımız olacak. O halde isterseniz bu yazılımın sistemimize nasıl kurulacağını inceleyelim ilk iş olarak. Bu işlemin nasıl yapılacağını GNU/Linux ve Windows için ayrı ayrı inceleyeceğiz. Önce GNU/Linux’tan başlayalım.
GNU/Linux
PyUno, OpenOffice ile birlikte gelen bir modüldür. O yüzden PyUno’yu bilgisayarınıza kurmak için herhangi bir işlem yapmanıza gerek yok. Eğer sisteminizde OpenOffice kurulu ise PyUno da kuruludur.
PyUno’nun kurulu olup olmadığını denetlemek için Python’un etkileşimli kabuğunda şu komutu verebilirsiniz:
>>> import uno
Eğer hiçbir şey olmadan bir alt satıra geçiliyorsa, PyUno modülü sisteminizde kurulu demektir. Eğer yukarıdaki komut bir hata mesajı veriyorsa okumaya devam edin...
Benim kullandığım işletim sistemi Ubuntu Jaunty Jackalope. O yüzden ben bu yazıda PyUno’nun Ubuntu üzerine nasıl kurulacağını anlatacağım. Başka GNU/Linux dağıtımlarını kullananlar, kendi paket yöneticileri aracılığıyla aşağıda anlattıklarıma benzer işlemleri gerçekleştirebilirler...
Önce Ubuntu paketleri arasında küçük bir araştırma yapalım. Acaba PyUno paketinin tam adı neymiş?
aptitude search uno
Bu komut bize şuna benzer bir çıktı verir:
plasma-widget-fortunoid
python-uno
python2.6-uno
uno-libs3
uno-libs3-dbg
unoconv
Burada “python-uno” ve “python2.6-uno” adlı iki farklı paket görüyoruz. Eğer “python2.6-uno” paketini kurarsanız, PyUno’nun Python 2.6’ya uygun sürümü kurulacaktır. “python-uno” paketi ise, sistemdeki en yeni resmi Python sürümü hangisiyse bilgisayarınıza ona uygun olan PyUno paketini kuracaktır. Şu an itibariyle Ubuntu Jaunty Jackalope‘deki en yeni resmi Python sürümü 2.6 olduğu için, “python-uno”, bilgisayarımıza PyUno’nun Python 2.6 ile uyumlu olan sürümünü kuracaktır. Dolayısıyla “python-uno” ve “python2.6-uno” bugün itibariyle aynı paketleri kurar... Tabii siz bu yazıyı okurken Ubuntu’da işler değişmiş olabilir... Ancak çoğu durumda en iyi yol “python-uno” adlı paketi kurmak olacaktır. O halde hemen bu paketi sistemimize kuralım:
sudo apt-get install python-uno
Bu komut, PyUno adlı paketi bilgisayarımıza kuracaktır. Ancak başta da dediğimiz gibi, PyUno OpenOffice ile birlikte geldiği için, muhtemelen bu işlemi yapmak zorunda kalmayacaksınız.
Microsoft Windows
Microsoft Windows işletim sisteminde de PyUno paketi OpenOffice kurulumu ile birlikte geliyor. Dolayısıyla eğer sisteminizde OpenOffice kurulu ise başka herhangi bir şey kurmanıza gerek yok. OpenOffice’yi ise http://www.openoffice.org/ adresinden indirebilirsiniz.
Eğer kurulum aşamasını başarıyla geçtiysek emin adımlarla yolumuza devam edebiliriz.
OpenOffice’yi Dinleme Kipinde Açmak (listening mode)¶
Python’u kullanarak OpenOffice ile herhangi bir işlem yapabilmek için atmamız gereken ilk adım OpenOffice’yi “dinleme kipinde” açmak olmalıdır... Bu sayede Python’la yaptığımız işlemlerin OpenOffice tarafından algılanmasını sağlayacağız.
Bu işlemi sırasıyla GNU/Linux’ta ve Windows’ta nasıl yapacağımızı görelim... Bu arada, aşağıda anlatacaklarımı “GNU/Linux” ve “Microsoft” diye ayırmış olsam da, hangi işletim sistemini kullanıyor olursanız olun hem GNU/Linux hem de Windows açıklamalarını okumalısınız. Çünkü GNU/Linux bölümünde Windows kullanıcılarının da işine yarayacak bilgiler bulunduğu gibi, Windows bölümünde GNU/Linux kullanıcılarının işine yarayacak bilgiler de yer alıyor...
GNU/Linux
OpenOffice’yi dinleme kipinde açabilmek için “-accept” adlı bir parametreden faydalanacağız. Bu parametre hakkında kısa bir bilgi almak için konsolda şu komutu verebilirsiniz:
soffice -h
Bu komutun çıktısı içinde şu satırları göreceksiniz:
-accept=<accept-string>
Specify an UNO connect-string to create an UNO acceptor through which
other programs can connect to access the API
Buradan anladığımıza göre, “-accept” parametresi, başka programların OpenOffice API’sine bağlanmak için kullanabileceği bir “bağlantı kabul etme mekanizması” (başka deyişle bir “UNO alıcısı”) oluşturulmasını sağlıyor...
Yine yukarıdaki kısa bilgiden anlıyoruz ki, OpenOffice API’sine bağlanmada kullanacağımız kabul mekanizmasını oluşturabilmek için bir “UNO bağlantı dizisi”, yani UNO aracılığıyla OpenOffice API’sine bağlanmamızı sağlayacak bilgileri içeren bir karakter dizisi de belirlememiz gerekiyor.
OpenOffice API’sine ilişkin resmi kılavuzun söylediğine göre bu işlemi yapabilmek için OpenOffice’yi şu şekilde başlatmamız gerekiyor:
soffice -accept=socket,host=0,port=2002;urp;
Bu komutu alıp olduğu gibi kullanamıyoruz. Bunu konsola yazmadan önce şu sorunu çözmemiz gerek:
Yukarıdaki parametre içinde gördüğümüz ”;” işaretini Unix kabuğunun farklı algılamasından ötürü, yukarıdaki komut OpenOffice’yle bağlantı kurmamızı sağlayamayacaktır. Unix kabuğunun bize sorun çıkarmaması için yukarıdaki parametreyi tırnak içine almamız yeterlidir. Yani komutumuzu şöyle yazacağız (Bu arada, bu komutu vermeden önce sistemde hiçbir OpenOffice belgesinin açık olmamasına dikkat ediyoruz)
soffice -accept="socket,host=0,port=2002;urp;"
Dilerseniz bu komuttaki parametreleri teker teker incelemeye çalışalım:
- soffice:
- Bu ifadenin ne işe yaradığını biliyoruz. Sistemimizdeki OpenOffice’yi çalıştırmamızı sağlayan dosyanın adı “soffice”dir.
- -accept:
- Bu parametrenin ne olduğunu da biraz önce görmüştük. Bu parametre temel olarak, OpenOffice’nin kendisine gelen bağlantı girişimlerini kabul etmesini sağlıyor. OpenOffice, güvenlik gerekçesiyle, varsayılan olarak hiç bir bağlantı girişimini kabul etmez.
- socket:
- Bu ifade, OpenOffice’ye bağlanırken kullanacağımız bağlantı tipini gösteriyor. Biz burada bir “soket bağlantısı” kurmayı deniyoruz... “soket”, sunucu ve istemci arasında çift yönlü bağlantı kurmamızı sağlayan bir mekanizmadır.
- host:
- Bu parametre, OpenOffice’nin dinleyeceği konak sistemin adını veya IP numarasını gösteriyor. Bu parametreye “0” veya “localhost” değerlerini verebiliriz. “0” değeri, müsait olan bütün ağ arayüzleri üzerinden dinleme işlemi gerçekleştirilmesini sağlar. Yukarıdaki komutta “host=0” yerine “host=localhost” da yazabiliriz...
- port:
- Bu parametre, OpenOffice ile bağlantıyı hangi port üzerinden gerçekleştireceğimizi belirtmemizi sağlıyor. Biz burada, resmi kılavuzun önerisine uyarak, “2002” portunu kullandık.
- urp:
- Bu ifade, “Uno Remote Protocol” teriminin kısaltmasıdır. Bu terim Türkçe’de “Uno Uzak Bağlantı Protokolü” anlamına gelir ve kurulacak bağlantının hangi protokol üzerinden gerçekleştirileceğini ifade eder.
Kısacası yukarıdaki komut yardımıyla, “OpenOffice’ye 2002 portu üzerinden bir soket bağlantısı gerçekleştirerek Uno Uzak Bağlantı Protokolü (URP) aracılığıyla OpenOffice’nin bizi dinlemeye almasını sağladık”. Bu arada, eğer bu komutu verdikten sonra “unable to get gail version number” gibi bir hata alırsanız, bunu önemsemeyin... Ancak bu komutu verdikten sonra eğer “Could not find a Java Runtime Environment” gibi bir hata mesajı alıyorsanız şu komut yardımıyla gerekli paketi sisteminize kurmalısınız:
sudo apt-get install openoffice.org-java-common
‘soffice -accept=”socket,host=0,port=2002;urp;”‘ komutu verildikten sonra boş bir OpenOffice Writer belgesi açılacaktır. Bu belgeyi kapatmadan yolumuza devam edelim... Ama önce Windows kullanıcılarının durumunu bir gözden geçirelim.
Microsoft Windows
Windows kullananlar, yukarıda GNU/Linux kullanıcılarının verdiği “soffice -accept...” komutunu, OpenOffice’nin kurulu olduğu dizin içinde verecek. Windows’ta OpenOffice programı “C:\Program Files\OpenOffice 3” dizini altında bulunur. Bu dizinin içinde “program” adlı bir başka dizin daha göreceksiniz. İşte “soffice.exe” dosyasının bulunduğu dizin burasıdır... Şimdi Başlat>Run” yolunu takip ederek “cmd” komutunu veriyoruz ve Windows’un komut satırına ulaşıyoruz. Orada önce şu komutu vererek “C:\Program Files\OpenOffice 3\program” dizinine ulaşıyoruz:
cd C:\Program Files\OpenOffice.org 3\program
Eğer sizdeki OpenOffice dizini farklıysa, yukarıdaki komutu ona göre düzenlemeniz gerekiyor.
Bu noktada, sistemimizde hiçbir OpenOffice belgesinin açık olmadığından emin olmamız gerekiyor. Ayrıca Windows’ta saat simgesinin yanına yerleşen “OpenOffice QuickStarter” uygulamasının da kapalı olması lazım. Eğer kapalı değilse bu uygulamayı da kapatıp şu komutu veriyoruz:
soffice -accept=socket,host=localhost,port=2002;urp;
Bu komutu verdikten sonra OpenOffice açılacaktır. Eğer ne tür bir belge açmak istediğinizi soran bir ekranla karşılaşırsanız “Text Document” (veya “Boş Belge”) seçeneğini işaretleyerek boş bir metin belgesi açın.
Yukarıdaki komuta ek olarak bazı başka parametreler de verebilirsiniz. Vereceğiniz bu parametreler OpenOffice programının açılış şeklini ekleyecektir:
soffice -accept=socket,host=localhost,port=2002;urp; -nofirstwizard
Buradaki “-nofirstwizard” parametresi OpenOffice’nin doğrudan boş bir metin belgesi açmasını sağlayacaktır. Bu parametre sayesinde OpenOffice’nin “ne tür bir belge açmak istersiniz?” sorusunu sormamasını sağlıyoruz.
Eğer OpenOffice’nin, ilk açılırken karşımıza çıkan açılış ekranını (splashscreen) da görmek istemiyorsak yukarıdaki komutu şu şekilde de verebiliriz:
soffice -accept=socket,host=localhost,port=2002;urp; -nologo
Böylece OpenOffice programı, açılış ekranını göstermeden açılacaktır. Eğer ne açılış ekranı ne de “ne tür belge?” ekranı görmek isterseniz yukarıdaki iki parametreyi birlikte de kullanabilirsiniz:
soffice -accept=socket,host=localhost,port=2002;urp; -nofirstwizard, -nologo
OpenOffice’yi bu parametrelerle birlikte çalıştırdığınızda OpenOffice’nin her zamankinden biraz daha hızlı açıldığını göreceksiniz...
Bu arada, yukarıdaki komutların GNU/Linux’takinden biraz farklı olduğuna dikkat edin. Bu komutu Windows’ta verirken “host=0” yerine “host=localhost” yazıyoruz. Komutta “host=0” yazmak Windows’ta OpenOffice ile bağlantı kuramamamıza sebep olabiliyor... Ayrıca Windows’tayken “socket,host=localhost,port=2002;urp;” satırını tırnak içine almamıza gerek olmadığına da dikkatinizi çekmek isterim...
OpenOffice’ye Bağlanmak¶
Bir önceki adımda OpenOffice’yi dinleme kipinde açtık. Bu, atmamız gereken ilk adımdı. Şimdi ise Python aracılığıyla OpenOffice’ye bağlanmayı deneyeceğiz. Yine sırasıyla GNU/Linux ve Microsoft kullanıcılarının ne yapması gerektiğini anlatacağız. Tabii hangi işletim sistemini kullanırsanız kullanın, her iki bölümü de dikkatle okumanın zararını değil faydasını görürsünüz...
GNU/Linux
Öncelikle Python’un etkileşimli kabuğunu başlatıyoruz:
python
Gayet güzel... Madem işimiz Uno ile, o halde hemen “uno” modülünü içe aktaralım:
>>> import uno
Böylece “uno” modülünün bütün nimetlerinden faydalanabileceğiz...
Biraz sonra, OpenOffice’ye nasıl bağlanacağımızı inceleyeceğiz. Bu konuya geçmeden önce dilerseniz, bağlantı işleminin hangi aşamalardan oluştuğunu görelim. Bu arada, aşağıda kullanacağımız kavramlara çok takılmayın. Bunların ne olduğunu biraz sonra açıklayacağız:
- Önce “uno” modülünü içe aktarıyoruz,
- Ardından “Bileşen Bağlamını” içe aktarıyoruz,
- “Servis Yöneticisi” yardımıyla OpenOffice bağlantı servisini çalıştırıyoruz,
- Daha sonra OpenOffice’ye bağlantı kuruyoruz,
- Bağlantıyı kurduktan sonra, en başta “soffice” komutuyla açtığımız OpenOffice belgesine erişmemizi sağlayacak servisi çalıştırıyoruz,
- Hemen ardından mevcut belgeye erişiyoruz,
- Belge içinde bir imleç oluşturuyoruz,
- Ve istediğimiz bir metni belgeye yazdırıyoruz.
Şimdi gelelim yukarıda sıralanan aşamaları gerçek hayata aktarmaya...
Bu noktada karşımıza “Bileşen Bağlamı” (Component Context) adı verilen bir kavram çıkıyor. Bileşen Bağlamı kavramını, “bütün bileşenlerin bir arada bulunduğu bir ortam” olarak düşünebiliriz. Şimdi yapmamız gereken şey, bu “bileşen bağlamını” içe aktarmak, yani bu bağlamı yerel ortamımızda kullanılabilir hale getirmektir. Bu işlemi, “uno” modülünün “getComponentContext()” adlı metodu yardımıyla gerçekleştireceğiz:
>>> uno.getComponentContext()
Dilerseniz bu metodu bir değişkene atayalım, ki kullanması kolay olsun:
>>> yerel = uno.getComponentContext()
Bileşen bağlamını, yani bütün bileşenlerin bir arada bulunduğu ortamı kendi çalışma alanımıza aktardığımıza göre, bu noktadan sonra OpenOffice’ye bağlanmamızı sağlayacak olan “UnoUrlResolver” adlı servise erişmeye çalışabiliriz. “UnoUrlResolver”i kullanabilmek için Servis Yöneticisinden (yani “ServiceManager”den) ve onun “createInstanceWithContext()” adlı metodundan yararlanarak “bağlantı servisini” çalışır hale getireceğiz:
>>> baglanti_servisi = yerel.ServiceManager.createInstanceWithContext(
... "com.sun.star.bridge.UnoUrlResolver", yerel)
Bir önceki adımda Bileşen Bağlamını yerel ortamımıza aktardığımız için, “ServiceManager”e ve onun “createInstanceWithContext()” adlı metoduna doğrudan yerel ortamımızın bir öğesi olarak erişebiliyoruz. Bu yüzden komutumuzu “yerel.ServiceManager...” şeklinde yazabildik. Burada “createInstanceWithContext()” metodunun iki parametre aldığına dikkat edin. İlk parametre “UnoUrlResolver”, ikinci parametre ise biraz önce hazırladığımız “yerel” adlı değişkendir... Bu arada, “UnoUrlResolver”i nasıl kullandığımıza dikkat edin. “com.sun.star.bridge” OpenOffice API’sinin öğelerinden biridir.
Bağlantı servisini çalışır hale getirdikten sonra “resolve()” metodu yardımıyla OpenOffice’ye bağlanma işlemini gerçekleştireceğiz:
>>> baglanti = baglanti_servisi.resolve(
... "uno:socket,host=0,port=2002;urp;StarOffice.ComponentContext")
Burada “resolve()” metoduna verdiğimiz parametrenin, en başta “soffice -accept...” komutuna verdiğimiz parametreyle hemen hemen aynı olduğuna dikkat edin.
Bağlantıyı kurduktan sonra, yine Servis Yöneticisi’nin, yani “ServiceManager”in “createInstanceWithContext()” metodunu kullanarak mevcut belgeye erişmemizi sağlayacak olan “Desktop” adlı servisi hazır hale getiriyoruz.
>>> belge_servisi = baglanti.ServiceManager.createInstanceWithContext(
... "com.sun.star.frame.Desktop", baglanti)
Hemen ardından da mevcut belgeye erişiyoruz:
>>> belge = belge_servisi.getCurrentComponent()
Artık, en başta “soffice...” komutuyla açtığımız Writer belgesi elimizin altında. Bu belgeye müdahale edebilmek için, bu belge içinde bir imleç oluşturmamız gerekiyor. Şimdi bu imleci oluşturalım:
>>> imlec = belge.Text.createTextCursor()
Son olarak belgeye bir metin yazdırıyoruz:
>>> belge.Text.insertString(imlec, "Elveda Zalim Dünya!", 0)
Şimdi bir kenarda açık halde bekleyen Writer belgesine bakın bakalım içinde ne yazıyor...
Dilerseniz bu kodları topluca görelim:
>>> import uno
>>> yerel = uno.getComponentContext()
>>> baglanti_servisi = yerel.ServiceManager.createInstanceWithContext(
... "com.sun.star.bridge.UnoUrlResolver", yerel)
>>> baglanti = baglanti_servisi.resolve(
... "uno:socket,host=0,port=2002;urp;StarOffice.ComponentContext")
>>> belge_servisi = baglanti.ServiceManager.createInstanceWithContext(
... "com.sun.star.frame.Desktop", baglanti)
>>> belge = belge_servisi.getCurrentComponent()
>>> imlec = belge.Text.createTextCursor()
>>> belge.Text.insertString(imlec, "Elveda Zalim Dünya!", 0)
Microsoft Windows
Hatırlarsanız, bir önceki adımda OpenOffice programını başlatabilmek için, “cd” komutu yardımıyla “C:\Program Files\OpenOffice.org 3\program” dizini altına gitmiş ve orada “soffice.exe” adlı çalıştırılabilir dosyayı başlatabilmek için “soffice” komutunu vermiştik... Yine “C:\Program Files\OpenOffice.org 3\program” dizini altında “python.exe” adlı bir dosya göreceksiniz. Bu, OpenOffice ile birlikte gelen Python sürümüdür ve sisteminizdeki asıl Python’dan farklıdır. Windows’ta Python’u OpenOffice ile birlikte kullanabilmek için, OpenOffice ile birlikte gelen Python sürümünden yararlanmamız gerekiyor. Sistemdeki öbür Python programı Windows’ta OpenOffice ile bağlantı kurmamızı sağlayamaz... “C:\Program Files\OpenOffice.org 3\program” dizini altındayken komut satırında “python” komutunu verirsek, OpenOffice’nin içindeki Python sürümü çalışmaya başlayacaktır. Eğer arzu ederseniz, “program” dizini altındaki “python.exe” dosyasına çift tıklayarak da OpenOffice’ye özgü Python sürümünü başlatabilirsiniz. O halde şimdi istediğimiz bir yöntemi kullanarak Python’un etkileşimli kabuğunu başlatalım. Orada şu komutu veriyoruz:
>>> import uno
Bu komutu verdiğimizde Python’un etkileşimli kabuğu sessizce bir alt satıra geçecektir. Eğer OpenOffice ile birlikte gelen Python sürümünü değil de, sisteminizdeki asıl Python sürümünü çalıştırıp “import uno” komutunu verdiyseniz Python size bu modülün bulunamadığına dair bir hata mesajı gösterecektir... O yüzden Windows’ta OpenOffice ile birlikte gelen Python sürümünü kullanmak büyük önem taşıyor.
Şimdi GNU/Linux bölümünde anlattığımız gibi “Bileşen Bağlamını” içe aktarıyoruz:
>>> yerel = uno.getComponentContext()
Bundan sonra, yine GNU/Linux bölümünde anlattığımız şekilde gerekli servisleri başlatabiliriz:
>>> baglanti_servisi = yerel.ServiceManager.createInstanceWithContext(
... "com.sun.star.bridge.UnoUrlResolver", yerel)
>>> baglanti = baglanti_servisi.resolve(
... "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
>>> belge_servisi = baglanti.ServiceManager.createInstanceWithContext(
... "com.sun.star.frame.Desktop", baglanti)
>>> belge = belge_servisi.getCurrentComponent()
Şu anda yapmamız gereken, belge içinde bir imleç oluşturup, bu imleci de kullanarak belge içine bir karakter dizisi yazdırmaktır:
>>> imlec = belge.Text.createTextCursor()
>>> belge.Text.insertString(imlec, u"Elveda Zalim Dünya!", 0)
Bu satırlarla ilgili daha geniş açıklamaya GNU/Linux bölümünden ulaşabilirsiniz.
Eğer “baglanti_servisi = yerel.ServiceManager.cre...” satırında bir hata alırsanız, “*import uno” satırından önce “import socket” komutuyla “socket” adlı modülü içe aktarmayı deneyin.
Ayrıca GNU/Linux kodlarıyla Windows kodları arasındaki bazı ufak farklılıkları da gözden kaçırmayın. Örneğin “baglanti = baglanti_servisi.resolve(“uno......)” satırında “host=0” yerine “host=localhost” yazdığımıza dikkat edin...
Bunun dışında, belgeye yazdırdığımız “Elveda Zalim Dünya!” cümlesindeki Türkçe karakterlerin düzgün görüntülenebilmesi için karakter dizimizi “unicode” olarak tanımlamayı da unutmuyoruz. (u”Elveda Zalim Dünya!”)
Karakter Biçimlendirme¶
Gördüğünüz gibi, OpenOffice’yle bağlantı kurup boş bir belgeye bir şeyler yazdırmak o kadar da zor değil. Biz bu ilk adımı aştığımıza göre artık OpenOffice’ye yazdığımız metinleri biçimlendirme konusunu incelemeye geçebiliriz...
Unutmayın, OpenOffice’ye bağlanmak için kullandığımız şey Python programlama dilidir. Dolayısıyla Python’un kendi özelliklerini kullanarak OpenOffice belgelerini çok rahat bir biçimde evirip çevirebiliriz. Mesela belgemize yeni satır veya sekme eklemek istersek Python’un kendi araçları emrimize amadedir:
>>> belge.Text.insertString(imlec, u"Uzak... \t\tçok uzak...", 0)
Burada, bu satıra kadar olan kodları halihazırda yazmış olduğunuzu varsayıyorum...
Aynı şekilde “\n” kaçış dizisini kullanarak yeni bir satır da oluşturabilirsiniz:
>>> belge.Text.insertString(imlec, u"Birinci satır\nİkinci satır\nÜçüncü satır", 0)
Mesela Python’un “datetime” modülünü kullanarak bugünün tarihini belgemize yazdıralım:
>>> import datetime
>>> bugun = datetime.date.today()
>>> belge.Text.insertString(imlec, "%s"%bugun, 0)
Bunun dışında, PyUno aracılığıyla OpenOffice belgelerindeki yazıların koyu, yana yatık, altı çizgili, üstü çizgili, vb. şekillerde görünmesini de sağlayabilirsiniz. Bu özellikler tek tek inceleyelim:
Kalın Karakterler (bold)¶
OpenOffice belgesine yazdıracağımız harflerin koyu olabilmesi için, “setPropertyValue()” adlı bir metottan yararlanacağız. “setPropertyValue()” imlecin bir metodudur. Bu ne demek oluyor? Hemen bir örnek verelim...
Hatırlarsanız, PyUno yardımıyla OpenOffice belgelerine bağlantı kurma aşamasında, istediğimiz bir metni belgeye yazdırmadan önce mutlaka bir imleç oluşturmamız gerekiyordu. Bu imleci şöyle oluşturuyorduk:
>>> imlec = belge.Text.createTextCursor()
İşte oluşturduğumuz bu imlecin “setPropertyValue()” adlı metodunu kullanarak, metne yazdırdığımız harflerin koyu olmasını sağlayabileceğiz:
>>> imlec.setPropertyValue("CharWeight", 150)
Dilerseniz, daha anlaşılır olması için yukarıdaki kodları bir örnek içinde kullanalım...
Önce komut satırında “soffice” komutuyla OpenOffice’yi başlatalım:
soffice -accept="socket,host=localhost,port=2002;urp"
Ardından Python’u çalıştıralım. GNU/Linux kullanıcıları kendi sistemlerindeki Python’u kullanabilir, ancak Windows kullanıcılarının OpenOffice ile birlikte gelen Python sürümünü kullanmaları gerekiyor. Sistemimize uygun şekilde Python’u başlattıktan sonra Python’un etkileşimli kabuğunda şu komutları veriyoruz:
>>> import uno
>>> yerel = uno.getComponentContext()
>>> baglanti_servisi = yerel.ServiceManager.createInstanceWithContext(
... "com.sun.star.bridge.UnoUrlResolver", yerel)
>>> baglanti = baglanti_servisi.resolve(
... "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
>>> belge_servisi = baglanti.ServiceManager.createInstanceWithContext(
... "com.sun.star.frame.Desktop", baglanti)
>>> belge = belge_servisi.getCurrentComponent()
>>> imlec = belge.Text.createTextCursor()
>>> imlec.setPropertyValue("CharWeight", 150)
>>> belge.Text.insertString(imlec, "deneme", 0)
“imlec”in “setPropertyValue()” adlı metodunu nasıl kullandığımıza dikkat edin. Burada “CharWeight” adlı bir özellikten yararlandık. “CharWeight” bir karakterin kalınlık-incelik durumunu belirler. Gördüğünüz gibi, “setPropertyValue()” metodu “CharWeight” dışında bir parametre daha alıyor. Bu parametre temel olarak iki farklı değer alır: “100” ve “150”.
“100” kalın olmayan karakter oluştururken, “150” kalın karakter oluşturur.
Yana Yatık Karakterler (italic)¶
Yukarıda harfleri kalın yazabilmek için “CharWeight” adlı bir özellikten yararlandık. Harfleri yatık yazmak için ise “CharPosture” adlı bir özellikten yararlanacağız:
>>> imlec.setPropertyValue("CharPosture", 1)
Harfleri yana yatık yazabilmek için “setPropertyValue()” metodunun ikinci parametresi olarak “1” değerini kullanıyoruz. Eğer bu değeri “0” yapacak olursak harflerimiz düz görünecektir...
Altı Çizgili Karakterler (underline)¶
Alti çizgili harfler üretmek için ise “CharUnderline” adlı bir özellikten yararlanacağız. Bu özellik, 0’dan 19’a kadar (19 hariç) olan sayıları değer olarak alabilir. Bu özelliği temel olarak şöyle kullanıyoruz:
>>> imlec.setPropertyValue("CharUnderline", 1)
Bu komut, yazdıracağımız metnin altını çizecektir. Eğer öteki değerlerin ne işe yaradığını merak ediyorsanız şöyle bir betik yazabilirsiniz:
>>> import uno
>>> yerel = uno.getComponentContext()
>>> baglanti_servisi = yerel.ServiceManager.createInstanceWithContext(
... "com.sun.star.bridge.UnoUrlResolver", yerel)
>>> baglanti = baglanti_servisi.resolve(
... "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
>>> belge_servisi = baglanti.ServiceManager.createInstanceWithContext(
... "com.sun.star.frame.Desktop", baglanti)
>>> belge = belge_servisi.getCurrentComponent()
>>> imlec = belge.Text.createTextCursor()
>>> for i in range(20):
... imlec.setPropertyValue("CharUnderline", i)
... belge.Text.insertString(imlec, "%s deneme"%i, 0)
Böylece hangi sayının nasıl bir alt çizgi ürettiğini rahatlıkla görebilirsiniz...
Üstü Çizili Karakterler (strikeout)¶
Harflerin üstünü çizmek için “CharStrikeout” adlı özellikten yararlanacağız:
>>> imlec.setPropertyValue("CharStrikeout", 1)
Yukarıdaki komut, kelimenin üstüne tek çizgi çeker. Eğer “1” yerine “2” yazarsak, bu komut kelimenin üzerine çift çizgi çekecektir. “0” değeri ise kelimenin üzerinde herhangi bir çizgi olmayacağını gösterir.
Yanıp Sönen Karakterler (flash)¶
Eğer yazdıracağımız karakterlerin yanıp sönmesini istersek “CharFlash” adlı bir özellikten yararlanabiliriz:
>>> imlec.setPropertyValue("CharFlash", True)
“CharFlash”, True ve False olmak üzere iki farklı değer alır. Eğer Bu özelliği “True” değeriyle birlikte kullanırsak, yazdırdığımız karakter (veya karakterler) yanıp sönecektir. False ise yanıp sönmeyi iptal eder.
Gölgeli Karakterler (shadow)¶
Eğer karakterlerimize gölge efekti kazandırmak istersek “CharShadowed” adlı bir özellikten yararlanacağız:
>>> imlec.setPropertyValue("CharShadowed", True)
Bu özellik de True ve False olmak üzere iki farklı değer alır.
İçi Boş Karakterler (contour)¶
Eğer içi boş karakterler üretmek isterseniz “CharContoured” özelliğinden faydalanabilirsiniz:
>>> imlec.setPropertyValue("CharContoured", True)
Bu özellik de True ve False olmak üzere iki farklı değer alır.
Karakterleri Renklendirme¶
Yukarıda karakterleri nasıl biçimlendireceğimizi gördük. Şimdi ise bu karakterleri nasıl renklendireceğimize bakacağız. Bu bölümde “CharColor” ve “CharBackColor” olmak üzere, iki temel renklendirme özelliğinden bahsedeceğiz.
CharColor¶
“CharColor özelliği, karakterlerin kendi renklerine işaret eder. Dolayısıyla bu özelliği kullanarak bir karakterin kendi rengini değiştirebiliriz. Bu özellik şöyle kullanılıyor:
>>> imlec.setPropertyValue("CharColor", renk)
Burada “renk” ifadesinin yerine uygun bir renk kodu yazmamız gerekiyor. OpenOffice onluk sayı biçimindeki renk kodlarını kabul eder. Normal olarak, renk kodları çoğu yerde karşımıza onaltılık (hexadecimal) sayı biçiminde çıkar. Dolayısıyla internet üzerindeki herhangi bir renk tablosundan alacağımız onaltılık sayı biçimindeki renk kodlarını OpenOffice’de kullanabilmek için öncelikle bunları onluk sayıya çevirmemiz gerekir.
Mesela renk kodlarını öğrenmek için http://html-color-codes.info/ adresinden yararlanabiliriz. Bu adresteki renk paleti içinden herhangi bir renk seçtiğimizde bu rengin kodu “Selected color code is:” ifadesinin yanındaki kutucuk içinde gösterilecektir. Diyelim ki orada “#0174DF” kodunu gördük. Bu kodun “0174DF” kısmını alıp, bu onaltılık sayıyı onluk sayı sistemine çevirmemiz gerekiyor. Bunu kodlarımız içine şöyle uygulayabiliriz:
>>> imlec.setPropertyValue("CharColor", int("0174DF", 16))
Burada int("0174DF", 16) kodu bir onaltılık sayı olan “0174DF”yi onluk sayı sistemine çevirecektir. “0174DF” sayısının onluk sistemdeki karşılığı “95455”tir. Dolayısıyla isterseniz önce sayıyı onluk sisteme çevirip, ardından elde edilen sayıyı yukarıdaki koda eklemeyi de tercih edebilirsiniz:
>>> imlec.setPropertyValue("CharColor", 95455)
Dilerseniz bu kodları bağlam içinde gösterelim:
>>> import uno
>>> yerel = uno.getComponentContext()
>>> baglanti_servisi = yerel.ServiceManager.createInstanceWithContext(
... "com.sun.star.bridge.UnoUrlResolver", yerel)
>>> baglanti = baglanti_servisi.resolve(
... "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
>>> belge_servisi = baglanti.ServiceManager.createInstanceWithContext(
... "com.sun.star.frame.Desktop", baglanti)
>>> belge = belge_servisi.getCurrentComponent()
>>> imlec = belge.Text.createTextCursor()
>>> imlec.setPropertyValue("CharColor", int("0174DF", 16))
>>> belge.Text.insertString(imlec, u"renkli yazı", 0)
Bu kodları yazdığımızda, OpenOffice belgesi içindeki karakterlerin renklerinin seçtiğimiz renge göre değiştiğini göreceğiz...
CharBackColor¶
“CharBackColor” özelliğinin kullanımı “CharColor” özelliğinin kullanımına çok benzer. “CharBackColor” özelliği yardımıyla bir karakterin arkaplan rengini değiştiriyoruz:
>>> imlec.setPropertyValue("CharBackColor", int("BDBDBD", 16))
PyUno, Python ve OpenOffice Hakkında Bilgi Veren Kaynaklar¶
Python ve OpenOffice ilişkisi üzerine çalışmak isteyenler interneti araştırdıklarında bu konu üzerine yazılmış ayrıntılı ve açıklayıcı belgelerin çok az olduğunu görecekler. Eldeki kısıtlı kaynaklar da (tabii ki) İngilizce. Türkçe olarak bu konu üzerine bir şeyler bulmak pek mümkün değil. Benim bu belgeyi hazırlamaktaki amacım, en azından bu işe başlayacak olanlara yol gösterebilmektir.
Eğer internet üzerinde bu konuyla ilgili hangi kaynakların mevcut olduğunu merak ediyorsanız, birkaç tanesini hemen burada sıralayalım: