PageFormatProperty StyleParser::parsePageProperty( QDomElement &parent ) { PageFormatProperty property; property.setBottomMargin( convertUnit( parent.attribute( "margin-bottom" ) ) ); property.setLeftMargin( convertUnit( parent.attribute( "margin-left" ) ) ); property.setTopMargin( convertUnit( parent.attribute( "margin-top" ) ) ); property.setRightMargin( convertUnit( parent.attribute( "margin-right" ) ) ); property.setWidth( convertUnit( parent.attribute( "page-width" ) ) ); property.setHeight( convertUnit( parent.attribute( "page-height" ) ) ); return property; }
QTextDocument* Converter::convert(const QString &fileName) { firstTime = true; Document oooDocument(fileName); if (!oooDocument.open()) { return 0; } m_TextDocument = new QTextDocument; m_Cursor = new QTextCursor(m_TextDocument); /** * Create the dom of the content */ QXmlSimpleReader reader; QXmlInputSource source; source.setData(oooDocument.content()); QString errorMsg; QDomDocument document; if (!document.setContent(&source, &reader, &errorMsg)) { setError(QString("Invalid XML document: %1").arg(errorMsg), -1); delete m_Cursor; return m_TextDocument; } /** * Read the style properties, so the are available when * parsing the content. */ m_StyleInformation = new StyleInformation(); if (oooDocument.content().size() == 0) { setError("Empty document", -1); } StyleParser styleParser(&oooDocument, document, m_StyleInformation); if (!styleParser.parse()) { setError("Unable to read style information", -1); delete m_Cursor; return 0; } /** * Add all images of the document to resource framework */ QMap<QString, QByteArray> imageLIST = oooDocument.images(); QMapIterator<QString, QByteArray> it(imageLIST); while (it.hasNext()) { it.next(); m_TextDocument->addResource(QTextDocument::ImageResource, QUrl(it.key()), QImage::fromData(it.value())); } /** * Set the correct page size */ const QString masterLayout = m_StyleInformation->masterPageName(); if (m_StyleInformation->pagePropertyExists(masterLayout)) { const int DPX = 231; /// im.logicalDpiX(); // 231 const int DPY = 231; // im.logicalDpiY(); // 231 const int A4Width = MM_TO_POINT(210); /// A4 210 x297 mm const int A4Height = MM_TO_POINT(297); const PageFormatProperty property = m_StyleInformation->pageProperty(masterLayout); int pageWidth = qRound(property.width() / 72.0 * DPX); if (pageWidth < 1) { pageWidth = A4Width; } int pageHeight = qRound(property.height() / 72.0 * DPY); if (pageHeight < 1) { pageHeight = A4Height; } m_TextDocument->setPageSize(QSize(pageWidth, pageHeight)); QTextFrameFormat frameFormat; frameFormat.setMargin(qRound(property.margin())); QTextFrame *rootFrame = m_TextDocument->rootFrame(); rootFrame->setFrameFormat(frameFormat); } /** * Parse the content of the document */ const QDomElement documentElement = document.documentElement(); QDomElement element = documentElement.firstChildElement(); while (!element.isNull()) { if (element.tagName() == QLatin1String("body")) { if (!convertBody(element)) { setError("Unable to convert document content", -1); delete m_Cursor; return 0; } } element = element.nextSiblingElement(); } return m_TextDocument; }
Okular::Document::OpenResult Converter::convertWithPassword( const QString &fileName, const QString &password ) { Document oooDocument( fileName ); if ( !oooDocument.open( password ) ) { if ( !oooDocument.anyFileEncrypted() ) emit error( oooDocument.lastErrorString(), -1 ); return oooDocument.anyFileEncrypted() ? Okular::Document::OpenNeedsPassword : Okular::Document::OpenError; } mTextDocument = new QTextDocument; mCursor = new QTextCursor( mTextDocument ); /** * Create the dom of the content */ QXmlSimpleReader reader; QXmlInputSource source; source.setData( oooDocument.content() ); QString errorMsg; QDomDocument document; if ( !document.setContent( &source, &reader, &errorMsg ) ) { if ( !oooDocument.anyFileEncrypted() ) emit error( i18n( "Invalid XML document: %1", errorMsg ), -1 ); delete mCursor; return oooDocument.anyFileEncrypted() ? Okular::Document::OpenNeedsPassword : Okular::Document::OpenError; } mStyleInformation = new StyleInformation(); /** * Read the style properties, so the are available when * parsing the content. */ StyleParser styleParser( &oooDocument, document, mStyleInformation ); if ( !styleParser.parse() ) { if ( !oooDocument.anyFileEncrypted() ) emit error( i18n( "Unable to read style information" ), -1 ); delete mCursor; return oooDocument.anyFileEncrypted() ? Okular::Document::OpenNeedsPassword : Okular::Document::OpenError; } /** * Add all images of the document to resource framework */ const QMap<QString, QByteArray> images = oooDocument.images(); QMapIterator<QString, QByteArray> it( images ); while ( it.hasNext() ) { it.next(); mTextDocument->addResource( QTextDocument::ImageResource, QUrl( it.key() ), QImage::fromData( it.value() ) ); } /** * Set the correct page size */ const QString masterLayout = mStyleInformation->masterPageName(); const PageFormatProperty property = mStyleInformation->pageProperty( masterLayout ); const QSizeF dpi = Okular::Utils::realDpi(nullptr); int pageWidth = qRound(property.width() / 72.0 * dpi.width()); int pageHeight = qRound(property.height() / 72.0 * dpi.height()); if ( pageWidth == 0 ) pageWidth = 600; if ( pageHeight == 0 ) pageHeight = 800; mTextDocument->setPageSize( QSize( pageWidth, pageHeight ) ); QTextFrameFormat frameFormat; frameFormat.setMargin( qRound( property.margin() ) ); QTextFrame *rootFrame = mTextDocument->rootFrame(); rootFrame->setFrameFormat( frameFormat ); /** * Parse the content of the document */ const QDomElement documentElement = document.documentElement(); QDomElement element = documentElement.firstChildElement(); while ( !element.isNull() ) { if ( element.tagName() == QLatin1String( "body" ) ) { if ( !convertBody( element ) ) { if ( !oooDocument.anyFileEncrypted() ) emit error( i18n( "Unable to convert document content" ), -1 ); delete mCursor; return oooDocument.anyFileEncrypted() ? Okular::Document::OpenNeedsPassword : Okular::Document::OpenError; } } element = element.nextSiblingElement(); } MetaInformation::List metaInformation = mStyleInformation->metaInformation(); for ( int i = 0; i < metaInformation.count(); ++i ) { emit addMetaData( metaInformation[ i ].key(), metaInformation[ i ].value(), metaInformation[ i ].title() ); } delete mCursor; delete mStyleInformation; mStyleInformation = 0; setDocument( mTextDocument ); return Okular::Document::OpenSuccess; }