Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_pdf_import.cpp
Go to the documentation of this file.
1
2/*
3 * SPDX-FileCopyrightText: 2006 Cyrille Berger <cberger@cberger.net>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8#include "kis_pdf_import.h"
9
10// poppler's headers
11#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
12#include <poppler-qt5.h>
13#else
14#include <poppler-qt6.h>
15#endif
16
17// Qt's headers
18#include <QFile>
19#include <QImage>
20#include <QRadioButton>
21#include <QApplication>
22
23// KDE's headers
24#include <kis_debug.h>
25#include <kis_paint_device.h>
26#include <KoDialog.h>
27#include <kpluginfactory.h>
28#include <kpassworddialog.h>
29
30// calligra's headers
31#include <KoColorSpace.h>
33#include <KoProgressUpdater.h>
34#include <KoUpdater.h>
35
36// krita's headers
37#include <KisDocument.h>
38#include <kis_group_layer.h>
39#include <kis_image.h>
40#include <kis_paint_layer.h>
41#include <kis_transaction.h>
43
44// plugins's headers
47
48K_PLUGIN_FACTORY_WITH_JSON(PDFImportFactory, "krita_pdf_import.json",
49 registerPlugin<KisPDFImport>();)
50
51KisPDFImport::KisPDFImport(QObject *parent, const QVariantList &)
52 : KisImportExportFilter(parent)
53{
54}
55
59
61{
62#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
63 Poppler::Document* pdoc = Poppler::Document::loadFromData(io->readAll());
64#else
65 std::unique_ptr<Poppler::Document> pdoc = Poppler::Document::loadFromData(io->readAll());
66#endif
67 if (!pdoc) {
68 dbgFile << "Error when reading the PDF";
70 }
71
72 pdoc->setRenderHint(Poppler::Document::Antialiasing, true);
73 pdoc->setRenderHint(Poppler::Document::TextAntialiasing, true);
74
75 while (pdoc->isLocked()) {
76 KPasswordDialog dlg(0);
77 dlg.setPrompt(i18n("A password is required to read that pdf"));
78 dlg.setWindowTitle(i18n("A password is required to read that pdf"));
79 if (dlg.exec() != QDialog::Accepted) {
80 dbgFile << "Password canceled";
82 } else
83 pdoc->unlock(dlg.password().toLocal8Bit(), dlg.password().toLocal8Bit());
84 }
85
86 KoDialog* kdb = new KoDialog(qApp->activeWindow());
87 kdb->setCaption(i18n("PDF Import Options"));
88 kdb->setModal(false);
89
90#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
91 KisPDFImportWidget* wdg = new KisPDFImportWidget(pdoc, kdb);
92#else
93 KisPDFImportWidget* wdg = new KisPDFImportWidget(pdoc.get(), kdb);
94#endif
95
96 kdb->setMainWidget(wdg);
97
98 {
99 KisCursorOverrideHijacker cursorHijacker;
100
101 if (kdb->exec() == QDialog::Rejected) {
102#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
103 delete pdoc;
104#endif
105 delete kdb;
107 }
108 }
109
110 // Create the krita image
112 int width = wdg->intWidth->value();
113 int height = wdg->intHeight->value();
114 KisImageSP image = new KisImage(document->createUndoStore(), width, height, cs, "built image");
115 image->setResolution(wdg->intResolution->value() / 72.0, wdg->intResolution->value() / 72.0);
116
117 // create a layer
118 QList<int> pages = wdg->pages();
119 for (QList<int>::const_iterator it = pages.constBegin(); it != pages.constEnd(); ++it) {
120 KisPaintLayer* layer = new KisPaintLayer(image.data(),
121 i18n("Page %1", *it + 1),
122 quint8_MAX);
123
124#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
125 Poppler::Page* page = pdoc->page(*it);
126#else
127 std::unique_ptr<Poppler::Page> page = pdoc->page(*it);
128#endif
129
130 QImage img = page->renderToImage(wdg->intResolution->value(), wdg->intResolution->value(), 0, 0, width, height);
131 layer->paintDevice()->convertFromQImage(img, 0, 0, 0);
132
133 image->addNode(layer, image->rootLayer(), 0);
134 setProgress(qreal(*it + 1) * 100 / pages.count());
135 }
136
137 document->setCurrentImage(image);
138#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
139 delete pdoc;
140#endif
141 delete kdb;
143}
144
145#include "kis_pdf_import.moc"
The KisCursorOverrideHijacker class stores all override cursors in a stack, and resets them back afte...
KisGroupLayerSP rootLayer() const
void setResolution(double xres, double yres)
The base class for import and export filters.
~KisPDFImport() override
KisImportExportErrorCode convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration=nullptr) override
KisPDFImport(QObject *parent, const QVariantList &)
void convertFromQImage(const QImage &image, const KoColorProfile *profile, qint32 offsetX=0, qint32 offsetY=0)
A dialog base class with standard buttons and predefined layouts.
Definition KoDialog.h:116
void setMainWidget(QWidget *widget)
Definition KoDialog.cpp:354
virtual void setCaption(const QString &caption)
Definition KoDialog.cpp:498
#define dbgFile
Definition kis_debug.h:53
const quint8 quint8_MAX
Definition kis_global.h:24
K_PLUGIN_FACTORY_WITH_JSON(PDFImportFactory, "krita_pdf_import.json", registerPlugin< KisPDFImport >();) KisPDFImport
bool addNode(KisNodeSP node, KisNodeSP parent=KisNodeSP(), KisNodeAdditionFlags flags=KisNodeAdditionFlag::None)
KisPaintDeviceSP paintDevice
static KoColorSpaceRegistry * instance()
const KoColorSpace * rgb8(const QString &profileName=QString())