我正在使用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);
认为这可以让我用ms office标签替换我的html标签,但它只是在文档中显示了MS Office标签:
First Line<w:br/> Second Line
如何将HTML标记转换为MS Office XML等效文件。
答案 0 :(得分:1)
由于您具有HTML到DOCX的转换功能,因此您可以使用自定义PHP函数和参数“onformat”在OpenTBS中实现它。
以下功能仅转换换行符:
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>
我目前还没有解决换行以外的标签的方法。对不起。 我认为编写一个代码非常困难。
答案 1 :(得分:1)
感谢Skrol对我所有openTBS问题的意见,只是注意到你是它的创造者,它是一个伟大的课程,你通过学习MS Word格式的一天后,你上面说的是真的我有一个大脑wave,我现在能够生成您在上面指定的格式,并且可以使用粗体斜体和下划线,这是我所需要的,我希望这为您提供了改进的基础。
我基本上注意到在示例中,您只需要一个样式数组,当您找到从样式数组中删除的结束标记时。每次找到标签时都需要关闭<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\">";
}
}
答案 2 :(得分:0)
public function f_html2docx($currVal) {
// handling <i> tag
$el = 'i';
$tag_open = '<' . $el . '>';
$tag_close = '</' . $el . '>';
$nb = substr_count($currVal, $tag_open);
if ( ($nb > 0) && ($nb == substr_count($currVal, $tag_open)) ) {
$currVal= str_replace($tag_open, '</w:t></w:r><w:r><w:rPr><w:i/></w:rPr><w:t>', $currVal);
$currVal= str_replace($tag_close, '</w:t></w:r><w:r><w:t>', $currVal);
}
// handling <b> tag
$el = 'b';
$tag_open = '<' . $el . '>';
$tag_close = '</' . $el . '>';
$nb = substr_count($currVal, $tag_open);
if ( ($nb > 0) && ($nb == substr_count($currVal, $tag_open)) ) {
$currVal= str_replace($tag_open, '</w:t></w:r><w:r><w:rPr><w:b/></w:rPr><w:t>', $currVal);
$currVal= str_replace($tag_close, '</w:t></w:r><w:r><w:t>', $currVal);
}
// handling <u> tag
$el = 'u';
$tag_open = '<' . $el . '>';
$tag_close = '</' . $el . '>';
$nb = substr_count($currVal, $tag_open);
if ( ($nb > 0) && ($nb == substr_count($currVal, $tag_open)) ) {
$currVal= str_replace($tag_open, '</w:t></w:r><w:r><w:rPr><w:u w:val="single"/></w:rPr><w:t>', $currVal);
$currVal= str_replace($tag_close, '</w:t></w:r><w:r><w:t>', $currVal);
}
// handling <br> tag
$el = 'br';
$currVal= str_replace('<br />', '<w:br/>', $currVal);
return $currVal;
}
public function f_handleUnsupportedTags($fieldValue){
$fieldValue = strip_tags($fieldValue, '<b><i><u><br>');
$fieldValue = str_replace(' ',' ',$fieldValue);
$fieldValue = str_replace('<br>','<br />',$fieldValue);
return $fieldValue;
}
现在将此函数称为:
$fieldVal = $this->f_html2docx($this->f_handleUnsupportedTags($fieldVal));