diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,13 +2,16 @@ ki18n_wrap_ui(skanlite_SRCS settings.ui SaveLocation.ui) -#kde4_add_app_icon(skanlite_SRCS "${KDE4_INSTALL_DIR}/share/icons/oxygen/*/devices/scanner.png") +find_package(Qt5Gui REQUIRED) +find_package(Qt5PrintSupport REQUIRED) add_executable(skanlite ${skanlite_SRCS}) target_link_libraries(skanlite PUBLIC Qt5::Core + Qt5::Gui + Qt5::PrintSupport PRIVATE KF5::CoreAddons KF5::Sane diff --git a/src/KSaneImageSaver.h b/src/KSaneImageSaver.h --- a/src/KSaneImageSaver.h +++ b/src/KSaneImageSaver.h @@ -39,6 +39,8 @@ bool saveQImage(const QUrl &url, const QString &name, const QByteArray &data, int width, int height, int bpl, int dpi, int format, const QString& fileFormat, int quality); bool save16BitPng(const QUrl &url, const QString &name, const QByteArray &data, int width, int height, int bpl, int dpi, int format, const QString& fileFormat, int quality); + + bool savePdf(const QUrl &url, const QString &name, const QByteArray &data, int width, int height, int bpl, int dpi, int format, const QString& fileFormat, int quality); Q_SIGNALS: void imageSaved(const QUrl &url, const QString &name, bool success); diff --git a/src/KSaneImageSaver.cpp b/src/KSaneImageSaver.cpp --- a/src/KSaneImageSaver.cpp +++ b/src/KSaneImageSaver.cpp @@ -30,8 +30,13 @@ #include #include +#include #include +#include +#include +#include + struct KSaneImageSaver::Private { bool m_savedOk; QMutex m_runMutex; @@ -47,11 +52,13 @@ QString m_fileFormat; int m_quality; bool m_savingAsPng16; + QString m_fileType; KSaneImageSaver *q; bool saveQImage(); bool save16BitPng(); + bool savePdf(); }; // ------------------------------------------------------------------------ @@ -83,6 +90,7 @@ d->m_fileFormat = fileFormat; d->m_quality = quality; d->m_savingAsPng16 = false; + d->m_fileType = QLatin1String("image"); start(); return true; @@ -105,6 +113,26 @@ d->m_fileFormat = fileFormat; d->m_quality = quality; d->m_savingAsPng16 = true; + d->m_fileType = QLatin1String("image"); + + start(); + return true; +} + +bool KSaneImageSaver::savePdf(const QUrl& url, const QString& name, const QByteArray& data, int width, int height, int bpl, int dpi, int format, const QString& fileFormat, int quality) +{ + d->m_url = url; + d->m_name = name; + d->m_data = data; + d->m_width = width; + d->m_height = height; + d->m_bpl = bpl; + d->m_dpi = dpi; + d->m_format = format; + d->m_fileFormat = fileFormat; + d->m_quality = quality; + d->m_savingAsPng16 = false; + d->m_fileType = QLatin1String("pdf"); start(); return true; @@ -112,7 +140,12 @@ void KSaneImageSaver::run() { - d->m_savedOk = d->m_savingAsPng16 ? d->save16BitPng() : d->saveQImage(); + if (d->m_fileType == QLatin1String("pdf")) { + d->m_savedOk = d->savePdf(); + } else { + assert(d->m_fileType == QLatin1String("image")); + d->m_savedOk = d->m_savingAsPng16 ? d->save16BitPng() : d->saveQImage(); + } emit imageSaved(d->m_url, d->m_name, d->m_savedOk); d->m_runMutex.unlock(); @@ -232,3 +265,25 @@ return true; } +bool KSaneImageSaver::Private::savePdf() +{ + QImage img = KSaneIface::KSaneWidget::toQImageSilent(m_data, m_width, m_height, m_bpl, m_dpi, (KSaneIface::KSaneWidget::ImageFormat) m_format); + + const QPoint imageCoordinates(0,0); + + QPdfWriter pdfWriter(m_name); + pdfWriter.setPageOrientation(QPageLayout::Orientation::Portrait); + pdfWriter.setPageSize(QPageSize(QPageSize::A4)); + pdfWriter.setResolution(m_dpi); + pdfWriter.setCreator(i18n("Skanlite")); + pdfWriter.setTitle(m_name); + QPainter painter; + + if (!painter.begin(&pdfWriter)) { + return false; + } + + painter.drawImage(imageCoordinates, img); + + return painter.end(); +} diff --git a/src/skanlite.cpp b/src/skanlite.cpp --- a/src/skanlite.cpp +++ b/src/skanlite.cpp @@ -127,25 +127,30 @@ m_settingsUi.revertOptions->setIcon(QIcon::fromTheme(QLatin1String("edit-undo"))); m_saveLocation = new SaveLocation(this); + m_filterList.clear(); + // add the supported image types const QList tmpList = QImageWriter::supportedMimeTypes(); - m_filterList.clear(); foreach (auto ba, tmpList) { if (ba.isEmpty()) { continue; } m_filterList.append(QString::fromLatin1(ba)); } + // add the supported document types + m_filterList.append(QLatin1String("application/pdf")); - qDebug() << m_filterList; + qDebug() << "Supported Mime Types:" << m_filterList; // Put first class citizens at first place + m_filterList.removeAll(QLatin1String("application/pdf")); m_filterList.removeAll(QLatin1String("image/jpeg")); m_filterList.removeAll(QLatin1String("image/tiff")); m_filterList.removeAll(QLatin1String("image/png")); m_filterList.insert(0, QLatin1String("image/png")); m_filterList.insert(1, QLatin1String("image/jpeg")); m_filterList.insert(2, QLatin1String("image/tiff")); + m_filterList.insert(3, QLatin1String("application/pdf")); m_filter16BitList << QLatin1String("image/png"); //m_filter16BitList << QLatin1String("image/tiff"); @@ -523,7 +528,11 @@ if (enforceSavingAsPng16bit) { m_imageSaver->save16BitPng(fileUrl, localName, m_data, m_width, m_height, m_bytesPerLine, (int) m_ksanew->currentDPI(), m_format, fileFormat, quality); } else { - m_imageSaver->saveQImage(fileUrl, localName, m_data, m_width, m_height, m_bytesPerLine, (int) m_ksanew->currentDPI(), m_format, fileFormat, quality); + if (suffix == QLatin1String("pdf")) { + m_imageSaver->savePdf(fileUrl, localName, m_data, m_width, m_height, m_bytesPerLine, (int) m_ksanew->currentDPI(), m_format, fileFormat, quality); + } else { + m_imageSaver->saveQImage(fileUrl, localName, m_data, m_width, m_height, m_bytesPerLine, (int) m_ksanew->currentDPI(), m_format, fileFormat, quality); + } } m_showImgDialog->close(); // calling close() on a closed window does nothing.