Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×
👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
ВСЕ... (кажись)
большое всем спасибо... вы все мне очень помогли...

ошибка у меня была в параметрах... нужно было писать именно так

params<<"-d"<<"cp1251"<<"6.doc";\\!!!!!!!!   у меня там было немно по другому
m_process.start(processFileFullPath+"\\catdoc.exe", params);

еще раз всем спасибо!!!

написал батник
catdoc.exe -d cp1251%1 > %2%
теперь можно ему передавать п-ры,

а вот с кодировкой считывания напряму с ДОК файла пока не знаю что делать...

В чем отличия Unicode Multi-Byte?
простыми словами: UniCode — на символ 2 байта, в MultiByte — 1 байт. Как известно в 1 байте 8 бит. Каждый бит может быть либо 0 либо 1 по определению. И это двоичное исчисление. Следовательно, ты можешь из 8 бит получить 2 в 8 степени комбинаций, то есть 256. А в двух байтах комбинаций 65536. Соответственно любимый всеми албанский язык может не поместиться в 256-ти комбинациях вместе с латинским-английским. А что говорить об иероглифах? Вот и сделали 2 байта — должно хватать всем. Сам понимаешь, что из одного байта ты с большей вероятностью перейдешь без потери информативности в два байта, чем обратно. Следовательно, для того, чтобы программы твои могли ходить по всему миру — работай в Unicode (надо то всего лишь галочку поставить). Вот и у тебя в подписи какая то строка из трех иероглифов — как они уживутся в 1 байте с латинским и русским (украинским) алфавитом (раскладкой).
Автор: takedo Источник: Vingrad
Как включить/отключить юникод в проекте.
На примере Visual C++ 8.0 (входит в состав Microsoft Visual Studio 2005).
В главном меню находим «Project», заходим в < имя_вышего_проекта> properties... либо жмем Alt+F7.
Появляется диалог настроек проекта, раскрываем ветку Configuration Properties-> General (для более ранних версий студии просто General),
ищем строку Charaster Set, выбираем для нее значение Use Multi-Byte charaster Set, для отключения юникода и, соответственно,

Use Unicode charaster Set для включения.


что за крокозябры?
qDebug()<<m_process.readAll(); выкидывает такое
Ѓ«®Є ўЁЎ®аг ०Ё¬г а®Ў®вЁ бЁб⥬Ё
ђҐ¦Ё¬ Ї?¤ўЁйҐ­­п иўЁ¤Є®¤?х Ї®игЄ®ў®Ј® Їа®жҐбг
‚ЁЎ?а ⥪бв®ў®Ј® д ©«г ¤«п ¤®б«?¤¦Ґ­­п

ты в юникоде компилишь?
я не знаю… (*shame)

знаю что раньше проблемы с кодировко решались через QTextCodec

мой код неправильный. Сначала написал — потом подумал (читай след пост)

что за крокозябры? ты в юникоде компилишь?

хм... тоже вариант..., но пока он читает только крякозябры..., а котопес сохраняет все нормально
ЗЫ: я знаю что пес по англ пишется не так...
к сожалению твой код не помог, выкидывает
onReadyReadStandardError
«catdoc: Invalid argument
catdoc: No such file or directory
»

хотя все нужные файлы там есть

По идее ты все можешь читать через m_process.readAll () в строку например, а потом сам ручками сохранить в файл

а вообще правильно он не принимает «> 111.txt» — это не аргумент catdoc’a, а команда для шелла по перенаправлению потока вывода

params<< “-s” << “cp1251” << “1.doc” << "> “<< “111.txt”;

to Mike Gorchak
блин!!! во я идиот... не додумался что их нужно с папки вынуть и положить с ексехой... думал там с папки оно подгружается...
catdoc -d cp1251 1.doc > 1.txt -из ком строки и все нормально... все буквы переводит...

хоть с этим разобрался..., но осталась маленькая проблемка...

