2011-02-11 12 views
6

Używam Apache POI do manipulowania plikami .docx Microsoft Word - tzn. Otwórz dokument, który był pierwotnie stworzony w Microsoft Word, zmodyfikuj go, zapisz w nowym dokumencie.Jak prawidłowo generować atrybuty RSID w plikach Worda .docx przy użyciu Apache POI?

Zauważyłem, że nowe akapity utworzone przez Apache POI brakuje Revision Zapisz identyfikator, często znany jako RSID lub rsidR. To jest używane przez program Word do identyfikowania zmian wprowadzonych do dokumentu w jednej sesji, np. Między zapisami. Jest to opcjonalne - użytkownicy mogliby go wyłączyć w Microsoft Word, gdyby chcieli - ale w rzeczywistości prawie wszyscy go mają, więc prawie każdy dokument jest pełen RSIDów. Przeczytaj this excellent explanation of RSIDs, aby uzyskać więcej informacji na ten temat.

w dokumencie programu Microsoft Word word/document.xml zawiera paragrafy tak:

<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> 

Jednak ten sam akapit stworzony przez UM będzie wyglądać w word/document.xml:

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

Mam zorientowali się, że Mogę wymusić dodawanie RSID do każdego akapitu przy użyciu kodu podobnego do tego:

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

Jednak nie wiem, jak powinienem generować RSID.

Czy punkty POI mają sposób generowania i/lub śledzenia RSID? Jeśli nie, czy mogę w jakiś sposób upewnić się, że wygenerowany przeze mnie identyfikator RSID nie jest sprzeczny z tym, który już znajduje się w dokumencie?

+0

Od artysty o których wspomniałeś: "Są całkowicie losowe i są używane tylko do sprawdzenia, gdzie rzeczy pasują. Więc nie są one przydatne, chyba że łączysz się z innym dokumentem, który ma również RSID. "Możesz więc wygenerować odpowiednie liczby losowe. Jeśli chodzi o konflikty, ich lista jest przechowywana w jednej z części właściwości. Poprawiają tylko pewne przypadki porównania/różnic .. – JasonPlutext

Odpowiedz

4

Wygląda na to, że lista poprawnych wpisów rsid jest przechowywana w pliku word/settings.xml w pozycji <w:rsids>. XWPF powinien być w stanie dać ci już do tego dostęp.

Prawdopodobnie chcesz wygenerować 8 losowo wybraną cyfrę o wartości szesnastkowo-szesnastkowej, sprawdź, czy jest tam, i ponownie wygeneruj, jeśli jest. Gdy masz już unikalny, dodaj go do tej listy, a następnie oznacz go akapitem.

To, co sugeruję, to dołączenie do listy deweloperów poi: (mailing list details), a my możemy pomóc w przygotowaniu łatki. Myślę, że warte uwagi są:

  • Wrapper wokół wejścia RSids w Word/settings.xml, co pozwala łatwo sprowadzić listę i wygenerować nowy (unikalny jeden)
  • owijkę wokół innego RSid wpisy na pkt i biegu
  • metod na pkt i prowadzi do uzyskania opakowanie RSid, dodać nowy lub usunąć istniejący

powinniśmy wziąć to do listy dev chociaż :)

+0

Dzięki za odpowiedź, wygląda to na rozsądne rozwiązanie, a ponieważ potrzebuję tej funkcjonalności, to równie dobrze mogę ją skompilować! Tak więc rzeczywiście wezmę to na listę dev POI . – gutch

Powiązane problemy