File indexing completed on 2024-05-19 04:35:20
0001 /* 0002 SPDX-FileCopyrightText: 2007 Pino Toscano <pino@kde.org> 0003 SPDX-FileCopyrightText: 2018 Intevation GmbH <intevation@intevation.de> 0004 SPDX-FileCopyrightText: 2019 Oliver Sander <oliver.sander@tu-dresden.de> 0005 0006 SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 #include "formfields.h" 0010 0011 #include "core/action.h" 0012 0013 #include "generator_pdf.h" 0014 #include "pdfsettings.h" 0015 #include "pdfsignatureutils.h" 0016 0017 #include <poppler-qt6.h> 0018 0019 extern Okular::Action *createLinkFromPopplerLink(const Poppler::Link *popplerLink, bool deletePopplerLink); 0020 #define SET_ANNOT_ACTIONS \ 0021 setAdditionalAction(Okular::Annotation::CursorEntering, createLinkFromPopplerLink(m_field->additionalAction(Poppler::Annotation::CursorEnteringAction).get(), false)); \ 0022 setAdditionalAction(Okular::Annotation::CursorLeaving, createLinkFromPopplerLink(m_field->additionalAction(Poppler::Annotation::CursorLeavingAction).get(), false)); \ 0023 setAdditionalAction(Okular::Annotation::MousePressed, createLinkFromPopplerLink(m_field->additionalAction(Poppler::Annotation::MousePressedAction).get(), false)); \ 0024 setAdditionalAction(Okular::Annotation::MouseReleased, createLinkFromPopplerLink(m_field->additionalAction(Poppler::Annotation::MouseReleasedAction).get(), false)); \ 0025 setAdditionalAction(Okular::Annotation::FocusIn, createLinkFromPopplerLink(m_field->additionalAction(Poppler::Annotation::FocusInAction).get(), false)); \ 0026 setAdditionalAction(Okular::Annotation::FocusOut, createLinkFromPopplerLink(m_field->additionalAction(Poppler::Annotation::FocusOutAction).get(), false)); 0027 0028 #define SET_ACTIONS \ 0029 setActivationAction(createLinkFromPopplerLink(m_field->activationAction().get(), false)); \ 0030 setAdditionalAction(Okular::FormField::FieldModified, createLinkFromPopplerLink(m_field->additionalAction(Poppler::FormField::FieldModified).get(), false)); \ 0031 setAdditionalAction(Okular::FormField::FormatField, createLinkFromPopplerLink(m_field->additionalAction(Poppler::FormField::FormatField).get(), false)); \ 0032 setAdditionalAction(Okular::FormField::ValidateField, createLinkFromPopplerLink(m_field->additionalAction(Poppler::FormField::ValidateField).get(), false)); \ 0033 setAdditionalAction(Okular::FormField::CalculateField, createLinkFromPopplerLink(m_field->additionalAction(Poppler::FormField::CalculateField).get(), false)); \ 0034 SET_ANNOT_ACTIONS 0035 0036 PopplerFormFieldButton::PopplerFormFieldButton(std::unique_ptr<Poppler::FormFieldButton> field) 0037 : Okular::FormFieldButton() 0038 , m_field(std::move(field)) 0039 { 0040 m_rect = Okular::NormalizedRect::fromQRectF(m_field->rect()); 0041 m_id = m_field->id(); 0042 SET_ACTIONS 0043 } 0044 0045 Okular::NormalizedRect PopplerFormFieldButton::rect() const 0046 { 0047 return m_rect; 0048 } 0049 0050 int PopplerFormFieldButton::id() const 0051 { 0052 return m_id; 0053 } 0054 0055 QString PopplerFormFieldButton::name() const 0056 { 0057 return m_field->name(); 0058 } 0059 0060 QString PopplerFormFieldButton::uiName() const 0061 { 0062 return m_field->uiName(); 0063 } 0064 0065 QString PopplerFormFieldButton::fullyQualifiedName() const 0066 { 0067 return m_field->fullyQualifiedName(); 0068 } 0069 0070 bool PopplerFormFieldButton::isReadOnly() const 0071 { 0072 return m_field->isReadOnly(); 0073 } 0074 0075 void PopplerFormFieldButton::setReadOnly(bool value) 0076 { 0077 m_field->setReadOnly(value); 0078 } 0079 0080 bool PopplerFormFieldButton::isVisible() const 0081 { 0082 return m_field->isVisible(); 0083 } 0084 0085 void PopplerFormFieldButton::setVisible(bool value) 0086 { 0087 m_field->setVisible(value); 0088 } 0089 0090 bool PopplerFormFieldButton::isPrintable() const 0091 { 0092 return m_field->isPrintable(); 0093 } 0094 0095 void PopplerFormFieldButton::setPrintable(bool value) 0096 { 0097 m_field->setPrintable(value); 0098 } 0099 0100 Okular::FormFieldButton::ButtonType PopplerFormFieldButton::buttonType() const 0101 { 0102 switch (m_field->buttonType()) { 0103 case Poppler::FormFieldButton::Push: 0104 return Okular::FormFieldButton::Push; 0105 case Poppler::FormFieldButton::CheckBox: 0106 return Okular::FormFieldButton::CheckBox; 0107 case Poppler::FormFieldButton::Radio: 0108 return Okular::FormFieldButton::Radio; 0109 } 0110 return Okular::FormFieldButton::Push; 0111 } 0112 0113 QString PopplerFormFieldButton::caption() const 0114 { 0115 return m_field->caption(); 0116 } 0117 0118 bool PopplerFormFieldButton::state() const 0119 { 0120 return m_field->state(); 0121 } 0122 0123 void PopplerFormFieldButton::setState(bool state) 0124 { 0125 m_field->setState(state); 0126 } 0127 0128 QList<int> PopplerFormFieldButton::siblings() const 0129 { 0130 return m_field->siblings(); 0131 } 0132 0133 Poppler::FormFieldIcon PopplerFormFieldButton::icon() const 0134 { 0135 return m_field->icon(); 0136 } 0137 0138 void PopplerFormFieldButton::setIcon(Okular::FormField *field) 0139 { 0140 if (field->type() == Okular::FormField::FormButton) { 0141 PopplerFormFieldButton *button = static_cast<PopplerFormFieldButton *>(field); 0142 m_field->setIcon(button->icon()); 0143 } 0144 } 0145 0146 PopplerFormFieldText::PopplerFormFieldText(std::unique_ptr<Poppler::FormFieldText> field) 0147 : Okular::FormFieldText() 0148 , m_field(std::move(field)) 0149 { 0150 m_rect = Okular::NormalizedRect::fromQRectF(m_field->rect()); 0151 m_id = m_field->id(); 0152 SET_ACTIONS 0153 } 0154 0155 Okular::NormalizedRect PopplerFormFieldText::rect() const 0156 { 0157 return m_rect; 0158 } 0159 0160 int PopplerFormFieldText::id() const 0161 { 0162 return m_id; 0163 } 0164 0165 QString PopplerFormFieldText::name() const 0166 { 0167 return m_field->name(); 0168 } 0169 0170 QString PopplerFormFieldText::uiName() const 0171 { 0172 return m_field->uiName(); 0173 } 0174 0175 QString PopplerFormFieldText::fullyQualifiedName() const 0176 { 0177 return m_field->fullyQualifiedName(); 0178 } 0179 0180 bool PopplerFormFieldText::isReadOnly() const 0181 { 0182 return m_field->isReadOnly(); 0183 } 0184 0185 void PopplerFormFieldText::setReadOnly(bool value) 0186 { 0187 m_field->setReadOnly(value); 0188 } 0189 0190 bool PopplerFormFieldText::isVisible() const 0191 { 0192 return m_field->isVisible(); 0193 } 0194 0195 void PopplerFormFieldText::setVisible(bool value) 0196 { 0197 m_field->setVisible(value); 0198 } 0199 0200 bool PopplerFormFieldText::isPrintable() const 0201 { 0202 return m_field->isPrintable(); 0203 } 0204 0205 void PopplerFormFieldText::setPrintable(bool value) 0206 { 0207 m_field->setPrintable(value); 0208 } 0209 0210 Okular::FormFieldText::TextType PopplerFormFieldText::textType() const 0211 { 0212 switch (m_field->textType()) { 0213 case Poppler::FormFieldText::Normal: 0214 return Okular::FormFieldText::Normal; 0215 case Poppler::FormFieldText::Multiline: 0216 return Okular::FormFieldText::Multiline; 0217 case Poppler::FormFieldText::FileSelect: 0218 return Okular::FormFieldText::FileSelect; 0219 } 0220 return Okular::FormFieldText::Normal; 0221 } 0222 0223 QString PopplerFormFieldText::text() const 0224 { 0225 return m_field->text(); 0226 } 0227 0228 void PopplerFormFieldText::setText(const QString &text) 0229 { 0230 m_field->setText(text); 0231 } 0232 0233 void PopplerFormFieldText::setAppearanceText(const QString &text) 0234 { 0235 m_field->setAppearanceText(text); 0236 } 0237 0238 bool PopplerFormFieldText::isPassword() const 0239 { 0240 return m_field->isPassword(); 0241 } 0242 0243 bool PopplerFormFieldText::isRichText() const 0244 { 0245 return m_field->isRichText(); 0246 } 0247 0248 int PopplerFormFieldText::maximumLength() const 0249 { 0250 return m_field->maximumLength(); 0251 } 0252 0253 Qt::Alignment PopplerFormFieldText::textAlignment() const 0254 { 0255 return Qt::AlignTop | m_field->textAlignment(); 0256 } 0257 0258 bool PopplerFormFieldText::canBeSpellChecked() const 0259 { 0260 return m_field->canBeSpellChecked(); 0261 } 0262 0263 PopplerFormFieldChoice::PopplerFormFieldChoice(std::unique_ptr<Poppler::FormFieldChoice> field) 0264 : Okular::FormFieldChoice() 0265 , m_field(std::move(field)) 0266 { 0267 m_rect = Okular::NormalizedRect::fromQRectF(m_field->rect()); 0268 m_id = m_field->id(); 0269 SET_ACTIONS 0270 0271 QMap<QString, QString> values; 0272 const auto fieldChoicesWithExportValues = m_field->choicesWithExportValues(); 0273 for (const QPair<QString, QString> &value : fieldChoicesWithExportValues) { 0274 values.insert(value.first, value.second); 0275 } 0276 setExportValues(values); 0277 } 0278 0279 Okular::NormalizedRect PopplerFormFieldChoice::rect() const 0280 { 0281 return m_rect; 0282 } 0283 0284 int PopplerFormFieldChoice::id() const 0285 { 0286 return m_id; 0287 } 0288 0289 QString PopplerFormFieldChoice::name() const 0290 { 0291 return m_field->name(); 0292 } 0293 0294 QString PopplerFormFieldChoice::uiName() const 0295 { 0296 return m_field->uiName(); 0297 } 0298 0299 QString PopplerFormFieldChoice::fullyQualifiedName() const 0300 { 0301 return m_field->fullyQualifiedName(); 0302 } 0303 0304 bool PopplerFormFieldChoice::isReadOnly() const 0305 { 0306 return m_field->isReadOnly(); 0307 } 0308 0309 void PopplerFormFieldChoice::setReadOnly(bool value) 0310 { 0311 m_field->setReadOnly(value); 0312 } 0313 0314 bool PopplerFormFieldChoice::isVisible() const 0315 { 0316 return m_field->isVisible(); 0317 } 0318 0319 void PopplerFormFieldChoice::setVisible(bool value) 0320 { 0321 m_field->setVisible(value); 0322 } 0323 0324 bool PopplerFormFieldChoice::isPrintable() const 0325 { 0326 return m_field->isPrintable(); 0327 } 0328 0329 void PopplerFormFieldChoice::setPrintable(bool value) 0330 { 0331 m_field->setPrintable(value); 0332 } 0333 0334 Okular::FormFieldChoice::ChoiceType PopplerFormFieldChoice::choiceType() const 0335 { 0336 switch (m_field->choiceType()) { 0337 case Poppler::FormFieldChoice::ComboBox: 0338 return Okular::FormFieldChoice::ComboBox; 0339 case Poppler::FormFieldChoice::ListBox: 0340 return Okular::FormFieldChoice::ListBox; 0341 } 0342 return Okular::FormFieldChoice::ListBox; 0343 } 0344 0345 QStringList PopplerFormFieldChoice::choices() const 0346 { 0347 return m_field->choices(); 0348 } 0349 0350 bool PopplerFormFieldChoice::isEditable() const 0351 { 0352 return m_field->isEditable(); 0353 } 0354 0355 bool PopplerFormFieldChoice::multiSelect() const 0356 { 0357 return m_field->multiSelect(); 0358 } 0359 0360 QList<int> PopplerFormFieldChoice::currentChoices() const 0361 { 0362 return m_field->currentChoices(); 0363 } 0364 0365 void PopplerFormFieldChoice::setCurrentChoices(const QList<int> &choices) 0366 { 0367 m_field->setCurrentChoices(choices); 0368 } 0369 0370 QString PopplerFormFieldChoice::editChoice() const 0371 { 0372 return m_field->editChoice(); 0373 } 0374 0375 void PopplerFormFieldChoice::setEditChoice(const QString &text) 0376 { 0377 m_field->setEditChoice(text); 0378 } 0379 0380 Qt::Alignment PopplerFormFieldChoice::textAlignment() const 0381 { 0382 return Qt::AlignTop | m_field->textAlignment(); 0383 } 0384 0385 bool PopplerFormFieldChoice::canBeSpellChecked() const 0386 { 0387 return m_field->canBeSpellChecked(); 0388 } 0389 0390 PopplerFormFieldSignature::PopplerFormFieldSignature(std::unique_ptr<Poppler::FormFieldSignature> field) 0391 : Okular::FormFieldSignature() 0392 , m_field(std::move(field)) 0393 { 0394 m_rect = Okular::NormalizedRect::fromQRectF(m_field->rect()); 0395 m_id = m_field->id(); 0396 int validateOptions = Poppler::FormFieldSignature::ValidateVerifyCertificate; 0397 if (!PDFSettings::checkOCSPServers()) { 0398 validateOptions = validateOptions | Poppler::FormFieldSignature::ValidateWithoutOCSPRevocationCheck; 0399 } 0400 m_info = fromPoppler(m_field->validate(static_cast<Poppler::FormFieldSignature::ValidateOptions>(validateOptions))); 0401 SET_ACTIONS 0402 } 0403 0404 PopplerFormFieldSignature::~PopplerFormFieldSignature() = default; 0405 0406 Okular::NormalizedRect PopplerFormFieldSignature::rect() const 0407 { 0408 return m_rect; 0409 } 0410 0411 int PopplerFormFieldSignature::id() const 0412 { 0413 return m_id; 0414 } 0415 0416 QString PopplerFormFieldSignature::name() const 0417 { 0418 return m_field->name(); 0419 } 0420 0421 QString PopplerFormFieldSignature::uiName() const 0422 { 0423 return m_field->uiName(); 0424 } 0425 0426 QString PopplerFormFieldSignature::fullyQualifiedName() const 0427 { 0428 return m_field->fullyQualifiedName(); 0429 } 0430 0431 bool PopplerFormFieldSignature::isReadOnly() const 0432 { 0433 return m_field->isReadOnly(); 0434 } 0435 0436 bool PopplerFormFieldSignature::isVisible() const 0437 { 0438 return m_field->isVisible(); 0439 } 0440 0441 PopplerFormFieldSignature::SignatureType PopplerFormFieldSignature::signatureType() const 0442 { 0443 switch (m_field->signatureType()) { 0444 case Poppler::FormFieldSignature::AdbePkcs7sha1: 0445 return Okular::FormFieldSignature::AdbePkcs7sha1; 0446 case Poppler::FormFieldSignature::AdbePkcs7detached: 0447 return Okular::FormFieldSignature::AdbePkcs7detached; 0448 case Poppler::FormFieldSignature::EtsiCAdESdetached: 0449 return Okular::FormFieldSignature::EtsiCAdESdetached; 0450 case Poppler::FormFieldSignature::UnsignedSignature: 0451 return Okular::FormFieldSignature::UnsignedSignature; 0452 default: 0453 return Okular::FormFieldSignature::UnknownType; 0454 } 0455 } 0456 0457 Okular::SignatureInfo PopplerFormFieldSignature::signatureInfo() const 0458 { 0459 return m_info; 0460 } 0461 0462 bool PopplerFormFieldSignature::sign(const Okular::NewSignatureData &oData, const QString &newPath) const 0463 { 0464 Poppler::PDFConverter::NewSignatureData pData; 0465 PDFGenerator::okularToPoppler(oData, &pData); 0466 return m_field->sign(newPath, pData) == Poppler::FormFieldSignature::SigningSuccess; 0467 }