Php ile Word (doc, docx) Belgelerini Okuma, Yazma
Bu yazıda php'de openOfiice SDK ile .doc, .docx microsoft office word belgelerinin nasıl okunacağını anlatacağım. Antiword, Docvert gibi word belgelerinin okuyabilen araçlar var fakat sadece .doc uzantılarını okuyabiliyorlar.
OpenOffice, her türlü belgeyi açabildiğinden en doğru seçimdir. Hem böylece her dosya türü için ayrı bir program veya eklenti kurma dolayısıyla yönetme dertleri de önlenmiş olunur. Open Office SDK ile Excel ve power point dosyalarına da erişilebilir.
Php'nin doğrudan openOffice SDK apilerine erişimi yok, ne de resmi bir eklentisi. SDK'nun UNO apisine erişim PUNO isimli bir eklenti ile sağlanmaktadır. (python için pyuno)
SDK bir portu (ön tanımlı: 8100) dinler, puno aracılığıyla php SDK'ya erişir.
Kurulum adımlar şöyle olacaktır:
1. OO SDK Kurulumu
2. PUNO Kurulumu
3. Php Konfigürasyonu
4. ooSDK'yı Başlatma
5. Örnek
Kurulumları ubuntu linux üzerinde yapacağım. Siz de işlemleri kendi işletim sisteminize göre uyarlamalısınız, eğer gerekirse.
1. OO SDK Kurulumu
Ubuntu depolarından -dev yani SDK paketi kurulur, böylece bağlımlı olunan diğer paketlerle uğraşmamız oluruz:sudo apt-get install openoffice.org-dev
Kurulum, /usr/lib/openoffice dizini altında olacaktır. Öncelikle SDK ortam değişkenlerinin ayarlanacaktır.$>cd /usr/lib/openoffice/basis-link/sdk/
$>./setsdkenv_unix
Bu son komut size bazı dizin yollarını soracaktır, ilk soruyu yanıtlamak yeterli olur. Diğer soruları enter'a basarak geçebiliriz. İlk soru openoffice'in nereye kurulu olduğudur, cevap: /usr/lib/openoffice
Sorular bittikten sonra şuna benzer bir çıktı verecektir:
********************************************
*
* SDK environment is prepared for Linux
*
* SDK = /usr/lib/openoffice/basis3.2/sdk
* Office = /usr/lib/openoffice
* Office Base = /usr/lib/openoffice/basis3.2
* URE = /usr/lib/openoffice/basis3.2/ure-link
* Make = /usr/bin
* Zip = /usr/bin
* C++ Compiler = /usr/bin
* Java =
* SDK Output directory = /root/openoffice.org3.2_sdk
* Auto deployment = YES
*
********************************************
2. PUNO Kurulumu
http://www.wstech2.net/index.php?do=0a,01,05,02 veya http://sourceforge.net/projects/puno/files/ adreslerinden PUNO'un son sürümünü indirin. Derleme işlemleri için bazı paketler gerekli olacaktır, şu komut ile hepsini topluca kurulur:$>apt-get install build-essential php5-de
Puno dosyalarını dışarı çıkarıp dizine girelim:$>tar zxf Puno_VERSION.tar.gz
$>cd Puno
Puno'yu kodlayanlar sanırım sadece kendi ihtiyaçlarını göz önünde bulundurmuşlar. Ben kurulumu tamamlayıp php ile eriştiğimde, Türkçe harflerin bozuk geldiğini gördüm. Bu; puno ile uno api'leri arasındaki iletişimin Avrupa dillerinde yapılmasından kaynaklanmaktadır. Biz bunu UTF-8 olarak değiştireceğiz veya ISO-8859-9.
puno_converters.cpp ve puno.functions.cpp dosyaları içindeki RTL_TEXTENCODING_ISO_8859_15 sabitlerini RTL_TEXTENCODING_UTF8 olarak değiştirip dosyaları kaydedeceğiz. Bu dil sabitlerinin listesi /usr/include/openoffice/rtl/textenc.h dosyası içerisinde tanımlanmıştır.
Şimdi puno'yı konfigüre edip derleyeceğiz ve kuracağız.$>phpize
$>./configure --with-php-config=/usr/server/php/bin/php-config --with-puno=/usr/lib/openoffice/basis3.2/sdk
--with-php ile php-config dosyasının yolunu belirtiyoruz. Php kurulumunuza uygun olarak değiştiriniz.
SDK paylaşılan kütüphane dosyalarının sembolink linkleri oluşturulmalıdır. Aşağıdaki iki komut ile bu işlem hızlıca yapılır. Sembolink linkler zaten var, hatası alsanız da boşverin, problem olmayacaktır.$>cd $OO_SDK_URE_HOME/lib
$>for i in $(ls *.so?* ); do ln -s $i `echo $i | cut -f1 -d.`.so; done
$>cd // puno dizinine geri dönmeyi unutmayın :)
İşte Puno kuruluyor:$>make cppumaker
$>make all
$>sudo make install
Kurulum sonunda şöyle bir çıktı olacaktır:
Installing shared extensions: /usr/server/php/lib/php/extensions/no-debug-non-zts-20090626/
php-config'e bağlı olarak sizinkinin yolu değişiklik gösterebilir. Belirtilen dizine gidin ve bakın puno.so orda mı diye, eğer yoksa, kurulumda bir sorun vardır.
3. Php Konfigürasyonu
php.ini dosyasını açın ve extension_dir'in direktifinin göterdiği yol ile puno.so'nun bulunduğu yolun aynı olup olmadığına bakın, aynı değilse aynı yapın veya puno.so'yu php.ini içinde belirtilen extension dizinine taşıyın.
Dizin belirtildikten sonra extension=puno.so
satırını php.ini'ye ekleyerek puno eklentisi aktif hale getirilir. $>php -m
komutuyla aktif olan php eklentileri listelenebilir. puno satırını görüyorsanız, eklenti kurulmuş demektir.
Eğer web sunucusunu root veya başka bir kullanıcı ile çalıştırıyorsanız, bu kullanıcının API dosyalarına, paylaşılan kütüphane dosyalarına erişebilmesini sağlamalısınız. root olduğunu varsayarsak komutlar şöyle olacak:$>sudo su
$>./setsdkenv_unix
$>LD_LIBRARY_PATH=$OO_SDK_HOME/lib:$OFFICE_BASE_PROGRAM_PATH:\ $OFFICE_PROGRAM_PATH:$OO_SDK_URE_HOME/lib:$LD_LIBRARY_PATH
$>export LD_LIBRARY_PATH
Bunları sistemin veya apache'nin başlangıç betiklerine yazarak tekrarlamaktan kurtulabilirsiniz.
Son olarka apache http sunucusu başlatılır:$>apache restart
4. ooSDK'yı Başlatma
SDK'yı (8100 portunda) başlatmak için şu komutu vermelisiniz: $>sudo soffice "-accept=socket,port=8100;urp;"
Kontrol etmek için şu komutu verin:netstat -anp|grep 8100
Çıktıda port soffice tarafından dinleniyor satırını görüyorsanız, başlatma işlemi başarılıdır.
5. Örnek
Örnek kod deneme.docx isimli bir word belgesinin içeriğini okuyup ekrana yazdırır. Kod epey dağınık, test için yazdığım birkaç satırdan oluşuyor zaten. Çalışıyorsa, siz ihtiyacınıza göre düzenlersiniz. <?php
header('content-type:text/plain;charset=utf-8');
error_reporting(E_ALL);
ini_set('display_errors','on');
function newDocComponent($doc_type){
$cloader=get_remote_xcomponent(
"uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager",
"com.sun.star.frame.Desktop"
);
//$url="private:factory/".$doc_type;
$file='deneme.docx';
$url='file:///var/www/localhost/guvenlik.doc';
$properties=array();
$c=$cloader->loadComponentFromURL(
$url,
"_blank",0,
$properties
);
return $c;
}
$x=newDocComponent("swriter");
$tt=$x->getText();
$s=$tt->getString();
echo $s;
//$tt->setString('selam');
$x->dispose();
?>
Sanırım açık kaynak kodlu yazılımların faydası bu yaptığımız işlemlerde de görülmektedir.
Yardımcı bağlantılar:
oo SDK API
PUNO Installation
PUNO Documentation
OpenOffice Developers Guide
UNO Reflection API



pdftotext -enc UTF-8 a.pdf -
x-server olmadan çalıştırabilmek için şu paketin de kurulması gerekir:
yum install openoffice.org-headless.x86_64
apt-get install openoffice.org-headless.x86_64
soffice "-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" -norestore -nofirststartwizard -nologo -headless