From 1f35ec9988eaf1ad3705655c434701d175c5b49f Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Mon, 22 Feb 2021 17:44:13 -0500 Subject: Add methods for copying form fields --- libqpdf/QPDFAcroFormDocumentHelper.cc | 47 ++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 14 deletions(-) (limited to 'libqpdf/QPDFAcroFormDocumentHelper.cc') diff --git a/libqpdf/QPDFAcroFormDocumentHelper.cc b/libqpdf/QPDFAcroFormDocumentHelper.cc index 84ddd432..dce413bd 100644 --- a/libqpdf/QPDFAcroFormDocumentHelper.cc +++ b/libqpdf/QPDFAcroFormDocumentHelper.cc @@ -132,6 +132,23 @@ QPDFAcroFormDocumentHelper::getWidgetAnnotationsForPage(QPDFPageObjectHelper h) return h.getAnnotations("/Widget"); } +std::vector +QPDFAcroFormDocumentHelper::getFormFieldsForPage(QPDFPageObjectHelper ph) +{ + std::vector result; + auto widget_annotations = getWidgetAnnotationsForPage(ph); + for (auto annot: widget_annotations) + { + auto field = getFieldForAnnotation(annot); + field = field.getTopLevelField(); + if (field.getObjectHandle().isDictionary()) + { + result.push_back(field); + } + } + return result; +} + QPDFFormFieldObjectHelper QPDFAcroFormDocumentHelper::getFieldForAnnotation(QPDFAnnotationObjectHelper h) { @@ -501,19 +518,8 @@ QPDFAcroFormDocumentHelper::transformAnnotations( // annotation and field separately in this case. have_field = true; // Find the top-level field. It may be the field itself. - top_field = ffield_oh; - std::set seen; - while (! top_field.getKey("/Parent").isNull()) - { - top_field = top_field.getKey("/Parent"); - have_parent = true; - auto og = top_field.getObjGen(); - if (seen.count(og)) - { - break; - } - seen.insert(og); - } + top_field = ffield.getTopLevelField( + &have_parent).getObjectHandle(); if (foreign) { // copyForeignObject returns the same value if called @@ -537,7 +543,7 @@ QPDFAcroFormDocumentHelper::transformAnnotations( { queue.push_back(top_field); } - seen.clear(); + std::set seen; while (! queue.empty()) { QPDFObjectHandle obj = queue.front(); @@ -664,3 +670,16 @@ QPDFAcroFormDocumentHelper::transformAnnotations( "/Rect", QPDFObjectHandle::newFromRectangle(rect)); } } + +void +QPDFAcroFormDocumentHelper::copyFieldsFromForeignPage( + QPDFPageObjectHelper foreign_page, + QPDFAcroFormDocumentHelper& foreign_afdh) +{ + for (auto field: foreign_afdh.getFormFieldsForPage(foreign_page)) + { + auto new_field = this->qpdf.copyForeignObject( + field.getObjectHandle()); + addFormField(new_field); + } +} -- cgit v1.2.3-54-g00ecf