Автор
|
Тема: Как скачать текст из *.doc или *.rtf файла
|
alpeugene |
опубликован 06-02-2002 00:16 MSK
Задача в следующем:Надо получить содержимое указанных выше файлов в виде текста(только текста, без форматирования) Если использовать CFile::Read или СStdioFile::ReadString,то в случае word-овского документа получается нечто не читаемое,а в случае *.rtf - текст с символами форматирования .....Вообще то есть как минимум 2 варианта решения: 1)Использовать Word как сервер автоматизации посредством IDispatch 2)Открыть в скрытом виде Wordpad,скачать текст,закрыть Wordpad Оба способа несколько корявы(Word глючит вообще и как сервер автоматизации в частности,Wordpad не удается полностью скрыть,к тому же это еще один процесс) Может кто знает способы лучше и радикальнее ? Помогитеееее!!!!
|
Muran
|
опубликован 06-02-2002 12:23 MSK
В доке там есть кусок в файле, где идет вець текст на странице. Идет без форматирования, то, что тебе надо, как я понял. Надо просто найли офсет и скачать.А в ртф там ведь все форматирование заключено в <>, тас что читаешь все подряд кроме этих кусков между <> включая сами <> |
Muran
|
опубликован 06-02-2002 12:27 MSK
Сорри, не <> а {} Главное не запутаться во вложенных.
|
SUnteXx
|
опубликован 06-02-2002 12:59 MSK
/**************************************************************************** * * FUNCTION: OpenTheFile(HWND, int, char *) * * PURPOSE: Opens the given text or rtf file. * ****************************************************************************/ BOOL OpenTheFile( HWND hWndRichEdit, int iAttrib, char *lpszFileName ) { HFILE hFile; OFSTRUCT of; EDITSTREAM eStream; if (hFile = OpenFile(lpszFileName, &of, OF_READ)) { // dwCookie is an app-defined value that holds // the handle to the file. eStream.dwCookie = hFile; eStream.pfnCallback = EditStreamCallback; eStream.dwError = 0; SendMessage(hWndRichEdit, EM_STREAMIN, (WPARAM)iAttrib, (LPARAM)&eStream); // Reset the dirty bit. SendMessage (hWndRichEdit, EM_SETMODIFY, (WPARAM)TRUE, 0L); CloseHandle((HANDLE)hFile); return TRUE; } return FALSE; } /**************************************************************************** * * FUNCTION: EditStreamCallback(DWORD, LPBYTE, LONG, LONG FAR *) * * PURPOSE: Callback that reads int the stream. * ****************************************************************************/ DWORD CALLBACK EditStreamCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG FAR *pcb) { ReadFile((HANDLE)dwCookie, pbBuff, cb, pcb, NULL); if (*pcb < cb ) return 0; // file has been fully read in else return ((DWORD)*pcb); // more to read } Вот пример для чтения РТФ'а в ричьэдит! Про doc ничего не знаю:( 2Muran: Знаешь прикол? Иногда символы кодируются в (к примеру) "\'cf\'ee\'f7\'e5\'ec\'f3 \'ea\'ee\'ec\'ef\'fc":( Ах да, попробуй нади здесь текст (програмно): "{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fnil\fcharset204 Franklin Gothic Medium;}{\f1\fnil\fcharset204{\*\fname Courier New;}Courier New CYR;}} {\colortbl ;\red0\green0\blue0;} \viewkind4\uc1\pard\sl360\slmult1\qc\cf1\ul\b\i\f0\fs32 Muran\ulnone\b0\i0\f1\fs20\par \pard\par \pard\par } " Тэгов как в HTML'e нету:( Есть некое подобие, но не то:( Так что облом-с! |
alpeugene
|
опубликован 06-02-2002 01:05 MSK
А можно поподробннее начтет word-a и offset-a Как его найти,если это возможно,используя СFile или CStdioFile(или есть другой способ)? Вообще-то мне нужно все содержимое *.doc файла в виде только текста (например, если бы Word coхранил его в формате *.txt) |
Muran
|
опубликован 06-02-2002 01:08 MSK
2SUnteXx: Вообще тут достаточто просто разобраться, было бы желание. Там текст выделен четко. Перед Muran пробел после какойто херни. А после слэш. Я пробовал разные извраты, все можно найти, если charcode стандартный. |
SUnteXx
|
опубликован 06-02-2002 13:14 MSK
Дык, есесно, во всем можно разобраться! Но все же надо разбираться:( Все можно и найти, но я так написал потому, что ты написал выше, что "А в ртф там ведь все форматирование заключено в <>, тас что читаешь все подряд кроме этих кусков между <> включая сами <>. Сорри, не <> а {} Главное не запутаться во вложенных." RTF не HTML, а так ничего сложного вроде бы нет:)Как я понял нужен только текст! А если будет текст типа "\ul\b\i" (кстати, \ul - underline, \b - bold, \i - italic:)! Как быть тогда? Все, понял, попробовал создать такой РТФ и понял! В таком случае, если текст идет со слешем, то ставится двойной слеш! ГЫ, как все просто:) Правда, если брать нормальный РТФ, а не вордовский:( |
alpeugene
|
опубликован 14-02-2002 12:09 MSK
Спасибо за все ответы,все было очень ценно,осталось лишь пару вопросов: 1)Насчет offset-а в Ворде,может подскажете,как его можно програмно вычислить(может он везде начинается определенном номере символа ,например 1451 или может быть есть какой другой способ) 2)Если в Вордовском документе есть русские символы вместо них при чтении файла получается что-то неудобоваримое,может подскажете как данную проблему решить 3)Подобная же проблема наблюдается при чтении RTF в ричэдит по методу SUnteXx - а(персональное спасибо,в остальном работает отлично)-некоторые файлы читает отлично даже с русским текстом(RTF сделанный Вордом),а некоторые(неанглийские) прочитываются как пустая строка Помогите,кто знает...!!!!!
|
rivitna
|
опубликован 14-02-2002 07:35 MSK
Надеюсь, ты текст по смещению ищешь в стриме WordDocument, а не прямо в doc-файле? :) |
rivitna
|
опубликован 16-02-2002 12:05 MSK
По поводу doc-файлов могу предложить следующее: 1. Считывай стрим WordDocument 2. Смещение 0x18 - long fcTextFirst (смещение первого символа текста в стриме) Смещение 0x1C - long fcTextLast (смещение + 1 последнего символа текста в стриме) 3. Далее с помощью смекалки и фукции WideCharToMultiByte получай ANSI-текст -------------------------------------------- По поводу rtf попробуй сделать преобразование с помощью RichEdit: Создай невидимое окно RICHEDIT, считывай из rtf, сохраняй как текст |