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 + + + + +