Я использую 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, но вместо этого он просто показал теги MS Office в документе:
First Line<w:br/> Second Line
Как преобразовать теги HTML в эквивалент MS Office XML.
Поскольку у вас есть функция преобразования 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>
На данный момент у меня нет решения для преобразования тегов, отличных от разрывов строк. Простите за это. И я думаю, что было бы сложно записать код.
Спасибо Skrol за ваш вклад во все мои проблемы с openTBS, просто заметили, что вы его создатель, отличный класс и то, что вы сказали выше, было истинным после дня вспашки через изучение формата MS Word. У меня была мозговая волна, а я теперь я могу создать формат, который вы указали выше, и может иметь жирный курсив и подчеркивание, что все, что мне нужно, я надеюсь, что это дает вам основание для улучшения.
Я в основном заметил, что в приведенном примере вам нужен массив стилей, который, когда вы обнаружите закрывающий тег, вы удаляете из массива style. Каждый раз, когда вы находите тег, вам нужно закрыть <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:uw: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\">"; } }