Signature plugin: visible digital signatures

This commit is contained in:
Jakub Melka
2022-05-29 17:27:58 +02:00
parent c7e7b76e5b
commit b46ff4f63c
6 changed files with 380 additions and 117 deletions

View File

@ -4567,6 +4567,46 @@ PDFObjectReference PDFDocumentBuilder::createFormFieldSignature(QString fieldNam
}
void PDFDocumentBuilder::createFormFieldWidget(PDFObjectReference formField,
PDFObjectReference page,
PDFObjectReference appearanceStream,
QRectF rect)
{
PDFObjectFactory objectBuilder;
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("Type");
objectBuilder << WrapName("Annot");
objectBuilder.endDictionaryItem();
objectBuilder.beginDictionaryItem("Subtype");
objectBuilder << WrapName("Widget");
objectBuilder.endDictionaryItem();
objectBuilder.beginDictionaryItem("P");
objectBuilder << page;
objectBuilder.endDictionaryItem();
objectBuilder.beginDictionaryItem("Rect");
objectBuilder << rect;
objectBuilder.endDictionaryItem();
objectBuilder.beginDictionaryItem("AP");
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("N");
objectBuilder << appearanceStream;
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject widgetObject = objectBuilder.takeObject();
objectBuilder.beginDictionary();
objectBuilder.beginDictionaryItem("Annots");
objectBuilder << std::array{ formField };
objectBuilder.endDictionaryItem();
objectBuilder.endDictionary();
PDFObject pageObject = objectBuilder.takeObject();
mergeTo(formField, widgetObject);
appendTo(page, pageObject);
}
void PDFDocumentBuilder::createInvisibleFormFieldWidget(PDFObjectReference formField,
PDFObjectReference page)
{
@ -5131,6 +5171,14 @@ void PDFDocumentBuilder::setFormFieldValue(PDFObjectReference formField,
}
void PDFDocumentBuilder::setLanguage(QLocale locale)
{
PDFObjectFactory objectBuilder;
setLanguage(locale.name());
}
void PDFDocumentBuilder::setLanguage(QString language)
{
PDFObjectFactory objectBuilder;
@ -5145,14 +5193,6 @@ void PDFDocumentBuilder::setLanguage(QString language)
}
void PDFDocumentBuilder::setLanguage(QLocale locale)
{
PDFObjectFactory objectBuilder;
setLanguage(locale.name());
}
void PDFDocumentBuilder::setOutline(PDFObjectReference outline)
{
PDFObjectFactory objectBuilder;

View File

@ -92,7 +92,7 @@ struct WrapEmptyArray { };
/// Factory for creating various PDF objects, such as simple objects,
/// dictionaries, arrays etc.
class PDFObjectFactory
class PDF4QTLIBSHARED_EXPORT PDFObjectFactory
{
public:
inline explicit PDFObjectFactory() = default;
@ -1235,6 +1235,17 @@ public:
PDFObjectReference signatureValue);
/// Creates visible form field widget without contents.
/// \param formField Form field reference
/// \param page Page reference
/// \param appearanceStream Appearance stream
/// \param rect Widget rectangle
void createFormFieldWidget(PDFObjectReference formField,
PDFObjectReference page,
PDFObjectReference appearanceStream,
QRectF rect);
///
/// \param formField Form field reference
/// \param page Page reference
@ -1457,6 +1468,11 @@ public:
PDFObject value);
/// Set document language.
/// \param locale Locale, from which is language determined
void setLanguage(QLocale locale);
/// Set document language.
/// \param language Document language. It should be a language identifier, as defined in ISO 639
/// and ISO 3166. For example, "en-US", where first two letter means language code (en =
@ -1464,11 +1480,6 @@ public:
void setLanguage(QString language);
/// Set document language.
/// \param locale Locale, from which is language determined
void setLanguage(QLocale locale);
/// Set document outline.
/// \param outline Document outline root
void setOutline(PDFObjectReference outline);

View File

@ -889,6 +889,21 @@ std::set<PDFInteger> PDFPageContentScene::getPageIndices() const
return result;
}
QRectF PDFPageContentScene::getBoundingBox(PDFInteger pageIndex) const
{
QRectF rect;
for (const auto& element : m_elements)
{
if (element->getPageIndex() == pageIndex)
{
rect = rect.united(element->getBoundingBox());
}
}
return rect;
}
void PDFPageContentScene::setSelectedElementIds(const std::set<PDFInteger>& selectedElementIds)
{
m_manipulator.selectNew(selectedElementIds);

View File

@ -507,6 +507,9 @@ public:
/// Returns set of involved pages
std::set<PDFInteger> getPageIndices() const;
/// Returns bounding box of elements on page
QRectF getBoundingBox(PDFInteger pageIndex) const;
/// Set selected items
void setSelectedElementIds(const std::set<PDFInteger>& selectedElementIds);