Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB
Jan. 27, 2019, 10:17 a.m.

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

Qt, HTML

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

16

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

QTextDocument htmlDocument;
htmlDocument.setHtml(textHtmlResume);
ui->ResumeHHTextEdit->setDocument(&htmlDocument);
0
s
  • Jan. 27, 2019, 4:15 p.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();

0

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

0

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

0

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

0

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

0

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

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

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

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

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

1

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

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

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

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

0

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

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

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

0

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

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 и картинки.

0

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

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

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

qDebug()<<HTMLResume;

хотя

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

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

0

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

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

0

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

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

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

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

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

0

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

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Last comments
Feb. 21, 2019, 12:51 p.m.
Евгений Легоцкой

Иногда CMake приходится перезапускать начисто, не обновляет кэш
R
Feb. 21, 2019, 12:29 p.m.
RandyGallup

Я указал данные строки, т.к. без них у меня вылетала следующая ошибка: By not providing "FindQt5Core.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configurat...
Feb. 21, 2019, 12:08 p.m.
BlinCT

Вот атк выглядит мой проектник, посмотрите его. cmake_minimum_required(VERSION 3.6)project(projecttimer)set(CMAKE_CXX_STANDARD 11)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)find_packa...
Feb. 21, 2019, 12:04 p.m.
BlinCT

Смотрите, если вы используете глобально для проекта -DCMAKE_PREFIX_PATH= то вам не надо уже указывать вот эти строкиset(Qt5Core_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Core")set(Qt5Gui_DIR...
R
Feb. 21, 2019, 11:54 a.m.
RandyGallup

Даже не запускается. main.cpp у меня точно такой же, как в статье. CMakeLists.txt пришлось немного подправить (прикрепил ниже), т.к. не находились некоторые файлы. cmake_minimum_requi...
Now discuss on the forum
Feb. 21, 2019, 8:58 a.m.
Евгений Легоцкой

Ну у меня координаты передавались в зависимости от положения курсора мыши, а в вам по сути нужно будет аналогичным способом посылать даннные из полей ввода. Так что здесь скорее интерфес...
Feb. 20, 2019, 9:55 p.m.
Евгений Легоцкой

Не до конца понимаю сути вопроса, наверное, нужно увидеть программный код и попытку его применения, но к методам базового класса можно обращаться в наследованном классе через вызов по имени ба...
MU
Feb. 20, 2019, 3:06 p.m.
Maciej Urmański

Yes, ok I have solution! Thank you for directing me about annotate.:) Solution is: users_in = User.objects.filter(joined_users__goal=goal, joined_users__joined=True)
Feb. 20, 2019, 2:40 p.m.
Евгений Легоцкой

Думаю, что ещё можно переопределить mouseReleaseEvent(QMouseEvent* event) у QTableView, который содержит модель и немного поиграться с индексом. Если это индекс, который соответству...
Feb. 20, 2019, 10:34 a.m.
Евгений Легоцкой

Да, так тоже можно. Единственный момент в том, что lupdate не всегда понимает, к какому контексту это дело относится, и может запихать в левый контекст. В небольшом проекте это не критич...
Join us in social networks

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