Михаиллл
Михаиллл11 січня 2019 р. 06: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 р. 08:17

toHtmlEscaped()

    Михаиллл
    • 11 січня 2019 р. 11:19
    • (відредаговано)

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

      nayk1982
      • 11 січня 2019 р. 22:54

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

        Михаиллл
        • 12 січня 2019 р. 03:12

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

          nayk1982
          • 12 січня 2019 р. 04: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 р. 05:34

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

              Михаиллл
              • 12 січня 2019 р. 06:07

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

                Михаиллл
                • 12 січня 2019 р. 06:53

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

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

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

                  nayk1982
                  • 12 січня 2019 р. 07:15

                  А так?

                  document->querySubObject("WebOptions")->dynamicCall("Encoding", 65001);
                  document->dynamicCall("SaveAs(const QVariant&,const QVariant)", newFileName, 0x0000000A);
                  
                    Михаиллл
                    • 12 січня 2019 р. 08:28

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

                      Михаиллл
                      • 13 січня 2019 р. 06:59

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

                        Михаиллл
                        • 13 січня 2019 р. 07: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 р. 06: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 р. 08:28

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

                              Михаиллл
                              • 14 січня 2019 р. 08:40

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

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

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

                                Михаиллл
                                • 15 січня 2019 р. 07: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 р. 07:21

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

                                    Михаиллл
                                    • 15 січня 2019 р. 08: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 р. 08:49

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

                                        Михаиллл
                                        • 15 січня 2019 р. 11:53

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

                                          Коментарі

                                          Only authorized users can post comments.
                                          Please, Log in or Sign up
                                          AD

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

                                          • Результат:50бали,
                                          • Рейтинг балів-4
                                          m
                                          • molni99
                                          • 26 жовтня 2024 р. 01:37

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

                                          • Результат:80бали,
                                          • Рейтинг балів4
                                          m
                                          • molni99
                                          • 26 жовтня 2024 р. 01:29

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

                                          • Результат:20бали,
                                          • Рейтинг балів-10
                                          Останні коментарі
                                          ИМ
                                          Игорь Максимов22 листопада 2024 р. 11:51
                                          Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                          Evgenii Legotckoi
                                          Evgenii Legotckoi31 жовтня 2024 р. 14:37
                                          Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                          A
                                          ALO1ZE19 жовтня 2024 р. 08:19
                                          Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                          ИМ
                                          Игорь Максимов05 жовтня 2024 р. 07:51
                                          Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                          d
                                          dblas505 липня 2024 р. 11:02
                                          QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                          Тепер обговоріть на форумі
                                          Evgenii Legotckoi
                                          Evgenii Legotckoi24 червня 2024 р. 15:11
                                          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                          t
                                          tonypeachey115 листопада 2024 р. 06:04
                                          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                          NSProject
                                          NSProject04 червня 2022 р. 03:49
                                          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                                          9
                                          9Anonim25 жовтня 2024 р. 09:10
                                          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                                          Слідкуйте за нами в соціальних мережах