Seite 1 von 1

Bilder in der klasse serialisieren als in. PDF QDataStream

Verfasst: 26. April 2008 13:55
von patrik08
Ich hatte die aufgabe von eine datenbank ferien hauser daten zu pdf generienen mit bild und text und alles in 4 sprachen also pro haus 4 pdf..

Bald merke ich das man QPixmap nicht in separaten QThread erstellen kann ... also packe ich die bilder im QTextImageFormat hinein (bereist beim editieren ) als QVariant mit dem QTextFormat::property

http://doc.trolltech.com/latest/qtextfo ... l#property

am ende serialisiere ich das ganze QTextDocument in einen QDataStream
mit 2 variablen
QMap<QString,SPics> resource; /* bilder liste */
QByteArray html;
/* qCompress das comprimiertes html
QTextDocument */

ist alles leichter und das virtuelle pdf kommt bei gebrauch mit der druck vorschau von oder exportieren zu richtigen pdf geht auch sehr schnell ... http://www.qt-apps.org/content/show.php ... tent=62383
innert millisekunden .... mit dem jeweiligen richtigen datum ...

man kann es auch direkt zu pdf machen beim erstellen .... aber warum wenn es mit qCompress leichter ist...

Code: Alles auswählen



class SPics
{
    public:
    enum { MAGICNUMBER = 0xFFAAFFAA, VERSION = 1 };
    SPics() {
    name = "error";
    info = "Image Description to blind people";
    extension = QByteArray("PNG");
    }
    SPics& operator=( const SPics& d )
    {
      name = d.name;
      info = d.info;
      extension = d.extension;
      data = d.data;
      return *this;
    }
    bool operator!=( const SPics& d )
    {
        if (name != d.name ) {
        return false;
        } else {
        return true;
        }
    }
    operator QVariant() const {
    return QVariant::fromValue(*this);
    }
    QPixmap erno_pix() {
        
            QPixmap pError = QPixmap(20, 20 );
            pError.fill( Qt::red  );
            QPainter pter( &pError );
            pter.setFont( QFont( "Helvetica", 8 ) );
            pter.setBrush( Qt::green );
            pter.drawText( 5, 12 , "0" );
            return pError;
    }
    QString web()
    {
         QString flusches;
         if (data.size() < 1) {
         return flusches;
         }
         QByteArray daunq = qUncompress( data );
         return daunq.toBase64();
    }
    
    QPixmap pix() {
      if (data.size() < 1) {
      return erno_pix();
      }
      QPixmap resultimage;
      QByteArray daunq = qUncompress( data );
     resultimage.loadFromData( daunq );
          if (resultimage.isNull()) {
            return erno_pix();
          }
          
    return resultimage;
    }
    
    QString FileName()
    {
    return Imagename(name) + "." + QString(extension.data()).toLower();
    }
    
    void SavePix( QString dir = QString() )
    {
        QString fullpath = dir + FileName();
        QPixmap curr = pix();
        curr.save(fullpath,extension.data());
    }
    
    void set_pics( const QPixmap * barcode )
    {
      if (barcode->isNull()) {
        return;
      }
      QByteArray bytes;
      QBuffer buffer(&bytes);
      buffer.open(QIODevice::WriteOnly);
      barcode->save(&buffer,extension.data());
      data = qCompress(bytes,9);
    }
    void set_pics( QPixmap barcode )
    {
      if (barcode.isNull()) {
        return;
      }
      QByteArray bytes;
      QBuffer buffer(&bytes);
      buffer.open(QIODevice::WriteOnly);
      barcode.save(&buffer,extension.data());
      data = qCompress(bytes,9);
    }
    int picskilo() {
    return data.size();
    }
    QUrl indoc()
    {
      const int grep = name.size() -  name.indexOf(".");
      QString webname = name.left(grep);
      return QUrl(QString("./%1.%2").arg(name).arg(QString(extension.data()).toLower()));  
    }
    
    
    /* vars permanent */
    QString name;
    QString info;
    QByteArray extension;
    QByteArray data;  /* qCompress */
};


/* deklarienen fuer datastream */

Q_DECLARE_METATYPE(SPics);

inline QDebug operator<<(QDebug debug, SPics& udoc)
{
  debug.nospace() << "SPics(name."
    << udoc.name << ","
    << udoc.info << ",size()"
    << udoc.data.size() << ",type()"
    << udoc.extension << ")";
  return debug.space();
}

