Михаиллл
Jan. 27, 2019, 4:17 p.m.

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

Qt, HTML

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

2

Do you like it? Share on social networks!

16
Михаиллл
  • Jan. 27, 2019, 6:54 p.m.
  • (edited)

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

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

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

    1. QImage image;
    2. //image=...;
    3. QByteArray ba;
    4. QBuffer buffer(&ba);
    5. buffer.open(QIODevice::WriteOnly);
    6. image.save(&buffer, "PNG"); // writes image into ba in PNG format
    7. QString s = ba.toBase64();
    8.  
      Михаиллл
      • Jan. 27, 2019, 11:09 p.m.

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

        Evgenii Legotckoi
        • Jan. 28, 2019, 1:25 p.m.

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

          Михаиллл
          • Jan. 28, 2019, 2:45 p.m.

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

            Evgenii Legotckoi
            • Jan. 28, 2019, 2:51 p.m.

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

              Михаиллл
              • Jan. 28, 2019, 3:30 p.m.

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

              1. src=\"file:///C:\\tempDirHtmlResume\\tempResumeHtmlFile.files\\image001.jpg\"
                Михаиллл
                • Jan. 28, 2019, 3:34 p.m.

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

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

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

                  Evgenii Legotckoi
                  • Jan. 28, 2019, 3:36 p.m.

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

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

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

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

                    Михаиллл
                    • Jan. 28, 2019, 3:54 p.m.

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

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

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

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

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

                      Михаиллл
                      • Jan. 28, 2019, 4:02 p.m.

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

                      1. QString TextResume;
                      2. QString HTMLResume;
                      3. QVariant fileFormat(0x0000000A); //Saving as filtered html
                      4. //QVariant fileFormat("HTML ");
                      5.  
                      6. QString resumeFileName; //= QFileDialog::getOpenFileName(0, "Выберете резюме hh.ru", "", "*.rtf");
                      7. resumeFileName = QFileDialog::getOpenFileName(0, "Выберете резюме hh.ru", "", "*.doc *.docx *.rtf");
                      8. resumeFileName.replace(QRegExp("[/]"), "\\");
                      9. QString saveFile = "C:\\tempDirHtmlResume\\tempResumeHtmlFile.html";
                      10. QDir tempDir("C:\\tempDirHtmlResume");
                      11. tempDir.removeRecursively(); //delete directory
                      12. tempDir.mkpath("."); //create directory
                      13.  
                      14. if(!resumeFileName.isEmpty())
                      15. {
                      16. QAxObject wordApplication("Word.Application");
                      17. QAxObject *documents = wordApplication.querySubObject("Documents");
                      18. QAxObject *document = documents->querySubObject("Open(const QVariant&, bool)", resumeFileName, true);
                      19. QAxObject *words = document->querySubObject("Words");
                      20.  
                      21.  
                      22.  
                      23. //qDebug()<< TextResume;
                      24. document->querySubObject("SaveAs(const QVariant&,const QVariant)", saveFile, fileFormat);
                      25. //document->querySubObject("WebOptions")->dynamicCall("Encoding",0x0000000A);
                      26. document->dynamicCall("Close (boolean)", false);
                      27. wordApplication.dynamicCall("Quit()");
                      28.  
                      29.  
                      30. if(!saveFile.isEmpty())
                      31. {
                      32. QFile sFile(saveFile);
                      33. if(sFile.open(QFile::ReadOnly | QFile::Text))
                      34. {
                      35. QTextStream in(&sFile);
                      36. //QString textHtmlResume = in.readAll();
                      37. HTMLResume = in.readAll();
                      38. sFile.close();
                      39. //HTMLResume.replace(QRegExp("src=\"tempResumeHtmlFile.files/"), "src=\"file:///C:\\tempDirHtmlResume\\tempResumeHtmlFile.files\\"); //замена символов //add images from directory
                      40. //src=\"file:///C:\\tempDirHtmlResume\\tempResumeHtmlFile.files\\image001.jpg\"
                      41. ui->ResumeHHTextEdit->clear();
                      42. //ui->ResumeHHTextEdit->setHtml(HTMLResume);
                      43.  
                      44. }
                      45. }
                      46.  
                      47.  
                      48. // tempDir.removeRecursively(); //delete directory
                      49. }//*/
                      50.  
                      51. QImage imageForResume("C:\\tempDirHtmlResume\\tempResumeHtmlFile.files\\image001.jpg");
                      52. QByteArray byteArrayForImage;
                      53. QBuffer buffer(&byteArrayForImage);
                      54. imageForResume.save(&buffer, "PNG"); // writes the image in PNG format inside the buffer
                      55. //QString textImage = QString::fromLatin1(byteArrayForImage.toBase64().data());
                      56. QString textImage = byteArrayForImage.toBase64();
                      57. //qDebug()<<textImage;
                      58.  
                      59. //HTMLResume.replace(QRegExp("src=\"tempResumeHtmlFile.files/image001.jpg\""), "src=\"data:image/png;base64,bytearray\""); //замена символов //add text Images
                      60. HTMLResume.replace(QRegExp("src=\"tempResumeHtmlFile.files/image001.jpg\""), textImage); //замена символов //add text Images
                      61. ui->ResumeHHTextEdit->setHtml(HTMLResume);
                      62. qDebug()<<HTMLResume;
                      63. tempDir.removeRecursively(); //delete directory
                      64. //qDebug()<<HTMLResume;

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

                        Михаиллл
                        • Jan. 28, 2019, 7:15 p.m.

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

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

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

                        1. qDebug()<<HTMLResume;

                        хотя

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

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

                          Михаиллл
                          • Jan. 28, 2019, 7:20 p.m.
                          • (edited)

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

                          1. //convert image to string
                          2. QImage imageForResume("C:\\tempDirHtmlResume\\tempResumeHtmlFile.files\\image001.jpg");
                          3. QByteArray byteArrayForImage;
                          4. QBuffer buffer(&byteArrayForImage);
                          5. imageForResume.save(&buffer, "PNG"); // writes the image in PNG format inside the buffer
                          6. //QString textImage = QString::fromLatin1(byteArrayForImage.toBase64().data());
                          7. QString textImage = byteArrayForImage.toBase64();
                          8. //qDebug()<<textImage;
                          9.  
                          10. //HTMLResume.replace(QRegExp("src=\"tempResumeHtmlFile.files/image001.jpg\""), "src=\"data:image/png;base64,bytearray\""); //замена символов //add text Images
                          11. HTMLResume.replace(QRegExp("tempResumeHtmlFile.files/image001.jpg"), textImage); //замена символов //add text Images
                          12. qDebug()<<HTMLResume;
                          13. qDebug()<<"1";
                          14. ui->ResumeHHTextEdit->setHtml(HTMLResume);
                          15. qDebug()<<ui->ResumeHHTextEdit->toHtml();
                          16. tempDir.removeRecursively(); //delete directory

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

                            Михаиллл
                            • Jan. 28, 2019, 7:29 p.m.

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

                            1. src=\"data:textImage/png;base64,byteArrayForImage\">
                              Михаиллл
                              • Jan. 28, 2019, 10:16 p.m.

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

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

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

                                Михаиллл
                                • Jan. 28, 2019, 10:41 p.m.
                                • The answer was marked as a solution.

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

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

                                  Comments

                                  Only authorized users can post comments.
                                  Please, Log in or Sign up
                                  • Last comments
                                  • AK
                                    April 1, 2025, 11:41 a.m.
                                    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                                  • Evgenii Legotckoi
                                    March 9, 2025, 9:02 p.m.
                                    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                                  • VP
                                    March 9, 2025, 4:14 p.m.
                                    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                                  • ИМ
                                    Nov. 22, 2024, 9:51 p.m.
                                    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                  • Evgenii Legotckoi
                                    Oct. 31, 2024, 11:37 p.m.
                                    Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup