Jan. 27, 2019, 4:17 a.m.

Как при чтении HTML файла отвязаться от картинок-файлов и все сохранять в одной переменной?

Qt, HTML

Здравствуйте.
Как при чтении HTML файла отвязаться от картинок-файлов и все сохранять в одной переменной?

10% refund of hotel reservation amount on Booking
10% refund of hotel reservation amount on Booking
We offer a link with a 10% return on the amount of the order when booking a hotel through Booking
16

попробовал сделать так, но выкидывает из программы и не написало ошибки:

QTextDocument htmlDocument;
htmlDocument.setHtml(textHtmlResume);
ui->ResumeHHTextEdit->setDocument(&htmlDocument);
s
  • Jan. 27, 2019, 10:15 a.m.

Возможно, вам как-то поможет это:

QImage image;
//image=...;
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
image.save(&buffer, "PNG"); // writes image into ba in PNG format
QString s = ba.toBase64();

Врятли он заменит ссылки в Html на файлы. Похоже придется в PDF конвертировать.

вроде как картинку можно добавлять в html как массив ascii символов, возможно, что предварительный парсинг и преобразование ссылок на файлы в эти массивы символов может помочь, но не уверен, что QTextEdit такое понимает, чтобы отобразить правильно.

Нужно проверить, вдруг понимает, не хочется делать еще один кастыль из PDF.
Вы не знаете как перевести картинку в массив ascii символов?

Ну вообще, вам выше уже примерный код дали . Нужно будет сначала выдернуть все url из html, а потом конвертнуть их в строку, если они будут доступны, конечно, на вашем диске.

получил картинку, конвертированную в текст.
Но как это вставить в HTML?
В HTML картинка записана так :

src=\"file:///C:\\tempDirHtmlResume\\tempResumeHtmlFile.files\\image001.jpg\"

Сделал так, заработало

HTMLResume.replace(QRegExp("src=\"file:///C:\\tempDirHtmlResume\\tempResumeHtmlFile.files\\image001.jpg\""), textImage);
    ui->ResumeHHTextEdit->setHtml(HTMLResume);

Спасибо всем за помощь.
QTextEdit отображает такой код HTML

Ну вот этот src обычно заменяют массивом байт в base64 (с ascii я погорчился, он не нужен, нужен только массив байт)

Обычно что-то вроде такого получаается

<img src="data:image/png;base64,bytearray"/>

на месте bytearray должно быть то, что вы получаете с помощью QByteArray из того кода, что товарищ выше привёл.

Я тоже поспешил,

HTMLResume.replace(QRegExp("\"file:///C:\\tempDirHtmlResume\\tempResumeHtmlFile.files\\image001.jpg\""), textImage);

почему-то не работает. Картинка отображается из старого места.
Картинку перевел в текст так:

    QImage imageForResume("C:\\tempDirHtmlResume\\tempResumeHtmlFile.files\\image001.jpg");
    QByteArray byteArrayForImage;
    QBuffer buffer(&byteArrayForImage);
    imageForResume.save(&buffer, "PNG"); // writes the image in PNG format inside the buffer
    //QString textImage = QString::fromLatin1(byteArrayForImage.toBase64().data());
    QString textImage = byteArrayForImage.toBase64();

И еще у меня не срабатывает часть кода, такое ощущение что некоторые части(что полегче) выполнились или пропустились, а некоторые продолжают выполняться(что потяжелее). может ли быть такое?

Похоже комп не успевает создавать картинки и читать их (в зависимости от того, как скомпановынны методы), а другие части кода уже выполнились, тогда как стоящие перед ними нет.
Код вышел такой, не знаете , что тут можно поделать?

