За последние 24 часа нас посетили 25048 программистов и 1739 роботов. Сейчас ищут 983 программиста ...

содержимое phpword template's

Тема в разделе "PHP для новичков", создана пользователем iNEEdhLw, 3 ноя 2015.

  1. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    работаю с шаблоном phpword'a, возникло желание получать содержимое шаблона (только текст, желательно сохраняя настройки форматирования).

    собственно, просто выводить содержимое шаблона я не могу
    Код (PHP):
    1. $template = $PHPWord->loadTemplate('***************.docx');
    2. echo $template;
    вардамп отдает мне вот такую структуру, необходимый мне текст содержится вот в последнем свойстве этого объекта.
    вопрос: как оптимально получить этот текст?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Посмотри методы PHPWord_Template
     
  3. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    быстро взглянул - вроде ничего подходящего нет.
    Код (PHP):
    1. class PHPWord_Template {
    2.  
    3.     /**
    4.      * ZipArchive
    5.      *
    6.      * @var ZipArchive
    7.      */
    8.     private $_objZip;
    9.  
    10.     /**
    11.      * Temporary Filename
    12.      *
    13.      * @var string
    14.      */
    15.     private $_tempFileName;
    16.  
    17.     /**
    18.      * Document XML
    19.      *
    20.      * @var string
    21.      */
    22.     private $_documentXML;
    23.  
    24.  
    25.     /**
    26.      * Create a new Template Object
    27.      *
    28.      * @param string $strFilename
    29.      */
    30.     public function __construct($strFilename) {
    31.         $path = dirname($strFilename);
    32.         $this->_tempFileName = $path.DIRECTORY_SEPARATOR.time().'.docx';
    33.  
    34.         copy($strFilename, $this->_tempFileName); // Copy the source File to the temp File
    35.  
    36.         $this->_objZip = new ZipArchive();
    37.         $this->_objZip->open($this->_tempFileName);
    38.  
    39.         $this->_documentXML = $this->_objZip->getFromName('word/document.xml');
    40.     }
    41.  
    42.     /**
    43.      * Set a Template value
    44.      *
    45.      * @param mixed $search
    46.      * @param mixed $replace
    47.      */
    48.     public function setValue($search, $replace, $limit=-1) {
    49.         if(substr($search, 0, 1) !== '{' && substr($search, -1) !== '}') {
    50.             $search = '{'.$search.'}';
    51.         }
    52.         preg_match_all('/\{[^}]+\}/', $this->_documentXML, $matches);
    53.         foreach ($matches[0] as $k => $match) {
    54.             $no_tag = strip_tags($match);
    55.             if ($no_tag == $search) {
    56.                 $match = '{'.$match.'}';
    57.                 $this->_documentXML = preg_replace($match, $replace, $this->_documentXML, $limit);
    58.                 if ($limit == 1) {
    59.                     break;
    60.                 }
    61.             }
    62.         }
    63.     }
    64.  
    65.     /**
    66.      * Save Template
    67.      *
    68.      * @param string $strFilename
    69.      */
    70.     public function save($strFilename) {
    71.         if(file_exists($strFilename)) {
    72.             unlink($strFilename);
    73.         }
    74.  
    75.         $this->_objZip->addFromString('word/document.xml', $this->_documentXML);
    76.  
    77.         // Close zip file
    78.         if($this->_objZip->close() === false) {
    79.             throw new Exception('Could not close zip file.');
    80.         }
    81.  
    82.         rename($this->_tempFileName, $strFilename);
    83.     }
    84.  
    85.     /**
    86.      * Clone Rows in tables
    87.      *
    88.      * @param string $search
    89.      * @param array $data
    90.      */
    91.     public function cloneRow($search, $data=array()) {
    92.         // remove ooxml-tags inside pattern                
    93.         foreach ($data as $nn => $fieldset) {
    94.             foreach ($fieldset as $field => $val) {
    95.                 $key = '{'.$search.'.'.$field.'}';
    96.                 $this->setValue($key, $key, 1);
    97.             }
    98.         }
    99.         // how many clons we need
    100.         $numberOfClones = 0;
    101.         if (is_array($data)) {
    102.             foreach ($data as $colName => $dataArr) {
    103.                 if (is_array($dataArr)) {
    104.                     $c = count($dataArr);
    105.                     if ($c > $numberOfClones)
    106.                         $numberOfClones = $c;
    107.                 }
    108.             }
    109.         }
    110.         if ($numberOfClones > 0) {
    111.             // read document as XML
    112.             $xml = new DOMDocument();
    113.             $xml->loadXML($this->_documentXML, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
    114.  
    115.             //$xml = DOMDocument::loadXML($this->_documentXML, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
    116.  
    117.             // search for tables
    118.             $tables = $xml->getElementsByTagName('tbl');
    119.             foreach ($tables as $table) {
    120.                 $text = $table->textContent;
    121.                 // search for pattern. Like {TBL1.
    122.                 if (mb_strpos($text, '{'.$search.'.') !== false) {
    123.                     // search row for clone
    124.                     $patterns = array();
    125.                     $rows = $table->getElementsByTagName('tr');
    126.                     $isUpdate = false;
    127.                     $isFind = false;
    128.                     foreach ($rows as $row) {
    129.                         $text = $row->textContent;
    130.                         $TextWithTags = $xml->saveXML($row);
    131.                         if (
    132.                             mb_strpos($text, '{'.$search.'.') !== false // Pattern found in this row
    133.                             OR
    134.                             (mb_strpos($TextWithTags, '<w:vMerge/>') !== false AND $isFind) // This row is merged with upper row (Upper row have pattern)
    135.                         )
    136.                         {
    137.                             // This row need to clone
    138.                             $patterns[] = $row->cloneNode(true);
    139.                             $isFind = true;
    140.                         } else {
    141.                             // This row don't have any patterns. It's table header or footer
    142.                             if (!$isUpdate and $isFind) {
    143.                                 // This is table footer
    144.                                 // Insert new rows before footer                                
    145.                                 $this->InsertNewRows($table, $patterns, $row, $numberOfClones);
    146.                                 $isUpdate = true;
    147.                             }
    148.                         }
    149.                     }
    150.                     // if table without footer                    
    151.                     if (!$isUpdate and $isFind) {
    152.                         $this->InsertNewRows($table, $patterns, $row, $numberOfClones);
    153.                     }
    154.                 }
    155.             }
    156.             // save document
    157.             $res_string = $xml->saveXML();
    158.             $this->_documentXML = $res_string;
    159.  
    160.             // parsing data
    161.             foreach ($data as $colName => $dataArr) {
    162.                 $pattern = '{' . $search . '.' . $colName . '}';
    163.                 foreach ($dataArr as $value) {
    164.                     $this->setValue($pattern, $value, 1);
    165.                 }
    166.             }
    167.         }
    168.     }
    169.  
    170.     /**
    171.      * Insert new rows in table
    172.      *
    173.      * @param object &$table
    174.      * @param object $patterns
    175.      * @param object $row
    176.      * @param int $numberOfClones
    177.      */
    178.     protected function InsertNewRows(&$table, $patterns, $row, $numberOfClones)    {
    179.         for ($i = 1; $i < $numberOfClones; $i++) {
    180.             foreach ($patterns as $pattern) {
    181.                 $new_row = $pattern->cloneNode(true);
    182.                 $table->insertBefore($new_row, $row);
    183.             }
    184.         }
    185.     } 
    Добавлено спустя 3 минуты 11 секунд:
    разве что какая-то связь с xml
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ну docx простой, раз в документации нет нужного функционала, то допиши.
    Может не открывать как шаблон, а просто как документ и вытягивать данные.
     
  5. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    ну-с, попробовал я вот так:
    Код (PHP):
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    5. </head>
    6.     <body><?php
    7.         require_once 'lib/PHPWord_0.6.2_Beta/PHPWord.php';
    8.  
    9. $template = file_get_contents('templates/AttorneyLetter/upowaznienie_do_odbioru_opinnie_szewcow.docx');
    10. echo mb_detect_encoding($template); 
    11. echo "<pre>";
    12.  
    13. var_dump($template);
    14. echo "</pre>";
    15. ?> </body>
    16. </html>
    получил вот так:
    [​IMG]

    Добавлено спустя 37 секунд:
    там польские символы по большей части.

    Добавлено спустя 8 минут 39 секунд:
    та и с русскими такая же беда.
    [​IMG]
    вообще странно, что при таком маленьком тексте содержится такая длинная строка.
    [​IMG]
    видимо, работает напрямую с xml, хотя все равно странно.
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    iNEEdhLw, docx это не совсем txt поэтому ты получаешь такие кракозябры
     
  7. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    это я заметил, потому и стоит вопрос: как же все таки вытянуть из него текст?
     
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    http://habrahabr.ru/post/69417/ если поможет.

    Добавлено спустя 21 минуту 27 секунд:
    кажется это то что тебе надо.
     
  9. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    да, действительно подойдет.
    а есть идеи, как сохранить форматирование?
    вдруг я захочу передать содержимое одного ворда в другое? (пример)
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    iNEEdhLw используй PHPWord зачем file_get_contents начал использовать?
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    это ж zip
     
  12. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    PHP 7 пользуетесь ?
     
  13. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    в OpenServer ещё нет php 7
     
  14. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    А разница?
     
  15. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Ну я увидел слово Catchable и вспомнил что в PHP 7 толи ошибки можно перехватывать(не путать с error_handler) толи ошибки кидают какието исключения свои.

    Добавлено спустя 52 секунды:
    Ида бенчмарки показывают что PHP 7 просто летать научился =)
     
  16. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    не нашел способа, как адекватно можно получить содержимое шаблона сохраняя форматирование, поэтому запилил руками.
    почти идеально )
     
  17. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    iNEEdhLw, показывай)
     
  18. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    там и показывать-то нечего, специфический текст с форматированием характерным для документов различных.
    на соседней вкладке открыл доку по этой либе и пилил.