R
RED_Spider17 декабря 2018 г. 16:15

Qt console application html to export pdf

есть пример

    QTextDocument *document = new QTextDocument();
    document->setHtml(html);

    QPrinter printer(QPrinter::PrinterResolution);
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setPaperSize(QPrinter::A4);
    printer.setPageMargins(QMarginsF(15, 15, 15, 15));
    printer.setOutputFileName("/tmp/test.pdf");

    document->setPageSize(printer.pageRect().size());
    document->print(&printer);

но программа падает на выполнении document->print(&printer);
я даже перевел QCoreApplication в QApplication результат тот же.
возможно кто-то сталкивался с таким?

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

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

11
Evgenii Legotckoi
  • 17 декабря 2018 г. 17:36

Добрый день!

А на какой строке падает? Может, что-то не инициализировано до конца?
С виду код правильный.

У меня был где-то проект подобного плана, завтра могу посмотреть, если найду, что я там писал.

    Александр Панюшкин
    • 18 декабря 2018 г. 0:37

    Добрый день.
    С QCoreApplication у меня тоже всё падает. Вероятнее всего он там просто не работает. А вот в QApplication всё запустилось без проблем.
    Единственное, что не известно в вашем примере - переменная html. Я её обозначил как:

    QString html = "<body><h1>Hello world</h1></body>"
    

    Результат прикладываю.
    Запускал на MacOS напрямую в main.c:

    #include <QApplication>
    #include <QTextDocument>
    #include <QPrinter>
    
    int main(int argc, char *argv[])
    {
      QApplication a(argc, argv);
    
      QString html = "<body><h1>Hello world</h1></body>";
    
      QTextDocument *document = new QTextDocument();
      document->setHtml(html);
    
      QPrinter printer(QPrinter::PrinterResolution);
      printer.setOutputFormat(QPrinter::PdfFormat);
      printer.setPaperSize(QPrinter::A4);
      printer.setPageMargins(QMarginsF(15, 15, 15, 15));
      printer.setOutputFileName("/Users/ap/Downloads/test.pdf");
    
      document->setPageSize(printer.pageRect().size());
      document->print(&printer);
    
      return a.exec();
    }
    

    Если у вас не в main.c, тогда вопрос по переменной printer - она у вас не умирает раньше времени?

      R
      • 18 декабря 2018 г. 2:59
      • (ред.)

      Добрый день.

      Единственное, что не известно в вашем примере - переменная html.

      туда приходит шаблон, для invoce, там все хорошо

      Если у вас не в main.c, тогда вопрос по переменной printer - она у вас не умирает раньше времени?

      думаю это правильный вопрос, Спасибо

      це слот який обробляє, генерацію PDF

      тут такой нюанс что я не могу использовать QApplication,

      потому что это серверная программа и с QApplication

      qt.qpa.screen: QXcbConnection: Could not connect to display
      Could not connect to any X display.

        Evgenii Legotckoi
        • 18 декабря 2018 г. 3:37

        QPrinter является GUI элементом, а значит придётся использовать QAplication.

        Я думаю, что вам стоит посмотреть в сторону python утилит, которые могут делать pdf из html, раз у вас серверная программа. Я же правильно понимаю, что у вас сервер под Линукс?

          R
          • 18 декабря 2018 г. 3:44

          да сервер под Linux и сам сервер написан на Qt поэтому и хотелось использовать возможности Qt
          ну тогда придется прикрепить велосипед на python

            Evgenii Legotckoi
            • 18 декабря 2018 г. 4:12

            Для конвертации pdf вы можете использовать python библиотеку через QProccess.

            А в остальном использовать Qt

              Александр Панюшкин
              • 18 декабря 2018 г. 4:12
              • Ответ был помечен как решение.

              Запустите программу с ключом "-platform offscreen".
              Я проверил у себя на убунтовском сервере, с этим ключом у меня всё заработало.

                Evgenii Legotckoi
                • 18 декабря 2018 г. 4:14

                Не знал про такое. Хм )))

                  R
                  • 18 декабря 2018 г. 6:50
                  • (ред.)

                  спасибо, так работает, запускается, и генерирует "-platform offscreen"

                  полная реализация

                  emit createInvoiceChanged(HTML_STRING)
                  
                  connect(this, &BuyItems::createInvoiceChanged, this, &BuyItems::createInvoice);
                  
                  void BuyItems::createInvoice(const QString &html)
                  {
                  
                      QTextDocument document;
                      document.setHtml(html);
                  
                      QPrinter printer(QPrinter::PrinterResolution);
                      printer.setOutputFormat(QPrinter::PdfFormat);
                      printer.setPaperSize(QPrinter::A4);
                      printer.setPageMargins(QMarginsF(15, 15, 15, 15));
                      printer.setOutputFileName("/tmp/test.pdf");
                  
                      document.setPageSize(printer.pageRect().size());
                      document.print(&printer);
                  }
                  
                  

                  входные данные проверил, нормально выглядят

                  <head>     <meta charset=\"utf-8\">     <title>A simple, clean, and responsive HTML invoice template</title>          <style>     .invoice-box {         max-width: 800px;         margin: auto;         padding: 30px;         border: 1px solid #eee;         box-shadow: 0 0 10px rgba(0, 0, 0, .15);         font-size: 16px;         line-height: 24px;         font-family: 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;         color: #555;     }          .invoice-box table {         width: 100%;         line-height: inherit;         text-align: left;     }          .invoice-box table td {         padding: 5px;         vertical-align: top;     }          .invoice-box table tr td:nth-child(2) {         text-align: right;     }          .invoice-box table tr.top table td {         padding-bottom: 20px;     }          .invoice-box table tr.top table td.title {         font-size: 45px;         line-height: 45px;         color: #333;     }          .invoice-box table tr.information table td {         padding-bottom: 40px;     }          .invoice-box table tr.heading td {         background: #eee;         border-bottom: 1px solid #ddd;         font-weight: bold;     }          .invoice-box table tr.details td {         padding-bottom: 20px;     }          .invoice-box table tr.item td{         border-bottom: 1px solid #eee;     }          .invoice-box table tr.item.last td {         border-bottom: none;     }          .invoice-box table tr.total td:nth-child(2) {         border-top: 2px solid #eee;         font-weight: bold;     }          @media only screen and (max-width: 600px) {         .invoice-box table tr.top table td {             width: 100%;             display: block;             text-align: center;         }                  .invoice-box table tr.information table td {             width: 100%;             display: block;             text-align: center;         }     }          /** RTL **/     .rtl {         direction: rtl;         font-family: Tahoma, 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;     }          .rtl table {         text-align: right;     }          .rtl table tr td:nth-child(2) {         text-align: left;     }     </style> </head>  <body>     <div class=\"invoice-box\">         <table cellpadding=\"0\" cellspacing=\"0\">             <tr class=\"top\">                 <td colspan=\"2\">                     <table>                         <tr>                             <td class=\"title\">                                 <img src=\"https://www.sparksuite.com/images/logo.png\" style=\"width:100%; max-width:300px;\">                             </td>                                                          <td>                                 Invoice #: 201811075103237<br>                                 Created: 2018-12-18<br>                                 Due: 2018-12-18                             </td>                         </tr>                     </table>                 </td>             </tr>                          <tr class=\"information\">                 <td colspan=\"2\">                     <table>                         <tr>                             <td>                                 SP Z.o.o.<br>                                 WLADY, nr 6\\12<br>                                 KRAKOW, 30454,                            </td>                                                          <td>                                 Victor Gnatiak<br>ul. OKIETKA, nr 6A, lok. 12<br>Krakow, 7588                             </td>                         </tr>                     </table>                 </td>             </tr>                          <tr class=\"heading\">                 <td>                     Payment Method                 </td>                                  <td>                                      </td>             </tr>                          <tr class=\"details\">                 <td>                     PayPal                 </td>                                  <td>                                      </td>             </tr>                          <tr class=\"heading\">                 <td>                     Item                 </td>                                  <td>                     Price                 </td>             </tr>              \t\t\t\t<tr class=\"item\"><td>39 test buy items</td><td>20</td></tr>                                      <tr class=\"item last\">                 <td>                     Incl. VAT(23%)                 </td>                                  <td>                     4.6                 </td>             </tr>                          <tr class=\"total\">                 <td></td>                                  <td>                    Total: 20                 </td>             </tr>         </table>     </div> </body> </html>
                  

                  осталась только одна проблема))
                  https://clip2net.com/s/3YHj0KS

                    Александр Панюшкин
                    • 18 декабря 2018 г. 6:57

                    А что не нравится? Красота же! :)

                    Содержимое html всё же нужно для того, чтобы попытаться это смоделировать.
                    Подозреваю, что у вас какое-то "несворение" кодировок. Попробуйте всё в utf-8 строго конвертировать.

                      R
                      • 18 декабря 2018 г. 7:25

                      именно так, проблема в кодировке, а именно в отсутствии шрифтов на сервере, для меня вопрос решился в CentOS 7
                      yum install curl cabextract xorg-x11-font-utils fontconfig

                      всем спасибо за помощь))

                        Комментарии

                        Только авторизованные пользователи могут публиковать комментарии.
                        Пожалуйста, авторизуйтесь или зарегистрируйтесь
                        AD

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

                        • Результат:50баллов,
                        • Очки рейтинга-4
                        m
                        • molni99
                        • 26 октября 2024 г. 11:37

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

                        • Результат:80баллов,
                        • Очки рейтинга4
                        m
                        • molni99
                        • 26 октября 2024 г. 11:29

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

                        • Результат:20баллов,
                        • Очки рейтинга-10
                        Последние комментарии
                        i
                        innorwall15 ноября 2024 г. 8:26
                        Qt/C++ - Урок 031. QCustomPlot - строим график по времени buy generic priligy We can just chat, and we will not lose too much time anyway
                        i
                        innorwall15 ноября 2024 г. 6:03
                        Qt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
                        i
                        innorwall14 ноября 2024 г. 22:42
                        Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
                        i
                        innorwall14 ноября 2024 г. 20:09
                        Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
                        Сейчас обсуждают на форуме
                        i
                        innorwall14 ноября 2024 г. 14:39
                        добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
                        i
                        innorwall11 ноября 2024 г. 21:55
                        Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                        9
                        9Anonim25 октября 2024 г. 19:10
                        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                        ИМ
                        Игорь Максимов3 октября 2024 г. 14:05
                        Реализация навигации по разделам Спасибо Евгений!

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