From b12187cca8a86f8fe659deae17fbdda235c31fc2 Mon Sep 17 00:00:00 2001 From: Alexander Pliushchou Date: Sun, 19 May 2024 19:23:35 +0000 Subject: [PATCH] Fix copying empty optional content properties DEVSIX-8320 Autoported commit. Original commit hash: [5a76ecc3f] --- .../kernel/pdf/OcgPropertiesCopierTest.cs | 24 ++++++++++++++++++ .../itext/kernel/utils/PdfMergerTest.cs | 24 ++++++++++++++++++ .../cmp_mergedEmptyOcPropertiesDoc.pdf | Bin 0 -> 955 bytes .../cmp_mergedOcPropertiesDoc.pdf | Bin 0 -> 955 bytes .../PdfMergerTest/emptyOcPropertiesDoc.pdf | Bin 0 -> 1009 bytes .../utils/PdfMergerTest/ocPropertiesDoc.pdf | Bin 0 -> 1440 bytes .../itext/kernel/pdf/PdfDocument.cs | 4 ++- port-hash | 2 +- 8 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/cmp_mergedEmptyOcPropertiesDoc.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/cmp_mergedOcPropertiesDoc.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/emptyOcPropertiesDoc.pdf create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/ocPropertiesDoc.pdf diff --git a/itext.tests/itext.kernel.tests/itext/kernel/pdf/OcgPropertiesCopierTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/pdf/OcgPropertiesCopierTest.cs index ee54bb00ba..010021bf97 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/pdf/OcgPropertiesCopierTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/pdf/OcgPropertiesCopierTest.cs @@ -929,6 +929,30 @@ public virtual void CopyOcmdsFromFormXObjectRecursivelyTest() { OcgPropertiesCopierTest.CopyPagesAndAssertLayersName(names, fromDocBytes); } + [NUnit.Framework.Test] + public virtual void CopyEmptyOcgTest() { + byte[] fromDocBytes; + using (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + using (PdfDocument fromDocument = new PdfDocument(new PdfWriter(outputStream))) { + PdfDictionary DDic = new PdfDictionary(); + DDic.Put(PdfName.ON, new PdfArray()); + DDic.Put(PdfName.Order, new PdfArray()); + DDic.Put(PdfName.RBGroups, new PdfArray()); + PdfDictionary OcDic = new PdfDictionary(); + OcDic.Put(PdfName.D, DDic); + OcDic.Put(PdfName.OCGs, new PdfArray()); + fromDocument.GetCatalog().Put(PdfName.OCProperties, OcDic); + } + fromDocBytes = outputStream.ToArray(); + } + using (PdfDocument toDocument = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()))) { + using (PdfDocument fromDocument = new PdfDocument(new PdfReader(new MemoryStream(fromDocBytes)))) { + fromDocument.CopyPagesTo(1, 1, toDocument); + NUnit.Framework.Assert.IsNull(toDocument.GetCatalog().GetOCProperties(false)); + } + } + } + private static byte[] GetDocumentWithAllDFields() { byte[] fromDocBytes; using (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { diff --git a/itext.tests/itext.kernel.tests/itext/kernel/utils/PdfMergerTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/utils/PdfMergerTest.cs index cba860fb88..351b93865b 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/utils/PdfMergerTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/utils/PdfMergerTest.cs @@ -755,6 +755,30 @@ public virtual void MergeDocumentsWithNamesJSInDestination() { )); } + [NUnit.Framework.Test] + public virtual void CopyEmptyOcPropertiesTest() { + String filename = sourceFolder + "emptyOcPropertiesDoc.pdf"; + String resultFile = destinationFolder + "mergedEmptyOcPropertiesDoc.pdf"; + PdfDocument pdfDoc = new PdfDocument(new PdfReader(filename)); + PdfDocument result = new PdfDocument(CompareTool.CreateTestPdfWriter(resultFile)); + PdfMerger merger = new PdfMerger(result).SetCloseSourceDocuments(true); + merger.Merge(pdfDoc, 1, 1).Close(); + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(resultFile, sourceFolder + "cmp_mergedEmptyOcPropertiesDoc.pdf" + , destinationFolder, "diff_")); + } + + [NUnit.Framework.Test] + public virtual void CopyOnlyEmptyOcPropertiesTest() { + String filename = sourceFolder + "ocPropertiesDoc.pdf"; + String resultFile = destinationFolder + "mergedOcPropertiesDoc.pdf"; + PdfDocument pdfDoc = new PdfDocument(new PdfReader(filename)); + PdfDocument result = new PdfDocument(CompareTool.CreateTestPdfWriter(resultFile)); + PdfMerger merger = new PdfMerger(result).SetCloseSourceDocuments(true); + merger.Merge(pdfDoc, 1, 1).Close(); + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(resultFile, sourceFolder + "cmp_mergedOcPropertiesDoc.pdf" + , destinationFolder, "diff_")); + } + private PdfDictionary MergeSinglePdfAndGetResultingStructTreeRoot(String pathToMerge) { IList sources = new List(); sources.Add(new FileInfo(sourceFolder + pathToMerge)); diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/cmp_mergedEmptyOcPropertiesDoc.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/cmp_mergedEmptyOcPropertiesDoc.pdf new file mode 100644 index 0000000000000000000000000000000000000000..edeb20876c8d75db8b7e7619b89dab6f0ff6233c GIT binary patch literal 955 zcmc&y&2AGh5C(DEr|>0eBb2Ov)?P1)RtgCz75$0Qh)bG-*PacF(skwCpp<9f1-S4k z9C!nG5$q^5rIolc2h096p84kcrZXK+dZeF5ou9wH|A;uk$QB=?!62Sg>lR!*S*sSt zpsj)U4C+<;0m(dXS_kST+J1TQ%*XQxYO{y@Efh!&g+{h+p>7)#iqGP6FqL|3w+rl_ zJmW|vbQw>T^Ers_QfAQDjnmK!26-OOU3K#$e|~oh{?iKbJTwn2*@KpzU0d0D?71J0 zUr|gG%t?v~W;A<=*%8J^-T2&^e(=e?_o;q>b5W~~n z*_$%58?O?H-&Lkr1dV6Q_+E2PkAs1Ac5Ya%Bx=U7@D=EWQ9!=+|zy#NjFW z0x3>c@l^XzgXq3w29?|T9IC+}P2+_xZl2UH?rtG`T0@#P?LL=7@u_F3updaF!j!CbMWnA0lWGe8aWS0^>9yg=a<9j{O#2OUAKp) z({uC*d=&_RENR$Q;l@3H*S3_ZkBQ| zW#qPDOC)|*m}=SVc(#h~S5Y0m>^#^Aqa+Gi4uKLOm_Qc&!I%t&G=a){jML!CBaGs( z*+&>w>M2GZ^sButHsG5>Ivb!+#j`9)nBg-0 z{|Z*|S!o?=&U6;foC`kg(|Pe3P!har?a!>+Tv_+;D~qaH`+9FGmn3Sn-ds(h--~4h AKmY&$ literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/emptyOcPropertiesDoc.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/emptyOcPropertiesDoc.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a3de3f7b08ecd2c70a1b4722306ce24ecac95624 GIT binary patch literal 1009 zcmc&y!EO^V5Cw7Duka;mE0o&nwbwR^R%#OxD%vDUA}(nT8+*1aO4pIsK`GzD4{+gE zIPeGXBX~n-N-J??q}AF_<9RdhO>5lix8qY0wSN5k_C4Z=AiMk!bvn3Tt~@y0U*#Tp zpsfLX3Du2%k7SnB-a&pFZ9l(w7UFpXmDxk#)D&QcLS0*VsC53& ziW15Qj|Cx2Ch{dojtDtA!B^J&J7Mgs*=TUbW8M;0` z8;mc}M{so@ygor+C?TZXP@=Q7yQ={WoZYO^@ZHIw*Z9!us2gb3;C$K4i+kZ44d)9y zat2)ZPtJGm>-i#RG3pL}ADYqYy<9sjy1CC+_U1s*NV&JNYd1mL7{4t|J#U<{9 literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/ocPropertiesDoc.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/ocPropertiesDoc.pdf new file mode 100644 index 0000000000000000000000000000000000000000..729f745a1e87b2419bb648de775e91d7408bb3d4 GIT binary patch literal 1440 zcmc&!!H&}~5Cw6|SNKxV3U%YyacrY1($dmp#qPGsR$RJ0ILV|0wRPpBsLQwT16=qO z4*UW92zKc;qj~e5XWpbW9t^v|3HMsxzJK}ZNraJ3-+8^BKd|4GT0(o& z@9R}j&fNuf{E^AQOodHMW^wF~`e)VQ=D{j=aMqL=mWvvUKU}C929W6-{0msk>$gb6 zaa9{oOKCnJNQ1dFBCR~tcV&`b%k8<#J_~RR4?>)itUw2hD1na{#Y5CgUBu= zfl6;o234-@v`0;$gLYT^@3f=9JuvxW`Sc#EZEjua z)xfsCJ$Ozq2{8+Jz^MrMGfbai{Iug=>iqW!W25s;2Buw3U|WAieQf}V6MVwD*H@?G z>sO-*x@n)DjW5u9FqI{|>7Y*pW88I==yYvvD?n#PZ`SDQO{Zyf&}bd?EzKHCT|$MN z3zOYgs{JT;bLy*FE%dy>yD{(G+SeO5cmH*nS5xPj1iAhvGygE+ssTFp?twdtS9%Ez zf9EI0I=eyarm%-JnRZ3SCP2Goi0!%a(AGfVVH5z__2q`2bCO zQJN{7DH34+%CwJ6MObc3aeSOVs^!iM*;-rrudcu+VF@UXF&|56m5h_W%F@ literal 0 HcmV?d00001 diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfDocument.cs b/itext/itext.kernel/itext/kernel/pdf/PdfDocument.cs index b15196ebbe..1b4d2742d6 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfDocument.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfDocument.cs @@ -1243,7 +1243,9 @@ public virtual IList CopyPagesTo(IList pagesToCopy, iText.Kernel.P // Copying OCGs should go after copying LinkAnnotations if (GetCatalog() != null && GetCatalog().GetPdfObject().GetAsDictionary(PdfName.OCProperties) != null) { OcgPropertiesCopier.CopyOCGProperties(this, toDocument, page2page); - toDocument.GetCatalog().SetOcgCopied(true); + if (toDocument.GetCatalog().GetPdfObject().GetAsDictionary(PdfName.OCProperties) != null) { + toDocument.GetCatalog().SetOcgCopied(true); + } } // It's important to copy tag structure after link annotations were copied, because object content items in tag // structure are not copied in case if their's OBJ key is annotation and doesn't contain /P entry. diff --git a/port-hash b/port-hash index 30dc4bde35..3ca3a61d37 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -d68b0e71fd64171f0f8181e8a7e5b7e040499ac5 +5a76ecc3fde818dfc102c677957030ada98cde8f