diff --git a/Pdf4QtViewerPlugins/RedactPlugin/RedactPlugin.pro b/Pdf4QtViewerPlugins/RedactPlugin/RedactPlugin.pro
index 368edd0..295805a 100644
--- a/Pdf4QtViewerPlugins/RedactPlugin/RedactPlugin.pro
+++ b/Pdf4QtViewerPlugins/RedactPlugin/RedactPlugin.pro
@@ -34,9 +34,11 @@ CONFIG += c++11
SOURCES += \
redactplugin.cpp \
+ selectpagestoredactdialog.cpp
HEADERS += \
redactplugin.h \
+ selectpagestoredactdialog.h
CONFIG += force_debug_info
@@ -46,4 +48,7 @@ DISTFILES += \
RESOURCES += \
icons.qrc
+FORMS += \
+ selectpagestoredactdialog.ui
+
diff --git a/Pdf4QtViewerPlugins/RedactPlugin/redactplugin.cpp b/Pdf4QtViewerPlugins/RedactPlugin/redactplugin.cpp
index d43989d..d1eb828 100644
--- a/Pdf4QtViewerPlugins/RedactPlugin/redactplugin.cpp
+++ b/Pdf4QtViewerPlugins/RedactPlugin/redactplugin.cpp
@@ -16,8 +16,11 @@
// along with Pdf4Qt. If not, see .
#include "redactplugin.h"
+#include "selectpagestoredactdialog.h"
+
#include "pdfdrawwidget.h"
#include "pdfadvancedtools.h"
+#include "pdfdocumentbuilder.h"
#include
@@ -60,6 +63,9 @@ void RedactPlugin::setWidget(pdf::PDFWidget* widget)
toolManager->addTool(redactRectangleTool);
toolManager->addTool(redactTextTool);
+ connect(m_actionRedactPage, &QAction::triggered, this, &RedactPlugin::onRedactPageTriggered);
+ connect(m_actionCreateRedactedDocument, &QAction::triggered, this, &RedactPlugin::onCreateRedactedDocumentTriggered);
+
updateActions();
}
@@ -84,4 +90,41 @@ void RedactPlugin::updateActions()
m_actionCreateRedactedDocument->setEnabled(m_document);
}
+void RedactPlugin::onRedactPageTriggered()
+{
+ pdfplugin::SelectPagesToRedactDialog dialog(m_document->getCatalog()->getPageCount(), m_widget->getDrawWidget()->getCurrentPages(), m_widget);
+ if (dialog.exec() == QDialog::Accepted)
+ {
+ std::vector selectedPages = dialog.getSelectedPages();
+
+ if (selectedPages.empty())
+ {
+ // Jakub Melka: no pages are selected, just return
+ return;
+ }
+
+ pdf::PDFDocumentModifier modifier(m_document);
+
+ for (pdf::PDFInteger pageIndex : selectedPages)
+ {
+ const pdf::PDFPage* page = m_document->getCatalog()->getPage(pageIndex - 1);
+ pdf::PDFObjectReference pageReference = page->getPageReference();
+ pdf::PDFObjectReference annotation = modifier.getBuilder()->createAnnotationRedact(pageReference, page->getMediaBox(), Qt::black);
+ modifier.getBuilder()->updateAnnotationAppearanceStreams(annotation);
+ }
+
+ modifier.markAnnotationsChanged();
+
+ if (modifier.finalize())
+ {
+ emit m_widget->getToolManager()->documentModified(pdf::PDFModifiedDocument(modifier.getDocument(), nullptr, modifier.getFlags()));
+ }
+ }
+}
+
+void RedactPlugin::onCreateRedactedDocumentTriggered()
+{
+
+}
+
}
diff --git a/Pdf4QtViewerPlugins/RedactPlugin/redactplugin.h b/Pdf4QtViewerPlugins/RedactPlugin/redactplugin.h
index 78be1dc..18445f3 100644
--- a/Pdf4QtViewerPlugins/RedactPlugin/redactplugin.h
+++ b/Pdf4QtViewerPlugins/RedactPlugin/redactplugin.h
@@ -43,6 +43,9 @@ public:
private:
void updateActions();
+ void onRedactPageTriggered();
+ void onCreateRedactedDocumentTriggered();
+
QAction* m_actionRedactRectangle;
QAction* m_actionRedactText;
QAction* m_actionRedactPage;
diff --git a/Pdf4QtViewerPlugins/RedactPlugin/selectpagestoredactdialog.cpp b/Pdf4QtViewerPlugins/RedactPlugin/selectpagestoredactdialog.cpp
new file mode 100644
index 0000000..8588258
--- /dev/null
+++ b/Pdf4QtViewerPlugins/RedactPlugin/selectpagestoredactdialog.cpp
@@ -0,0 +1,128 @@
+// Copyright (C) 2020 Jakub Melka
+//
+// This file is part of Pdf4Qt.
+//
+// Pdf4Qt is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Pdf4Qt 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 Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with Pdf4Qt. If not, see .
+
+#include "selectpagestoredactdialog.h"
+#include "ui_selectpagestoredactdialog.h"
+
+#include "pdfwidgetutils.h"
+
+#include
+
+namespace pdfplugin
+{
+
+SelectPagesToRedactDialog::SelectPagesToRedactDialog(pdf::PDFInteger pageCount, const std::vector& visiblePages, QWidget* parent) :
+ QDialog(parent),
+ ui(new Ui::SelectPagesToRedactDialog),
+ m_pageCount(pageCount),
+ m_visiblePages(visiblePages)
+{
+ ui->setupUi(this);
+
+ for (pdf::PDFInteger& pageIndex : m_visiblePages)
+ {
+ ++pageIndex;
+ }
+
+ m_evenPages.reserve(pageCount / 2);
+ m_oddPages.reserve(pageCount / 2 + 1);
+
+ for (pdf::PDFInteger i = 1; i <= pageCount; ++i)
+ {
+ if (i % 2 == 1)
+ {
+ m_oddPages.push_back(i);
+ }
+ else
+ {
+ m_evenPages.push_back(i);
+ }
+ }
+
+ connect(ui->customPageRangeRadioButton, &QRadioButton::toggled, this, &SelectPagesToRedactDialog::updateUi);
+
+ setMinimumWidth(pdf::PDFWidgetUtils::scaleDPI_x(this, 400));
+ updateUi();
+}
+
+SelectPagesToRedactDialog::~SelectPagesToRedactDialog()
+{
+ delete ui;
+}
+
+std::vector SelectPagesToRedactDialog::getSelectedPages() const
+{
+ std::vector result;
+
+ if (ui->visiblePagesRadioButton->isChecked())
+ {
+ result = m_visiblePages;
+ }
+ else if (ui->allPagesRadioButton->isChecked())
+ {
+ result.resize(m_pageCount, 0);
+ std::iota(result.begin(), result.end(), 1);
+ }
+ else if (ui->evenPagesRadioButton->isChecked())
+ {
+ result = m_evenPages;
+ }
+ else if (ui->oddPagesRadioButton->isChecked())
+ {
+ result = m_oddPages;
+ }
+ else if (ui->customPageRangeRadioButton->isChecked())
+ {
+ QString errorMessage;
+ result = pdf::PDFClosedIntervalSet::parse(1, m_pageCount, ui->customPageRangeEdit->text(), &errorMessage).unfold();
+ }
+ else
+ {
+ Q_ASSERT(false);
+ }
+
+ return result;
+}
+
+void SelectPagesToRedactDialog::updateUi()
+{
+ ui->customPageRangeEdit->setEnabled(ui->customPageRangeRadioButton->isChecked());
+}
+
+void SelectPagesToRedactDialog::accept()
+{
+ if (ui->customPageRangeRadioButton->isChecked())
+ {
+ QString errorMessage;
+ pdf::PDFClosedIntervalSet::parse(1, m_pageCount, ui->customPageRangeEdit->text(), &errorMessage);
+ if (!errorMessage.isEmpty())
+ {
+ QMessageBox::critical(this, tr("Error"), errorMessage);
+ return;
+ }
+ }
+
+ if (getSelectedPages().empty())
+ {
+ QMessageBox::critical(this, tr("Error"), tr("Selected page range is empty."));
+ return;
+ }
+
+ QDialog::accept();
+}
+
+} // namespace pdfplugin
diff --git a/Pdf4QtViewerPlugins/RedactPlugin/selectpagestoredactdialog.h b/Pdf4QtViewerPlugins/RedactPlugin/selectpagestoredactdialog.h
new file mode 100644
index 0000000..62f7644
--- /dev/null
+++ b/Pdf4QtViewerPlugins/RedactPlugin/selectpagestoredactdialog.h
@@ -0,0 +1,59 @@
+// Copyright (C) 2020 Jakub Melka
+//
+// This file is part of Pdf4Qt.
+//
+// Pdf4Qt is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Pdf4Qt 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 Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with Pdf4Qt. If not, see .
+
+#ifndef SELECTPAGESTOREDACTDIALOG_H
+#define SELECTPAGESTOREDACTDIALOG_H
+
+#include "pdfutils.h"
+
+#include
+
+namespace Ui
+{
+class SelectPagesToRedactDialog;
+}
+
+namespace pdfplugin
+{
+
+class SelectPagesToRedactDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit SelectPagesToRedactDialog(pdf::PDFInteger pageCount, const std::vector& visiblePages, QWidget* parent);
+ virtual ~SelectPagesToRedactDialog() override;
+
+ virtual void accept() override;
+
+ std::vector getSelectedPages() const;
+
+private:
+ void updateUi();
+
+ Ui::SelectPagesToRedactDialog* ui;
+ pdf::PDFInteger m_pageCount;
+ std::vector m_visiblePages;
+ std::vector m_evenPages;
+ std::vector m_oddPages;
+
+
+};
+
+} // namespace pdfplugin
+
+#endif // SELECTPAGESTOREDACTDIALOG_H
diff --git a/Pdf4QtViewerPlugins/RedactPlugin/selectpagestoredactdialog.ui b/Pdf4QtViewerPlugins/RedactPlugin/selectpagestoredactdialog.ui
new file mode 100644
index 0000000..6559f15
--- /dev/null
+++ b/Pdf4QtViewerPlugins/RedactPlugin/selectpagestoredactdialog.ui
@@ -0,0 +1,127 @@
+
+
+ SelectPagesToRedactDialog
+
+
+
+ 0
+ 0
+ 400
+ 218
+
+
+
+ Redact Pages
+
+
+ -
+
+
+ Page Range to be Redacted
+
+
+
-
+
+
+ All pages
+
+
+
+ -
+
+
+ -
+
+
+ Even pages
+
+
+
+ -
+
+
+ Odd pages
+
+
+
+ -
+
+
+ Custom page range:
+
+
+
+ -
+
+
+ Visible pages
+
+
+ true
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+
+
+
+
+
+ buttonBox
+ accepted()
+ SelectPagesToRedactDialog
+ accept()
+
+
+ 248
+ 254
+
+
+ 157
+ 274
+
+
+
+
+ buttonBox
+ rejected()
+ SelectPagesToRedactDialog
+ reject()
+
+
+ 316
+ 260
+
+
+ 286
+ 274
+
+
+
+
+