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 116ab5a49c..4d378d6d0e 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/utils/PdfMergerTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/utils/PdfMergerTest.cs @@ -84,6 +84,24 @@ public virtual void MergeDocumentOutlinesWithNullDestinationTest01() { , destinationFolder, "diff_")); } + [NUnit.Framework.Test] + [LogMessage(iText.IO.Logs.IoLogMessageConstant.SOURCE_DOCUMENT_HAS_ACROFORM_DICTIONARY)] + public virtual void MergeDocumentOutlinesWithExplicitRemoteDestinationTest() { + String resultFile = destinationFolder + "mergeDocumentWithRemoteGoToTest.pdf"; + String filename1 = sourceFolder + "docWithRemoteGoTo.pdf"; + String filename2 = sourceFolder + "doc1.pdf"; + PdfDocument sourceDocument1 = new PdfDocument(new PdfReader(filename1)); + PdfDocument sourceDocument2 = new PdfDocument(new PdfReader(filename2)); + PdfMerger resultDocument = new PdfMerger(new PdfDocument(CompareTool.CreateTestPdfWriter(resultFile))); + resultDocument.Merge(sourceDocument1, 1, 1); + resultDocument.Merge(sourceDocument2, 1, 1); + resultDocument.Close(); + sourceDocument1.Close(); + sourceDocument2.Close(); + NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(resultFile, sourceFolder + "cmp_mergeDocumentWithRemoteGoToTest.pdf" + , destinationFolder, "diff_")); + } + [NUnit.Framework.Test] public virtual void MergeDocumentWithCycleRefInAcroFormTest() { String filename1 = sourceFolder + "doc1.pdf"; diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/cmp_mergeDocumentWithRemoteGoToTest.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/cmp_mergeDocumentWithRemoteGoToTest.pdf new file mode 100644 index 0000000000..15b15e3b5d Binary files /dev/null and b/itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/cmp_mergeDocumentWithRemoteGoToTest.pdf differ diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/docWithRemoteGoTo.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/docWithRemoteGoTo.pdf new file mode 100644 index 0000000000..bbf7a0674a Binary files /dev/null and b/itext.tests/itext.kernel.tests/resources/itext/kernel/utils/PdfMergerTest/docWithRemoteGoTo.pdf differ diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfCatalog.cs b/itext/itext.kernel/itext/kernel/pdf/PdfCatalog.cs index c566b3ccb7..9536cd3253 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfCatalog.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfCatalog.cs @@ -780,14 +780,14 @@ internal virtual PdfDestination CopyDestination(PdfObject dest, IDictionary page2page + , PdfDocument toDocument, PdfObject pageObject) { + foreach (PdfPage oldPage in page2page.Keys) { + if (oldPage.GetPdfObject() == pageObject) { + // in the copiedArray old page ref will be correctly replaced by the new page ref + // as this page is already copied + PdfArray copiedArray = (PdfArray)dest.CopyTo(toDocument, false, NullCopyFilter.GetInstance()); + return new PdfExplicitDestination(copiedArray); + } + } + return null; + } + private bool IsEqualSameNameDestExist(IDictionary page2page, PdfDocument toDocument, PdfString srcDestName, PdfArray srcDestArray, PdfPage oldPage) { PdfArray sameNameDest = (PdfArray)toDocument.GetCatalog().GetNameTree(PdfName.Dests).GetNames().Get(srcDestName diff --git a/port-hash b/port-hash index 15c1ac32c3..94e18e2fbf 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -c2b3f987d05db32411585f4579adcef01ad857a3 +238107cd5532d937fc246b97f60c8f1599786f9d