QString TextResume;
    QString HTMLResume;
    QVariant fileFormat(0x0000000A);     //Saving as filtered html
    //QVariant fileFormat("HTML ");

    QString resumeFileName; //= QFileDialog::getOpenFileName(0, "Выберете резюме hh.ru", "", "*.rtf");
    resumeFileName = QFileDialog::getOpenFileName(0, "Выберете резюме hh.ru", "", "*.doc *.docx *.rtf");
    resumeFileName.replace(QRegExp("[/]"), "\\");
    QString saveFile = "C:\\tempDirHtmlResume\\tempResumeHtmlFile.html";
    QDir tempDir("C:\\tempDirHtmlResume");
    tempDir.removeRecursively();  //delete directory
    tempDir.mkpath("."); //create directory

    if(!resumeFileName.isEmpty())
    {
        QAxObject   wordApplication("Word.Application");
        QAxObject *documents = wordApplication.querySubObject("Documents");
        QAxObject *document = documents->querySubObject("Open(const QVariant&, bool)", resumeFileName, true);
        QAxObject *words = document->querySubObject("Words");



        //qDebug()<< TextResume;
        document->querySubObject("SaveAs(const QVariant&,const QVariant)", saveFile, fileFormat);
        //document->querySubObject("WebOptions")->dynamicCall("Encoding",0x0000000A);
        document->dynamicCall("Close (boolean)", false);
        wordApplication.dynamicCall("Quit()");


        if(!saveFile.isEmpty())
        {
            QFile sFile(saveFile);
            if(sFile.open(QFile::ReadOnly | QFile::Text))
            {
                QTextStream in(&sFile);
                //QString textHtmlResume = in.readAll();
                HTMLResume = in.readAll();
                sFile.close();
                //HTMLResume.replace(QRegExp("src=\"tempResumeHtmlFile.files/"), "src=\"file:///C:\\tempDirHtmlResume\\tempResumeHtmlFile.files\\"); //замена символов //add images from directory
                //src=\"file:///C:\\tempDirHtmlResume\\tempResumeHtmlFile.files\\image001.jpg\"
                ui->ResumeHHTextEdit->clear();
                //ui->ResumeHHTextEdit->setHtml(HTMLResume);

            }
        }


   // tempDir.removeRecursively();  //delete directory
    }//*/

    QImage imageForResume("C:\\tempDirHtmlResume\\tempResumeHtmlFile.files\\image001.jpg");
    QByteArray byteArrayForImage;
    QBuffer buffer(&byteArrayForImage);
    imageForResume.save(&buffer, "PNG"); // writes the image in PNG format inside the buffer
    //QString textImage = QString::fromLatin1(byteArrayForImage.toBase64().data());
    QString textImage = byteArrayForImage.toBase64();
    //qDebug()<<textImage;

    //HTMLResume.replace(QRegExp("src=\"tempResumeHtmlFile.files/image001.jpg\""), "src=\"data:image/png;base64,bytearray\""); //замена символов //add text Images
    HTMLResume.replace(QRegExp("src=\"tempResumeHtmlFile.files/image001.jpg\""), textImage); //замена символов //add text Images
    ui->ResumeHHTextEdit->setHtml(HTMLResume);
    qDebug()<<HTMLResume;
    tempDir.removeRecursively();  //delete directory
    //qDebug()<<HTMLResume;

Самые медленные части кода на мой взгляд: конвертация doc в html, чтение html и картинки.

код все же работает, просто почему то

HTMLResume.replace(QRegExp("src=\"tempResumeHtmlFile.files/image001.jpg\""), textImage); //замена символов //add text Images

не хочет выполнятся, на место вставки вставляет "".
И почему то после этого не выводит

qDebug()<<HTMLResume;

хотя

qDebug()<<ui->ResumeHHTextEdit->toHtml();

работает.
Скажите пожалуйста, как вставить сюда textImage

Если сделать так

    //convert image to string
    QImage imageForResume("C:\\tempDirHtmlResume\\tempResumeHtmlFile.files\\image001.jpg");
    QByteArray byteArrayForImage;
    QBuffer buffer(&byteArrayForImage);
    imageForResume.save(&buffer, "PNG"); // writes the image in PNG format inside the buffer
    //QString textImage = QString::fromLatin1(byteArrayForImage.toBase64().data());
    QString textImage = byteArrayForImage.toBase64();
    //qDebug()<<textImage;

    //HTMLResume.replace(QRegExp("src=\"tempResumeHtmlFile.files/image001.jpg\""), "src=\"data:image/png;base64,bytearray\""); //замена символов //add text Images
    HTMLResume.replace(QRegExp("tempResumeHtmlFile.files/image001.jpg"), textImage); //замена символов //add text Images
    qDebug()<<HTMLResume;
    qDebug()<<"1";
    ui->ResumeHHTextEdit->setHtml(HTMLResume);
    qDebug()<<ui->ResumeHHTextEdit->toHtml();
    tempDir.removeRecursively();  //delete directory

