Михаиллл
Михаиллл27 января 2019 г. 5:17

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

Qt, HTML

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

16
Михаиллл
  • 27 января 2019 г. 7:54
  • (ред.)

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

QTextDocument htmlDocument;
htmlDocument.setHtml(textHtmlResume);
ui->ResumeHHTextEdit->setDocument(&htmlDocument);
    s
    • 27 января 2019 г. 11:15

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

    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();
    
    
      Михаиллл
      • 27 января 2019 г. 12:09

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

        Evgenii Legotckoi
        • 28 января 2019 г. 2:25

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

          Михаиллл
          • 28 января 2019 г. 3:45

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

            Evgenii Legotckoi
            • 28 января 2019 г. 3:51

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

              Михаиллл
              • 28 января 2019 г. 4:30

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

              src=\"file:///C:\\tempDirHtmlResume\\tempResumeHtmlFile.files\\image001.jpg\"
              
                Михаиллл
                • 28 января 2019 г. 4:34

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

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

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

                  Evgenii Legotckoi
                  • 28 января 2019 г. 4:36

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

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

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

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

                    Михаиллл
                    • 28 января 2019 г. 4:54

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

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

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

                      Михаиллл
                      • 28 января 2019 г. 5:02

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

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

                        Михаиллл
                        • 28 января 2019 г. 8:15

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

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

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

                        qDebug()<<HTMLResume;
                        

                        хотя

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

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

                          Михаиллл
                          • 28 января 2019 г. 8:20
                          • (ред.)

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

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

                            Михаиллл
                            • 28 января 2019 г. 8:29

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

                            src=\"data:textImage/png;base64,byteArrayForImage\">
                            
                              Михаиллл
                              • 28 января 2019 г. 11:16

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

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

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

                                Михаиллл
                                • 28 января 2019 г. 11:41
                                • Ответ был помечен как решение.

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

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

                                  Комментарии

                                  Только авторизованные пользователи могут публиковать комментарии.
                                  Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                  e
                                  • ehot
                                  • 31 марта 2024 г. 21:29

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

                                  • Результат:78баллов,
                                  • Очки рейтинга2
                                  B

                                  C++ - Тест 002. Константы

                                  • Результат:16баллов,
                                  • Очки рейтинга-10
                                  B

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

                                  • Результат:46баллов,
                                  • Очки рейтинга-6
                                  Последние комментарии
                                  k
                                  kmssr9 февраля 2024 г. 2:43
                                  Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                  АК
                                  Анатолий Кононенко5 февраля 2024 г. 9:50
                                  Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                  EVA
                                  EVA25 декабря 2023 г. 18:30
                                  Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                                  J
                                  JonnyJo25 декабря 2023 г. 16:38
                                  Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                                  G
                                  Gvozdik19 декабря 2023 г. 5:01
                                  Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                                  Сейчас обсуждают на форуме
                                  a
                                  a_vlasov14 апреля 2024 г. 13:41
                                  Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                                  Павел Дорофеев
                                  Павел Дорофеев14 апреля 2024 г. 9:35
                                  QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                                  f
                                  fastrex4 апреля 2024 г. 11:47
                                  Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
                                  P
                                  Pisych27 февраля 2023 г. 12:04
                                  Как получить в массив значения из связанной модели? Спасибо, разобрался:))
                                  AC
                                  Alexandru Codreanu19 января 2024 г. 19:57
                                  QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

                                  Следите за нами в социальных сетях