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 р. 00: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 р. 02: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 р. 03:37

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

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

          R
          • 18 грудня 2018 р. 03:44

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

            Evgenii Legotckoi
            • 18 грудня 2018 р. 04:12

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

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

              Александр Панюшкин
              • 18 грудня 2018 р. 04:12
              • Відповідь була позначена як рішення.

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

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

                  R
                  • 18 грудня 2018 р. 06: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 р. 06:57

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

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

                      R
                      • 18 грудня 2018 р. 07:25

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

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

                        Коментарі

                        Only authorized users can post comments.
                        Please, Log in or Sign up
                        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
                        Останні коментарі
                        ИМ
                        Игорь Максимов22 листопада 2024 р. 22:51
                        Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                        Evgenii Legotckoi
                        Evgenii Legotckoi01 листопада 2024 р. 00:37
                        Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                        A
                        ALO1ZE19 жовтня 2024 р. 18:19
                        Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                        ИМ
                        Игорь Максимов05 жовтня 2024 р. 17:51
                        Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                        d
                        dblas505 липня 2024 р. 21:02
                        QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                        Тепер обговоріть на форумі
                        Evgenii Legotckoi
                        Evgenii Legotckoi25 червня 2024 р. 01:11
                        добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                        t
                        tonypeachey115 листопада 2024 р. 17:04
                        google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                        NSProject
                        NSProject04 червня 2022 р. 13:49
                        Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                        9
                        9Anonim25 жовтня 2024 р. 19:10
                        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                        Слідкуйте за нами в соціальних мережах