OpenTbs将html标签转换为MS Word标签

时间:2012-02-16 16:59:10

标签: php templates ms-word tinybutstrong opentbs

我正在使用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等效文件。

3 个答案:

答案 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('&nbsp;',' ',$fieldValue);
    $fieldValue = str_replace('<br>','<br />',$fieldValue);

    return $fieldValue;
}

现在将此函数称为:

$fieldVal = $this->f_html2docx($this->f_handleUnsupportedTags($fieldVal));