Jan. 11, 2019, 11:34 a.m.

Как текст из 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);
    }
Virtual hosting with 10 percent discount
Virtual hosting with 10 percent discount
EVILEG offers reliable hosting with a 10% discount for virtual hosting and 5% for VPS
20

toHtmlEscaped()

0

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

0

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

0

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

0

В Вашем коде 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.

0

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

0

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

0

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

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

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

0

А так?

document->querySubObject("WebOptions")->dynamicCall("Encoding", 65001);
document->dynamicCall("SaveAs(const QVariant&,const QVariant)", newFileName, 0x0000000A);
0

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

0

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

0

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

0

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

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);
0

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

0

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

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

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

0

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

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());
     }
}

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

0

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

0

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

#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); Не знаете ли Вы как можно воспользоваться этой структурой?

0

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

0

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

0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
TT
June 13, 2019, 7:01 p.m.
Taimoor Tanweer

C++ - Test 001. The first program and data types

  • Result:66points,
  • Rating points-1
TT
June 13, 2019, 6:51 p.m.
Taimoor Tanweer

C++ - Test 002. Constants

  • Result:75points,
  • Rating points2
ВМ
June 13, 2019, 12:30 p.m.
Ваня Мороз

C++ - Test 001. The first program and data types

  • Result:100points,
  • Rating points10
Last comments
i
June 17, 2019, 6:10 a.m.
ingenfly

Только по осям xAxis2, уAxis2 значения начинаются с 0. Почему-то xAxis2 и xAxis не синхронизированы по данным. Ну и QCustomPlot последний.
June 16, 2019, 8:21 p.m.
Евгений Легоцкой

Добрый день. Ну точно также добавляете ту же самую информацию на ось xAxis2, только добавляете другое форматирование customPlot->xAxis2->setDateTimeFormat("hh:mm"); если я ...
EF
June 14, 2019, 1:56 p.m.
Egor Fomin

Спасибо за ваш ответ, у меня получилось реализовать это. Тем не менее появилась другая проблема, поэтому опять надеюсь на вашу помощь. Скажем, я уже выставил точки и они соеденены. Когда я нач...
d
June 13, 2019, 2:47 p.m.
damix

Можно классу, который описывает точку, добавить сигнал, который подавать (emit), когда точка перемещается (переопределить mouseMoveEvent или mouseReleaseEvent). Так вот эти сигналы у каждой из...
i
June 13, 2019, 2:09 p.m.
ingenfly

Здравствайте! Подскажите, пожалуйста: customPlot->xAxis2->setTickLabels(true); //Здесь включается отображение данных на оси xAxis2. а можно как-то продублировать информацию cus...
Now discuss on the forum
June 20, 2019, 9:30 a.m.
IscanderChe

Вернулся к этой задачке только-только, поэтому и не ответил ничего раньше.Как переопределить mouseReleaseEvent(QMouseEvent* event) у QTableView, если QTableView задан в ui? Или задавать QTabl...
I
June 19, 2019, 1:41 p.m.
Intruder

Всем добрый день. При разборе XML файла наткнулся на тег вот такого плана: <TagName attribute1="value1" attribute2="value2" /> При попытке проверить на наличие такого элеме...
June 19, 2019, 12:55 p.m.
Михаиллл

Скажите пожалуйста, как его в таком случае перемещать и удалять?
June 18, 2019, 7:50 p.m.
Дмитрий

Большое спасибо! SDK заработал.К сожалению удалось продвинутся только на один шаг. При сборке чистого проекта NDK выдаёт следующие ошибки C:\Android\ndk-bundle/toolchains/arm-linux-andr...
June 18, 2019, 4:59 p.m.
Михаиллл

Добрый день.В этом учебнике представлен код INSTALLED_APPS = ( ... 'rest_framework', 'snippets.apps.SnippetsConfig',) На строчке 'snippets.apps.SnippetsConf...
Looking for a Job?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

EVILEG
About
Services
Join us
© EVILEG 2015-2019
Recommend hosting TIMEWEB