vcl/qa/cppunit/pdfexport/data/pdf-image-annots.odg |binary vcl/qa/cppunit/pdfexport/pdfexport.cxx | 20 ++++++++++++++++++++ vcl/source/gdi/pdfwriter_impl.cxx | 16 ++++++++++++++-- 3 files changed, 34 insertions(+), 2 deletions(-)
New commits: commit 63dba12b779dd4d007c8cb8cf4b967bd78077cac Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Wed Mar 9 13:36:27 2022 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Wed Mar 9 17:11:49 2022 +0100 PDF export of PDF images: don't preserve annotations in general Regression from 33c9bc0225a92f26770f9ef20b252af47853e7b9 (PDF export of PDF images: preserve hyperlinks, 2022-01-07), the problem was that we want to preserve hyperlinks, but annotations are added by the PDF export explicitly, so it isn't a good idea to "preserve" them as well. Fix the problem by going back to the old behavior, except when the annotation sub-type is /Link. This keeps hyperlinks working but doesn't lead to duplicated comments when re-exporting an image + adding comments explicitly. Change-Id: I910990da59bdc1150cc346f1a5471cb6da55dd2c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131243 Reviewed-by: Miklos Vajna <vmik...@collabora.com> Tested-by: Jenkins diff --git a/vcl/qa/cppunit/pdfexport/data/pdf-image-annots.odg b/vcl/qa/cppunit/pdfexport/data/pdf-image-annots.odg new file mode 100644 index 000000000000..6dee0145c536 Binary files /dev/null and b/vcl/qa/cppunit/pdfexport/data/pdf-image-annots.odg differ diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx b/vcl/qa/cppunit/pdfexport/pdfexport.cxx index e7f2354b9118..0ebf70becdb3 100644 --- a/vcl/qa/cppunit/pdfexport/pdfexport.cxx +++ b/vcl/qa/cppunit/pdfexport/pdfexport.cxx @@ -3148,6 +3148,26 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testURIs) CPPUNIT_ASSERT_EQUAL(URIs[i].out, pURIElem->GetValue()); } } + +CPPUNIT_TEST_FIXTURE(PdfExportTest, testPdfImageAnnots) +{ + // Given a document with a PDF image that has 2 comments (popup, text) and a hyperlink: + aMediaDescriptor["FilterName"] <<= OUString("draw_pdf_Export"); + + // When saving to PDF: + saveAsPDF(u"pdf-image-annots.odg"); + + // Then make sure only the hyperlink is kept, since Draw itself has its own comments: + std::unique_ptr<vcl::pdf::PDFiumDocument> pPdfDocument = parseExport(); + CPPUNIT_ASSERT(pPdfDocument); + std::unique_ptr<vcl::pdf::PDFiumPage> pPdfPage = pPdfDocument->openPage(/*nIndex=*/0); + CPPUNIT_ASSERT(pPdfPage); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 3 + // i.e. not only the hyperlink but also the 2 comments were exported, leading to duplication. + CPPUNIT_ASSERT_EQUAL(1, pPdfPage->getAnnotationCount()); +} } // end anonymous namespace CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx index 51291604fe51..6477163c1b78 100644 --- a/vcl/source/gdi/pdfwriter_impl.cxx +++ b/vcl/source/gdi/pdfwriter_impl.cxx @@ -8440,7 +8440,7 @@ void PDFWriterImpl::writeReferenceXObject(const ReferenceXObjectEmit& rEmit) return; } - // Merge page annotations (links, etc) from pPage to our page. + // Merge link annotations from pPage to our page. std::vector<filter::PDFObjectElement*> aAnnots; if (auto pArray = dynamic_cast<filter::PDFArrayElement*>(pPage->Lookup("Annots"))) { @@ -8458,7 +8458,19 @@ void PDFWriterImpl::writeReferenceXObject(const ReferenceXObjectEmit& rEmit) continue; } - // Annotation refers to an object, remember it. + auto pType = dynamic_cast<filter::PDFNameElement*>(pObject->Lookup("Type")); + if (!pType || pType->GetValue() != "Annot") + { + continue; + } + + auto pSubtype = dynamic_cast<filter::PDFNameElement*>(pObject->Lookup("Subtype")); + if (!pSubtype || pSubtype->GetValue() != "Link") + { + continue; + } + + // Reference to a link annotation object, remember it. aAnnots.push_back(pObject); } }