QString  processFileFullPath = "C:\\catdoc-0.94.2-win32";
params<<"-s cp1251"<<"1.doc"
m_process.start(processFileFullPath+"\\catdoc.exe", params);
    m_process.waitForFinished(-1) ;

\\ если пишу так.. то впринципе все нормально...

вравда вот это

qDebug()<<m_process.readAll(); - возвращает крякозябры...хотя я и указываю

QTextCodec::setCodecForCStrings( QTextCodec::codecForName("windows-1251") );
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("windows-1251") );

но это уже пол беды, главное выводит, и все без ошибок...
но как мне написать аргументы если мне вдруг понадобится написать так :
catdoc -d cp1251 1.doc > 1.txt это вариант из ком строки

я пробовал разные варианты

params<<"-s cp1251"<<"1.doc"<<"> 111.txt";
params<<"-s cp1251"<<"1.doc > 111.txt";
params<<"-s cp1251"<<"1.doc"<< ">"<<"111.txt";

но все напрасно…

qDebug () << m_process.readAllStandardError (); — сдесь выдает «catdoc: Invalid argument

Кста, переменная m_process должна жить пока процесс выполняется.,
а судя по мессагу
QProcess: Destroyed while process is still running.
ты ее удаляешь раньше

попробуй заюзать m_process.waitForFinished (-1)

у тя ж два параметра:
params<< “C: \\catdoc-0.94.2-win32\\1.doc C: \\catdoc-0.94.2-win32\\55.txt”;
сделай такЖ

params<< "C: \\catdoc-0.94.2-win32\\1.doc"<< " C: \\catdoc-0.94.2-win32\\55.txt";

а че за ошибка? вставь
void QuestionsForm: onReadyReadStandardError ()
{
qDebug () << m_process.readAllStandardError ();

qDebug () << “onReadyReadStandardError”; }

Только сейчас обратил внимание, что ссылки одни и те же:) В.zip архиве есть каталоги с charset’ами, их нужно тоже положить рядом с.exe’шником.
Если нужен вывод именно в utf-8, то указать «catdoc -d utf-8 1.doc > 1.txt»

Файл utf-8.txt в данном случае не нужен. Так как в вордовских документах оно и так в юникоде.

to Mike Gorchak
ну отсюда я его и качал... вот только УТФ-8 там нету..., а все остальные (cp1251 or koi8-r и еще много других) я уже перепробывал...

