Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Convert HTML to PDF



  • I'm trying to convert an html web page to PDF.

    I found out that there is this library in C++: https://wkhtmltopdf.org/downloads.html that can be used in QT.

    However, I downloaded the source code and I opened it with Qt Creator, but when I try to build it, it gives me this error:

    Project ERROR: Unknown module(s) in QT: webkit webkitwidgets
    

    I found a topic on this forum that explains how to install the webkitwidgets package, but I can't find the source code for my Qt version which should be Qt 5.15.0 with msvc2019_64.

    Or, if it is too difficult to install and use this library, can you suggest me another solution, please?

    At the moment, my program generates a HTML page with the content produced by the user and send it as attachment by email. It works fine most of the times, but I noticed that some smartphones or email clients automatically remove the attached webpage so I would like to convert the html page to PDF to send the content as a PDF file.

    Thank you!



  • @Marcus-Barnet webkit can be downloaded here https://download.qt.io/snapshots/ci/qtwebkit/5.212/latest/qtwebkit/ in the flavour you need.

    From your post it looks like it might be worth extra effort and remove the html generator parts completely (if you don't intend to use it, do I get that part right?) and simply use QPdfWriter with QTextDocument - QTextDocument also accepts subset of HTML to do rich text.

    Also worth your time: https://doc.qt.io/qt-5/richtext.html



  • Unfortunately, I can't get rid of the HTML part since the webpage is formatted in a very specific way.

    I need to add an extra step: load the html page saved on the hard drive, convert it to PDF and send it as attachment by email.

    I couldn't find any other smarter way so far.

    After having downloaded the package, should I just build the source code of the wkhtmltopdf library in QT or do I need some extra setup? I'm sorry, but I usually use Linux and I'm not very confident with Windows.



  • @Marcus-Barnet maybe first try to import your HTML to QTextDocument? It might be that it will look just right. Worth checking, might save you a bit of a time.



  • Thank you! Yes, I could try! I have all the html code store into a QString html_page variable.

    What is the fastest way to convert it to QTextDocument?

    QTextDocument doc;
    doc.setHtml(html_page );
    

    The web page is formatted to fit in a A4 format as it is.
    I couldn't find any simple code to understand how to use QPdfWriter, by the way!



  • Another way is to convert the web page to a xml file which can be used to make web pages. You may be able to find tools to do that. Then it may be easier to convert xml file to PDF or QTextDocument.



  • @Marcus-Barnet
    Be aware that QTextDocument's support for HTML is "limited". To that subset specified by Qt.

    When you talk about

    Unfortunately, I can't get rid of the HTML part since the webpage is formatted in a very specific way.

    it makes me think you may need full, unadulterated HTML support. Like that in a web browser.

    You can use the older Qt webkit that you mention. However, that is no longer supplied with Qt, and you'll likely have to build it yourself. If you do not want to do that, are you aware that Qt replaced that with Qt WebEngine, which can also be used to display a web page and print it, including to PDF?



  • @Marcus-Barnet setHTML() is a way to go.
    QPdfWriter operates as usual printer, difference is that it produces well formed PDF document.

    The way to do it is use QTextDocument::drawContents() method, like on the printer. You might need to take care of setting the resolution of the "printer" and so on (when you notice that image is scaled up/down, etc, my usual setting is 300dpi).

    If that works then it works and you have less work.
    It it does not... Like @JonB said, only cumbersome solutions like webkit or QtWebEngine.

    On that note I fully endorse your decision of using lightweight webkit over a heavy cow of web engine. For this particular task should suffice.
    But I hope you don't have to use any of them.



  • @JonB said in Convert HTML to PDF:

    @Marcus-Barnet
    Be aware that QTextDocument's support for HTML is "limited". To that subset specified by Qt.

    When you talk about

    Unfortunately, I can't get rid of the HTML part since the webpage is formatted in a very specific way.

    it makes me think you may need full, unadulterated HTML support. Like that in a web browser.

    You can use the older Qt webkit that you mention. However, that is no longer supplied with Qt, and you'll likely have to build it yourself. If you do not want to do that, are you aware that Qt replaced that with Qt WebEngine, which can also be used to display a web page and print it, including to PDF?

    Yes, it's for this reason that I skipped the QTextDocument months ago.
    I remember that someone in this forum (may be you) told me that is supports only a limited set of HTML tags while my webpage is highly formatted.

    I do not think I have the skills to be able to build my myself the package, may be I should try Qt WebEngine, I need to check if there is any code example about that on google.



  • @Marcus-Barnet
    Note that @artwaw has just posted before you. He suggests that QPdfWriter (didn't yet exist when I did my stuff for this a few years ago) is preferable to WebKit/Engine, on the cumbersome-ness front. He may well know what he is talking about! But for QTextDocument I'm not sure it will support the raw HTML you seem to have? Maybe @artwaw will comment further?



  • @JonB /me will.
    It all depends on the document. Supported subset is documented here: https://doc.qt.io/qt-5/richtext-html-subset.html

    If that doesn't work, well... Further up I posted links to binaries of QtWebkit, just download and put into your Qt tree. As for printing - I'd need about half an hour to dig out how I did it with webkit in the past.



  • @Marcus-Barnet Got it. Not overly complicated.

    I write this under the assumption that you do not need to display the page.
    Once you have QtWebkit installed, you take QWebPage, usual QWebPage page; or something.

    Important concept with webkit is that (in our context) page manipulation like printing is not done on QWebPage object but on frames. Each QWebPage has at least one frame accessible via mainFrame() method. That is the key.

    So, to set the content we do page->mainFrame()->setHtml(QString html);
    To print, we need to setup the printer (plot twist! NOT QPdfWriter) and simply call page->mainFrame()->print(QPrinter *printer);
    To print to pdf from QPrinter you need to call during the setup QPrinter::setOutputFormat(QPrinter::PdfFormat); and QPrinter::setOutputFileName(QString fname);

    Documentation is here:

    https://qtwebkit.github.io/doc/qtwebkit/qwebpage.html
    https://qtwebkit.github.io/doc/qtwebkit/qwebframe.htm
    https://doc.qt.io/qt-5/qprinter.html

    At least that's what I did in my last project and I have to say it worked rather well.

    The reason I opt so often towards QtWebkit is that for solutions like this it is really lightweight and fast. Say, for headless processing or static html. For full fledged web applications it might be not enough but for like the above? Ideal.

    Have fun!

    Edit: I corrected calls to QWebFrame methods since I forgot that mainFrame() returns pointer.



  • Thank you a lot! I'll check everything this evening and I'll let you know if it worked!



  • You can do the same as @artwaw's approach of using PDF printer from QWebEnginePage. Absolutely nothing wrong with QtWebKit QWebPage. Just I don't compile anything Qt, just so you know if you have any compile problems.



  • @JonB side note and part explanation: for me QWebEngine is a no go on Windows as it requires Microsoft environment. I never managed to set it up properly, for some reason I saw my programs working well on mingw failing to compile I checked no further. Call me spoiled but...





  • Thank you to all, guys, for your support!

    Unfortunately, I think using qtwebkit requires some skills, since I downloaded this one: https://download.qt.io/snapshots/ci/qtwebkit/5.212/latest/qtwebkit/qtwebkit-Windows-Windows_10-MSVC2019-Windows-Windows_10-X86_64.7z and I got a folder that I moved to my QT directory:

    C:\Qt\5.15.0\qtwebkit-Windows-Windows_10-MSVC2019-Windows-Windows_10-X86_64
    
    08/06/2021  22:50    <DIR>          .
    08/06/2021  22:50    <DIR>          ..
    08/06/2021  22:50    <DIR>          bin
    08/06/2021  22:50    <DIR>          include
    08/06/2021  22:50    <DIR>          lib
    24/09/2020  14:15    <DIR>          mkspecs
    08/06/2021  22:50    <DIR>          qml
    

    and I do not know how to proceed from this step. I tried to search on the forum, but I didn't found any topic about this (only one, but it was for Linux while I'm on Windows 10).
    My current program uses msvc2019_64.

    I can't understand how I can build this package.



  • @Marcus-Barnet It should be already build. Just reopen QtCreator and add Qt += webkit in your .pro file.
    I have also Qt += webkitwidgets but I don't think you need them.

    At any rate you can then do #include <QWebPage> in the header files.



  • where should I copy the files contained in the archive I downloaded?

    This is the path where my qmake is:

    C:\Qt\5.15.0\msvc2019_64\bin\qmake.exe
    

    should I copy the content of:

    C:\Qt\5.15.0\qtwebkit-Windows-Windows_10-MSVC2019-Windows-Windows_10-X86_64
    08/06/2021  22:50    <DIR>          .
    08/06/2021  22:50    <DIR>          ..
    08/06/2021  22:50    <DIR>          bin
    08/06/2021  22:50    <DIR>          include
    08/06/2021  22:50    <DIR>          lib
    24/09/2020  14:15    <DIR>          mkspecs
    08/06/2021  22:50    <DIR>          qml
    

    in this directory?

    C:\Qt\5.15.0\msvc2019_64
    
    19/07/2020  21:36    <DIR>          .
    19/07/2020  21:36    <DIR>          ..
    29/07/2020  10:15    <DIR>          bin
    19/07/2020  21:34    <DIR>          doc
    19/07/2020  21:36    <DIR>          include
    19/07/2020  21:39    <DIR>          lib
    19/07/2020  21:34    <DIR>          mkspecs
    19/07/2020  21:34    <DIR>          phrasebooks
    19/07/2020  21:36    <DIR>          plugins
    19/07/2020  21:36    <DIR>          qml
    19/07/2020  21:36    <DIR>          resources
    19/07/2020  21:36    <DIR>          translations
    

    Sorry for the stupid question, but I can't understand how to use these files.
    Usually, in linux, there is /src and /lib folders that you can pass as parameter to the compiler.



  • @Marcus-Barnet yes. exactly there, all folders' content to the respective folders.



  • thank you, I did as you suggested and now I get no errors when I try to call QWebPage.

    Later, this evening, I will try to use it for the PDF and I will update you.



  • I tried to convert the html to pdf, it works fine even if this process doesn't include a PNG image which is included in the HTML page.

    Unfortunately, this image is very important since it is a logo which must be included also in the PDF file. (I use the <img> tag to insert the image)
    Is there any specific reason for not including the image?

    Moreover, I noticed that the table borders are displayed in grey color while they should be black.
    This is the code I'm using:

      ```
           QWebPage page;
           page.mainFrame()->setHtml(html_scheda);
    
           QPrinter printer(QPrinter::HighResolution);
           printer.setOrientation(QPrinter::Portrait);
           printer.setOutputFormat(QPrinter::PdfFormat);
           printer.setPaperSize(QPrinter::A4);
           printer.setPageMargins(QMarginsF(5, 5, 5, 5));
           QString fileName = "C:/folder/test.pdf";
           printer.setOutputFileName(fileName);
    
           page.mainFrame()->print(&printer);
    


  • @Marcus-Barnet from documentation: External objects referenced in the content are located relative to baseUrl. I'd search in that direction.



  • @artwaw said in Convert HTML to PDF:

    @Marcus-Barnet from documentation: External objects referenced in the content are located relative to baseUrl. I'd search in that direction.

    The problem is that the logo is loaded from the network, so I do not know what kind of base_url I should specify.

    This is the HTML where I load the picture:

    html_scheda = "<table align=\"center\" border=\"0\" style=\"border-collapse: collapse; width: 21cm; height: 29 cm;\"> <tbody> <tr> <td style=\"width: 100%;\"> <table border=\"0\" style=\"height: 146px; width: 100%; border-collapse: collapse; margin-left: auto; margin-right: auto;\"> <tbody> <tr style=\"height: 0px;\"> <td style=\"width: 50%; height: 146px; text-align: center;\" rowspan=\"4\"><img width=\"200\" align=\"center\" src=\"http://www.robo-dyne.com/pics/pump_logo.png\" alt=\"\" /></td>
    

    What should I use as baseurl in this situation?



  • We had the same problem and while webkit is viable option it does not support everything we needed.
    We tried a few options, but the best result was produced with using chrome:
    It can do it in headless mode
    google-chrome --headless --disable-gpu --print-to-pdf=file1.pdf http://www.example.com/

    So if you could make sure chrome is installed on your system, this would be an approach I recommend.



  • Does this work also on Windows?

    Even if I would prefer to use QT functionalities to export the PDF.



  • @Marcus-Barnet
    I will throw this in. I do not know if it is right/will help, but....

    I previously suggested you use the supported/supplied Qt WebEngine, not Qt WebKit. But for whatever reason you have gone down the WebKit route :) I do not compile anything Qt (Linux). For Windows I do not know whether you have to compile or whether you download already-built. I gather WebEngine requires MSVC, not MinGW, but that seems to be what you are using anyway.

    Web Engine uses the chromium engine. From @AlexMaly's post, I'm thinking/hoping this would do the necessary "chrome" facility for you, and access external URLs without problem?

    You would have to check. I leave you with this possibility....



  • @JonB said in Convert HTML to PDF:

    @Marcus-Barnet
    I will throw this in. I do not know if it is right/will help, but....

    I previously suggested you use the supported/supplied Qt WebEngine, not Qt WebKit. But for whatever reason you have gone down the WebKit route :) I do not compile anything Qt (Linux). For Windows I do not know whether you have to compile or whether you download already-built. I gather WebEngine requires MSVC, not MinGW, but that seems to be what you are using anyway.

    Web Engine uses the chromium engine. From @AlexMaly's post, I'm thinking/hoping this would do the necessary "chrome" facility for you, and access external URLs without problem?

    You would have to check. I leave you with this possibility....

    I didn't use WebEngine because I thought that WebKit was easier! But it is not working as expected, so I'll give it a try! :)
    I think I should use this one: https://doc.qt.io/qt-5/qtwebengine-webenginewidgets-html2pdf-example.html as an example and make it fit my needs, is it correct?

    Thank you!



  • @Marcus-Barnet said in Convert HTML to PDF:

    I think I should use this one: https://doc.qt.io/qt-5/qtwebengine-webenginewidgets-html2pdf-example.html as an example and make it fit my needs, is it correct?

    Indeed. I didn't know that example existed. Looks like what you are wanting to do, so seems a good starting point!



  • @Marcus-Barnet I will try to build basic webkit browser and check that for you later today. You got me curious. To all my knowledge and experience this should work just fine.



  • @Marcus-Barnet Hi,
    I got some spare time right now and this is the result:
    07303d40-b166-4486-b49c-fb02ccc1fe67-image.png

    Code:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QtWebKit>
    #include <QtWebKitWidgets>
    #include <QtPrintSupport>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    private:
        Ui::MainWindow *ui;
        QWebPage *page;
    };
    #endif // MAINWINDOW_H
    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        page = new QWebPage(this);
        page->mainFrame()->setHtml("<table align=\"center\" border=\"0\" style=\"border-collapse: collapse; width: 21cm; height: 29 cm;\"> <tbody> <tr> <td style=\"width: 100%;\"> <table border=\"0\" style=\"height: 146px; width: 100%; border-collapse: collapse; margin-left: auto; margin-right: auto;\"> <tbody> <tr style=\"height: 0px;\"> <td style=\"width: 50%; height: 146px; text-align: center;\" rowspan=\"4\"><img width=\"200\" align=\"center\" src=\"http://www.robo-dyne.com/pics/pump_logo.png\" alt=\"\" /></td>");
        ui->view->setPage(page);
        QPrinter *printer = new QPrinter(QPrinter::HighResolution);
        printer->setPageSize(QPrinter::A4);
        printer->setOutputFormat(QPrinter::PdfFormat);
        printer->setOutputFileName(QFileDialog::getSaveFileName(this,"Save location",QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)));
        page->mainFrame()->print(printer);
        delete printer;
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    QT       += core gui webkit webkitwidgets printsupport
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    CONFIG += c++11
    CONFIG +=s dk_no_version_check
    
    # You can make your code fail to compile if it uses deprecated APIs.
    # In order to do so, uncomment the following line.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    SOURCES += \
        main.cpp \
        mainwindow.cpp
    
    HEADERS += \
        mainwindow.h
    
    FORMS += \
        mainwindow.ui
    

    Resulting pdf file is here: https://trollnet.com.pl/dwn/webkitTest.pdf

    I'd say it works?

    EDIT:
    UI has one QWidget in the grid layout promoted to QWebView (named, surprisingly, view).
    I did additional tests where I removed the displayed part (which was added only to test the page anyway) and resulting pdf file is exactly the same, so we can exclude presence of QWebView form having any impact. QWebPage rendering and printout works perfectly fine with the sample you provided.



  • @artwaw said in Convert HTML to PDF:

    @Marcus-Barnet Hi,
    I got some spare time right now and this is the result:
    07303d40-b166-4486-b49c-fb02ccc1fe67-image.png

    Code:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QtWebKit>
    #include <QtWebKitWidgets>
    #include <QtPrintSupport>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    private:
        Ui::MainWindow *ui;
        QWebPage *page;
    };
    #endif // MAINWINDOW_H
    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        page = new QWebPage(this);
        page->mainFrame()->setHtml("<table align=\"center\" border=\"0\" style=\"border-collapse: collapse; width: 21cm; height: 29 cm;\"> <tbody> <tr> <td style=\"width: 100%;\"> <table border=\"0\" style=\"height: 146px; width: 100%; border-collapse: collapse; margin-left: auto; margin-right: auto;\"> <tbody> <tr style=\"height: 0px;\"> <td style=\"width: 50%; height: 146px; text-align: center;\" rowspan=\"4\"><img width=\"200\" align=\"center\" src=\"http://www.robo-dyne.com/pics/pump_logo.png\" alt=\"\" /></td>");
        ui->view->setPage(page);
        QPrinter *printer = new QPrinter(QPrinter::HighResolution);
        printer->setPageSize(QPrinter::A4);
        printer->setOutputFormat(QPrinter::PdfFormat);
        printer->setOutputFileName(QFileDialog::getSaveFileName(this,"Save location",QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)));
        page->mainFrame()->print(printer);
        delete printer;
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    QT       += core gui webkit webkitwidgets printsupport
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    CONFIG += c++11
    CONFIG +=s dk_no_version_check
    
    # You can make your code fail to compile if it uses deprecated APIs.
    # In order to do so, uncomment the following line.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    SOURCES += \
        main.cpp \
        mainwindow.cpp
    
    HEADERS += \
        mainwindow.h
    
    FORMS += \
        mainwindow.ui
    

    Resulting pdf file is here: https://trollnet.com.pl/dwn/webkitTest.pdf

    I'd say it works?

    EDIT:
    UI has one QWidget in the grid layout promoted to QWebView (named, surprisingly, view).
    I did additional tests where I removed the displayed part (which was added only to test the page anyway) and resulting pdf file is exactly the same, so we can exclude presence of QWebView form having any impact. QWebPage rendering and printout works perfectly fine with the sample you provided.

    I really do not know what to say, but I tried your code and it doesn't work for me!
    It doesn't display the image in the PDF file.



  • it's strange because everything else works fine, but the images are not displayed.



  • @AlexMaly said in Convert HTML to PDF:

    We had the same problem and while webkit is viable option it does not support everything we needed.
    We tried a few options, but the best result was produced with using chrome:
    It can do it in headless mode
    google-chrome --headless --disable-gpu --print-to-pdf=file1.pdf http://www.example.com/

    So if you could make sure chrome is installed on your system, this would be an approach I recommend.

    This solution works and it is able to generate the PDF by including also the images, but I can't scale the result PDF.
    I need to fit all the content in a A4 format and to do so I need to scale the print to 93%. It seems that chrome doesn't provide this feature.



  • At the moment, I solved the conversion problem by using wkhtmltopdf.

    However, I was trying to generated a PDF file to be able to send it by email as an attachment since sometimes the HTML webpages are blocked by the antivirus (I guess) and they cannot be read by the user.
    I was thinking to solve the problem by sending PDF files instead of HTML, but the attachments keep to be blocked on some smartphones!!



  • @Marcus-Barnet That, I believe, is a problem with settings of the said smartphone mail client or account and I am not sure if you can do anything to prevent that.
    Ugly solution might be to ditch pdf and render a4 size png image and include that as an attachment (but I am totally not sure if that would work with mail filters).



  • But it's strange because if I sent the same PDF file as attachment by using my mail client, then they receive it.

    The problem occurs only when I send it by my QT application.



  • @Marcus-Barnet I'd examine headers set by mail client and by Qt code.



  • Following your suggestion, I tried to compare both mail headers, but they look almost similar to me even if the email client seems to convert the mail text to HTML.

    This is the header for the email sent by the QT code:

    Delivered-To: email@gmail.com
    Received: by 2002:a05:6838:e2d1:0:0:0:0 with SMTP id h17csp4107691nke;
            Tue, 15 Jun 2021 13:31:50 -0700 (PDT)
    X-Received: by 2002:a17:906:60d3:: with SMTP id f19mr1464991ejk.413.1623789110147;
            Tue, 15 Jun 2021 13:31:50 -0700 (PDT)
    ARC-Seal: i=1; a=rsa-sha256; t=1623789110; cv=none;
            d=google.com; s=arc-20160816;
            b=I/NjJ997YuEPNSd5GreiyadlkrHD6KyDjm8ZkJnuZCQxGo/gNdi87wj76UVwQ4PxOT
             5PDMII0Zd6ilXoCube5INmsMszMhSOyH/rOMVPtovfGLC1OEOSKUIgfDb8Z2rcKPTNSy
             FU5g0Mq6/aeOttXpsuMovZiD5Pm/pwZ11wyI0jb2a5a6kGz2fcpm5HQ70FiuIF/o4tkC
             Oi6s9GkLspvhmmntX2BJDlSV/bhgB7j8qMgAQUuB6bTRjiDI+zRzj8hnO6PLy1756mf8
             xiDIJtJ5z3yi1CMi++EIypHP0VxEBPnyUnLkmphJKVNrBgw4QtLV+OCwjFvFMRuxoMU9
             409Q==
    ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
            h=content-transfer-encoding:mime-version:subject:to:from:date
             :message-id:dkim-signature;
            bh=0BZEuUGVIISL9vh2ZiCAePOWEZJm2fk4iWTEHYb3Klg=;
            b=ujrXD41yE3z9gtDpIc1nAkzU2dKdMpJOSDCYDVJnkfz1NN5IAc8/1u19cqBcmotVr1
             w7RIuCQBqdnkd/g9wYgkDcVWO2/X7RH4O1c+P8ByBdpq0cR2YECFw5ivientFVgk65ju
             rgJjhc76x5PKluvQQGlIvh4s/rIw+EgxOcDRZjEWVh6xeurrjiLu9RhIP+8Jn3o3z8mp
             cRBN2zQ/oH3pKzf3s2XOBz+IVSztqcSIOYpkKC6cQMP553rRWU7bdLm8up30EKCmN6QF
             /V4yuOuV5tWAg6s+kpreFEi9V7MRcp3zS5K2GWTKwO3TL3rBTI9YRAplhru6V631u/JL
             iWvw==
    ARC-Authentication-Results: i=1; mx.google.com;
           dkim=pass header.i=@gmail.com header.s=20161025 header.b="V/05G+hO";
           spf=pass (google.com: domain of email@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=pumpasdmaglie@gmail.com;
           dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com
    Return-Path: <pumpasdmaglie@gmail.com>
    Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41])
            by mx.google.com with SMTPS id e22sor17653647edu.23.2021.06.15.13.31.49
            for <email@gmail.com>
            (Google Transport Security);
            Tue, 15 Jun 2021 13:31:50 -0700 (PDT)
    Received-SPF: pass (google.com: domain of pumpasdmaglie@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41;
    Authentication-Results: mx.google.com;
           dkim=pass header.i=@gmail.com header.s=20161025 header.b="V/05G+hO";
           spf=pass (google.com: domain of pumpasdmaglie@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=pumpasdmaglie@gmail.com;
           dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com
    DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
            d=gmail.com; s=20161025;
            h=message-id:date:from:to:subject:mime-version
             :content-transfer-encoding;
            bh=0BZEuUGVIISL9vh2ZiCAePOWEZJm2fk4iWTEHYb3Klg=;
            b=V/05G+hOVQajWYay+THCyOZe2XcQSCy1Eqw8ePT6dmHGPYurnxR3dO5cmmhEg/+4du
             L4aptWvFiYKaDVZJvsCFgDphUtxxTQFBfFNWadVkzHAErBfesOehucMnz8vdaPkyI1hA
             ekP2h2QuKy5/gRpOfTVqQg5nVtFz0EtY3AlYMY16bYMMgXgURnD5MqsFo5KFBSApG+VD
             kejb3RIw6zyT+ubNJGrxkoxXJ1052qKFtx1o0Hhufh6tUyrhveuIuWyH+C/mvr1mZcKk
             d/Fu1qw4oXqW0wYyRqEsoSt2V7f03ikLnfmSyxDTwBZVIz/AMNwQ68+3lqL5PCbN+rpy
             y9mQ==
    X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
            d=1e100.net; s=20161025;
            h=x-gm-message-state:message-id:date:from:to:subject:mime-version
             :content-transfer-encoding;
            bh=0BZEuUGVIISL9vh2ZiCAePOWEZJm2fk4iWTEHYb3Klg=;
            b=CaoucRugLcRefZOqgUIdai4QXz6pGPXJc17BaqgLs47RwaIIobYisIRzy2jXOZ/y95
             xqr/DLKJqla1FwDKTqT5J4Rn+bAHO97CVWNuNYE1Bl4Np+pXuMLwI/oWWBh805J2q/+e
             8UQj+ixoeZpSydNbeovsN6alYlpNRumNR28yukb6LuGIdFrOL2f8rz9DwjiH3Zq7m5u0
             IuXhn0HZZzbbZSCqamq4Ki/P10w7Z8ttssD/uYdd/TeH44Q5BdN7U4PZtPBEWYvRsgN3
             JtX7oXsp9JpOr7t3DmviSSiVp/+6GQrvyCR/IPv1B5rbbf5/D6QBCDUInE8gx5EIiBGn
             WZDg==
    X-Gm-Message-State: AOAM5336ea21u4HeweqqAnDrAKtdifUHCW0lwdshpt7j9cFUDoXJ7Q0n t0/0cqpmokCIawJXCH1HzRGnWx9G7Fk=
    X-Google-Smtp-Source: ABdhPJx4U1C4HLk0WphjdL7Fk16b4PcnBlPBDBVfMInuYYRW06oVvuk7/XEem9l8F01eEWwq85Q+0Q==
    X-Received: by 2002:aa7:c799:: with SMTP id n25mr22902eds.16.1623789109691;
            Tue, 15 Jun 2021 13:31:49 -0700 (PDT)
    Return-Path: <pumpasdmaglie@gmail.com>
    Received: from localhost (host-87-0-192-249.retail.telecomitalia.it. [87.0.192.249])
            by smtp.gmail.com with ESMTPSA id i26sm37044edq.54.2021.06.15.13.31.48
            for <roccogalati@gmail.com>
            (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256);
            Tue, 15 Jun 2021 13:31:48 -0700 (PDT)
    Message-ID: <60c90e34.1c69fb81.70a57.0267@mx.google.com>
    Date: Tue, 15 Jun 2021 13:31:48 -0700 (PDT)
    X-Google-Original-Date: 15 Jun 2021 22:31:51 +0200
    From: Palestra PUMP <email@gmail.com>
    To: "Galati Rocco #1000" <email@gmail.com>
    Subject: La tua tabella di allenamento!
    MIME-Version: 1.0
    Content-Type: multipart/related; boundary=9371d7a2e3ae86a00aab4771e39d255d
    Content-Transfer-Encoding: 8bit
    X-Antivirus: Avast (VPS 210615-4, 15/06/2021), Outbound message
    X-Antivirus-Status: Clean
    
    --9371d7a2e3ae86a00aab4771e39d255d
    Content-Type: text/plain; charset=utf-8
    Content-Transfer-Encoding: 8bit
    
    Ciao Rocco,
    
    in allegato, trovi la tua tabella di allenamento.
    
    
    
    A presto, la tua palestra PUMP!
    
    
    
    
    
    
    
    
    
    
    In ottemperanza al D.lgs. 196/03 e al Regolamento UE 2016/679 in materia di protezione dei dati personali, le informazioni ivi contenute hanno natura strettamente personale e sono indirizzate esclusivamente al destinatario indicato. Qualora abbia ricevuto questa e-mail per errore, La invito cortesemente ad avvertire immediatamente il mittente e a distruggere il presente messaggio.
    
    -- 
    This email has been checked for viruses by Avast antivirus software.
    https://www.avast.com/antivirus
    
    --9371d7a2e3ae86a00aab4771e39d255d
    Content-Type: application/pdf; name="scheda-2021-06-15-22-31-43.pdf"
    Content-Transfer-Encoding: base64
    Content-disposition: attachment
    
    
    --9371d7a2e3ae86a00aab4771e39d255d--
    

    and this is the email sent by the mail client:

    Delivered-To: email@gmail.com
    Received: by 2002:a05:6838:e2d1:0:0:0:0 with SMTP id h17csp4110240nke;
            Tue, 15 Jun 2021 13:35:41 -0700 (PDT)
    X-Received: by 2002:a05:6402:885:: with SMTP id e5mr21738edy.248.1623789341141;
            Tue, 15 Jun 2021 13:35:41 -0700 (PDT)
    ARC-Seal: i=1; a=rsa-sha256; t=1623789341; cv=none;
            d=google.com; s=arc-20160816;
            b=WPDMLTDvj3pUZz8WTQHgDSA0aSHtNqt6HDwt9YSPaaVo52sQcXHqyaCoXA9k/OZ8M3
             HV4JLvW2idM4SJfQIBKpzeWFp5GmYt0fKUFRlBq0w+u2s4Q538NmOkCU50WKXhYOxG3c
             HE6+QbH63kZ/LdTbBd85YRWCMc3YAMa8qcwzDcO9QDmnbsH79LkgrOPzQ40l3NnMarGq
             kDYtp1zUYWADyW3CzwwjwhfHh3YfHH9TrmbA3iI4XZ2g110OstjpAV+CNFLuO7JKHGZy
             U1sjnoKk7LTG9Vw4Uf81Pk40neQ4Gt8JXLK4xCTlU7l6zF+NPzS9LP48rPJwG1Xm+Q8y
             /qyA==
    ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
            h=to:subject:message-id:date:from:mime-version:dkim-signature;
            bh=uqwG0qx8RbPz4mcP+T2OrqWbpBbaghEYmb/ZCpcY2vk=;
            b=BIpf2/QIJTZ4Awlg4lgo7M6KV/UcY43OrD0DDfCQ5WKpZ0VZphy3TKwm6nfgyF2jwz
             2uVob2AIUV5vLyY/zbKAgd6PIi70sjpk3C3zwHGeDcV8HHU6LxxitXDJpCWCU/ry2PmN
             YV5OcPfIImOZ2dkY+cvM9Ou2LWTUkEhW0cQMFJxpR1+XhZUvw8Nu+bYbLwZRk5Q23WFx
             L1nd285U3tNoN9JwERZV3pLS0C5Ba6yd2AEryEKZihyAa+IvTnFJmxxsgcBi9yeqzyV2
             vSxJqgXAUR2gYy4mk1iF5EQi1NL8zWDBOj9Dq6G2pkVHe5I+T/X5mb1w3ClpthkErhJd
             DkaA==
    ARC-Authentication-Results: i=1; mx.google.com;
           dkim=pass header.i=@gmail.com header.s=20161025 header.b=KoNBYb9O;
           spf=pass (google.com: domain of email@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=pumpasdmaglie@gmail.com;
           dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com
    Return-Path: <email@gmail.com>
    Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41])
            by mx.google.com with SMTPS id k5sor17978824edo.16.2021.06.15.13.35.41
            for <email@gmail.com>
            (Google Transport Security);
            Tue, 15 Jun 2021 13:35:41 -0700 (PDT)
    Received-SPF: pass (google.com: domain of email@gmail.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41;
    Authentication-Results: mx.google.com;
           dkim=pass header.i=@gmail.com header.s=20161025 header.b=KoNBYb9O;
           spf=pass (google.com: domain of email@gmail.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=email@gmail.com;
           dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com
    DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
            d=gmail.com; s=20161025;
            h=mime-version:from:date:message-id:subject:to;
            bh=uqwG0qx8RbPz4mcP+T2OrqWbpBbaghEYmb/ZCpcY2vk=;
            b=KoNBYb9OMgICs8aVqPKjMbNT6kIV9Y8ymAzFoTFNdBu7wj/8ZVm00QAgSL6cmxDyuv
             cLyMV525QYdWbnIQ89o2I6ZfjASZhlC2amuNX9KzFOuoZhi9ZnVcx2sTAxxr1D6w3aBi
             K3OHJSRjQeQOtl76wDkok+knBEEXXg16bM/wQbmO61LVtQHzl/XZf0ZD8oStFL/99Hhm
             kM/U6HE+RcyEsdwzH/eyhdLgFOL6fTUMe2sIFTPVz88JVODx6/xUQu14d+VDQTuvWvGI
             IIkIVVcghId48MPD5Vm8I9bITFIDBy6rJxAZwWd/HSciNmzOluXHwV2F9FcLP7DYaJqC
             ICRw==
    X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
            d=1e100.net; s=20161025;
            h=x-gm-message-state:mime-version:from:date:message-id:subject:to;
            bh=uqwG0qx8RbPz4mcP+T2OrqWbpBbaghEYmb/ZCpcY2vk=;
            b=bDt6NmLZQsLItATHtLI8AJY8P7ogosAcdeFuBQHFE8Ih6wgx7LiEFzmitfTk5RPo62
             9kdvvAsNopwOleR891NRxiHIbQRdgb2XW5vUC5adTGQ58wLSufCBjfM76HGBB/QdKYj2
             lVme8trRJQJGNSqHRGh6W/2gnB4EjLXfhCcF67G2tRaSGFHfPVfAWCjkw0hJVS6boKMI
             LUDqIKQOR3oKglJboq5Cyy3q5fqPoRxhZ1KNMRImf/e/nhNCjWvQf73TlN0RPGPazOok
             8PBq0fzPsuuVSXdqYL2ajoTQGbzooCfBt53eUquPQFEsFBYzYutw4JCduNPQk5xaVnNJ
             zYPw==
    X-Gm-Message-State: AOAM532ThjqQDukcTP//RzC6elrP/3mb9JMq5ZO1ed8ZxRapAb5rJpEW +6qdTP1A0zPMS5yMNbBG8a+PmCp8HTJ27zWTR97mlMvh4le/Jw==
    X-Google-Smtp-Source: ABdhPJy13k4Xks3LltxmtgA/rFwjgGZVjEZxPu5X13JcMAxOpeYX7GMioaiRuxwobLeXrt0e/IPHZW4SSPccf6VNf9E=
    X-Received: by 2002:a05:6402:1a25:: with SMTP id be5mr1657285edb.369.1623789340788; Tue, 15 Jun 2021 13:35:40 -0700 (PDT)
    MIME-Version: 1.0
    From: Palestra PUMP <email@gmail.com>
    Date: Tue, 15 Jun 2021 22:35:32 +0200
    Message-ID: <CAPs+xw-RQ34QHM3wH6JcNmWLUX67sbgT3VtyjCEsNShJVA9KuQ@mail.gmail.com>
    Subject: La tua tabella di allenamento!
    To: Rocco Galati <email@gmail.com>
    Content-Type: multipart/mixed; boundary="000000000000d931fb05c4d3ead5"
    
    --000000000000d931fb05c4d3ead5
    Content-Type: multipart/alternative; boundary="000000000000d931fa05c4d3ead3"
    
    --000000000000d931fa05c4d3ead3
    Content-Type: text/plain; charset="UTF-8"
    
    Ciao MARCO,
    
    in allegato, trovi la tua tabella di allenamento.
    
    
    
    A presto, la tua palestra PUMP!
    
    
    
    
    
    
    
    
    
    
    In ottemperanza al D.lgs. 196/03 e al Regolamento UE 2016/679 in materia di
    protezione dei dati personali, le informazioni ivi contenute hanno natura
    strettamente personale e sono indirizzate esclusivamente al destinatario
    indicato. Qualora abbia ricevuto questa e-mail per errore, La invito
    cortesemente ad avvertire immediatamente il mittente e a distruggere il
    presente messaggio.
    
    <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
    Virus-free.
    www.avast.com
    <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
    <#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>
    
    --000000000000d931fa05c4d3ead3
    Content-Type: text/html; charset="UTF-8"
    Content-Transfer-Encoding: quoted-printable
    
    <div dir=3D"ltr">Ciao MARCO,<br><br>in allegato, trovi la tua tabella di al=
    lenamento.<br><br><br><br><br><br>A presto, la t=
    ua palestra PUMP!<br><br><br><br><br><br><br><br><br><br><br>In ottemperanz=
    a al D.lgs. 196/03 e al Regolamento UE 2016/679 in materia di protezione de=
    i dati personali, le informazioni ivi contenute hanno natura strettamente p=
    ersonale e sono indirizzate esclusivamente al destinatario indicato. Qualor=
    a abbia ricevuto questa e-mail per errore, La invito cortesemente ad avvert=
    ire immediatamente il mittente e a distruggere il presente messaggio.<br></=
    div><div id=3D"DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2"><br>
    <table style=3D"border-top:1px solid #d3d4de">
    =09<tr>
            <td style=3D"width:55px;padding-top:13px"><a href=3D"https://www.av=
    ast.com/sig-email?utm_medium=3Demail&amp;utm_source=3Dlink&amp;utm_campaign=
    =3Dsig-email&amp;utm_content=3Dwebmail" target=3D"_blank"><img src=3D"https=
    ://ipmcdn.avast.com/images/icons/icon-envelope-tick-round-orange-animated-n=
    o-repeat-v1.gif" alt=3D"" width=3D"46" height=3D"29" style=3D"width: 46px; =
    height: 29px;"></a></td>
    =09=09<td style=3D"width:470px;padding-top:12px;color:#41424e;font-size:13p=
    x;font-family:Arial,Helvetica,sans-serif;line-height:18px">Virus-free. <a h=
    ref=3D"https://www.avast.com/sig-email?utm_medium=3Demail&amp;utm_source=3D=
    link&amp;utm_campaign=3Dsig-email&amp;utm_content=3Dwebmail" target=3D"_bla=
    nk" style=3D"color:#4453ea">www.avast.com</a>
    =09=09</td>
    =09</tr>
    </table><a href=3D"#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2" width=3D"1" heigh=
    t=3D"1"></a></div>
    
    --000000000000d931fa05c4d3ead3--
    --000000000000d931fb05c4d3ead5
    Content-Type: application/pdf; name="scheda-2021-06-15-22-31-43.pdf"
    Content-Disposition: attachment; filename="scheda-2021-06-15-22-31-43.pdf"
    Content-Transfer-Encoding: base64
    Content-ID: <f_kpyi8e5m0>
    X-Attachment-Id: f_kpyi8e5m0
    
    
    --000000000000d931fb05c4d3ead5--
    


  • @Marcus-Barnet said in Convert HTML to PDF:
    Content-Type: multipart/related; vs Content-Type: multipart/mixed;

    There are also differences in Return-Path header but I assume this is due to not full obfuscation on your part?

    I'll need to verify with google docs if this makes any difference (Content-Type), I really don't know from the top of my head.


Log in to reply