RTF….. a może nie powinienem ograniczać tego do RTF ale sądzę, że to dobry przykład. RTF, format pliku znany chyba każdemu kto siedział na windows – podstawowy format zapisu w WordPad, format dostępny w MS Office. Prawie każdy dokument w MS Word jesteśmy wstanie zapisać jako RTF. Prawie wszystkie własności tego pliku są także zapisywane wraz z tym plikiem. Ustawiliśmy tags/keywords w docx? Będą one przeniesione do RTF. Można to łatwo sprawdzić w UI offica.

I tutaj właśnie się zaczyna magia. Te własności są dostępne, ale są one dostępne tylko i wyłącznie z poziomu Worda. Nie są dostępne z poziomu explorer’a, z poziomu własności plików, z poziomu Shell32 API. Ogólnie NIE MA JAK SIĘ DO NICH DOSTAĆ.

keywords/tags były i są zapisywane w różnych miejscach w zależności od systemu operacyjnego jak i typu pliku. Jak już wiemy, własności docx są zapisywane w pliku w formacie XML i można się do nich dostać za pomocą na przykład LINQ to XML. Doc i Docx są różnie zapisywane w zależności od systemu operacyjnego i wersji office.

Jednak, od windows Vista, trochę się pozmieniało. I teraz pewne rzeczy nie są już dostępne i koniec. Jeżeli zobaczymy na plik docx, to nie zobaczymy własności, z kodu już możemy je pobrać jak i zobaczymy te własności w pliku doc do których z kodu też możemy się dostać. Zaś przy RTF ich nigdzie nie zobaczymy a próba ich pobrania nic nam nie zwróci.

Na przykład mam plik RTF z tag ustawiony w Word:

RTF i Advance Property Window w Word 2016
RTF i Advance Property Window w Word 2016

Jak wezmę jego własności to mam:

RTF i Windows Explorer Properties
RTF i Windows Explorer Properties

Jak spróbuje się dobrać z kodu – jakąkolwiek metodą (to jeszcze pewnie opiszę) to nic nie dostaniemy.

Jesteśmy tak naprawdę w kropce. Nie mamy wyjścia i jedyną opcją pobrania własności RTF jest załadowanie RTF w procesie worda i za pomocą API wordowego dobranie się do właściwości dokumentu. Nie jest to ani fajne, ani miłe. Ale działa.

PS.: tak jak pisałem RTF to tylko przykład, taki sam problem istnieje dla innych typów plików – na przykład TXT. Jednak przy innych to raczej nie mamy styczności w pisaniu rozwiązań w oparciu o Worda.

4 KOMENTARZE

  1. Czasami mnie zaskakujesz ;) RTF to w gruncie rzeczy plik tekstowy i tagi można znaleźć w jego źródle prostym wyrażeniem. Tu masz plik zapisany w Word 2016 jako rtf (wyciąłem link bo fiddle nie pozwala) i jedym wyrażeniem /{\\keywords[^}]+}/g znajdziesz poszukiwane tagi, Worda można pominąć: http://refiddle.com/refiddles/5ab5131e75622d4fe9970000

    Warto zapoznać się z samą dokumentacja rtfa i jak przechowuje informacje o dokumencie: http://www.biblioscape.com/rtf15_spec.htm#Heading25

    Co do txt, to pierwsze słysże aby udało się w nich zapisywać tagi, nie udało mi się zmusić Worda aby je zapisał….

    • a widzisz! lubie czasami zaskakiwać ;)

      dziękuję Ci za to, bo jak nie wiem co serio szukałem nawet ręcznie otwierając w notatniku i znaleźć nie mogłem! wiem, że na 10 mi to śmiga, super sprawa. Będę więc próbował na innych systemach dla których jest wsparcie pluginu – od xp wzwyż, problemu jednak nie powinno być. nie wiem czemu tego nie znalazłem szczerze mówiąc. może jak głupi szukałem po tags… nie ważne. ważne, że byłem w błędzie :)

      Co do txt :) kiedyś można to było robić bo system plików na to zezwalał. właściwości nie były przechowywane w pliku ale jako rozszerzenia czy jakkolwiek to poprawnie nazwać systemu plików. I tak, można było ustawiać z poziomy prawego przycisku myszy keywords na na txt.

      Od Windows 7 (w XP były ale za pomocą jakiegoś dodatku i są traktowane jako legacy jak dobrze pamiętam) jest coś takiego co się zwie Property Handlers i one umożliwiają wiele ciekawych rzeczy jeżeli chodzi o własności plików jak i wsparcie dla wyszukiwania i indeksowania. Wcześniej NATF miał osobny strumień danych dla własności zaś takie pliki jak DOC wykorzystywały Compound File Binary Format. Właśnie, pisząc to nie wiem czy sprawdziłem czy Property Handlers by odczytały własności plików…

      ta czy siak, dzięki za podpowiedź czytaniem pure text, serio nie wiem jak to mogłem przgapić :)

Comments are closed.