Михаиллл
Михаиллл11. Januar 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

20
nayk1982
  • 11. Januar 2019 08:17

toHtmlEscaped()

    Михаиллл
    • 11. Januar 2019 11:19
    • (bearbeitet)

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

      nayk1982
      • 11. Januar 2019 22:54

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

        Михаиллл
        • 12. Januar 2019 03:12

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

          nayk1982
          • 12. Januar 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. Januar 2019 05:34

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

              Михаиллл
              • 12. Januar 2019 06:07

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

                Михаиллл
                • 12. Januar 2019 06:53

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

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

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

                  nayk1982
                  • 12. Januar 2019 07:15

                  А так?

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

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

                      Михаиллл
                      • 13. Januar 2019 06:59

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

                        Михаиллл
                        • 13. Januar 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. Januar 2019 06:54
                          • (bearbeitet)

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

                          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. Januar 2019 08:28

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

                              Михаиллл
                              • 14. Januar 2019 08:40

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

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

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

                                Михаиллл
                                • 15. Januar 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. Januar 2019 07:21

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

                                    Михаиллл
                                    • 15. Januar 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. Januar 2019 08:49

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

                                        Михаиллл
                                        • 15. Januar 2019 11:53

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

                                          Kommentare

                                          Nur autorisierte Benutzer können Kommentare posten.
                                          Bitte Anmelden oder Registrieren
                                          Letzte Kommentare
                                          A
                                          ALO1ZE19. Oktober 2024 18:19
                                          Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                          ИМ
                                          Игорь Максимов5. Oktober 2024 17:51
                                          Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                          d
                                          dblas55. Juli 2024 21:02
                                          QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                          k
                                          kmssr9. Februar 2024 05:43
                                          Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                          Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                          Jetzt im Forum diskutieren
                                          J
                                          JacobFib17. Oktober 2024 13:27
                                          добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                                          JW
                                          Jhon Wick2. Oktober 2024 01:52
                                          Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                                          КГ
                                          Кирилл Гусарев27. September 2024 19:09
                                          Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                                          F
                                          Fynjy22. Juli 2024 14:15
                                          при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                                          Folgen Sie uns in sozialen Netzwerken