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"