то почемуто qDebug не выводит HTMLResume и ui->ResumeHHTextEdit->toHtml();

а если вставляю так, то картинка не появляется:

src=\"data:textImage/png;base64,byteArrayForImage\">

Нашел тут подобный вопрос
Сделал так

HTMLResume.replace(QRegExp("tempResumeHtmlFile.files/image001.jpg"), "<img src=\"data:image/png;base64," + textImage); 

Но картинка не отобразилась.
Получилось так
testHtml.txt testHtml.txt
Хромом тоже картинка не отображается

  • Jan. 28, 2019, 10:41 a.m.
  • The answer was marked as a solution.

Вот так заработало! Всем Спасибо за помощь!

    QImage imageForResume("C:\\tempDirHtmlResume\\tempResumeHtmlFile.files\\image001.jpg");
    QByteArray byteArrayForImage;
    QBuffer buffer(&byteArrayForImage);
    imageForResume.save(&buffer, "PNG"); // writes the image in PNG format inside the buffer
    QString textImage = byteArrayForImage.toBase64();
    HTMLResume.replace(QRegExp("src=\"tempResumeHtmlFile.files/image001.jpg\">"), " src=\"data:image/png;base64," + textImage + "\"/>"); //замена символов //add text Images
    ui->ResumeHHTextEdit->setHtml(HTMLResume);

Comments

Only authorized users can post comments.
Please, Log in or Sign up
D
Aug. 16, 2019, 11:58 a.m.
Damir

C++ - Тест 003. Условия и циклы

  • Result:92points,
  • Rating points8
D
Aug. 16, 2019, 11:46 a.m.
Damir

C++ - Test 005. Structures and Classes

  • Result:75points,
  • Rating points2
u
Aug. 14, 2019, 1:55 p.m.
unrealproro

C++ - Test 005. Structures and Classes

  • Result:83points,
  • Rating points4
Last comments
Aug. 19, 2019, 6:41 a.m.
Andrej Jankovich

это проблема дистрибутива, попробуйте установить через пакетный менеджер snap Суть проблемы: libQt5Core которая лежит в дистрибутиве требует версию glibc >= 2.25 у вас видимо …
b
Aug. 18, 2019, 5:09 a.m.
bbb116

cqtdeployer /home/aleks/CQtDeployer/bin/cqtdeployer: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by /home/aleks/CQtDeployer/lib/libQt5Core.so.5) linux mint …
D
Aug. 17, 2019, 8:04 a.m.
Damir

github ChekableTView Правой групповая смена значения при перетаскивании левой как обычно.
Aug. 16, 2019, 12:03 p.m.
Evgenij Legotskoj

Потому, что в минуте 60 секунд
Aug. 16, 2019, 11:16 a.m.
Dmitrij

а почему делитель 60000, а не 1000?
Now discuss on the forum
Aug. 19, 2019, 10:29 a.m.
Aleksej Vnukov

я в дороге, по тому примеру что в есть выше вам чтоб заработало нужно примерно следующее ListModel{ id: list_model } в ListView добавить model:list_model там где кноп…
Aug. 19, 2019, 8:47 a.m.
Pavel K.

bool YourClass::chekIfEmpty(const QString& table) { return getCount(table) == 0;}int YourClass::getCount(const QString& table, const QString& where) { QString command =…
Aug. 19, 2019, 8:29 a.m.
Pavel K.

посмотрите тут , практически тоже самое делал(пробегал по документу). А так в принципе : QFile file(Path);if(file.exist){ file.open(QIODevice::WriteOnly); // ReadWrite for…
Aug. 19, 2019, 2:39 a.m.
grig_p

Здравствуйте! Хотелось бы в своем приложении сделать цетрализованную обработку исключительных ситуаций для их логирования. Переопределил метод notify(): static const int EC_MAINLOOP…
Aug. 15, 2019, 2:19 a.m.
Mihailll

Плюсы и qml отличаются, с++ логичней
Looking for a Job?
14,000.00 руб. - 40,000.00 руб.
Разработчик Qt
Annino, Moscow Oblast, Russia
5,000.00 руб. - 15,000.00 руб.
Дизайнер
Moskovskiy, Moscow, Russia
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
© EVILEG 2015-2019
Recommend hosting TIMEWEB