Михаиллл
МихаилллҚаң. 11, 2019, 6:34 Т.Ж.

Как текст из Word перевести в формат HTML

Qt, HTML, Word

Здравствуйте.
Как текст из Word перевести в формат HTML?
Ниже приведена функция получения текста в формате обычной строки.

    QString ResumeFileName ("");
    ResumeFileName = QFileDialog::getOpenFileName(0, "Выберете резюме hh.ru", "", "*.doc *.docx *.rtf");
    ResumeFileName.replace(QRegExp("[/]"), "\\");
    qDebug()<<ResumeFileName;
    if (ResumeFileName != "")
    {
        QAxObject   wordApplication("Word.Application");
        QAxObject *documents = wordApplication.querySubObject("Documents");
        QAxObject *document = documents->querySubObject("Open(const QString&, bool)", ResumeFileName, true);
        QAxObject *words = document->querySubObject("Words");
        QString TextResume;
        QString HTMLResume;
        int countWord = words->dynamicCall("Count()").toInt();
        for (int a = 1; a <= countWord; a++){
            TextResume.append(words->querySubObject("Item(int)", a)->dynamicCall("Text()").toString());
            HTMLResume.append(words->querySubObject("Item(int)", a)->dynamicCall("Text()").какаято функция);
        }
        document->dynamicCall("Close (boolean)", false);
        TextResume.replace(QRegExp("[\r]"), "\r\n"); //замена символов
        qDebug()<<TextResume;
        QString Coments1 ("");
        LoadResumeInDB(TextResume, Coments1, HTMLResume);
    }
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

20
nayk1982
  • Қаң. 11, 2019, 8:17 Т.Ж.

