Konwersja strony kodowej podczas czytania plików *.doc

0

Witam

Jestem w trakcie tworzenia mechanizmu czytającego zawartość plików *.doc . Ze względu na fakt wykorzystania narzędzia na serwerze (bez instalacji MS Office czy innych narzędzi) nie mogę wykorzystać Interop MS Office.

Udało mi się stworzyć mechanizm czytający dane binarne z pliku (kod poniżej), jednak ma on pewien mankament. Nie potrafi czytać polskich znaków. Kiedy w tekście pliku znajdują się polskie znaki diakrytyczne mechanizm czyta kilka pierwszych liter (jeśli w pliku nie ma polskich znaków czytana jest zawartość całego pliku).

FileStream fs = null;
				
fs = new FileStream(plik.ToString(), FileMode.Open);
byte[] example = new byte[fs.Length];
fs.Read(example, 0, example.Length);
string outtext = "";
int count = 0;
					
for (int i = 2560; i < example.Length; i++)
{
	if (example[i] == 0)
	{
		break;
	}
	count++;
}
					
BinaryReader br = new BinaryReader(fs, Encoding.GetEncoding(1250));
br.BaseStream.Position = 2560;  
byte[] newarr = br.ReadBytes(count); 
					
outtext = System.Text.UTF8Encoding.UTF8.GetString(newarr); 
string str = "";
for (int i = 0; i < outtext.Length; i++)
{
	if ((outtext[i] >= '!' && outtext[i] <= '~') || (outtext[i] == ' ') || (outtext[i] == '\r'))
	{
		str += outtext[i];
	}
}
fs.Close();
tekst = str;

Udało mi się wyciągnąć kilka znaków diakrytycznych przy konwersji na Unicode, jednak spowodowało to, że wszystkie pozostałe znaki zostały pominięte.

Proszę o pomoc w kwestii konwersji, bo zakładam, że tutaj jest problem.
Dziękuję z góry za wszystkie sensowne wypowiedzi

0

skąd ci się wzięło CP1250 i UTF-8, skoro Word zapisuje dane jako UTF-16? (czyli nie potrzeba byłoby żadnej konwersji)

poza tym widać, że czytasz plik na pałę bez znajomości nagłówka, co może spowodować że trzy dokumenty odczytasz, a czwartego już nie, bo czymś się różnił.
format pliku .doc jest opisany w dokumentach:
[MS-CFB]: Compound File Binary File Format
[MS-DOC]: Word (.doc) Binary File Format
ale uprzedzam, że ci się odechce ;-)

0

Dzięki za linki do dokumentacji. Z chęcią w wolnym czasie zapoznam się z nimi.

Idąc jednak Twoją logiką tekst, który został przeczytany przez ten mechanizm powinien zawierać znaki diakrytyczne. Jeśli jednak zapiszę wynikowy string "tekst" do pliku txt (bądź wyświetlę w cmd) polskich znaków nie pokazuje. Tak jak pisałem wcześniej konwersja na Unicode spowodowała wyświetlenie wyłącznie polskich znaków, a konwersja na UTF8 wyświetliła wszystko poza tymi znakami. Czy dałoby się jednak (niezależnie czy mechanizm jest w 100% poprawny czy też nie) przekodować wynik w taki sposób, żeby pojawiały się wszystkie czytane znaki?

0

Bez rozbiórki formatu pewnie nie. O ile dobrze pamiętam to taki doc ma np. optymalizację, żeby zmiany były wpisywane na koniec pliku, żeby się szybciej zapisywał. Ja bym spróbował poszukać może jakieś biblioteki.

Edit: Może to się przyda: http://stackoverflow.com/questions/4724765/manipulating-word-documents-on-server-without-office-installed-asp-net .

0
Zjarek napisał(a):

Edit: Może to się przyda: http://stackoverflow.com/questions/4724765/manipulating-word-documents-on-server-without-office-installed-asp-net .

Niestety, ale rozwiązanie, które podałeś w poście wymaga InterOp'a, a ja potrzebuję czegoś, co będzie czytać doc'ki na FreeBSD, gdzie oczywiście nie można zainstalować MS Office.

Ale i tak dzięki za odpowiedź.

0

OpenOffice / LibreOffice czyta. Może da się z nimi "interopować", a jeśli nie - to wyciągnąć co trzeba ze źródeł.

1 użytkowników online, w tym zalogowanych: 0, gości: 1