You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/filters/kword/pdf/pdfimport.cpp

180 lines
5.9 KiB

/*
* Copyright (c) 2002-2003 Nicolas HADACEK (hadacek@kde.org)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "pdfimport.h"
#include "pdfimport.moc"
#include <tqdom.h>
#include <tqdatetime.h> // debug
#include <KoFilterChain.h>
#include <kgenericfactory.h>
#include <kdebug.h>
#include <KoGlobal.h>
#include <KoStore.h>
#include <tdeapplication.h>
#include <kprogress.h>
#include "data.h"
using namespace PDFImport;
//-----------------------------------------------------------------------------
class PdfImportFactory : KGenericFactory<PdfImport, KoFilter>
{
public:
PdfImportFactory()
: KGenericFactory<PdfImport, KoFilter>("kwordpdfimport") {}
protected:
virtual void setupTranslations() {
TDEGlobal::locale()->insertCatalogue("kofficefilters");
}
};
K_EXPORT_COMPONENT_FACTORY(libpdfimport, PdfImportFactory())
//-----------------------------------------------------------------------------
PdfImport::PdfImport(KoFilter *, const char *, const TQStringList&)
{}
KoFilter::ConversionStatus PdfImport::convert(const TQCString& from,
const TQCString& to)
{
// check for proper conversion
if ( to!="application/x-kword" || from!="application/pdf" )
return KoFilter::NotImplemented;
// read file
KoFilter::ConversionStatus result
= _doc.init(m_chain->inputFile(), TQString(), TQString());
if ( result!=KoFilter::OK ) return result;
// options dialog
{
Dialog dialog(_doc.nbPages(), _doc.isEncrypted(), 0);
dialog.exec();
if ( dialog.result()==TQDialog::Rejected )
return KoFilter::UserCancelled;
_options = dialog.options();
}
// progress dialog
KProgressDialog pd(0, "progress_dialog", i18n("PDF Import"),
i18n("Initializing..."), true);
pd.setMinimumDuration(0);
pd.progressBar()->setTotalSteps( _options.range.nbPages()*2 );
pd.progressBar()->setValue(1);
tqApp->processEvents();
// if passwords : reread file
if ( !_options.ownerPassword.isEmpty()
|| !_options.userPassword.isEmpty() ) {
result = _doc.init(m_chain->inputFile(), _options.ownerPassword,
_options.userPassword);
if ( result!=KoFilter::OK ) return result;
}
// data
KoPageLayout page;
DRect rect = _doc.paperSize(page.format);
kdDebug(30516) << "paper size: " << rect.toString() << endl;
page.orientation = _doc.paperOrientation();
Data data(m_chain, rect, page, _options);
_doc.initDevice(data);
// treat pages
TQTime time;
time.start();
SelectionRangeIterator it(_options.range);
for (uint k=0; k<2; k++) {
bool first = ( k==0 );
data.pageIndex = 0;
if ( !first ) _doc.init();
for (it.toFirst(); it.current()!=it.end(); it.next()) {
TQString s = (first ? i18n("First pass: page #%1...")
: i18n("Second pass: page #%1..."));
pd.setLabel( s.arg(it.current()) );
tqApp->processEvents();
if (pd.wasCancelled()) return KoFilter::UserCancelled;
kdDebug(30516) << "-- " << "pass #" << k
<< " treat page: " << it.current()
<< "----------------" << endl;
if (first) _doc.treatPage( it.current() );
else _doc.dumpPage(data.pageIndex);
pd.progressBar()->advance(1);
data.pageIndex++;
}
}
data.endDump();
kdDebug(30516) << "treatement elapsed=" << time.elapsed() << endl;
// output
KoStoreDevice* out = m_chain->storageFile("root", KoStore::Write);
if( !out ) {
kdError(30516) << "Unable to open output file!" << endl;
return KoFilter::StorageCreationError;
}
// kdDebug(30516) << data.document().toCString() << endl;
TQCString cstr = data.document().toCString();
out->writeBlock(cstr, cstr.length());
out->close();
treatInfoDocument();
return KoFilter::OK;
}
void PdfImport::treatInfoDocument()
{
TQDomDocument infoDocument("document-info");
infoDocument.appendChild(
infoDocument.createProcessingInstruction(
"xml", "version=\"1.0\" encoding=\"UTF-8\""));
TQDomElement infoElement = infoDocument.createElement( "document-info" );
infoDocument.appendChild(infoElement);
TQDomElement aboutTag = infoDocument.createElement("about");
infoElement.appendChild(aboutTag);
TQDomElement authorTag = infoDocument.createElement("author");
infoElement.appendChild(authorTag);
TQDomElement fullNameTag = infoDocument.createElement("full-name");
authorTag.appendChild(fullNameTag);
TQDomText authorText = infoDocument.createTextNode( _doc.info("Author") );
fullNameTag.appendChild(authorText);
TQDomElement titleTag = infoDocument.createElement("title");
aboutTag.appendChild(titleTag);
TQDomText titleText = infoDocument.createTextNode( _doc.info("Title") );
titleTag.appendChild(titleText);
// output
KoStoreDevice *out =
m_chain->storageFile("documentinfo.xml", KoStore::Write);
if ( !out )
kdWarning(30516) << "unable to open doc info. continuing anyway\n";
else {
TQCString cstr = infoDocument.toCString();
out->writeBlock(cstr, cstr.length());
out->close();
}
}