наверное не судьба... (



    QProcess m_process;
    // listen to events of the process
    connect(&m_process, SIGNAL(started()), SLOT(onProcessStarted()));
    connect(&m_process, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(onProcessFinished(int, QProcess::ExitStatus)));
    connect(&m_process, SIGNAL(error(QProcess::ProcessError)), SLOT(onProcessError(QProcess::ProcessError)));
    connect(&m_process, SIGNAL(readyReadStandardError()), SLOT(onReadyReadStandardError()));
    connect(&m_process, SIGNAL(readyReadStandardOutput()), SLOT(onReadyReadStandardOutput()));
    QString  processFileFullPath = "C:\\catdoc-0.94.2-win32\\catdoc.exe";
    if(QFile::exists(processFileFullPath))
    {
    //m_process.setWorkingDirectory(processFileFullPath);
    QStringList params;
    params<<"C:\\catdoc-0.94.2-win32\\1.doc  C:\\catdoc-0.94.2-win32\\55.txt";
    m_process.start(processFileFullPath, params);
    }
    qDebug()<<m_process.errorString();
    qDebug()<<m_process.readAll();

void QuestionsForm::onProcessFinished(int i , QProcess::ExitStatus a)
{
    qDebug()<<"onProcessFinished";
    qDebug()<<i;
    qDebug()<<a;
}

void QuestionsForm::onProcessError(QProcess::ProcessError a)
{
    qDebug()<<"onProcessError";
    qDebug()<<a;
}
void QuestionsForm::onReadyReadStandardError()
{
    qDebug()<<"onReadyReadStandardError";
}

void QuestionsForm::onReadyReadStandardOutput()
{
    qDebug()<<"onReadyReadStandardOutput";
}

void QuestionsForm::onProcessStarted()
{
    qDebug()<<"onProcessStarted";
}

вывод
onProcessStarted
»Unknown error»
»»
QProcess: Destroyed while process is still running.
onReadyReadStandardError
onProcessFinished
1

0

Возьми отсюда порт: blog.brush.co.nz/...catdoc-windows

Там есть чарсеты.

Еще забыл:
В дочернем процессе делаешь
QTextStream out (stdout);
out<< “smth happened”;
out.flush ();
посылается сигнал readyReadStandardOutput () в родительский процесс
елси
QTextStream out (stderr);
out<< “smth happened”;
out.flush ();

nj посылается сигнал readyReadStandardError () в родительский процесс

ПО поводу процесса:
QProcess m_process;
// listen to events of the process
connect (& m_process, SIGNAL (started ()), SLOT (onProcessStarted (:);
connect (& m_process, SIGNAL (finished (int, QProcess: ExitStatus)), SLOT (onProcessFinished (int, QProcess: ExitStatus:);
connect (& m_process, SIGNAL (error (QProcess: ProcessError)), SLOT (onProcessError (QProcess: ProcessError:);
connect (& m_process, SIGNAL (readyReadStandardError ()), SLOT (onReadyReadStandardError (:);
connect (& m_process, SIGNAL (readyReadStandardOutput ()), SLOT (onReadyReadStandardOutput (:);
if (! QFile: exists (processFileFullPath))
{
m_process.setWorkingDirectory (...)
QStringList params;
params<< param1<< param2;
m_process.start (processFileFullPath, params); }

вроде усе

ну... я не буду это обьяснять... это долго... скажу только что есть много доков... и их нужно или конвертировать или с них читать..., а если заставить кого токонвертировать что то, то лучше уже конвертировать в тхт, для этого у меня все вже написано

Ну так — внеси рац. предложение. Зачем привязывать себя к формату мелкософта? КуТи ж ведь кроссплатформенная весч:) как и ртф

не секрет... пишу бакалаврскую в институт... эта прога будет где то там использоватся у них... и нужно чтетие из дока... таблицы и рисунки не нужны... только текст

Сори, а где сказанно если не секрет?

ну... так сказано... желаьельно сделать

А нах зачем тебе док? Юзай ртф. Его читает на ура

если кто знает — помогите..., а то никак не могу с кодировкой справится... все записывает в файлы крякозябры...
кодировку пробовал ставить
catdoc -s cp1251 1.doc > 1.txt,
а файла utf-8 в папке в прогой нету...

что делать?

сзаписью разобрался,
catdoc 1.doc > 1.txt

вот только в файл 1.txt пишутся крякозябры... (

спасибо большое за подсказку... нашел уже скомпилированое blog.brush.co.nz/...catdoc-windows
только вот вопрос у меня...
ввожу я в ком строку например такое
catdoc 1.doc 2.doc — выводит текст из док файла,
а как мне сделать так чтобы оно его сохранило в 1.txt and 2.txt
я понимаю что есть документация, там написано типа [-f output-format], но если я пишу так
catdoc -f 1.txt 1.doc
то ничего не происходит, просто выводится текст в окно...
и еще одно... (я понимаю, это наглость)

как в кюте запустить процес, передать ему параметры и возможно даже получить результирующую строку, тоесть док текст?

а жаль... какой то очень принципиальный програмер

Оно компилируется под Windows с пол пинка:)


There is no support for catdoc under Windows
Not because I hate windows.

а жаль... какой то очень принципиальный програмер

Существуют пачки парсеров, которые достают текст из.doc’ов. Достаточно прикрутить один и qt здесь и не при чём.

Советую вот этот: wagner.pp.ru/...oftware/catdoc

СОМ? Есть что-то подобное вроде QActiveX...

может я не правильно вопрос задал...

хочу програмно считать текст с док файла...

Підписатись на коментарі