OpenTbs конвертирует HTML-теги в теги MS Word - PullRequest
0 голосов
/ 16 февраля 2012

Я использую OpenTbs, http://www.tinybutstrong.com/plugins/opentbs/tbs_plugin_opentbs.html.

У меня есть template.docx, и я могу заменить поля содержимым, но если содержимое имеет HTML-код, оно отображается в документе, созданном шаблоном.

First list <br /> Second Line

Я пытался использовать:

$TBS->LoadTemplate('document.docx', OPENTBS_ALREADY_XML); 

Думая, что это позволило бы мне заменить мои html-теги на теги ms office, но вместо этого в документе просто отображались теги MS Office:

First Line<w:br/> Second Line

Как преобразовать теги HTML в эквивалент MS Office XML.

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Спасибо Skrol за ваш вклад по всем моим проблемам с openTBS, только что заметил, что вы его создатель, его класс, и то, что вы сказали выше, было правдой после дня, когда я изучал формат MS Word, у меня был мозгволна, и теперь я могу создать формат, который вы указали выше, и он может выделяться жирным курсивом и подчеркиванием, и это все, что мне нужно, я надеюсь, что это даст вам основу для улучшения.

Я в основном заметил, что вНапример, вам нужен только массив стилей, который при нахождении закрывающего тега удаляется из массива стилей.Каждый раз, когда вы находите тег, вам нужно закрыть <w:r> и создать новый, я проверял его, и он прекрасно работает.

class printClass {
    private static $currentStyles = array();    

    public function __construct() {}

    public function format($string) {
            if($string !=""){
            return preg_replace_callback("#<b>|<u>|<i>|</b>|</u>|</i>#",
                                        'printClass::replaceTags',
                                        $string);
        }else{
            return false;
        }
    }


    private static function applyStyles() {

        if(count(self::$currentStyles) > 0 ) {

            foreach(self::$currentStyles as $value) {

                if($value == "b") {
                    $styles .= "<w:b/>";
                }   

                if($value == "u") {
                    $styles .= "<w:u w:val=\"single\"/>";
                }   

                if($value == "i") {
                    $styles .= "<w:i/>";
                }
            }

            return "<w:rPr>" . $styles . "</w:rPr>";
        }else{
            return false;
        }
    }



    private static function replaceTags($matches) {

        if($matches[0] == "<b>") {
            array_push(self::$currentStyles, "b");
        }   

        if($matches[0] == "<u>") {
            array_push(self::$currentStyles, "u");
        }   

        if($matches[0] == "<i>") {
            array_push(self::$currentStyles, "i");
        }

        if($matches[0] == "</b>") {
            self::$currentStyles = array_diff(self::$currentStyles, array("b"));
        }   

        if($matches[0] == "</u>") {
            self::$currentStyles = array_diff(self::$currentStyles, array("u"));
        }   

        if($matches[0] == "</i>") {
            self::$currentStyles = array_diff(self::$currentStyles, array("i"));
        }

        return "</w:t></w:r><w:r>" . self::applyStyles() . "<w:t xml:space=\"preserve\">";
    }
}
1 голос
/ 17 февраля 2012

Поскольку у вас есть функция преобразования HTML в DOCX, вы можете реализовать ее в OpenTBS, используя пользовательскую функцию PHP и параметр "onformat".

Следующая функция преобразует только разрывы строк:

function f_html2docx($FieldName, &$CurrVal) {
  $CurrVal= str_replace('<br />', '<w:br/>', $CurrVal);
} 

Использование в шаблоне DOCX:

[b.thetext;onformat=f_html2docx]

О преобразовании HTML в DOCX:

Преобразование форматированного текста в другой форматированный текст довольно частокошмарный сон.Вот почему разумно хранить чистые данные вместо форматированных данных.

Преобразование HTML в DOCX - настоящий кошмар, потому что форматирование структурировано не так.

Например, в HTMLтеги могут быть вложенными, например:

<i> hello <b> this is important </b> to know </i>

В DOCX это будет выглядеть как пересечение, например:

  <w:r>
    <w:rPr><w:b/></w:rPr>
    <w:t>hello</w:t>
  </w:r>

  <w:r>
    <w:rPr><w:b/><w:i/></w:rPr>
    <w:t>this is important</w:t>
  </w:r>

  <w:r>
    <w:rPr><w:i/></w:rPr>
    <w:t>to know</w:t>
  </w:r>

У меня нет решения для преобразования тегов, кроме переносов строктеперь.Простите за это.И я думаю, что было бы довольно сложно закодировать один.

...