diff options
-rw-r--r-- | include/vcl/filter/PDFiumLibrary.hxx | 2 | ||||
-rw-r--r-- | include/vcl/pdf/PDFAnnotationMarker.hxx | 2 | ||||
-rw-r--r-- | vcl/qa/cppunit/PDFiumLibraryTest.cxx | 58 | ||||
-rwxr-xr-x | vcl/qa/cppunit/data/Annotations_Adobe_FreeText.pdf | bin | 0 -> 251638 bytes | |||
-rw-r--r-- | vcl/source/filter/ipdf/pdfread.cxx | 10 |
5 files changed, 72 insertions, 0 deletions
diff --git a/include/vcl/filter/PDFiumLibrary.hxx b/include/vcl/filter/PDFiumLibrary.hxx index d90da7286020..e008a502be58 100644 --- a/include/vcl/filter/PDFiumLibrary.hxx +++ b/include/vcl/filter/PDFiumLibrary.hxx @@ -46,6 +46,8 @@ inline constexpr OString constDictionaryKeyContents = "Contents"_ostr; inline constexpr OString constDictionaryKeyPopup = "Popup"_ostr; inline constexpr OString constDictionaryKeyModificationDate = "M"_ostr; inline constexpr OString constDictionaryKeyInteriorColor = "IC"_ostr; +inline constexpr OString constDictionaryKey_DefaultStyle = "DS"_ostr; +inline constexpr OString constDictionaryKey_RichContent = "RC"_ostr; class PDFiumBitmap; class PDFiumDocument; diff --git a/include/vcl/pdf/PDFAnnotationMarker.hxx b/include/vcl/pdf/PDFAnnotationMarker.hxx index d1217c65c3af..0c559a4cedae 100644 --- a/include/vcl/pdf/PDFAnnotationMarker.hxx +++ b/include/vcl/pdf/PDFAnnotationMarker.hxx @@ -37,6 +37,8 @@ struct VCL_DLLPUBLIC PDFAnnotationMarkerStamp : public PDFAnnotationMarker /** Free text annotation marker - showing text of the annotation in the document */ struct VCL_DLLPUBLIC PDFAnnotationMarkerFreeText : public PDFAnnotationMarker { + OUString maDefaultStyle; + OUString maRichContent; }; struct VCL_DLLPUBLIC PDFAnnotationMarkerCircle : public PDFAnnotationMarker diff --git a/vcl/qa/cppunit/PDFiumLibraryTest.cxx b/vcl/qa/cppunit/PDFiumLibraryTest.cxx index d11c66bae323..df65a6450ca0 100644 --- a/vcl/qa/cppunit/PDFiumLibraryTest.cxx +++ b/vcl/qa/cppunit/PDFiumLibraryTest.cxx @@ -412,6 +412,64 @@ CPPUNIT_TEST_FIXTURE(PDFiumLibraryTest, testAnnotationsDifferentTypes) } } +CPPUNIT_TEST_FIXTURE(PDFiumLibraryTest, testAnnotationsFreeText) +{ + OUString aURL = getFullUrl(u"Annotations_Adobe_FreeText.pdf"); + SvFileStream aStream(aURL, StreamMode::READ); + + std::vector<vcl::PDFGraphicResult> aResults; + CPPUNIT_ASSERT_EQUAL(size_t(1), vcl::ImportPDFUnloaded(aURL, aResults)); + + vcl::PDFGraphicResult& rResult = aResults[0]; + + Graphic aGraphic = rResult.GetGraphic(); + aGraphic.makeAvailable(); + + OUString aDefaultStyle; + OUString aRichContent; + + { + auto pVectorGraphicData = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT(pVectorGraphicData); + CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Pdf, pVectorGraphicData->getType()); + + auto& rDataContainer = pVectorGraphicData->getBinaryDataContainer(); + + auto pPdfium = vcl::pdf::PDFiumLibrary::get(); + auto pDocument + = pPdfium->openDocument(rDataContainer.getData(), rDataContainer.getSize(), OString()); + CPPUNIT_ASSERT(pDocument); + + CPPUNIT_ASSERT_EQUAL(1, pDocument->getPageCount()); + + auto pPage = pDocument->openPage(0); + CPPUNIT_ASSERT(pPage); + + CPPUNIT_ASSERT_EQUAL(1, pPage->getAnnotationCount()); + + auto pAnnotation = pPage->getAnnotation(0); + CPPUNIT_ASSERT(pAnnotation); + CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::FreeText, pAnnotation->getSubType()); + + aDefaultStyle = pAnnotation->getString(vcl::pdf::constDictionaryKey_DefaultStyle); + CPPUNIT_ASSERT_EQUAL(false, aDefaultStyle.isEmpty()); + + aRichContent = pAnnotation->getString(vcl::pdf::constDictionaryKey_RichContent); + CPPUNIT_ASSERT_EQUAL(false, aRichContent.isEmpty()); + } + + auto const& rAnnotations = rResult.GetAnnotations(); + CPPUNIT_ASSERT_EQUAL(size_t(1), rAnnotations.size()); + + CPPUNIT_ASSERT_EQUAL(vcl::pdf::PDFAnnotationSubType::FreeText, rAnnotations[0].meSubType); + + auto* pMarker + = static_cast<vcl::pdf::PDFAnnotationMarkerFreeText*>(rAnnotations[0].mpMarker.get()); + + CPPUNIT_ASSERT_EQUAL(aDefaultStyle, pMarker->maDefaultStyle); + CPPUNIT_ASSERT_EQUAL(aRichContent, pMarker->maRichContent); +} + CPPUNIT_TEST_FIXTURE(PDFiumLibraryTest, testTools) { OUString sConverted = vcl::pdf::convertPdfDateToISO8601(u"D:20200612201322+02'00"); diff --git a/vcl/qa/cppunit/data/Annotations_Adobe_FreeText.pdf b/vcl/qa/cppunit/data/Annotations_Adobe_FreeText.pdf Binary files differnew file mode 100755 index 000000000000..32cb3a6cbc31 --- /dev/null +++ b/vcl/qa/cppunit/data/Annotations_Adobe_FreeText.pdf diff --git a/vcl/source/filter/ipdf/pdfread.cxx b/vcl/source/filter/ipdf/pdfread.cxx index c7cf5794dffa..c60e8bb4a792 100644 --- a/vcl/source/filter/ipdf/pdfread.cxx +++ b/vcl/source/filter/ipdf/pdfread.cxx @@ -329,6 +329,16 @@ findAnnotations(const std::unique_ptr<vcl::pdf::PDFiumPage>& pPage, basegfx::B2D { auto pMarker = std::make_shared<vcl::pdf::PDFAnnotationMarkerFreeText>(); rPDFGraphicAnnotation.mpMarker = pMarker; + if (pAnnotation->hasKey(vcl::pdf::constDictionaryKey_DefaultStyle)) + { + pMarker->maDefaultStyle + = pAnnotation->getString(vcl::pdf::constDictionaryKey_DefaultStyle); + } + if (pAnnotation->hasKey(vcl::pdf::constDictionaryKey_RichContent)) + { + pMarker->maRichContent + = pAnnotation->getString(vcl::pdf::constDictionaryKey_RichContent); + } } else if (eSubtype == vcl::pdf::PDFAnnotationSubType::Stamp) { |