QTextDocument zu andere formate bringen nicht html

Code-Schnippsel, oder Tipps und Tricks, die einem beim Programmieren mit Qt helfen können.
Antworten
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

QTextDocument zu andere formate bringen nicht html

Beitrag von patrik08 »

QTextDocument ist eine gute Rich Text daten structur und man kann auch in andere formate exportieren die nicht html sind .

http://doc.trolltech.com/4.2/richtext-structure.html

Ich habe 3 tage damit verbracht ein QTextBrowser/QGraphicsItem text mit QTextDocument , zum XSL-FO format zu bringen ( http://de.wikipedia.org/wiki/Extensible ... ng_Objects ) ... der vorteil ist alles layer die man rotieren darstellen kann ..
sovie top left coordinaten am ende bemerkte ich dass es nicht einmal den java fop prozessor braucht um ins pdf zu bringen.

Im ganzen ist alles moeglich was scribus auch macht aber eben mit qt3..

mit dem iterator kann man von oben bis unten alles parsen und ins respektive format bringen....

beispiel code anlage....


Code: Alles auswählen


void QDoc2XslFo::Parse( QTextDocument * w3 , const QString basepathimage )
{
    imagepathexport = basepathimage;
    QTextFrame  *Tframe = w3->rootFrame();
......

QDomElement flow = QDomDocument::createElement("fo:flow");
    flow.setAttribute ("flow-name","xsl-region-body");
    pageseq1.appendChild( flow );
    
 HandleFrame(Tframe,FRAME_ROOT,flow);
    
void QDoc2XslFo::HandleFrame( QTextFrame  * Tframe , FRAME_TYP dd , QDomElement appender ) 
{
    BigframeProcessing++;
    QTextFrame::iterator it;
    
        for (it = Tframe->begin(); !(it.atEnd()); ++it) {
         /* to find tree structure */
         QTextFrame *childFrame = it.currentFrame();
         QTextBlock para = it.currentBlock();
         
             if (childFrame)  {
                QTextTable *childTable = qobject_cast<QTextTable*>(childFrame);
                /* if is table */
                 if (childTable->columns() > 0) {
                   /* PARAGRAPH  TAG ..............TAGNR. ENUM 406 */
                  QDomElement tablepara = createElement("fo:block");
                     appender.appendChild(tablepara);
                     HandleTable(childTable,tablepara);
                     
                 }
                 
                 
                 
             }  else if (para.isValid()) {
                 
                 HandleBlock(para,appender); 
             }
    
    }
    
    if (dd == FRAME_ROOT) {
        
    }
    
}


Die idee kam mir von okular KDE http://developer.kde.org/summerofcode/okular.html der sogar openoffice dateien darstellt...

http://www.google.com/codesearch?hl=it& ... pp&start=1
Dateianhänge
qdoc2xsl-fo.zip
(7.68 KiB) 341-mal heruntergeladen
image_1.png
image_1.png (46.59 KiB) 4174 mal betrachtet
.........................
speack português italiano deutsch english castellà qt
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Iher noch den Mass converter fuer eventuel jemand der will xsl-fo dokumenten darstellen, von xsl-fo zu QTextDocument der man im
QTextBrowser/QGraphicsItem darstellen kann.

alle einheiten sind 21cm oder 4em u.n.s.w

und mit der funktion bekomt man die genaue punkt punkt werte in qreal mit 5 zahlen nach dem komma....

Code: Alles auswählen


static inline qreal UnitInt( const QString datain )
{
   QString ctmp = datain;
  QString data = ctmp.replace(" ","").trimmed();
  //////////qDebug() << "### request unit data->" << datain << " size->" << datain.size();    
  #define MM_TO_POINT(mm) ((mm)*2.83465058)
  #define CM_TO_POINT(cm) ((cm)*28.3465058)
  #define DM_TO_POINT(dm) ((dm)*283.465058)
  #define INCH_TO_POINT(inch) ((inch)*72.0)
  #define PI_TO_POINT(pi) ((pi)*12)
  #define DD_TO_POINT(dd) ((dd)*154.08124)
  #define CC_TO_POINT(cc) ((cc)*12.840103)
  qreal points = 0;
  if (data.size() < 1) {
  return points;
  }
  
  if ( data.endsWith( "pt" ) ) {
    points = data.left( data.length() - 2 ).toDouble();
  } else if ( data.endsWith( "cm" ) ) {
    double value = data.left( data.length() - 2 ).toDouble();
    points = CM_TO_POINT( value );
  } else if ( data.endsWith( "em" ) ) {
    points = data.left( data.length() - 2 ).toDouble();
  } else if ( data.endsWith( "mm" ) ) {
    double value = data.left( data.length() - 2 ).toDouble();
    points = MM_TO_POINT( value );
  } else if ( data.endsWith( "dm" ) ) {
    double value = data.left( data.length() - 2 ).toDouble();
    points = DM_TO_POINT( value );
  } else if ( data.endsWith( "in" ) ) {
    double value = data.left( data.length() - 2 ).toDouble();
    points = INCH_TO_POINT( value );
  } else if ( data.endsWith( "inch" ) ) {
    double value = data.left( data.length() - 4 ).toDouble();
    points = INCH_TO_POINT( value );
  } else if ( data.endsWith( "pi" ) ) {
    double value = data.left( data.length() - 4 ).toDouble();
    points = PI_TO_POINT( value );
  } else if ( data.endsWith( "dd" ) ) {
    double value = data.left( data.length() - 4 ).toDouble();
    points = DD_TO_POINT( value );
  } else if ( data.endsWith( "cc" ) ) {
    double value = data.left( data.length() - 4 ).toDouble();
    points = CC_TO_POINT( value );
  } else {
    points = 0;
    qDebug( "unknown unit %s", qPrintable( datain ) );
    //////QMessageBox::warning(0,"Unit converter",QString("unknown Unit \"%1\"").arg(datain));
  }
  return points;
}
.........................
speack português italiano deutsch english castellà qt
Antworten