PHP Dersleri

PHP ile Word Dosyası Oluşturma

HTML ile hazırlanan bir içeriğin MS Word dosyasına dönüştürülmesi, web uygulamaları için dinamiklik katacak bir uygulamadır. HTML içeriği MS Word’e aktarmak için JavaScript kullanılarakta kolaylıkla yapılmaktadır. Fakat dinamik bir içeriği MS Word’e dönüştürmek istediğinizde sunucu taraflı bir etkileşime ihtiyaç duyulacaktır. Bu açığıda PHP Programlama dili ile kapatmış olacağız.

HTML etiketlerinden oluşturulan bir dökümanı MS Word’e çevirmek için bir sınıftan yardım alacağız. Bu kütüphaneni kolay kullanımıyla birlikte az kod yazarak web uygulamalarına dinamiklik katmış olacağız.

HTML to Word Sınıfının Özellikleri

Bu sınıfla birlikte kolaylıkla MS Word dosyaları oluşturabilirsiniz. Kullanım için bir kaç metodu bulunmaktadır. Bu metodlarla birlikle Word dosyası oluşturabilirsiniz.

  • setDocFileName() metodunda word dosyasının adı belirlenmekedir.
  • setTitle () metodunda word dosyasına başlık ayarlanır.
  • getHeader () metodu ile üst bilgi bölümü oluşturulur.
  • getFotter () metodu ile alt bilgi bölümü oluşturulur.
  • createDoc () metodu ile .dcox biçiminde word belgesi oluşturulur.
  • _parseHtml () metodu ile HTML’yi kaynaktan ayrıştırma ve filtreleme yapılır.
  • write_file () metodu ile kelime dosyasına içerik ekleyebilirsiniz.

Sınıf için kullanılan metodları da tanıdıktan sonra kullanımının nasıl olduğuna bir bakalım.

HTMLtoWord Kütüphanesi

Aşağıda yer alan kodları htmltoword.php olarak kayıt edebilirsiniz. Oluşturacağınız bu dosya ile HTML ile hazırlanan içeriği MS Word’e çevirmiş olacağız.

