From 0099cc09ed8909d71bd885e2b2647cb28888ad8d Mon Sep 17 00:00:00 2001 From: Vitali Prudnikovich Date: Thu, 17 Nov 2022 13:33:28 +0000 Subject: [PATCH] Cache PdfReader.getPdfAConformanceLevel result for non pdfA docs DEVSIX-7188 Autoported commit. Original commit hash: [f15fb9a5b] --- .../itext/kernel/pdf/PdfReaderTest.cs | 118 ++++++++++++------ .../itext/kernel/pdf/PdfReader.cs | 14 ++- port-hash | 2 +- 3 files changed, 92 insertions(+), 42 deletions(-) diff --git a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderTest.cs index 6cc190b40..bb7ec45b4 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/pdf/PdfReaderTest.cs @@ -49,6 +49,8 @@ using iText.IO.Font; using iText.IO.Source; using iText.Kernel.Exceptions; using iText.Kernel.Utils; +using iText.Kernel.XMP; +using iText.Kernel.XMP.Options; using iText.Test; using iText.Test.Attributes; @@ -1514,12 +1516,12 @@ namespace iText.Kernel.Pdf { [NUnit.Framework.Test] public virtual void HasRebuiltXrefReadingNotCompletedTest() { String filename = SOURCE_FOLDER + "XrefWithNullOffsets.pdf"; - PdfReader hasRebuiltXrefReader = new _PdfReader_1759(filename); + PdfReader hasRebuiltXrefReader = new _PdfReader_1763(filename); ReadingNotCompletedTest(hasRebuiltXrefReader); } - private sealed class _PdfReader_1759 : PdfReader { - public _PdfReader_1759(String baseArg1) + private sealed class _PdfReader_1763 : PdfReader { + public _PdfReader_1763(String baseArg1) : base(baseArg1) { } @@ -1540,12 +1542,12 @@ namespace iText.Kernel.Pdf { [NUnit.Framework.Test] public virtual void HasHybridXrefReadingNotCompletedTest() { String filename = SOURCE_FOLDER + "XrefWithNullOffsets.pdf"; - PdfReader hasHybridXrefPdfReader = new _PdfReader_1782(filename); + PdfReader hasHybridXrefPdfReader = new _PdfReader_1786(filename); ReadingNotCompletedTest(hasHybridXrefPdfReader); } - private sealed class _PdfReader_1782 : PdfReader { - public _PdfReader_1782(String baseArg1) + private sealed class _PdfReader_1786 : PdfReader { + public _PdfReader_1786(String baseArg1) : base(baseArg1) { } @@ -1565,12 +1567,12 @@ namespace iText.Kernel.Pdf { [NUnit.Framework.Test] public virtual void HasXrefStmReadingNotCompletedTest() { String filename = SOURCE_FOLDER + "XrefWithNullOffsets.pdf"; - PdfReader hasXrefStmReader = new _PdfReader_1805(filename); + PdfReader hasXrefStmReader = new _PdfReader_1809(filename); ReadingNotCompletedTest(hasXrefStmReader); } - private sealed class _PdfReader_1805 : PdfReader { - public _PdfReader_1805(String baseArg1) + private sealed class _PdfReader_1809 : PdfReader { + public _PdfReader_1809(String baseArg1) : base(baseArg1) { } @@ -1590,12 +1592,12 @@ namespace iText.Kernel.Pdf { [NUnit.Framework.Test] public virtual void HasFixedXrefReadingNotCompletedTest() { String filename = SOURCE_FOLDER + "XrefWithNullOffsets.pdf"; - PdfReader hasFixedXrefReader = new _PdfReader_1828(filename); + PdfReader hasFixedXrefReader = new _PdfReader_1832(filename); ReadingNotCompletedTest(hasFixedXrefReader); } - private sealed class _PdfReader_1828 : PdfReader { - public _PdfReader_1828(String baseArg1) + private sealed class _PdfReader_1832 : PdfReader { + public _PdfReader_1832(String baseArg1) : base(baseArg1) { } @@ -1615,12 +1617,12 @@ namespace iText.Kernel.Pdf { [NUnit.Framework.Test] public virtual void GetLastXrefReadingNotCompletedTest() { String filename = SOURCE_FOLDER + "XrefWithNullOffsets.pdf"; - PdfReader getLastXrefReader = new _PdfReader_1851(filename); + PdfReader getLastXrefReader = new _PdfReader_1855(filename); ReadingNotCompletedTest(getLastXrefReader); } - private sealed class _PdfReader_1851 : PdfReader { - public _PdfReader_1851(String baseArg1) + private sealed class _PdfReader_1855 : PdfReader { + public _PdfReader_1855(String baseArg1) : base(baseArg1) { } @@ -1641,12 +1643,12 @@ namespace iText.Kernel.Pdf { [NUnit.Framework.Test] public virtual void GetPermissionsReadingNotCompletedTest() { String filename = SOURCE_FOLDER + "XrefWithNullOffsets.pdf"; - PdfReader getPermissionsReader = new _PdfReader_1874(filename); + PdfReader getPermissionsReader = new _PdfReader_1878(filename); ReadingNotCompletedTest(getPermissionsReader); } - private sealed class _PdfReader_1874 : PdfReader { - public _PdfReader_1874(String baseArg1) + private sealed class _PdfReader_1878 : PdfReader { + public _PdfReader_1878(String baseArg1) : base(baseArg1) { } @@ -1667,12 +1669,12 @@ namespace iText.Kernel.Pdf { [NUnit.Framework.Test] public virtual void IsOpenedWithFullPReadingNotCompletedTest() { String filename = SOURCE_FOLDER + "XrefWithNullOffsets.pdf"; - PdfReader isOpenedWithFullPReader = new _PdfReader_1899(filename); + PdfReader isOpenedWithFullPReader = new _PdfReader_1903(filename); ReadingNotCompletedTest(isOpenedWithFullPReader); } - private sealed class _PdfReader_1899 : PdfReader { - public _PdfReader_1899(String baseArg1) + private sealed class _PdfReader_1903 : PdfReader { + public _PdfReader_1903(String baseArg1) : base(baseArg1) { } @@ -1693,12 +1695,12 @@ namespace iText.Kernel.Pdf { [NUnit.Framework.Test] public virtual void GetCryptoModeReadingNotCompletedTest() { String filename = SOURCE_FOLDER + "XrefWithNullOffsets.pdf"; - PdfReader getCryptoModeReader = new _PdfReader_1922(filename); + PdfReader getCryptoModeReader = new _PdfReader_1926(filename); ReadingNotCompletedTest(getCryptoModeReader); } - private sealed class _PdfReader_1922 : PdfReader { - public _PdfReader_1922(String baseArg1) + private sealed class _PdfReader_1926 : PdfReader { + public _PdfReader_1926(String baseArg1) : base(baseArg1) { } @@ -1719,12 +1721,12 @@ namespace iText.Kernel.Pdf { [NUnit.Framework.Test] public virtual void ComputeUserPasswordReadingNotCompletedTest() { String filename = SOURCE_FOLDER + "XrefWithNullOffsets.pdf"; - PdfReader computeUserPasswordReader = new _PdfReader_1947(filename); + PdfReader computeUserPasswordReader = new _PdfReader_1951(filename); ReadingNotCompletedTest(computeUserPasswordReader); } - private sealed class _PdfReader_1947 : PdfReader { - public _PdfReader_1947(String baseArg1) + private sealed class _PdfReader_1951 : PdfReader { + public _PdfReader_1951(String baseArg1) : base(baseArg1) { } @@ -1745,12 +1747,12 @@ namespace iText.Kernel.Pdf { [NUnit.Framework.Test] public virtual void GetOriginalFileIdReadingNotCompletedTest() { String filename = SOURCE_FOLDER + "XrefWithNullOffsets.pdf"; - PdfReader getOriginalFileIdReader = new _PdfReader_1970(filename); + PdfReader getOriginalFileIdReader = new _PdfReader_1974(filename); ReadingNotCompletedTest(getOriginalFileIdReader); } - private sealed class _PdfReader_1970 : PdfReader { - public _PdfReader_1970(String baseArg1) + private sealed class _PdfReader_1974 : PdfReader { + public _PdfReader_1974(String baseArg1) : base(baseArg1) { } @@ -1771,12 +1773,12 @@ namespace iText.Kernel.Pdf { [NUnit.Framework.Test] public virtual void GetModifiedFileIdReadingNotCompletedTest() { String filename = SOURCE_FOLDER + "XrefWithNullOffsets.pdf"; - PdfReader getModifiedFileIdReader = new _PdfReader_1993(filename); + PdfReader getModifiedFileIdReader = new _PdfReader_1997(filename); ReadingNotCompletedTest(getModifiedFileIdReader); } - private sealed class _PdfReader_1993 : PdfReader { - public _PdfReader_1993(String baseArg1) + private sealed class _PdfReader_1997 : PdfReader { + public _PdfReader_1997(String baseArg1) : base(baseArg1) { } @@ -1796,12 +1798,12 @@ namespace iText.Kernel.Pdf { [NUnit.Framework.Test] public virtual void IsEncryptedReadingNotCompletedTest() { String filename = SOURCE_FOLDER + "XrefWithNullOffsets.pdf"; - PdfReader isEncryptedReader = new _PdfReader_2016(filename); + PdfReader isEncryptedReader = new _PdfReader_2020(filename); ReadingNotCompletedTest(isEncryptedReader); } - private sealed class _PdfReader_2016 : PdfReader { - public _PdfReader_2016(String baseArg1) + private sealed class _PdfReader_2020 : PdfReader { + public _PdfReader_2020(String baseArg1) : base(baseArg1) { } @@ -2060,6 +2062,12 @@ namespace iText.Kernel.Pdf { NUnit.Framework.Assert.AreEqual(KernelExceptionMessageConstant.DOCUMENT_HAS_NOT_BEEN_READ_YET, e.Message); } + [NUnit.Framework.Test] + public virtual void GetPdfAConformanceLevelNoMetadataTest() { + PdfDocument pdfDoc = new PdfDocument(new PdfReader(new MemoryStream(CreatePdfDocumentForTest()))); + NUnit.Framework.Assert.IsNull(pdfDoc.GetReader().GetPdfAConformanceLevel()); + } + [NUnit.Framework.Test] public virtual void XrefStreamPointsItselfTest() { String fileName = SOURCE_FOLDER + "xrefStreamPointsItself.pdf"; @@ -2369,6 +2377,24 @@ namespace iText.Kernel.Pdf { } } + [NUnit.Framework.Test] + public virtual void ConformanceLevelCacheTest() { + String filename = DESTINATION_FOLDER + "simpleDoc.pdf"; + PdfDocument pdfDoc = new PdfDocument(new PdfWriter(filename)); + XMPMeta xmp = XMPMetaFactory.Create(); + xmp.AppendArrayItem(XMPConst.NS_DC, "subject", new PropertyOptions(PropertyOptions.ARRAY), "Hello World", + null); + pdfDoc.SetXmpMetadata(xmp); + pdfDoc.AddNewPage(); + pdfDoc.Close(); + PdfReaderTest.TestPdfDocumentCache pdfTestDoc = new PdfReaderTest.TestPdfDocumentCache(this, new PdfReader + (filename)); + for (int i = 0; i < 1000; ++i) { + pdfTestDoc.GetReader().GetPdfAConformanceLevel(); + } + NUnit.Framework.Assert.AreEqual(2, pdfTestDoc.GetCounter()); + } + private static PdfDictionary GetTestPdfDictionary() { Dictionary tmpMap = new Dictionary(); tmpMap.Put(new PdfName("b"), new PdfName("c")); @@ -2383,5 +2409,25 @@ namespace iText.Kernel.Pdf { return baos.ToArray(); } } + + private class TestPdfDocumentCache : PdfDocument { + private int getXmpMetadataCounter; + + public TestPdfDocumentCache(PdfReaderTest _enclosing, PdfReader pdfReader) + : base(pdfReader) { + this._enclosing = _enclosing; + } + + public override byte[] GetXmpMetadata(bool createNew) { + ++this.getXmpMetadataCounter; + return base.GetXmpMetadata(createNew); + } + + public virtual int GetCounter() { + return this.getXmpMetadataCounter; + } + + private readonly PdfReaderTest _enclosing; + } } } diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfReader.cs b/itext/itext.kernel/itext/kernel/pdf/PdfReader.cs index 55a37920f..9f1c17b0a 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfReader.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfReader.cs @@ -86,6 +86,8 @@ namespace iText.Kernel.Pdf { //indicate nearest first Indirect reference object which includes current reading the object, using for PdfString decrypt private PdfIndirectReference currentIndirectReference; + private XMPMeta xmpMeta; + protected internal PdfTokenizer tokens; protected internal PdfEncryption decrypt; @@ -674,14 +676,16 @@ namespace iText.Kernel.Pdf { if (pdfDocument == null || !pdfDocument.GetXref().IsReadingCompleted()) { throw new PdfException(KernelExceptionMessageConstant.DOCUMENT_HAS_NOT_BEEN_READ_YET); } - if (pdfDocument.GetXmpMetadata() != null) { - try { - pdfAConformanceLevel = PdfAConformanceLevel.GetConformanceLevel(XMPMetaFactory.ParseFromBuffer(pdfDocument - .GetXmpMetadata())); + try { + if (xmpMeta == null && pdfDocument.GetXmpMetadata() != null) { + xmpMeta = XMPMetaFactory.ParseFromBuffer(pdfDocument.GetXmpMetadata()); } - catch (XMPException) { + if (xmpMeta != null) { + pdfAConformanceLevel = PdfAConformanceLevel.GetConformanceLevel(xmpMeta); } } + catch (XMPException) { + } } return pdfAConformanceLevel; } diff --git a/port-hash b/port-hash index a9317f275..445161a82 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -0fdc3a0a9c9b4adac10bcc36d14e074d7499e699 +f15fb9a5bd75cd2b430deba743a22e308816daf6