CookingTheCode.COM

Php ile Word (doc, docx) Belgelerini Okuma, Yazma

07 Ocak 2011Cuma17:42Yorum: 3
Kategori: Sunucu Tarafı Programlama

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

Bu Konuya Yazılan Yorumlar Listeneniyor
  • 18 Ocak 2011Salı14:56Yazan : mustafa

    pdftotext -enc UTF-8 a.pdf -

  • 09 Şubat 2011Çarşamba14:52Yazan : mustafa atik

    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

  • 09 Şubat 2011Çarşamba14:56Yazan : mustafa atik

    soffice "-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" -norestore -nofirststartwizard -nologo -headless

Yorum Formu, ne düşünüyorsan yaz!
  • Bu da ne?
  • Gönderiliyor