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);
    }
Виртуальный хостинг со скидкой 10 процентов
Виртуальный хостинг со скидкой 10 процентов
EVILEG предлагает надёжный хостинг со скидкой 10% на виртуальный хостинг и 5% на 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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
G
24 июля 2019 г. 4:20
G0tzef

C++ - Тест 005. Структуры и Классы

  • Результат:66баллов,
  • Очки рейтинга-1
VK
24 июля 2019 г. 3:49
Viktoriia Komarova

C++ - Тест 001. Первая программа и типы данных

  • Результат:40баллов,
  • Очки рейтинга-8
G
24 июля 2019 г. 3:25
G0tzef

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

  • Результат:80баллов,
  • Очки рейтинга4
Последние комментарии
23 июля 2019 г. 12:14
IscanderChe

Вот ссылка: https://github.com/iscander-che/TestReportViewer .
23 июля 2019 г. 5:42
Евгений Легоцкой

Хорошо, хотя конечно это С, а не С++ )))) Но если вдруг будут проблемы, то решение через класс со статическими переменными вы видели ))
23 июля 2019 г. 5:33
IscanderChe

"Не потребует каждый раз объявлять extern в других файлах". И так не требует. У меня в тестовом классе эти переменные используются без дополнительного объявления. Так же объявил их в cpp-файле о…
23 июля 2019 г. 5:28
IscanderChe

В репозиторий могу сегодня вечером выложить. "Или ее надо компилить самому под дистриб?" Тут я не совсем понимаю, что вы имеете ввиду. Я выложу в репозиторий исходный код утилиты, и всё.
23 июля 2019 г. 4:32
Евгений Легоцкой

Есть комментарий по вашему коду. Лучше бы вместо глобальных переменных в стиле Си, то есть с использоавнием extern, написали бы статические переменные в рамках класса. IMHO - это будет выглядеть…
Сейчас обсуждают на форуме
24 июля 2019 г. 4:57
Михаиллл

Это не помогает. Ниже мой код Rectangle{ //Flickable { //contentX: 100 id: rectangleForListView y: parent.height * 0.15 height: parent.height * 0.…
24 июля 2019 г. 3:17
Евгений Легоцкой

Ну вот теперь я несколько в ступоре. Запустите из консоли проект и посмотрите тогда, на что ругается. Также, следовало бы посмотреть в настройках самой виртуальной машины, что по поддержке OpenG…
23 июля 2019 г. 8:20
Михаиллл

Так работает QFile f1(dbAdress); f1.setPermissions(QFileDevice::WriteOther);
23 июля 2019 г. 7:11
Pavel K.

Советую использовать нечто такое или такое
22 июля 2019 г. 10:50
Pavel K.

Благодарю.Буду пробовать.
Ищу работу?
5,000.00 руб. - 15,000.00 руб.
Дизайнер
Moskovskiy, Moscow, Russia
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

EVILEG
О нас
Услуги
Присоединяйтесь к нам
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB