File indexing completed on 2024-06-16 04:17:03
0001 /* 0002 * SPDX-FileCopyrightText: 2006 Cyrille Berger <cberger@cberger.net> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "kis_pdf_import.h" 0008 0009 // poppler's headers 0010 #include <poppler-qt5.h> 0011 0012 // Qt's headers 0013 #include <QFile> 0014 #include <QImage> 0015 #include <QRadioButton> 0016 #include <QApplication> 0017 #include <QFileInfo> 0018 0019 // KDE's headers 0020 #include <kis_debug.h> 0021 #include <kis_paint_device.h> 0022 #include <KoDialog.h> 0023 #include <kpluginfactory.h> 0024 #include <kpassworddialog.h> 0025 0026 // calligra's headers 0027 #include <KoColorSpace.h> 0028 #include <KoColorSpaceRegistry.h> 0029 #include <KoProgressUpdater.h> 0030 #include <KoUpdater.h> 0031 0032 // krita's headers 0033 #include <KisDocument.h> 0034 #include <kis_group_layer.h> 0035 #include <kis_image.h> 0036 #include <kis_paint_layer.h> 0037 #include <kis_transaction.h> 0038 #include <kis_cursor_override_hijacker.h> 0039 0040 // plugins's headers 0041 #include "kis_pdf_import_widget.h" 0042 #include <KisImportExportErrorCode.h> 0043 0044 K_PLUGIN_FACTORY_WITH_JSON(PDFImportFactory, "krita_pdf_import.json", 0045 registerPlugin<KisPDFImport>();) 0046 0047 KisPDFImport::KisPDFImport(QObject *parent, const QVariantList &) 0048 : KisImportExportFilter(parent) 0049 { 0050 } 0051 0052 KisPDFImport::~KisPDFImport() 0053 { 0054 } 0055 0056 KisImportExportErrorCode KisPDFImport::convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP /*configuration*/) 0057 { 0058 Poppler::Document* pdoc = Poppler::Document::loadFromData(io->readAll()); 0059 0060 if (!pdoc) { 0061 dbgFile << "Error when reading the PDF"; 0062 return ImportExportCodes::ErrorWhileReading; 0063 } 0064 0065 pdoc->setRenderHint(Poppler::Document::Antialiasing, true); 0066 pdoc->setRenderHint(Poppler::Document::TextAntialiasing, true); 0067 0068 while (pdoc->isLocked()) { 0069 KPasswordDialog dlg(0); 0070 dlg.setPrompt(i18n("A password is required to read that pdf")); 0071 dlg.setWindowTitle(i18n("A password is required to read that pdf")); 0072 if (dlg.exec() != QDialog::Accepted) { 0073 dbgFile << "Password canceled"; 0074 return ImportExportCodes::Cancelled; 0075 } else 0076 pdoc->unlock(dlg.password().toLocal8Bit(), dlg.password().toLocal8Bit()); 0077 } 0078 0079 KoDialog* kdb = new KoDialog(qApp->activeWindow()); 0080 kdb->setCaption(i18n("PDF Import Options")); 0081 kdb->setModal(false); 0082 0083 KisPDFImportWidget* wdg = new KisPDFImportWidget(pdoc, kdb); 0084 kdb->setMainWidget(wdg); 0085 0086 { 0087 KisCursorOverrideHijacker cursorHijacker; 0088 0089 if (kdb->exec() == QDialog::Rejected) { 0090 delete pdoc; 0091 delete kdb; 0092 return ImportExportCodes::Cancelled; 0093 } 0094 } 0095 0096 // Create the krita image 0097 const KoColorSpace* cs = KoColorSpaceRegistry::instance()->rgb8(); 0098 int width = wdg->intWidth->value(); 0099 int height = wdg->intHeight->value(); 0100 KisImageSP image = new KisImage(document->createUndoStore(), width, height, cs, "built image"); 0101 image->setResolution(wdg->intResolution->value() / 72.0, wdg->intResolution->value() / 72.0); 0102 0103 // create a layer 0104 QList<int> pages = wdg->pages(); 0105 for (QList<int>::const_iterator it = pages.constBegin(); it != pages.constEnd(); ++it) { 0106 KisPaintLayer* layer = new KisPaintLayer(image.data(), 0107 i18n("Page %1", *it + 1), 0108 quint8_MAX); 0109 0110 0111 Poppler::Page* page = pdoc->page(*it); 0112 0113 QImage img = page->renderToImage(wdg->intResolution->value(), wdg->intResolution->value(), 0, 0, width, height); 0114 layer->paintDevice()->convertFromQImage(img, 0, 0, 0); 0115 0116 delete page; 0117 image->addNode(layer, image->rootLayer(), 0); 0118 setProgress(qreal(*it + 1) * 100 / pages.count()); 0119 } 0120 0121 document->setCurrentImage(image); 0122 0123 delete pdoc; 0124 delete kdb; 0125 return ImportExportCodes::OK; 0126 } 0127 0128 #include "kis_pdf_import.moc"