2011-02-11 15 views
6

私はApache POIを使用してMicrosoft Wordの.docxファイルを操作しています。つまり、もともとMicrosoft Wordで作成された文書を開き、変更して新しい文書に保存します。Apache POIを使用してWord .docxファイルでRSID属性を正しく生成する方法は?

私は、Apache POIによって作成された新しい段落がしばしばRSIDまたはrsidRとして知られ、リビジョン保存IDが欠落していることに注意してください。これは、Wordで1つのセッション、たとえば保存の間にドキュメントに加えられた変更を識別するために使用されます。オプションです。ユーザーは必要に応じてMicrosoft Wordでオフにすることができますが、実際にはほぼすべてのユーザーがこれを使用しているため、ほぼすべてのドキュメントがRSIDでいっぱいです。詳しくは、this excellent explanation of RSIDsをご覧ください。 Microsoft Word文書で

word/document.xmlは次のように段落が含まれています

<w:p> 
    <w:r> 
    <w:t>Paragraph of text here.</w:t> 
    </w:r> 
</w:p> 

私がいることを考え出した:POIによって作成された同じ段落がword/document.xmlで次のようになります。しかし

<w:p w:rsidR="007809A1" w:rsidRDefault="007809A1" w:rsidP="00191825"> 
    <w:r> 
    <w:t>Paragraph of text here.</w:t> 
    </w:r> 
</w:p> 

POIに次のようなコードを使用して各段落にRSIDを追加するように強制できます。

byte[] rsid = ???; 
    XWPFParagraph paragraph = document.createParagraph(); 
    paragraph.getCTP().setRsidR(rsid); 
    paragraph.getCTP().setRsidRDefault(rsid); 

しかし、私はどのように私はRSIDsを生成する必要がありますか分からない。

POIは、RSIDを取得する方法、または生成するか、追跡していますか?そうでない場合は、私が生成するRSIDがすでに文書にあるRSIDと矛盾しないようにする方法はありますか?

+0

芸術家からあなたは参照しました: "彼らは完全にランダムであり、物事がどこに合っているかを見るためにのみ使われます。したがって、RSIDを持つ別のドキュメントとマージしない限り、あまり使用されません」適切な乱数を生成することができます。競合に関しては、それらのリストがプロパティパーツの1つに格納されます。 – JasonPlutext

答えて

4

有効なrsidエントリのリストは、<w:rsids>エントリのword/settings.xmlに保持されているようです。 XWPFはあなたにすでにアクセスできるはずです。

おそらく、8桁の16進数の長い乱数を生成し、それがそこにあるかどうかを確認し、そうであれば再生成したいと思うでしょう。ユニークなものがあれば、それをそのリストに追加してから、その段落にタグを付けます。

私が示唆しているのは、poi devリスト(mailing list details)に参加し、そのパッチを手にすることです。単語/ settings.xml内RSidsエントリの周りのラッパー、あなたは簡単にリストを取得し、新しい(ユニーク1)を生成させるために

  • は異なるRSIDのラッパー

    • :私はやるべき事があると思います段落の段落と実行
    • 法上のエントリと、RSIDラッパーを取得し、新しいものを追加したり、クリアするために実行し、既存の1

    我々は、しかしDEVリストにこれを取る必要があります:)

  • +0

    あなたの答えをお寄せいただきありがとうございます。これは賢明な解決策のように見えますが、私は機能が必要なので、私もそれを構築するかもしれません!だから、これを実際にPOI開発者リストに入れます。 – gutch

    関連する問題