toHtmlEscaped()

    Михаиллл
    • Қаң. 11, 2019, 11:19 Т.Ж.
    • (өңделген)

    Так нельзя, выдает ошибку: no member named 'toHtmlEscaped' in 'QVariant'
    Я хотел бы сохранить форматирование и картинки

      nayk1982
      • Қаң. 11, 2019, 10:54 Т.Қ.

      Ваш вопрос был "Как текст из Word перевести в формат HTML?". Ошибку выдает, потому что это функция класса QString, а не QVariant.
      Если хотите документ HTML с форматированием и картинками, тогда нужно сам документ Word сохранять как Вэб страницу, а потом загружать готовый HTML в программу. Но учтите, что Word сохраняет HTML с кучей ненужных элементов.
      Сам формат документа HTML известен .

        Михаиллл
        • Қаң. 12, 2019, 3:12 Т.Ж.

        А QVariant нельзя сохранить как HTML?
        Не знаете, как сохранить Word в HTML?

          nayk1982
          • Қаң. 12, 2019, 4:48 Т.Ж.

          В Вашем коде QVariant содержит строку, поэтому

          QString htmlString = words->querySubObject("Item(int)", a)->dynamicCall("Text()").toString().toHtmlEscaped();
          HTMLResume.append( htmlString );
          

          Но это не решает Вашу проблему сохранения форматирования и картинок. Полагаю, что после открытия документа:

          QAxObject *document = documents->querySubObject("Open(const QString&, bool)", ResumeFileName, true);
          

          нужно вызвать функцию "SaveAs()" через ActiveX и указать формат сохранения HTML.

            Михаиллл
            • Қаң. 12, 2019, 5:34 Т.Ж.

            Скажите пожалуйста, как вызвать функцию "SaveAs()" через ActiveX ?

              Михаиллл
              • Қаң. 12, 2019, 6:07 Т.Ж.

              Этот текст можно перевести в ByteArray, может быть из него можно перевести в HTML?

                Михаиллл
                • Қаң. 12, 2019, 6:53 Т.Ж.

                Вот тут нашел решение.
                Попробовал сдалать так, но выдает ошибки при работе

                HTMLResume = words->querySubObject("WebOptions")->setProperty("Encoding",0x0000000A);
                qDebug()<<HTMLResume;
                

                Помогите пожалуйста с этим разобраться

                  nayk1982
                  • Қаң. 12, 2019, 7:15 Т.Ж.

                  А так?

                  document->querySubObject("WebOptions")->dynamicCall("Encoding", 65001);
                  document->dynamicCall("SaveAs(const QVariant&,const QVariant)", newFileName, 0x0000000A);
                  
                    Михаиллл
                    • Қаң. 12, 2019, 8:28 Т.Ж.

                    Программа также ломается при работе с ошибкой:
                    QAxBase::dynamicCallHelper: WebOptions: No such property in [unknown]
                    Candidates are:

                      Михаиллл
                      • Қаң. 13, 2019, 6:59 Т.Ж.

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

                        Михаиллл
                        • Қаң. 13, 2019, 7:30 Т.Ж.

                        И еще есть такая функция, но как ей воспользоваться
                        QString QAxBase::generateDocumentation ()
                        Returns a rich text string with documentation for the wrapped COM object. Dump the string to an HTML-file, or use it in e.g. a QTextBrowser widget.

                          Михаиллл
                          • Қаң. 14, 2019, 6:54 Т.Ж.
                          • (өңделген)

                          А если так написать

                          HTMLResume.append(words->querySubObject("Item(int)", a)->dynamicCall("Encoding",0x0000000A).toString());
                          

                          то не выбрасывает, но возникают трудности с кодировкой :
                          QAxBase::dynamicCallHelper: Encoding: No such property in [unknown]
                          Candidates are:
                          Editors
                          EmphasisMark
                          End
                          EndnoteOptions
                          Endnotes
                          EnhMetaFileBits

                          А если написать так, то выкидывает

                          words->querySubObject("Item(int)", a)->querySubObject("WebOptions")->dynamicCall("Encoding",0x0000000A);
                          
                            Михаиллл
                            • Қаң. 14, 2019, 8:28 Т.Ж.

                            или может быть можно QVariant разметить на QTextEdit, а от туда перевести в HTML?

                              Михаиллл
                              • Қаң. 14, 2019, 8:40 Т.Ж.

                              Если делать так, то почти работает

                                          HTMLQVariant = words->querySubObject("Item(int)", a)->dynamicCall("Text()");
                                          HTMLResume += HTMLQVariant.convert(0x0000000A);
                              

                              Наверно нужна только верная кодировка.
                              Может Вы знаете какая?

                                Михаиллл
                                • Қаң. 15, 2019, 7:07 Т.Ж.

                                Видимо можно использовать эту библиотеку
                                И использовать этот код:

                                using OpenXmlPowerTools;
                                using DocumentFormat.OpenXml.Wordprocessing;
                                
                                byte[] byteArray = File.ReadAllBytes(DocxFilePath);
                                using (MemoryStream memoryStream = new MemoryStream())
                                {
                                     memoryStream.Write(byteArray, 0, byteArray.Length);
                                     using (WordprocessingDocument doc = WordprocessingDocument.Open(memoryStream, true))
                                     {
                                          HtmlConverterSettings settings = new HtmlConverterSettings()
                                          {
                                               PageTitle = "My Page Title"
                                          };
                                          XElement html = HtmlConverter.ConvertToHtml(doc, settings);
                                
                                          File.WriteAllText(HTMLFilePath, html.ToStringNewLineOnAttributes());
                                     }
                                }
                                

                                Вот только не могу подключить библиотеку.
                                Помогите пожалуйста

                                  Evgenii Legotckoi
                                  • Қаң. 15, 2019, 7:21 Т.Ж.

                                  Никак вы её не подключите в проект на Qt. Это C# библиотека.

                                    Михаиллл
                                    • Қаң. 15, 2019, 8:34 Т.Ж.

                                    На основании этого кода получил структуру

                                    #ifndef CONVERTDOCINHTML_H
                                    #define CONVERTDOCINHTML_H
                                    
                                    #include <QGuiApplication>
                                    #include <QDataStream>
                                    #include <QMetaType>
                                    #include <QXmlStreamWriter>
                                    #include <QBuffer>
                                    #include <QImage>
                                    #include <QBitmap>
                                    #include <QPixmap>
                                    #include <QVariant>
                                    #include <QDateTime>
                                    #include <QFile>
                                    
                                    struct ConvertDocInHTML
                                    {
                                        int guessDecimals(double val)
                                        {
                                            int precision = 0;
                                            for (double junk = 0; !qFuzzyIsNull(std::modf(val, &junk)); ++precision)
                                                val *= 10.0;
                                            return precision;
                                        }
                                        QString guessDecimalsString(double val, QLocale* loca  = Q_NULLPTR)
                                        {
                                            if (loca)
                                                return loca->toString(val, 'f', guessDecimals(val));
                                            return QString::number(val, 'f', guessDecimals(val));
                                        }
                                        bool isImageType(int val) {
                                            switch(val){
                                            case QMetaType::QImage:
                                            case QMetaType::QPixmap:
                                            case QMetaType::QBitmap:
                                                return true;
                                            }
                                            return false;
                                        }
                                        QString saveImageVariant(const QImage& imageData)
                                        {
                                            QByteArray byteArray;
                                            QBuffer buffer(&byteArray);
                                            imageData.save(&buffer, "PNG");
                                            return QString::fromLatin1(byteArray.toBase64().constData());
                                        }
                                        QString variantToString(const QVariant& val)
                                        {
                                            QString result;
                                            QByteArray data;
                                            QDataStream outStream(&data, QIODevice::WriteOnly);
                                            outStream << val;
                                            data = qCompress(data);
                                            return QString::fromLatin1(data.toBase64());
                                        }
                                    
                                        QString saveVariant(const QVariant& val)
                                        {
                                            if (val.isNull())
                                                return QString();
                                            switch (val.type()) {
                                            case QMetaType::UnknownType:
                                                Q_ASSERT_X(false, "saveVariant", "Trying to save unregistered type.");
                                                return QString();
                                            case QMetaType::Bool: return val.toBool() ? QStringLiteral("1") : QStringLiteral("0");
                                            case QMetaType::Long:
                                            case QMetaType::Short:
                                            case QMetaType::Char:
                                            case QMetaType::SChar:
                                            case QMetaType::Int: return QString::number(val.toInt());
                                            case QMetaType::ULong:
                                            case QMetaType::UShort:
                                            case QMetaType::UChar:
                                            case QMetaType::UInt: return QString::number(val.toUInt());
                                            case QMetaType::LongLong: return QString::number(val.toLongLong());
                                            case QMetaType::ULongLong:  return QString::number(val.toULongLong());
                                            case QMetaType::Double:
                                            case QMetaType::Float: return guessDecimalsString(val.toDouble());
                                            case QMetaType::QChar: return QString(val.toChar());
                                            case QMetaType::QString: return val.toString();
                                            case QMetaType::QByteArray: return QString::fromLatin1(val.toByteArray().toBase64());
                                            case QMetaType::QDate: return val.toDate().toString(Qt::ISODate);
                                            case QMetaType::QTime: return val.toTime().toString(Qt::ISODate);
                                            case QMetaType::QDateTime: return val.toDateTime().toString(Qt::ISODate);
                                            case QMetaType::QImage: return saveImageVariant(val.value<QImage>());
                                            case QMetaType::QPixmap: return saveImageVariant(val.value<QPixmap>().toImage());
                                            case QMetaType::QBitmap: return saveImageVariant(val.value<QBitmap>().toImage());
                                            default:
                                                return ConvertDocInHTML::variantToString(val);
                                            }
                                        }
                                        void writeHtmlVariant(QXmlStreamWriter& writer, const QVariant& val)
                                        {
                                            if (isImageType(val.type())) {
                                                writer.writeEmptyElement(QStringLiteral("img"));
                                                writer.writeAttribute(QStringLiteral("src"), "data:image/png;base64," + saveVariant(val));
                                                writer.writeAttribute(QStringLiteral("alt"), QStringLiteral("modelimage.png"));
                                                return;
                                            }
                                            writer.writeCharacters(saveVariant(val));
                                        }
                                    
                                    
                                       /* int main(int argc, char **argv) {
                                            QGuiApplication app(argc,argv);
                                            QFile htmlOutPut("TestOutput.html");
                                            if(!htmlOutPut.open(QIODevice::WriteOnly))
                                                return 1;
                                            htmlOutPut.write(QByteArrayLiteral("<!DOCTYPE html>"));
                                            QXmlStreamWriter htmlWriter(&htmlOutPut);
                                            htmlWriter.writeStartElement(QStringLiteral("html"));
                                            htmlWriter.writeAttribute(QStringLiteral("xmlns"),QStringLiteral("http://www.w3.org/1999/xhtml"));
                                            htmlWriter.writeAttribute(QStringLiteral("lang"),QStringLiteral("en"));
                                            htmlWriter.writeAttribute(QStringLiteral("xml:lang"),QStringLiteral("en"));
                                            htmlWriter.writeStartElement(QStringLiteral("head"));
                                            htmlWriter.writeEmptyElement(QStringLiteral("meta"));
                                            htmlWriter.writeAttribute(QStringLiteral("http-equiv"),QStringLiteral("Content-Type"));
                                            htmlWriter.writeAttribute(QStringLiteral("content"),QStringLiteral("text/html; charset=utf-8"));
                                            htmlWriter.writeStartElement(QStringLiteral("title"));
                                            htmlWriter.writeCharacters(QStringLiteral("Testing Variant to Html"));
                                            htmlWriter.writeEndElement(); //title
                                            htmlWriter.writeEndElement(); //head
                                            htmlWriter.writeStartElement(QStringLiteral("body"));
                                            htmlWriter.writeStartElement(QStringLiteral("p"));
                                            writeHtmlVariant(htmlWriter, QStringLiteral("The magic number is: "));
                                            writeHtmlVariant(htmlWriter, 88);
                                            writeHtmlVariant(htmlWriter, QStringLiteral(" and "));
                                            writeHtmlVariant(htmlWriter, 3.21);
                                            htmlWriter.writeEndElement(); //p
                                            QPixmap blueImage(200,200);
                                            blueImage.fill(Qt::blue);
                                            writeHtmlVariant(htmlWriter,blueImage);
                                            htmlWriter.writeEndDocument();
                                            return 0;
                                        }*/
                                    };
                                    
                                    #endif // CONVERTDOCINHTML_H
                                    
                                    

                                    Пробую сделать так:

                                    TextResume.append(words->querySubObject("Item(int)", a)->dynamicCall("Text()").toString());
                                                HTMLQVariant = words->querySubObject("Item(int)", a)->dynamicCall("Text()");
                                                HTMLResume = ConvertDocInHTML::saveVariant(HTMLQVariant);
                                    

                                    Но получаю ошибку :
                                    D:\QTProject\ReaderResume\mainwindow.cpp:1198: ошибка: cannot call member function 'QString ConvertDocInHTML::saveVariant(const QVariant&)' without object
                                    HTMLResume = ConvertDocInHTML::saveVariant(HTMLQVariant);
                                    Не знаете ли Вы как можно воспользоваться этой структурой?

                                      Evgenii Legotckoi
                                      • Қаң. 15, 2019, 8:49 Т.Ж.

                                      вы вызываете saveVariant как статический метод, а он таковым не является. Нужно создать объект ConvertDocInHTML, а потом из этого объекта вызывать данный метод.

                                        Михаиллл
                                        • Қаң. 15, 2019, 11:53 Т.Ж.

                                        Спасибо, заработало.
                                        Но выдало обычный текст без форатирования HTML.
                                        Придется искать дальше

                                          Пікірлер

                                          Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                                          Кіріңіз немесе Тіркеліңіз
                                          AD

                                          C++ - Тест 004. Указатели, Массивы и Циклы

                                          • Нәтиже:50ұпай,
                                          • Бағалау ұпайлары-4
                                          m
                                          • molni99
                                          • Қаз. 26, 2024, 1:37 Т.Ж.

                                          C++ - Тест 004. Указатели, Массивы и Циклы

                                          • Нәтиже:80ұпай,
                                          • Бағалау ұпайлары4
                                          m
                                          • molni99
                                          • Қаз. 26, 2024, 1:29 Т.Ж.

                                          C++ - Тест 004. Указатели, Массивы и Циклы

                                          • Нәтиже:20ұпай,
                                          • Бағалау ұпайлары-10
                                          Соңғы пікірлер
                                          ИМ
                                          Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
                                          Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                          Evgenii Legotckoi
                                          Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
                                          Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                          A
                                          ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
                                          Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                          ИМ
                                          Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
                                          Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                          d
                                          dblas5Шілде 5, 2024, 11:02 Т.Ж.
                                          QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                          Енді форумда талқылаңыз
                                          m
                                          moogoҚар. 22, 2024, 7:17 Т.Ж.
                                          Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
                                          Evgenii Legotckoi
                                          Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                                          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                          t
                                          tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
                                          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                          NSProject
                                          NSProjectМаусым 4, 2022, 3:49 Т.Ж.
                                          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

                                          Бізді әлеуметтік желілерде бақылаңыз