inline QDataStream& operator<<(QDataStream& out, const SPics& udoc)
{
    out << udoc.name;
    out << udoc.info;
    out << udoc.extension;
    out << udoc.data;
    return out;
}

inline QDataStream& operator>>(QDataStream& in, SPics& udoc)
{
    in >> udoc.name;
    in >> udoc.info;
    in >> udoc.extension;
    in >> udoc.data;
    return in;
}


/* bilder liste speichern und oefnnen */

inline QString SaveImageGroup( QList<SPics> li  )
{
   if (li.size() < 1) {
     return QString();  
   }
  QByteArray bytes;
  QBuffer buffer(&bytes);
  if (!buffer.open(QIODevice::WriteOnly)) {
    return QString();
  }
  QDataStream ds(&buffer);
  /* place header */
  ds.setVersion(QDataStream::Qt_4_2);
  ds << (quint32)SPics::MAGICNUMBER;
  ds << (quint32)SPics::VERSION;
  /* place header */
             QApplication::setOverrideCursor(Qt::WaitCursor);
             for (int i=0; i<li.size(); i++) {
                 SPics conni = li[i];
                 ds << conni;
             }   
             QApplication::restoreOverrideCursor();
  buffer.close();
  return bytes.toBase64();
}

/* decoded base64 stream to put on mysql row , file or network streams */
inline QList<SPics> OpenImageGroup( const QString datastream_base64   )
{
  
  
  QList<SPics> li;
  QByteArray xcode("");
  xcode.append(datastream_base64);
  quint32 magic, version;
  QByteArray bytes(QByteArray::fromBase64(xcode));   /* decoded base64 string to QByteArray */
  QBuffer buffer(&bytes);
  if (!buffer.open(QIODevice::ReadOnly)) {
    return li;
  }
  QDataStream ds(&buffer);
  /* place header */
  ds.setVersion(QDataStream::Qt_4_2);
  ds >> magic;
  if ( (quint32)SPics::MAGICNUMBER != magic ) {
    qDebug() << "######## SPics::MAGICNUMBER not ok  ";
    buffer.close();
    return li;
  }
  ds >> version;
  if ( (quint32)SPics::VERSION != version ) {
    qDebug() << "######## SPics::VERSION not ok  ";
    buffer.close();
    return li;
  }
  SPics appoint;
  /* place header */
  QApplication::setOverrideCursor(Qt::WaitCursor);
    while (!ds.atEnd()) {
         ds >> appoint;
         li.append(appoint);
    }
   QApplication::restoreOverrideCursor();
  buffer.close();
  return li;
}







Verfasst: 26. April 2008 14:16
von patrik08
die QTextDocument wieder herstellen geht schmerzlos so

Code: Alles auswählen

QTextDocument *todoc()
    {
			  QTextCursor helper;
        QTextDocument *d = new QTextDocument();
        d->setHtml(QString(html));  /* stream html laden */
			  helper = QTextCursor(d);
				 QTextFrame  *Tframe = d->rootFrame();
				 QTextFrame::iterator it;
         for (it = Tframe->begin(); !(it.atEnd()); ++it) {
					 QTextBlock para = it.currentBlock();
					 if (para.isValid()) {
						QTextBlockFormat Parformat = para.blockFormat();
						if (Parformat.bottomMargin() == 12 && Parformat.topMargin() == 12) {
							/* default QT margin doc from  QTextDocument*/
						}
							QTextBlock::iterator de;
										for (de = para.begin(); !(de.atEnd()); ++de) {
												QTextFragment fr = de.fragment();
											  if (fr.isValid()) {
                           QTextCharFormat base = fr.charFormat();
                           QTextImageFormat pico = base.toImageFormat();
													      if (pico.isValid()) {
																		const QString hrefadress = pico.name();
                                    /* die bilder wieder laden von qmap  qmap[bildname]value*/
																		SPics spico = resource[hrefadress];
																		pico.setToolTip(spico.info);
																		pico.setProperty(100,spico);
																		helper.setPosition(fr.position());
                                    helper.setPosition(fr.position() + fr.length(),QTextCursor::KeepAnchor);
                                    /* die bilder wieder hinein stellen */
                                    helper.setCharFormat(pico);
																	  d->addResource( QTextDocument::ImageResource,QUrl(spico.name),spico.pix());
																}
												}
																 
										}
						 
					 }
			
		     }
				 
    /* beim abspeichern einfach prozess umdrehen */
    return d;
    }