1

Microsoft Word を使用しているユーザーによって生成された RTF ファイルがいくつかあります。これらのファイルを連結できるようにする必要があり、結果ファイルは引き続き libreoffice で読み取り可能である必要があります。結果ファイルを PDF ファイルに変換するために libreoffice を使用しています。

2 つのファイルを連結するために、私のアプリケーションは最初のファイルの最後の文字と他のファイルの最初の文字を削除します。ファイルのヘッダーは削除されません (ページ ヘッダーについて話しているわけではありません)。

何らかの理由で、libreoffice は Microsoft Word によって挿入されたヘッダーを好みません。しかし、これらのファイルをワードパッドで開いて保存すると、問題なく動作します。

これらのヘッダーを削除する別の方法は、これらのファイルを連結する前に RTF に変換することです。この方法で PDF に変換できますが、ファイルを RTF に変換すると、libreoffice がタブをひどく混乱させます。

では、タブをいじらずに PHP からヘッダーを削除するにはどうすればよいでしょうか。または、同じ結果を得る別の方法がありますか?

編集 :

一言で言えば、これらのファイルを連結し、libreoffice で開くことができなければなりません。また、タブは引き続き Microsoft Word で適切に表示される必要があります。

ご想像のとおり、ユーザーはワードパッドを使いたがりません。そして、私の顧客の IT 部門は、その要望 (オフィスの方針) に従わなければなりません。

アップデート :

ビジネス ルールのため、最初にマージを行う必要があります。ファイルがマージされ、ユーザーは Word を使用してファイルを変更できます (ここでは問題ありません)。次に、上司に検証を依頼します。上司が検証に同意すると、RTF ファイルは PDF ファイルになります。

更新 2:

私は解決策の始まりを持っています。RTF ファイルがプレーン テキストまたは画像で始まる場合は、\pard になるまですべてを削除する必要があります。ただし、タブでファイルを開始すると、これは機能しません。

更新 3:

タブもサポートしたい場合は、\pard または \trowd を取得するまですべてを削除する必要があります。動作するコードを取得したら、ソリューション全体を投稿します。色を必要とせず、すべてのファイルが同じフォントを使用している限り、これは問題なく機能します (最初のファイルの RTF ヘッダーを削除しないため)。

4

2 に答える 2

1

「純粋な RTF」アプローチの制限が戻ってきた場合は、LibreOffice を使用して RTF ファイルを docx に変換し、ツールを使用して docx ファイルをマージすることができます。

.NET および Java 用のツール (MergeDocx 製品など) があります。PHPで何が見つかるかわかりません。

于 2013-08-08T03:40:27.020 に答える
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;
于 2013-08-07T09:30:21.557 に答える