Михаиллл
Jan. 11, 2019, 5:34 p.m.

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

Qt, HTML, Word

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

  1. QString ResumeFileName ("");
  2. ResumeFileName = QFileDialog::getOpenFileName(0, "Выберете резюме hh.ru", "", "*.doc *.docx *.rtf");
  3. ResumeFileName.replace(QRegExp("[/]"), "\\");
  4. qDebug()<<ResumeFileName;
  5. if (ResumeFileName != "")
  6. {
  7. QAxObject wordApplication("Word.Application");
  8. QAxObject *documents = wordApplication.querySubObject("Documents");
  9. QAxObject *document = documents->querySubObject("Open(const QString&, bool)", ResumeFileName, true);
  10. QAxObject *words = document->querySubObject("Words");
  11. QString TextResume;
  12. QString HTMLResume;
  13. int countWord = words->dynamicCall("Count()").toInt();
  14. for (int a = 1; a <= countWord; a++){
  15. TextResume.append(words->querySubObject("Item(int)", a)->dynamicCall("Text()").toString());
  16. HTMLResume.append(words->querySubObject("Item(int)", a)->dynamicCall("Text()").какаято функция);
  17. }
  18. document->dynamicCall("Close (boolean)", false);
  19. TextResume.replace(QRegExp("[\r]"), "\r\n"); //замена символов
  20. qDebug()<<TextResume;
  21. QString Coments1 ("");
  22. LoadResumeInDB(TextResume, Coments1, HTMLResume);
  23. }
3

Do you like it? Share on social networks!