<?php
class HTML_TO_DOC{ 
    var $docFile  = ''; 
    var $title    = ''; 
    var $htmlHead = ''; 
    var $htmlBody = ''; 
    /** 
     * Constructor 
     * 
     * @return void 
     */ 
    function __construct(){ 
        $this->title = ''; 
        $this->htmlHead = ''; 
        $this->htmlBody = ''; 
    } 
    /** 
     * Set the document file name 
     * 
     * @param String $docfile  
     */ 
    function setDocFileName($docfile){ 
        $this->docFile = $docfile; 
        if(!preg_match("/\.doc$/i",$this->docFile) && !preg_match("/\.docx$/i",$this->docFile)){ 
            $this->docFile .= '.doc'; 
        } 
        return;  
    } 
    /** 
     * Set the document title 
     * 
     * @param String $title  
     */ 
    function setTitle($title){ 
        $this->title = $title; 
    }
    /** 
     * Return header of MS Doc 
     * 
     * @return String 
     */ 
    function getHeader(){ 
        $return ='
        <html xmlns:v="urn:schemas-microsoft-com:vml" 
        xmlns:o="urn:schemas-microsoft-com:office:office" 
        xmlns:w="urn:schemas-microsoft-com:office:word" 
        xmlns="http://www.w3.org/TR/REC-html40">
        <head> 
        <meta http-equiv=Content-Type content="text/html; charset=utf-8"> 
        <meta name=ProgId content=Word.Document> 
        <meta name=Generator content="Microsoft Word 9"> 
        <meta name=Originator content="Microsoft Word 9"> 
        <!--[if !mso]> 
        <style> 
        v\:* {behavior:url(#default#VML);} 
        o\:* {behavior:url(#default#VML);} 
        w\:* {behavior:url(#default#VML);} 
        .shape {behavior:url(#default#VML);} 
        </style> 
        <![endif]--> 
        <title>'.$this->title.'</title> 
        <!--[if gte mso 9]><xml> 
         <w:WordDocument> 
          <w:View>Print</w:View> 
          <w:DoNotHyphenateCaps/> 
          <w:PunctuationKerning/> 
          <w:DrawingGridHorizontalSpacing>9.35 pt</w:DrawingGridHorizontalSpacing> 
          <w:DrawingGridVerticalSpacing>9.35 pt</w:DrawingGridVerticalSpacing> 
         </w:WordDocument> 
        </xml><![endif]--> 
        <style> 
        <!-- 
         /* Font Definitions */ 
        @font-face 
            {font-family:Verdana; 
            panose-1:2 11 6 4 3 5 4 4 2 4; 
            mso-font-charset:0; 
            mso-generic-font-family:swiss; 
            mso-font-pitch:variable; 
            mso-font-signature:536871559 0 0 0 415 0;} 
         /* Style Definitions */ 
        p.MsoNormal, li.MsoNormal, div.MsoNormal 
            {mso-style-parent:""; 
            margin:0in; 
            margin-bottom:.0001pt; 
            mso-pagination:widow-orphan; 
            font-size:7.5pt; 
                mso-bidi-font-size:8.0pt; 
            font-family:"Verdana"; 
            mso-fareast-font-family:"Verdana";} 
        p.small 
            {mso-style-parent:""; 
            margin:0in; 
            margin-bottom:.0001pt; 
            mso-pagination:widow-orphan; 
            font-size:1.0pt; 
                mso-bidi-font-size:1.0pt; 
            font-family:"Verdana"; 
            mso-fareast-font-family:"Verdana";} 
        @page Section1 
            {size:8.5in 11.0in; 
            margin:1.0in 1.25in 1.0in 1.25in; 
            mso-header-margin:.5in; 
            mso-footer-margin:.5in; 
            mso-paper-source:0;} 
        div.Section1 
            {page:Section1;} 
        --> 
        </style> 
        <!--[if gte mso 9]><xml> 
         <o:shapedefaults v:ext="edit" spidmax="1032"> 
          <o:colormenu v:ext="edit" strokecolor="none"/> 
         </o:shapedefaults></xml><![endif]--><!--[if gte mso 9]><xml> 
         <o:shapelayout v:ext="edit"> 
          <o:idmap v:ext="edit" data="1"/> 
         </o:shapelayout></xml><![endif]--> 
         '.$this->htmlHead.'
        </head> 
        <body>';
        return $return; 
    }
    /** 
     * Return Document footer 
     * 
     * @return String 
     */ 
    function getFotter(){ 
        return "</body></html>"; 
    } 
    /** 
     * Create The MS Word Document from given HTML 
     * 
     * @param String $html :: HTML Content or HTML File Name like path/to/html/file.html 
     * @param String $file :: Document File Name 
     * @param Boolean $download :: Wheather to download the file or save the file 
     * @return boolean  
     */ 
    function createDoc($html, $file, $download = false){ 
        if(is_file($html)){ 
            $html = @file_get_contents($html); 
        }
        $this->_parseHtml($html); 
        $this->setDocFileName($file); 
        $doc = $this->getHeader(); 
        $doc .= $this->htmlBody; 
        $doc .= $this->getFotter();             
        if($download){ 
            @header("Cache-Control: ");// leave blank to avoid IE errors 
            @header("Pragma: ");// leave blank to avoid IE errors 
            @header("Content-type: application/octet-stream"); 
            @header("Content-Disposition: attachment; filename=\"$this->docFile\""); 
            echo $doc; 
            return true; 
        }else { 
            return $this->write_file($this->docFile, $doc); 
        } 
    } 
    /** 
     * Parse the html and remove <head></head> part if present into html 
     * 
     * @param String $html 
     * @return void 
     * @access Private 
     */ 
    function _parseHtml($html){ 
        $html = preg_replace("/<!DOCTYPE((.|\n)*?)>/ims", "", $html); 
        $html = preg_replace("/<script((.|\n)*?)>((.|\n)*?)<\/script>/ims", "", $html); 
        preg_match("/<head>((.|\n)*?)<\/head>/ims", $html, $matches); 
        $head = !empty($matches[1])?$matches[1]:''; 
        preg_match("/<title>((.|\n)*?)<\/title>/ims", $head, $matches); 
        $this->title = !empty($matches[1])?$matches[1]:''; 
        $html = preg_replace("/<head>((.|\n)*?)<\/head>/ims", "", $html); 
        $head = preg_replace("/<title>((.|\n)*?)<\/title>/ims", "", $head); 
        $head = preg_replace("/<\/?head>/ims", "", $head); 
        $html = preg_replace("/<\/?body((.|\n)*?)>/ims", "", $html); 
        $this->htmlHead = $head; 
        $this->htmlBody = $html; 
        return; 
    } 
    /** 
     * Write the content in the file 
     * 
     * @param String $file :: File name to be save 
     * @param String $content :: Content to be write 
     * @param [Optional] String $mode :: Write Mode 
     * @return void 
     * @access boolean True on success else false 
     */ 
    function write_file($file, $content, $mode = "w"){ 
        $fp = @fopen($file, $mode); 
        if(!is_resource($fp)){ 
            return false; 
        } 
        fwrite($fp, $content); 
        fclose($fp); 
        return true; 
    } 
}
?>

Yukarıda yer alan kodları htmltoword.php olarak kayıt ettikten sonra kütüphaneyi kullanmaya başlayalım.

HTML’i MS Word’e Çevirme

Kütüphaneyi kullanarak HTML’i MS Word’e çevirmek için ilk olarak kütüphaneyi kullanacağımız sayfaya dahil etmemiz gerekmektedir. Dahil işleminden sonra daha öncesinde incelediğimiz metodları kullanmalıyız.

Kütüphaneyi Yükleme ve Sınıfı Çağırma

Kütüphaneyi sayfaya dahil etmek için include_once() fonksiyonunu kullanacağız. Sonrasında bir değişken tanımlayarak sınıfı çağırıyoruz.

<?php
include_once 'htmltoword.php';
$kutuphane = new HTML_TO_DOC();
?>

Sınıfı çağırdıktan sonra dönüştürme işlemini yapacağımız döküman yada değişken oluşturuyoruz.

Dönüştürülecek HTML’i Belirleme

Dönüştürmek istediğiniz HTML alanı bir değişkende depolayarak çevirme işlemini sağlayabilirsiniz.

$htmlBolumu = '<h1>Başlık!</h1> 
<p>Merhaba, HTML etiketinden oluşan dokümanı WORD dosyasına çeviriyoruz.</p>';

Yukarıdaki gibi $htmlBolumu değişkeninde bilgileri depolayabilirsiniz. Bu bölümü istediğiniz gibi hazırlayabilirsiniz ve tüm HTML etiketlerini kullanabilirsiniz.

HTML’i Word Dosyasına Çevirme

HTML etiketleriyle hazırlanan değişkeni çevirmek için kütüphaneden yardım alarak bu işlemi sağlıyoruz.

$kutuphane->createDoc($htmlBolumu,"dosyaadi",1);

İlk olarak kütüphane değişkenini kullanarak createDoc metodu ile MS Word’e çeviriyoruz. İlk parametreye çevrilecek olan HTML etiketlerinden oluşan değişkeni yazıyoruz. İkinci değişkene ise uzantısını yazmadan oluşturulacak olan dosyanın adını yazıyoruz. Üçüncü parametreye eğer 1 (bir) değeri girilirse, oluşturulan dosya otomatik olarak indirilecektir. Eğer bu değer girilmezse, MS Word dosyası oluşturulup dizine eklenecektir.

Eğer HTML alanı bir değişken üzerinden değilde sayfayı seçerek yapmak isterseniz, ilk parametreye HTML değere sahip olan dosyanın adını ve uzantısını yazmanız yeterli olacaktır. Diğer parametreleri yukarıdaki örnekte yer aldığı gibi kullanabilirsiniz.

Daha Fazla Göster

İlgili Makaleler

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Kapalı