我有一些用户使用Microsoft Word生成的RTF文件。我需要能够连接这些文件,并且libreoffice仍然可以读取结果文件。我正在使用libreoffice将结果文件转换为PDF文件。
为了连接两个文件,我的应用程序删除了第一个文件的最后一个字符和我的另一个文件的第一个字符。不删除文件头(我不是在谈论页眉)。
出于某种原因,libreoffice不喜欢Microsoft Word插入的标头。但是,如果我用Wordpad打开这些文件并保存它,它工作正常。
删除这些标头的另一种方法是在连接它们之前将这些文件转换为RTF。这样我可以转换成PDF,但是当我将文件转换为RTF时,libreoffice会严重破坏我的标签。
那么如何在不搞乱标签的情况下通过PHP删除标题?或者你有另一种方法来获得相同的结果?
编辑:
简而言之,我必须能够将这些文件连接起来,并且libreoffice可以打开它。我的标签仍然可以很好地显示在Microsoft Word中。
您可以猜到,用户不想使用写字板。我的客户的IT部门必须遵守这个愿望(办公室政治)。
更新:
由于业务规则,我必须先进行合并。合并文件,然后我的用户可以使用Word修改它(这里没有问题)。然后他们要求他们的老板验证它。如果老板同意验证,则RTF文件将成为PDF文件。
更新2:
我有一个解决方案。如果RTF文件以纯文本或图片开头,则必须删除所有内容,直到获得\ pard。但是,如果您以标签文件开头,这不起作用。
更新3:
如果你也想支持标签,你必须删除evrything,直到你得到\ pard或\ trowd。一旦我得到一个有效的代码,我将发布整个解决方案。只要您不需要颜色并且所有文件都使用相同的字体(因为我们不删除第一个文件的RTF标题),这将正常工作。
答案 0 :(得分:1)
如果使用'纯RTF'方法的限制回过头来咬你,你可以使用LibreOffice将RTF文件转换为docx,然后使用工具合并docx文件。
有.NET和Java的工具(例如我们的MergeDocx产品);我不确定你会发现什么是PHP。
答案 1 :(得分:0)
我成功构建了一个可靠的代码,可以操作使用Microsoft Word创建的RTF文件。只要您只需要文本,图片和标签,并且不需要花哨的东西作为颜色,它就可以工作。颜色适用于文字,但除此之外......
$content = "";
//stristr Returns all of haystack starting from and including the first occurrence of needle to the end.
$tmp_pard = stristr($RTFstring, "\pard");
//stristr fail to detect \trowd
$tmp_tab = stristr($RTFstring, "trowd");
if($tmp_pard != "" || $tmp_tab != "") {
//We pick the longer string. Because we want the first occurence of \pard or \trowd
if(strlen($tmp_pard) > strlen($tmp_tab))
// { is added so concatenation code still works. We just remove headers.
$content = "{" . substr($RTFstring,-strlen($tmp_pard)) ;
else
$content = "{" . "\\". substr($RTFstring,-strlen($tmp_tab)) ;
} else {
$content = $RTFstring;
}
return $content;