R
RED_SpiderЖел. 17, 2018, 4: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, 5:36 Т.Қ.

Добрый день!

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

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

    Александр Панюшкин
    • Жел. 18, 2018, 12: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".
              Я проверил у себя на убунтовском сервере, с этим ключом у меня всё заработало.

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

                  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

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

                        Пікірлер

                        Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                        Кіріңіз немесе Тіркеліңіз
                        Г

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

                        • Нәтиже:66ұпай,
                        • Бағалау ұпайлары-1
                        t

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

                        • Нәтиже:33ұпай,
                        • Бағалау ұпайлары-10
                        t

                        Qt - Тест 001. Сигналы и слоты

                        • Нәтиже:52ұпай,
                        • Бағалау ұпайлары-4
                        Соңғы пікірлер
                        G
                        GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
                        Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
                        d
                        dblas5Шілде 5, 2024, 11:02 Т.Ж.
                        QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                        k
                        kmssrАқп. 8, 2024, 6:43 Т.Қ.
                        Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                        АК
                        Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
                        Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                        Енді форумда талқылаңыз
                        Evgenii Legotckoi
                        Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                        добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                        F
                        FynjyШілде 22, 2024, 4:15 Т.Ж.
                        при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
                        BlinCT
                        BlinCTМаусым 25, 2024, 1 Т.Ж.
                        Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                        BlinCT
                        BlinCTМамыр 5, 2024, 5:46 Т.Ж.
                        Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                        Evgenii Legotckoi
                        Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
                        Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

                        Бізді әлеуметтік желілерде бақылаңыз