20
nayk1982
  • Jan. 11, 2019, 7:17 p.m.
    Михаиллл
    • Jan. 11, 2019, 10:19 p.m.
    • (edited)

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

      nayk1982
      • Jan. 12, 2019, 9:54 a.m.

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

        Михаиллл
        • Jan. 12, 2019, 2:12 p.m.

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

          nayk1982
          • Jan. 12, 2019, 3:48 p.m.

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

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

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

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

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

            Михаиллл
            • Jan. 12, 2019, 4:34 p.m.

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

              Михаиллл
              • Jan. 12, 2019, 5:07 p.m.

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

                Михаиллл
                • Jan. 12, 2019, 5:53 p.m.

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

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

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

                  nayk1982
                  • Jan. 12, 2019, 6:15 p.m.

                  А так?

                  1. document->querySubObject("WebOptions")->dynamicCall("Encoding", 65001);
                  2. document->dynamicCall("SaveAs(const QVariant&,const QVariant)", newFileName, 0x0000000A);
                    Михаиллл
                    • Jan. 12, 2019, 7:28 p.m.

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

                      Михаиллл
                      • Jan. 13, 2019, 5:59 p.m.

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

                        Михаиллл
                        • Jan. 13, 2019, 6:30 p.m.

                        И еще есть такая функция, но как ей воспользоваться
                        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.

                          Михаиллл
                          • Jan. 14, 2019, 5:54 p.m.
                          • (edited)

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

                          1. 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

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

                          1. words->querySubObject("Item(int)", a)->querySubObject("WebOptions")->dynamicCall("Encoding",0x0000000A);
                            Михаиллл
                            • Jan. 14, 2019, 7:28 p.m.

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

                              Михаиллл
                              • Jan. 14, 2019, 7:40 p.m.

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

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

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

                                Михаиллл
                                • Jan. 15, 2019, 6:07 p.m.

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

                                1. using OpenXmlPowerTools;
                                2. using DocumentFormat.OpenXml.Wordprocessing;
                                3.  
                                4. byte[] byteArray = File.ReadAllBytes(DocxFilePath);
                                5. using (MemoryStream memoryStream = new MemoryStream())
                                6. {
                                7. memoryStream.Write(byteArray, 0, byteArray.Length);
                                8. using (WordprocessingDocument doc = WordprocessingDocument.Open(memoryStream, true))
                                9. {
                                10. HtmlConverterSettings settings = new HtmlConverterSettings()
                                11. {
                                12. PageTitle = "My Page Title"
                                13. };
                                14. XElement html = HtmlConverter.ConvertToHtml(doc, settings);
                                15.  
                                16. File.WriteAllText(HTMLFilePath, html.ToStringNewLineOnAttributes());
                                17. }
                                18. }

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

                                  Evgenii Legotckoi
                                  • Jan. 15, 2019, 6:21 p.m.

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

                                    Михаиллл
                                    • Jan. 15, 2019, 7:34 p.m.

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

                                    1. #ifndef CONVERTDOCINHTML_H
                                    2. #define CONVERTDOCINHTML_H
                                    3.  
                                    4. #include <QGuiApplication>
                                    5. #include <QDataStream>
                                    6. #include <QMetaType>
                                    7. #include <QXmlStreamWriter>
                                    8. #include <QBuffer>
                                    9. #include <QImage>
                                    10. #include <QBitmap>
                                    11. #include <QPixmap>
                                    12. #include <QVariant>
                                    13. #include <QDateTime>
                                    14. #include <QFile>
                                    15.  
                                    16. struct ConvertDocInHTML
                                    17. {
                                    18. int guessDecimals(double val)
                                    19. {
                                    20. int precision = 0;
                                    21. for (double junk = 0; !qFuzzyIsNull(std::modf(val, &junk)); ++precision)
                                    22. val *= 10.0;
                                    23. return precision;
                                    24. }
                                    25. QString guessDecimalsString(double val, QLocale* loca = Q_NULLPTR)
                                    26. {
                                    27. if (loca)
                                    28. return loca->toString(val, 'f', guessDecimals(val));
                                    29. return QString::number(val, 'f', guessDecimals(val));
                                    30. }
                                    31. bool isImageType(int val) {
                                    32. switch(val){
                                    33. case QMetaType::QImage:
                                    34. case QMetaType::QPixmap:
                                    35. case QMetaType::QBitmap:
                                    36. return true;
                                    37. }
                                    38. return false;
                                    39. }
                                    40. QString saveImageVariant(const QImage& imageData)
                                    41. {
                                    42. QByteArray byteArray;
                                    43. QBuffer buffer(&byteArray);
                                    44. imageData.save(&buffer, "PNG");
                                    45. return QString::fromLatin1(byteArray.toBase64().constData());
                                    46. }
                                    47. QString variantToString(const QVariant& val)
                                    48. {
                                    49. QString result;
                                    50. QByteArray data;
                                    51. QDataStream outStream(&data, QIODevice::WriteOnly);
                                    52. outStream << val;
                                    53. data = qCompress(data);
                                    54. return QString::fromLatin1(data.toBase64());
                                    55. }
                                    56.  
                                    57. QString saveVariant(const QVariant& val)
                                    58. {
                                    59. if (val.isNull())
                                    60. return QString();
                                    61. switch (val.type()) {
                                    62. case QMetaType::UnknownType:
                                    63. Q_ASSERT_X(false, "saveVariant", "Trying to save unregistered type.");
                                    64. return QString();
                                    65. case QMetaType::Bool: return val.toBool() ? QStringLiteral("1") : QStringLiteral("0");
                                    66. case QMetaType::Long:
                                    67. case QMetaType::Short:
                                    68. case QMetaType::Char:
                                    69. case QMetaType::SChar:
                                    70. case QMetaType::Int: return QString::number(val.toInt());
                                    71. case QMetaType::ULong:
                                    72. case QMetaType::UShort:
                                    73. case QMetaType::UChar:
                                    74. case QMetaType::UInt: return QString::number(val.toUInt());
                                    75. case QMetaType::LongLong: return QString::number(val.toLongLong());
                                    76. case QMetaType::ULongLong: return QString::number(val.toULongLong());
                                    77. case QMetaType::Double:
                                    78. case QMetaType::Float: return guessDecimalsString(val.toDouble());
                                    79. case QMetaType::QChar: return QString(val.toChar());
                                    80. case QMetaType::QString: return val.toString();
                                    81. case QMetaType::QByteArray: return QString::fromLatin1(val.toByteArray().toBase64());
                                    82. case QMetaType::QDate: return val.toDate().toString(Qt::ISODate);
                                    83. case QMetaType::QTime: return val.toTime().toString(Qt::ISODate);
                                    84. case QMetaType::QDateTime: return val.toDateTime().toString(Qt::ISODate);
                                    85. case QMetaType::QImage: return saveImageVariant(val.value<QImage>());
                                    86. case QMetaType::QPixmap: return saveImageVariant(val.value<QPixmap>().toImage());
                                    87. case QMetaType::QBitmap: return saveImageVariant(val.value<QBitmap>().toImage());
                                    88. default:
                                    89. return ConvertDocInHTML::variantToString(val);
                                    90. }
                                    91. }
                                    92. void writeHtmlVariant(QXmlStreamWriter& writer, const QVariant& val)
                                    93. {
                                    94. if (isImageType(val.type())) {
                                    95. writer.writeEmptyElement(QStringLiteral("img"));
                                    96. writer.writeAttribute(QStringLiteral("src"), "data:image/png;base64," + saveVariant(val));
                                    97. writer.writeAttribute(QStringLiteral("alt"), QStringLiteral("modelimage.png"));
                                    98. return;
                                    99. }
                                    100. writer.writeCharacters(saveVariant(val));
                                    101. }
                                    102.  
                                    103.  
                                    104. /* int main(int argc, char **argv) {
                                    105. QGuiApplication app(argc,argv);
                                    106. QFile htmlOutPut("TestOutput.html");
                                    107. if(!htmlOutPut.open(QIODevice::WriteOnly))
                                    108. return 1;
                                    109. htmlOutPut.write(QByteArrayLiteral("<!DOCTYPE html>"));
                                    110. QXmlStreamWriter htmlWriter(&htmlOutPut);
                                    111. htmlWriter.writeStartElement(QStringLiteral("html"));
                                    112. htmlWriter.writeAttribute(QStringLiteral("xmlns"),QStringLiteral("http://www.w3.org/1999/xhtml"));
                                    113. htmlWriter.writeAttribute(QStringLiteral("lang"),QStringLiteral("en"));
                                    114. htmlWriter.writeAttribute(QStringLiteral("xml:lang"),QStringLiteral("en"));
                                    115. htmlWriter.writeStartElement(QStringLiteral("head"));
                                    116. htmlWriter.writeEmptyElement(QStringLiteral("meta"));
                                    117. htmlWriter.writeAttribute(QStringLiteral("http-equiv"),QStringLiteral("Content-Type"));
                                    118. htmlWriter.writeAttribute(QStringLiteral("content"),QStringLiteral("text/html; charset=utf-8"));
                                    119. htmlWriter.writeStartElement(QStringLiteral("title"));
                                    120. htmlWriter.writeCharacters(QStringLiteral("Testing Variant to Html"));
                                    121. htmlWriter.writeEndElement(); //title
                                    122. htmlWriter.writeEndElement(); //head
                                    123. htmlWriter.writeStartElement(QStringLiteral("body"));
                                    124. htmlWriter.writeStartElement(QStringLiteral("p"));
                                    125. writeHtmlVariant(htmlWriter, QStringLiteral("The magic number is: "));
                                    126. writeHtmlVariant(htmlWriter, 88);
                                    127. writeHtmlVariant(htmlWriter, QStringLiteral(" and "));
                                    128. writeHtmlVariant(htmlWriter, 3.21);
                                    129. htmlWriter.writeEndElement(); //p
                                    130. QPixmap blueImage(200,200);
                                    131. blueImage.fill(Qt::blue);
                                    132. writeHtmlVariant(htmlWriter,blueImage);
                                    133. htmlWriter.writeEndDocument();
                                    134. return 0;
                                    135. }*/
                                    136. };
                                    137.  
                                    138. #endif // CONVERTDOCINHTML_H
                                    139.  

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

                                    1. TextResume.append(words->querySubObject("Item(int)", a)->dynamicCall("Text()").toString());
                                    2. HTMLQVariant = words->querySubObject("Item(int)", a)->dynamicCall("Text()");
                                    3. 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
                                      • Jan. 15, 2019, 7:49 p.m.

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

                                        Михаиллл
                                        • Jan. 15, 2019, 10:53 p.m.

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

                                          Comments

                                          Only authorized users can post comments.
                                          Please, Log in or Sign up
                                          • Last comments
                                          • IscanderChe
                                            April 12, 2025, 5:12 p.m.
                                            Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
                                          • AK
                                            April 1, 2025, 11:41 a.m.
                                            Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                                          • Evgenii Legotckoi
                                            March 9, 2025, 9:02 p.m.
                                            К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                                          • VP
                                            March 9, 2025, 4:14 p.m.
                                            Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                                          • ИМ
                                            Nov. 22, 2024, 9:51 p.m.
                                            Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…