ODTPHP 和段

ODTPHP and segments

我正在使用 odt-php library 自定义带有个人数据的 .odt 模板。

我目前卡在 6th tutorial 期间,我想复制一行 table。

当我使用默认的段名称时,代码 运行 没问题:articles

$app = $odf->setSegment('articles');
foreach ($listing_app as $element) 
{
    $app->descrApp($element['descr']);
    $app->refApp($element['ref']);
    $app->merge();  
}
$odf->mergeSegment($app);

但是当我想replace/edit/create一个新的段用另一个名字(这里test。它不起作用

Fatal error: Uncaught exception 'OdfException' with message ''test' segment not found in the document'

代码完全一样

$app = $odf->setSegment('test');
foreach ($listing_app as $element) 
{
    $app->descrApp($element['descr']);
    $app->refApp($element['ref']);
    $app->merge();  
}
$odf->mergeSegment($app);

我的 .odt 中确实有这些行:

[!-- BEGIN row.test --] {descrApp} {refApp} [!-- END row.test --]

我尝试 copy/paste 仅通过编辑段名称从在线教程中获取。而且我还尝试重写所有内容。似乎没有任何效果。

我还尝试将我的 template.odt 导出为 xml,似乎没有任何问题

<informaltable frame="all">
    <tgroup cols="3"><tbody><row><entry><para/></entry><entry><para/></entry><entry><para/></entry></row><row><entry><para>[!-- BEGIN row.articles --]{descrApp}</para></entry><entry><para>{refApp}</para></entry><entry><para/><para/><para>[!-- END row.articles --]</para></entry></row></tbody></tgroup>
  </informaltable>

编辑

我发现错误来自这个函数

public function setSegment($segment)
{
    if (array_key_exists($segment, $this->segments)) {
        return $this->segments[$segment];
    }
    // $reg = "#\[!--\sBEGIN\s$segment\s--\]<\/text:p>(.*?)<text:p\s.*>\[!--\sEND\s$segment\s--\]#sm";
    $reg = "#\[!--\sBEGIN\s$segment\s--\](.*?)\[!--\sEND\s$segment\s--\]#smU";
    if (preg_match($reg, html_entity_decode($this->contentXml), $m) == 0) {
        throw new OdfException("'$segment' segment not found in the document");
    }
    $this->segments[$segment] = new Segment($segment, $m[1], $this);
    return $this->segments[$segment];
}

我对正则表达式了解不够,但您认为这可能不是最新的吗?

问题主要不是odtPhp引起的! 问题是你修改模板odt文件的方式引起的。一旦您在(较新的)open/libreoffice 中编辑模板文档中的行标签,它就会向其中添加一些不需要的格式化程序:

原代码:

[!-- BEGIN row.articles --]

新代码:

[!-- BEGIN row.<text:span text:style-name="T4">articles</text:span> --]

最简单的解决方法是重写整个占位符。 或者,您可以执行以下操作:

  1. 根据需要修改模板文件。
  2. 解压缩 odt 文件(是一个简单的 zip 文件)
  3. 再次在文本编辑器中手动删除那些不需要的标签(文件:content.xml)
  4. 再次将文件打包成 zip 文件并将其重命名回 .odt。

补充说明:

作为测试,我削弱了函数 setSegment 中的标签检测器,使其仍能按需触发:

$reg = "#\[!--\sBEGIN\s(.*?)$segment(.*?)\s--\](.*?)\[!--\sEND\s(.*?)$segment(.*?)\s--\]#smU";

这怎么会导致误报和库中的错误。

我发现我可以通过小心删除导致问题的整个元素并重新键入整个内容来解决这个问题。 (而不是删除中间的一点并替换它。)