Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QImage+QPainter+QPdfWriter + newPage() = working code
QtWS25 Last Chance

QImage+QPainter+QPdfWriter + newPage() = working code

Scheduled Pinned Locked Moved Unsolved General and Desktop
20 Posts 4 Posters 3.3k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • R RazerMind

    Hi!

    I ask someone - who already has on his hands a fully working (production) code, which behaves like that:
    We have a list of QImages - each of then must presented as A4 PDF page.
    So we must somehow to combine them into one PDF. new image = new page.

    Can you share it here?

    According to library description this task should be possible for the trio "QImage+QPainter+QPdfWriter".
    Main magic probably is done by QPdfWriter - because it has newPage() function.

    W Offline
    W Offline
    wrosecrans
    wrote on last edited by
    #3

    @RazerMind

    I have some old Python code that uses QPainter to make multi page PDF's. This is basically what it does. Should be straightforward to translate into C++

      # Make PDF writer first
        w = gui.QPdfWriter(fn)
        w.setTitle("My Cool PDF")
        w.setResolution(90)
        w.setPageSize(w.Letter)
    
      # Make QPainter on it **after** setting stuff like resolution and paper size
        p = gui.QPainter(w)
      # there's always a first page to start with, so draw that before calling newPage()  
        draw_first_page(p)  
        for page in pages:
            w.newPage()
            draw_page(p, page)
            # Make sure you don't accidentally add a blank newPage() after your last actual page.
    

    Then if your draw_page function, it sounds like you just want QPainter::drawImage so that should be simple to implement, and not particularly special for being on a PDF surface vs painting to a widget or anything else.

    1 Reply Last reply
    0
    • R Offline
      R Offline
      RazerMind
      wrote on last edited by
      #4

      Unfortunately, but it is precisely the presence of such answers in almost all - more or less significant forums, chats/ etc... after using it in my own code that shows that the advice is given from the off.docs, but they were not applied by themselves on practice. And of course they are fragmented filled. That's why I wrote about the big request to provide the entire related code - which works in production! And of course in C++. Yes. I have seen a bunch of python code that works. But as soon as you start translating it into C++, some nuances emerge that are encoded in the bowels of the Python engine, or in the bowels of the related py.system libraries, and which cannot be brought into C++ 1-in-1. And in the end nothing works...

      Pl45m4P W 2 Replies Last reply
      0
      • R RazerMind

        Unfortunately, but it is precisely the presence of such answers in almost all - more or less significant forums, chats/ etc... after using it in my own code that shows that the advice is given from the off.docs, but they were not applied by themselves on practice. And of course they are fragmented filled. That's why I wrote about the big request to provide the entire related code - which works in production! And of course in C++. Yes. I have seen a bunch of python code that works. But as soon as you start translating it into C++, some nuances emerge that are encoded in the bowels of the Python engine, or in the bowels of the related py.system libraries, and which cannot be brought into C++ 1-in-1. And in the end nothing works...

        Pl45m4P Offline
        Pl45m4P Offline
        Pl45m4
        wrote on last edited by
        #5

        @RazerMind

        The Qt commands are the same... You just have to translate the syntax.
        Have a look what I wrote above. If you know C++, it is easy doable


        If debugging is the process of removing software bugs, then programming must be the process of putting them in.

        ~E. W. Dijkstra

        R 1 Reply Last reply
        0
        • Pl45m4P Pl45m4

          @RazerMind

          The Qt commands are the same... You just have to translate the syntax.
          Have a look what I wrote above. If you know C++, it is easy doable

          R Offline
          R Offline
          RazerMind
          wrote on last edited by RazerMind
          #6

          @Pl45m4 said in QImage+QPainter+QPdfWriter + newPage() = working code:

          it is easy doable

              QImage image = QImage::fromData(imageData);// imageData - from class func's param
              if (image.isNull())
              {
                errorMsg = QStringLiteral("Cannot load image");
                return false;
              }
          
              QPainter painter(m_writer); //from ctor: m_writer = new QPdfWriter(filePtr); // filePtr = new QFile(fileName);
              if (!m_writer->newPage())
              {
                errorMsg = QStringLiteral("Cannot add new page at PDF file for further work.");
                return false;
              }
              painter.drawImage(QPointF(0, 0), image);
          

          Also for m_writer was set 3 options:
          m_writer->setPageSize(QPageSize(QPageSize::A4));
          m_writer->setResolution(72);
          m_writer->setPageOrientation(QPageLayout::Orientation::Landscape);

          after that:
          filePtr->close();
          delete m_writer;

          for the first sight - pretty good? But it's not working...
          I can save 'image' as PNG file (not JPG coz input image goes with alpha-channel)
          So I can prof myself that image is fine. BUT PDF file is get corrupted/not filled with image/bla-bla .. another errors...
          So that's why I want see from somewhere - a real, production - full C++ code but which definitely works in same manner:
          one picture comes from somewhere and is added as a whole new page in the PDF file at the end of the document.
          The picture covers the entire area of ​​the page. A4 size. Sheet orientation - landscape.

          Christian EhrlicherC 1 Reply Last reply
          0
          • R RazerMind

            @Pl45m4 said in QImage+QPainter+QPdfWriter + newPage() = working code:

            it is easy doable

                QImage image = QImage::fromData(imageData);// imageData - from class func's param
                if (image.isNull())
                {
                  errorMsg = QStringLiteral("Cannot load image");
                  return false;
                }
            
                QPainter painter(m_writer); //from ctor: m_writer = new QPdfWriter(filePtr); // filePtr = new QFile(fileName);
                if (!m_writer->newPage())
                {
                  errorMsg = QStringLiteral("Cannot add new page at PDF file for further work.");
                  return false;
                }
                painter.drawImage(QPointF(0, 0), image);
            

            Also for m_writer was set 3 options:
            m_writer->setPageSize(QPageSize(QPageSize::A4));
            m_writer->setResolution(72);
            m_writer->setPageOrientation(QPageLayout::Orientation::Landscape);

            after that:
            filePtr->close();
            delete m_writer;

            for the first sight - pretty good? But it's not working...
            I can save 'image' as PNG file (not JPG coz input image goes with alpha-channel)
            So I can prof myself that image is fine. BUT PDF file is get corrupted/not filled with image/bla-bla .. another errors...
            So that's why I want see from somewhere - a real, production - full C++ code but which definitely works in same manner:
            one picture comes from somewhere and is added as a whole new page in the PDF file at the end of the document.
            The picture covers the entire area of ​​the page. A4 size. Sheet orientation - landscape.

            Christian EhrlicherC Offline
            Christian EhrlicherC Offline
            Christian Ehrlicher
            Lifetime Qt Champion
            wrote on last edited by
            #7

            @RazerMind said in QImage+QPainter+QPdfWriter + newPage() = working code:

            QByteArray image = imageData; // from class func's param
            

            ...

            painter.drawImage(QPointF(0, 0), image);
            

            This does not even compile.

            Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
            Visit the Qt Academy at https://academy.qt.io/catalog

            R 1 Reply Last reply
            0
            • R RazerMind

              Unfortunately, but it is precisely the presence of such answers in almost all - more or less significant forums, chats/ etc... after using it in my own code that shows that the advice is given from the off.docs, but they were not applied by themselves on practice. And of course they are fragmented filled. That's why I wrote about the big request to provide the entire related code - which works in production! And of course in C++. Yes. I have seen a bunch of python code that works. But as soon as you start translating it into C++, some nuances emerge that are encoded in the bowels of the Python engine, or in the bowels of the related py.system libraries, and which cannot be brought into C++ 1-in-1. And in the end nothing works...

              W Offline
              W Offline
              wrosecrans
              wrote on last edited by
              #8

              @RazerMind said in QImage+QPainter+QPdfWriter + newPage() = working code:

              Unfortunately, but it is precisely the presence of such answers in almost all - more or less significant forums, chats/ etc... after using it in my own code that shows that the advice is given from the off.docs, but they were not applied by themselves on practice.

              To be clear, I copied and pasted from my actual working code to make that example code for you. It works in practice. I commented to specific places where order of operations had tripped me up when I originally wrote it.

              If you are expecting somebody to literally write exactly the software you want, that's not a reasonable expectation from a discussion forum where random people are taking time out of their day to help you for free.

              BUT PDF file is get corrupted/not filled with image/bla-bla .. another errors...

              If you want help with specific problems, you'll need to do the leg work to break down the specific problems you are having and ask more specific questions. From this, I couldn't begin to guess what to suggest or help you with if I wanted to spend more time helping you.

              R 1 Reply Last reply
              0
              • Christian EhrlicherC Christian Ehrlicher

                @RazerMind said in QImage+QPainter+QPdfWriter + newPage() = working code:

                QByteArray image = imageData; // from class func's param
                

                ...

                painter.drawImage(QPointF(0, 0), image);
                

                This does not even compile.

                R Offline
                R Offline
                RazerMind
                wrote on last edited by RazerMind
                #9

                @Christian-Ehrlicher said in QImage+QPainter+QPdfWriter + newPage() = working code:

                This does not even compile.

                sorry - fixed. I did not copy as single piece all code. coz it's slightly scattered throughout the class functions.

                1 Reply Last reply
                0
                • W wrosecrans

                  @RazerMind said in QImage+QPainter+QPdfWriter + newPage() = working code:

                  Unfortunately, but it is precisely the presence of such answers in almost all - more or less significant forums, chats/ etc... after using it in my own code that shows that the advice is given from the off.docs, but they were not applied by themselves on practice.

                  To be clear, I copied and pasted from my actual working code to make that example code for you. It works in practice. I commented to specific places where order of operations had tripped me up when I originally wrote it.

                  If you are expecting somebody to literally write exactly the software you want, that's not a reasonable expectation from a discussion forum where random people are taking time out of their day to help you for free.

                  BUT PDF file is get corrupted/not filled with image/bla-bla .. another errors...

                  If you want help with specific problems, you'll need to do the leg work to break down the specific problems you are having and ask more specific questions. From this, I couldn't begin to guess what to suggest or help you with if I wanted to spend more time helping you.

                  R Offline
                  R Offline
                  RazerMind
                  wrote on last edited by
                  #10

                  @wrosecrans said in QImage+QPainter+QPdfWriter + newPage() = working code:

                  If you want help with specific problems

                  I don't quite understand what specific problem I could single out to get help on solving it.
                  There is only one problem - there is no final PDF file with a new page and a new image on the last page.
                  And so - everything is compiled, linked, launched, works ... BUT there is no desired result.
                  According to the documentation and a mini-example of working python code, it is clear that for C ++ code, too, should not be required to be complex, long, etc. BUT the practice of running this mini-code shows that there is some kind of a bunch of problems that SOMETHING needs to be solved. For that garbage in the PDF file, which is nevertheless generated, cannot be the desired result. Those it turns out that the C++ code needs to add some kind of checks, corrections, clarifications or PDF properties, or images. Maybe additional scaling? Changing proportions? As you can see, I can't even figure out what's wrong here - because the simplest code from the documentation simply turned out to be unable to do what was written about it. Although this was not expected.

                  Pl45m4P W 2 Replies Last reply
                  0
                  • R RazerMind

                    @wrosecrans said in QImage+QPainter+QPdfWriter + newPage() = working code:

                    If you want help with specific problems

                    I don't quite understand what specific problem I could single out to get help on solving it.
                    There is only one problem - there is no final PDF file with a new page and a new image on the last page.
                    And so - everything is compiled, linked, launched, works ... BUT there is no desired result.
                    According to the documentation and a mini-example of working python code, it is clear that for C ++ code, too, should not be required to be complex, long, etc. BUT the practice of running this mini-code shows that there is some kind of a bunch of problems that SOMETHING needs to be solved. For that garbage in the PDF file, which is nevertheless generated, cannot be the desired result. Those it turns out that the C++ code needs to add some kind of checks, corrections, clarifications or PDF properties, or images. Maybe additional scaling? Changing proportions? As you can see, I can't even figure out what's wrong here - because the simplest code from the documentation simply turned out to be unable to do what was written about it. Although this was not expected.

                    Pl45m4P Offline
                    Pl45m4P Offline
                    Pl45m4
                    wrote on last edited by
                    #11

                    @RazerMind said in QImage+QPainter+QPdfWriter + newPage() = working code:

                    because the simplest code from the documentation simply turned out to be unable to do what was written about it.

                    Doubt.

                    According to the documentation and a mini-example of working python code, it is clear that for C ++ code, too, should not be required to be complex, long, etc. BUT the practice of running this mini-code shows that there is some kind of a bunch of problems that SOMETHING needs to be solved. For that garbage in the PDF file, which is nevertheless generated

                    I also doubt that you properly convert Qt code written in Python to C++ and it suddenly produces garbage, while the Python way seem to work.
                    Debug your code, set breakpoints, check expected results and check WHY it outputs garbage in your case.
                    Check if you file is valid, if your image data is valid and everything was correctly initialized.
                    You are not the first one, who uses this Qt C++ module/class and tries to write content to a new PDF page.
                    If you still need help, you should post what you've done exactly and not snippets grabbed from here and there out of your classes.


                    If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                    ~E. W. Dijkstra

                    R 1 Reply Last reply
                    0
                    • Pl45m4P Pl45m4

                      @RazerMind said in QImage+QPainter+QPdfWriter + newPage() = working code:

                      because the simplest code from the documentation simply turned out to be unable to do what was written about it.

                      Doubt.

                      According to the documentation and a mini-example of working python code, it is clear that for C ++ code, too, should not be required to be complex, long, etc. BUT the practice of running this mini-code shows that there is some kind of a bunch of problems that SOMETHING needs to be solved. For that garbage in the PDF file, which is nevertheless generated

                      I also doubt that you properly convert Qt code written in Python to C++ and it suddenly produces garbage, while the Python way seem to work.
                      Debug your code, set breakpoints, check expected results and check WHY it outputs garbage in your case.
                      Check if you file is valid, if your image data is valid and everything was correctly initialized.
                      You are not the first one, who uses this Qt C++ module/class and tries to write content to a new PDF page.
                      If you still need help, you should post what you've done exactly and not snippets grabbed from here and there out of your classes.

                      R Offline
                      R Offline
                      RazerMind
                      wrote on last edited by RazerMind
                      #12

                      @Pl45m4
                      Ok, feel free to reuse next code for your own tests:

                      class PdfDocument
                      {
                        public:
                            PdfDocument(const QString& fileName);
                            virtual ~PdfDocument();
                      
                            bool isReady() const { return m_file != nullptr && m_writer != nullptr; }
                            const QString& get_errorMsg() const { return errorMsg; }
                            bool addImageToPdf(const QByteArray& imageData);
                        private:
                            QFile* createFile(const QString& fileName, QString& error)
                            QPdfWriter* createPdfWriter() const;
                      
                        private:
                            QString outputFileName;
                            QFile* m_file;
                            QPdfWriter* m_writer;
                            QString errorMsg;
                      };
                      
                        PdfDocument::PdfDocument(const QString& fileName) : outputFileName(fileName), 
                          m_file(nullptr), m_writer(nullptr), errorMsg("impossible error")
                        {
                          m_file = createFile(outputFileName, errorMsg);
                          if (m_file) m_writer = createPdfWriter();
                        }
                      
                        PdfDocument::~PdfDocument()
                        {
                          m_file->close();
                          delete m_writer;
                          delete m_file;
                        }
                      
                        QFile* PdfDocument::createFile(const QString& fileName, QString& error)
                        {
                          QFile* file = new QFile(fileName);
                          if (file->exists())
                          {
                            if (!file->open(QIODevice::Append))
                            {
                              error = QStringLiteral("Cannot open file for appending: %0").arg(file->errorString());
                              delete file;
                              return nullptr;
                            }
                          }
                          else
                          {
                            if (!file->open(QIODevice::WriteOnly))
                            {
                              error = QStringLiteral("Cannot create file: %0").arg(file->errorString());
                              delete file;
                              return nullptr;
                            }
                          }
                          return file;
                        }
                      
                        QPdfWriter* PdfDocument::createPdfWriter() const
                        {
                          QPdfWriter* writer = new QPdfWriter(m_file);
                          writer->setPageSize(QPageSize(QPageSize::A4));
                          writer->setResolution(72);
                          writer->setPageOrientation(QPageLayout::Orientation::Landscape);
                          return writer;
                        }
                      
                        bool PdfDocument::addImageToPdf(const QByteArray& imageData)
                        {
                          if (!m_writer) return false; // impossible case, but...
                      
                          QImage image = QImage::fromData(imageData);
                          if (image.isNull())
                          {
                            errorMsg = QStringLiteral("Cannot load image from data.");
                            return false;
                          }
                      
                          QPainter painter(m_writer);
                          if (!m_writer->newPage())
                          {
                            errorMsg = QStringLiteral("Cannot add new page at PDF file for further work.");
                            return false;
                          }
                          painter.drawImage(QPointF(0, 0), image);
                      
                          return true;
                        }
                      
                      
                      // somewhere in the code:
                      PdfDocument pdf("full_PDF_pathName_onDisk");
                      if (!pdf.isReady())
                      {
                        //produce general error message, use also and pdf.get_errorMsg()
                        //about this bad case and return false;
                      }else{
                        QByteArray singlePage = //get it from response of 3rd component = webclient;
                        return pdf.addImageToPdf(singlePage);
                      }
                      
                      Pl45m4P 1 Reply Last reply
                      0
                      • R RazerMind

                        @Pl45m4
                        Ok, feel free to reuse next code for your own tests:

                        class PdfDocument
                        {
                          public:
                              PdfDocument(const QString& fileName);
                              virtual ~PdfDocument();
                        
                              bool isReady() const { return m_file != nullptr && m_writer != nullptr; }
                              const QString& get_errorMsg() const { return errorMsg; }
                              bool addImageToPdf(const QByteArray& imageData);
                          private:
                              QFile* createFile(const QString& fileName, QString& error)
                              QPdfWriter* createPdfWriter() const;
                        
                          private:
                              QString outputFileName;
                              QFile* m_file;
                              QPdfWriter* m_writer;
                              QString errorMsg;
                        };
                        
                          PdfDocument::PdfDocument(const QString& fileName) : outputFileName(fileName), 
                            m_file(nullptr), m_writer(nullptr), errorMsg("impossible error")
                          {
                            m_file = createFile(outputFileName, errorMsg);
                            if (m_file) m_writer = createPdfWriter();
                          }
                        
                          PdfDocument::~PdfDocument()
                          {
                            m_file->close();
                            delete m_writer;
                            delete m_file;
                          }
                        
                          QFile* PdfDocument::createFile(const QString& fileName, QString& error)
                          {
                            QFile* file = new QFile(fileName);
                            if (file->exists())
                            {
                              if (!file->open(QIODevice::Append))
                              {
                                error = QStringLiteral("Cannot open file for appending: %0").arg(file->errorString());
                                delete file;
                                return nullptr;
                              }
                            }
                            else
                            {
                              if (!file->open(QIODevice::WriteOnly))
                              {
                                error = QStringLiteral("Cannot create file: %0").arg(file->errorString());
                                delete file;
                                return nullptr;
                              }
                            }
                            return file;
                          }
                        
                          QPdfWriter* PdfDocument::createPdfWriter() const
                          {
                            QPdfWriter* writer = new QPdfWriter(m_file);
                            writer->setPageSize(QPageSize(QPageSize::A4));
                            writer->setResolution(72);
                            writer->setPageOrientation(QPageLayout::Orientation::Landscape);
                            return writer;
                          }
                        
                          bool PdfDocument::addImageToPdf(const QByteArray& imageData)
                          {
                            if (!m_writer) return false; // impossible case, but...
                        
                            QImage image = QImage::fromData(imageData);
                            if (image.isNull())
                            {
                              errorMsg = QStringLiteral("Cannot load image from data.");
                              return false;
                            }
                        
                            QPainter painter(m_writer);
                            if (!m_writer->newPage())
                            {
                              errorMsg = QStringLiteral("Cannot add new page at PDF file for further work.");
                              return false;
                            }
                            painter.drawImage(QPointF(0, 0), image);
                        
                            return true;
                          }
                        
                        
                        // somewhere in the code:
                        PdfDocument pdf("full_PDF_pathName_onDisk");
                        if (!pdf.isReady())
                        {
                          //produce general error message, use also and pdf.get_errorMsg()
                          //about this bad case and return false;
                        }else{
                          QByteArray singlePage = //get it from response of 3rd component = webclient;
                          return pdf.addImageToPdf(singlePage);
                        }
                        
                        Pl45m4P Offline
                        Pl45m4P Offline
                        Pl45m4
                        wrote on last edited by
                        #13

                        @RazerMind said in QImage+QPainter+QPdfWriter + newPage() = working code:

                        QByteArray singlePage = //get it from response of 3rd component = webclient;
                        return pdf.addImageToPdf(singlePage);

                        Without testing (I will later), are you sure that the data (i.e. either your web response or your bytearray) you receive is 100% valid and you are not getting your "garbage" already there?

                        Something like this in addImageToPdf

                        QImage image = QImage::fromData(imageData);
                        if (image.isNull())
                        {
                            errorMsg = QStringLiteral("Cannot load image from data.");
                            return false;
                        }
                        
                        QLabel lbl;
                        lbl.setPixmap(QPixmap::fromImage(image));
                        lbl.show();
                        
                        // QPainter stuff
                        // ...
                        
                        

                        If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                        ~E. W. Dijkstra

                        R 1 Reply Last reply
                        0
                        • Pl45m4P Pl45m4

                          @RazerMind said in QImage+QPainter+QPdfWriter + newPage() = working code:

                          QByteArray singlePage = //get it from response of 3rd component = webclient;
                          return pdf.addImageToPdf(singlePage);

                          Without testing (I will later), are you sure that the data (i.e. either your web response or your bytearray) you receive is 100% valid and you are not getting your "garbage" already there?

                          Something like this in addImageToPdf

                          QImage image = QImage::fromData(imageData);
                          if (image.isNull())
                          {
                              errorMsg = QStringLiteral("Cannot load image from data.");
                              return false;
                          }
                          
                          QLabel lbl;
                          lbl.setPixmap(QPixmap::fromImage(image));
                          lbl.show();
                          
                          // QPainter stuff
                          // ...
                          
                          
                          R Offline
                          R Offline
                          RazerMind
                          wrote on last edited by
                          #14

                          @Pl45m4 said in QImage+QPainter+QPdfWriter + newPage() = working code:

                          are you sure that the data (i.e. either your web response or your bytearray) you receive is 100% valid

                          100000% sure.

                          Pl45m4P 1 Reply Last reply
                          0
                          • R RazerMind

                            @wrosecrans said in QImage+QPainter+QPdfWriter + newPage() = working code:

                            If you want help with specific problems

                            I don't quite understand what specific problem I could single out to get help on solving it.
                            There is only one problem - there is no final PDF file with a new page and a new image on the last page.
                            And so - everything is compiled, linked, launched, works ... BUT there is no desired result.
                            According to the documentation and a mini-example of working python code, it is clear that for C ++ code, too, should not be required to be complex, long, etc. BUT the practice of running this mini-code shows that there is some kind of a bunch of problems that SOMETHING needs to be solved. For that garbage in the PDF file, which is nevertheless generated, cannot be the desired result. Those it turns out that the C++ code needs to add some kind of checks, corrections, clarifications or PDF properties, or images. Maybe additional scaling? Changing proportions? As you can see, I can't even figure out what's wrong here - because the simplest code from the documentation simply turned out to be unable to do what was written about it. Although this was not expected.

                            W Offline
                            W Offline
                            wrosecrans
                            wrote on last edited by
                            #15

                            @RazerMind said in QImage+QPainter+QPdfWriter + newPage() = working code:

                            I don't quite understand what specific problem I could single out to get help on solving it.
                            There is only one problem - there is no final PDF file with a new page and a new image on the last page.

                            Part of programming is learning to break problems down into smaller problems. The QPainter API's work on any surface, like a QIMage that you can save to a PNG, or a QWidget. So, are you drawing what you want to draw correctly? If you can replicate the issue on something other than a PDF, then the problem has nothing to do with a PDF.

                            Does drawing on everything but a PDF work? Then the problem is specific to making a PDF.

                            Break the problem down into smaller pieces like that. Are you saying there is no PDF file at all? In your sentence you lump "final PDF file with a new page and a new image on the last page" into a single concept like it has irreducible complexity, so I can't even tell if you made an empty PDF or a PDF with multiple pages but the wrong content, or no file, etc.

                            R 1 Reply Last reply
                            1
                            • W wrosecrans

                              @RazerMind said in QImage+QPainter+QPdfWriter + newPage() = working code:

                              I don't quite understand what specific problem I could single out to get help on solving it.
                              There is only one problem - there is no final PDF file with a new page and a new image on the last page.

                              Part of programming is learning to break problems down into smaller problems. The QPainter API's work on any surface, like a QIMage that you can save to a PNG, or a QWidget. So, are you drawing what you want to draw correctly? If you can replicate the issue on something other than a PDF, then the problem has nothing to do with a PDF.

                              Does drawing on everything but a PDF work? Then the problem is specific to making a PDF.

                              Break the problem down into smaller pieces like that. Are you saying there is no PDF file at all? In your sentence you lump "final PDF file with a new page and a new image on the last page" into a single concept like it has irreducible complexity, so I can't even tell if you made an empty PDF or a PDF with multiple pages but the wrong content, or no file, etc.

                              R Offline
                              R Offline
                              RazerMind
                              wrote on last edited by
                              #16

                              @wrosecrans
                              ok for the very beginning - you can try to reuse my code from above. What you will get?
                              Of course here will be small problem - how to obtain bytearray of input image in your case....
                              ....................

                              Aha! one idea I have: the best variant in this ase should be: open any small pdf you have with
                              help of class QPdfDocument and render it into QImage class))) {https://doc.qt.io/qt-5/qpdfdocument.html#render}
                              So We can kill two birds with one stone this way.

                              1. We will be sure that we get a valid image. It will not depend on what and where the photo/image you can find && download. With what resolution? What size? Who knows. And so everything is already predetermined.
                              2. Because If you take some ready-made PDF file (with 1/2/3 pages max!), then trying to add an Image to the new one being created, you will, as it were, have to completely repeat your original PDF file! Of course, I'm not talking about bit similarity, but about the same content when viewing. But the essence does not change from this. You should have two PDF files on your disk after the code runs. One initial, let's say with 3 original pages, and one final, created as a result of running the C++ code, which was supposed to take the first page from the original PDF file and repeat it. Accordingly, when you open these two files in AdobeAcrobat for ex., the first two pages must absolutely match, because one page will be just the source, and the second one will be just a literal copy, because it is made on the basis of the complete image from this first page.
                              Pl45m4P 1 Reply Last reply
                              1
                              • R RazerMind

                                @Pl45m4 said in QImage+QPainter+QPdfWriter + newPage() = working code:

                                are you sure that the data (i.e. either your web response or your bytearray) you receive is 100% valid

                                100000% sure.

                                Pl45m4P Offline
                                Pl45m4P Offline
                                Pl45m4
                                wrote on last edited by
                                #17

                                @RazerMind said in QImage+QPainter+QPdfWriter + newPage() = working code:

                                100000% sure.

                                So how does the image look? If the QLabel is shown correctly, we can be sure that it's a PDFWriter issue


                                If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                                ~E. W. Dijkstra

                                1 Reply Last reply
                                0
                                • R RazerMind

                                  @wrosecrans
                                  ok for the very beginning - you can try to reuse my code from above. What you will get?
                                  Of course here will be small problem - how to obtain bytearray of input image in your case....
                                  ....................

                                  Aha! one idea I have: the best variant in this ase should be: open any small pdf you have with
                                  help of class QPdfDocument and render it into QImage class))) {https://doc.qt.io/qt-5/qpdfdocument.html#render}
                                  So We can kill two birds with one stone this way.

                                  1. We will be sure that we get a valid image. It will not depend on what and where the photo/image you can find && download. With what resolution? What size? Who knows. And so everything is already predetermined.
                                  2. Because If you take some ready-made PDF file (with 1/2/3 pages max!), then trying to add an Image to the new one being created, you will, as it were, have to completely repeat your original PDF file! Of course, I'm not talking about bit similarity, but about the same content when viewing. But the essence does not change from this. You should have two PDF files on your disk after the code runs. One initial, let's say with 3 original pages, and one final, created as a result of running the C++ code, which was supposed to take the first page from the original PDF file and repeat it. Accordingly, when you open these two files in AdobeAcrobat for ex., the first two pages must absolutely match, because one page will be just the source, and the second one will be just a literal copy, because it is made on the basis of the complete image from this first page.
                                  Pl45m4P Offline
                                  Pl45m4P Offline
                                  Pl45m4
                                  wrote on last edited by Pl45m4
                                  #18

                                  @RazerMind

                                  I made some tests and played around a bit.

                                  My conclusion:

                                  This works flawless. Generates a PDF.pdf with three pages, on each page the image, starting at (0,0).

                                  QImage img("Path/to/Image.png");
                                  QPdfWriter* writer = new QPdfWriter("Path/to/Pdf.pdf");
                                  writer->setPageSize(QPageSize(QPageSize::A4));
                                  writer->setResolution(72);
                                  writer->setPageOrientation(QPageLayout::Orientation::Landscape);
                                  QPainter painter(writer);
                                  
                                  for (int i=0; i<3; ++i) 
                                  {
                                        painter.drawImage(QPoint(0, 0), img);
                                         writer->newPage();
                                  }
                                  

                                  Then I used your class / code, using the same image.
                                  It works, BUT only as long as the PDF file doesn't exists.

                                  Maybe somebody can correct me, if I'm wrong, but QPdfWriter is a generator for PDF files. For invoices, small documents and other stuff. AFAIK it's not designed to continue to write to already existing PDF files or append any content "out of the box" (which you tried to do).
                                  The QPainter on QPdfWriter didn't care much about QFile(QIODevice::Append)), since it resets and starts from the beginning of the file.

                                  Also, QPdfWriter::newPage() creates a new page and then the painter jumps there. Since append doesn't work, it starts at page 1, creates a new one and paints the image on page 2, leaving the first (starting) page blank.
                                  Doing the same on the same file again, doesn't append either. It creates the same file again (blank first page, then image on second).

                                  There's nothing wrong with your code and probably not with your QByteArray, it's unfortunately not how it works with QPdfWriter / QPainter :(
                                  I guess, you have to find another way or use external pdf libs.


                                  If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                                  ~E. W. Dijkstra

                                  R 1 Reply Last reply
                                  0
                                  • Pl45m4P Pl45m4

                                    @RazerMind

                                    I made some tests and played around a bit.

                                    My conclusion:

                                    This works flawless. Generates a PDF.pdf with three pages, on each page the image, starting at (0,0).

                                    QImage img("Path/to/Image.png");
                                    QPdfWriter* writer = new QPdfWriter("Path/to/Pdf.pdf");
                                    writer->setPageSize(QPageSize(QPageSize::A4));
                                    writer->setResolution(72);
                                    writer->setPageOrientation(QPageLayout::Orientation::Landscape);
                                    QPainter painter(writer);
                                    
                                    for (int i=0; i<3; ++i) 
                                    {
                                          painter.drawImage(QPoint(0, 0), img);
                                           writer->newPage();
                                    }
                                    

                                    Then I used your class / code, using the same image.
                                    It works, BUT only as long as the PDF file doesn't exists.

                                    Maybe somebody can correct me, if I'm wrong, but QPdfWriter is a generator for PDF files. For invoices, small documents and other stuff. AFAIK it's not designed to continue to write to already existing PDF files or append any content "out of the box" (which you tried to do).
                                    The QPainter on QPdfWriter didn't care much about QFile(QIODevice::Append)), since it resets and starts from the beginning of the file.

                                    Also, QPdfWriter::newPage() creates a new page and then the painter jumps there. Since append doesn't work, it starts at page 1, creates a new one and paints the image on page 2, leaving the first (starting) page blank.
                                    Doing the same on the same file again, doesn't append either. It creates the same file again (blank first page, then image on second).

                                    There's nothing wrong with your code and probably not with your QByteArray, it's unfortunately not how it works with QPdfWriter / QPainter :(
                                    I guess, you have to find another way or use external pdf libs.

                                    R Offline
                                    R Offline
                                    RazerMind
                                    wrote on last edited by
                                    #19

                                    @Pl45m4 said in QImage+QPainter+QPdfWriter + newPage() = working code:

                                    AFAIK it's not designed to continue to write to already existing PDF files or append any content "out of the box" (which you tried to do).

                                    Yep, looks like you are right. And I should stop using this flawless library at all((((((
                                    But huge thx for all this "testing" stuff...

                                    Pl45m4P 1 Reply Last reply
                                    0
                                    • R RazerMind

                                      @Pl45m4 said in QImage+QPainter+QPdfWriter + newPage() = working code:

                                      AFAIK it's not designed to continue to write to already existing PDF files or append any content "out of the box" (which you tried to do).

                                      Yep, looks like you are right. And I should stop using this flawless library at all((((((
                                      But huge thx for all this "testing" stuff...

                                      Pl45m4P Offline
                                      Pl45m4P Offline
                                      Pl45m4
                                      wrote on last edited by
                                      #20

                                      @RazerMind

                                      Have a look at LibHaru, esp. the Graphics part

                                      • https://github.com/libharu/libharu/wiki/Graphics

                                      If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                                      ~E. W. Dijkstra

                                      1 Reply Last reply
                                      0

                                      • Login

                                      • Login or register to search.
                                      • First post
                                        Last post
                                      0
                                      • Categories
                                      • Recent
                                      • Tags
                                      • Popular
                                      • Users
                                      • Groups
                                      • Search
                                      • Get Qt Extensions
                                      • Unsolved