0

私は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タグに置き換えることができますが、代わりにドキュメントにMSOfficeタグが表示されます。

First Line<w:br/> Second Line

HTMLタグを同等のMSOfficeXMLに変換するにはどうすればよいですか。

4

3 に答える 3

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>

今のところ、改行以外のタグを変換する解決策はありません。そのために残念。そして、それをコーディングするのはかなり難しいと思います。

于 2012-02-17T11:53:44.963 に答える
1

私のすべてのopenTBSの問題についてご意見をくださったSkrolに感謝します.あなたがその作成者であり、その素晴らしいクラスであることに気づきました.MS Word形式を学習して1日を耕した後、あなたが言ったことは真実でした.私は脳波を持っていました.上記で指定された形式を作成できるようになり、太字のイタリック体と下線を使用できるようになりました。必要なのはこれだけです。これが改善の基盤になることを願っています。

基本的に、あなたが配置した例では、スタイル配列から削除する終了タグを見つけたときにスタイルの配列が必要であることに気付きました。<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\">";
    }
}
于 2012-02-17T18:06:33.557 に答える
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));
于 2020-03-27T18:04:39.410 に答える