From c07244792f871c46107d9e69ed10286dfbe0689d Mon Sep 17 00:00:00 2001 From: Andrei Stryhelski Date: Mon, 23 Sep 2024 09:17:43 +0000 Subject: [PATCH 1/2] Fix crypt filter for AES-GSM Fix tests DEVSIX-8588 Autoported commit. Original commit hash: [698545ba1] Manual files: kernel/src/test/java/com/itextpdf/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest.java --- .../PubSecHandlerUsingAesGcmTest.cs | 197 ++++++++++++++++++ .../StandardHandlerUsingAesGcmTest.cs | 151 +++++++++----- .../mac/MacIntegrityProtectorCreationTest.cs | 6 +- .../cmp_externalFile.pdf | Bin .../cmp_simpleEncryptDecrypt.pdf} | Bin 4225 -> 4140 bytes .../decrypter.cert.pem | 0 .../externalFile.pdf | Bin .../invalidCryptFilter.pdf | Bin 0 -> 5766 bytes .../signerkey.pem | 0 .../simpleEncryptDecrypt.pdf} | Bin .../test.cer | Bin .../test.pem | 0 .../cmp_encryptedSimpleDocument.pdf | Bin 0 -> 7843 bytes ...ument.pdf => cmp_simpleEncryptDecrypt.pdf} | Bin .../cmp_macEncryptionWithAesGsmTest.pdf | Bin 5751 -> 5809 bytes .../PubSecHandlerUsingAes256.cs | 13 +- .../PubSecHandlerUsingAesGcm.cs | 11 +- .../StandardHandlerUsingAes256.cs | 103 +++++---- .../StandardHandlerUsingAesGcm.cs | 47 ++--- .../itext/kernel/pdf/PdfEncryption.cs | 19 +- port-hash | 2 +- 21 files changed, 429 insertions(+), 120 deletions(-) create mode 100644 itext.tests/itext.kernel.tests/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest.cs rename itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/{PublicHandlerUsingAesGcmTest => PubSecHandlerUsingAesGcmTest}/cmp_externalFile.pdf (100%) rename itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/{PublicHandlerUsingAesGcmTest/cmp_test-document.pdf => PubSecHandlerUsingAesGcmTest/cmp_simpleEncryptDecrypt.pdf} (52%) rename itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/{PublicHandlerUsingAesGcmTest => PubSecHandlerUsingAesGcmTest}/decrypter.cert.pem (100%) rename itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/{PublicHandlerUsingAesGcmTest => PubSecHandlerUsingAesGcmTest}/externalFile.pdf (100%) create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/invalidCryptFilter.pdf rename itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/{PublicHandlerUsingAesGcmTest => PubSecHandlerUsingAesGcmTest}/signerkey.pem (100%) rename itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/{PublicHandlerUsingAesGcmTest/test-document.pdf => PubSecHandlerUsingAesGcmTest/simpleEncryptDecrypt.pdf} (100%) rename itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/{PublicHandlerUsingAesGcmTest => PubSecHandlerUsingAesGcmTest}/test.cer (100%) rename itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/{PublicHandlerUsingAesGcmTest => PubSecHandlerUsingAesGcmTest}/test.pem (100%) create mode 100644 itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/StandardHandlerUsingAesGcmTest/cmp_encryptedSimpleDocument.pdf rename itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/StandardHandlerUsingAesGcmTest/{cmp_simpleDocument.pdf => cmp_simpleEncryptDecrypt.pdf} (100%) diff --git a/itext.tests/itext.kernel.tests/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest.cs new file mode 100644 index 0000000000..9b4f71e95a --- /dev/null +++ b/itext.tests/itext.kernel.tests/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest.cs @@ -0,0 +1,197 @@ +/* +This file is part of the iText (R) project. +Copyright (c) 1998-2024 Apryse Group NV +Authors: Apryse Software. + +This program is offered under a commercial and under the AGPL license. +For commercial licensing, contact us at https://itextpdf.com/sales. For AGPL licensing, see below. + +AGPL licensing: +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +using System; +using System.Collections.Generic; +using iText.Bouncycastleconnector; +using iText.Bouncycastlefips; +using iText.Commons.Bouncycastle; +using iText.Commons.Bouncycastle.Cert; +using iText.Commons.Bouncycastle.Crypto; +using iText.Commons.Utils; +using iText.Kernel.Exceptions; +using iText.Kernel.Logs; +using iText.Kernel.Pdf; +using iText.Kernel.Utils; +using iText.Test; +using iText.Test.Attributes; + +namespace iText.Kernel.Crypto.Securityhandler { + [NUnit.Framework.Category("BouncyCastleIntegrationTest")] + public class PubSecHandlerUsingAesGcmTest : ExtendedITextTest { + public static readonly String SOURCE_FOLDER = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext + .CurrentContext.TestDirectory) + "/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/"; + + public static readonly String DESTINATION_FOLDER = NUnit.Framework.TestContext.CurrentContext.TestDirectory + + "/test/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/"; + + private static readonly IBouncyCastleFactory FACTORY = BouncyCastleFactoryCreator.GetFactory(); + + private static readonly char[] PASSWORD = "testpassphrase".ToCharArray(); + + [NUnit.Framework.OneTimeSetUp] + public static void SetUp() { + CreateOrClearDestinationFolder(DESTINATION_FOLDER); + } + + [LogMessage(KernelLogMessageConstant.MD5_IS_NOT_FIPS_COMPLIANT, Ignore = true)] + [NUnit.Framework.Test] + public virtual void TestSimpleEncryptDecryptTest() { + String fileName = "simpleEncryptDecrypt.pdf"; + String srcFile = SOURCE_FOLDER + fileName; + String outFile = DESTINATION_FOLDER + fileName; + if ("BCFIPS".Equals(FACTORY.GetProviderName())) { + Exception e = NUnit.Framework.Assert.Catch(typeof(UnsupportedEncryptionFeatureException), () => + DoEncrypt(srcFile, outFile, true)); + NUnit.Framework.Assert.AreEqual(UnsupportedEncryptionFeatureException.ENCRYPTION_WITH_CERTIFICATE_ISNT_SUPPORTED_IN_FIPS, e.Message); + } else { + DoEncrypt(srcFile, outFile, true); + DecryptWithCertificate(fileName, DESTINATION_FOLDER, "test.cer", "test.pem"); + } + } + + [LogMessage(VersionConforming.NOT_SUPPORTED_AES_GCM, Ignore = true)] + [LogMessage(KernelLogMessageConstant.MD5_IS_NOT_FIPS_COMPLIANT, Ignore = true)] + [NUnit.Framework.Test] + public virtual void TestSimpleEncryptDecryptPdf15Test() { + String fileName = "simpleEncryptDecrypt.pdf"; + String srcFile = SOURCE_FOLDER + fileName; + String outFile = DESTINATION_FOLDER + fileName; + if ("BCFIPS".Equals(FACTORY.GetProviderName())) { + Exception e = NUnit.Framework.Assert.Catch(typeof(UnsupportedEncryptionFeatureException), () => + DoEncrypt(srcFile, outFile, false)); + NUnit.Framework.Assert.AreEqual(UnsupportedEncryptionFeatureException.ENCRYPTION_WITH_CERTIFICATE_ISNT_SUPPORTED_IN_FIPS, e.Message); + } else { + DoEncrypt(srcFile, outFile, false); + DecryptWithCertificate(fileName, DESTINATION_FOLDER, "test.cer", "test.pem"); + } + } + + [LogMessage(KernelLogMessageConstant.MD5_IS_NOT_FIPS_COMPLIANT, Ignore = true)] + [NUnit.Framework.Test] + public virtual void DecryptExternalFileTest() { + if ("BCFIPS".Equals(FACTORY.GetProviderName())) { + Exception e = NUnit.Framework.Assert.Catch(typeof(UnsupportedEncryptionFeatureException), () => + DecryptWithCertificate("externalFile.pdf", SOURCE_FOLDER, "decrypter.cert.pem", "signerkey.pem")); + NUnit.Framework.Assert.AreEqual(UnsupportedEncryptionFeatureException.ENCRYPTION_WITH_CERTIFICATE_ISNT_SUPPORTED_IN_FIPS, e.Message); + } else { + DecryptWithCertificate("externalFile.pdf", SOURCE_FOLDER, "decrypter.cert.pem", "signerkey.pem"); + } + } + + [LogMessage(KernelLogMessageConstant.MD5_IS_NOT_FIPS_COMPLIANT, Ignore = true)] + [NUnit.Framework.Test] + public virtual void InvalidCryptFilterTest() { + String fileName = "invalidCryptFilter.pdf"; + Exception e = NUnit.Framework.Assert.Catch(typeof(PdfException), () => DecryptWithCertificate(fileName, SOURCE_FOLDER + , "test.cer", "test.pem")); + NUnit.Framework.Assert.AreEqual(KernelExceptionMessageConstant.NO_COMPATIBLE_ENCRYPTION_FOUND, e.Message); + } + + [NUnit.Framework.Test] + public virtual void EncryptPdfWithMissingCFTest() { + IPrivateKey certificateKey = PemFileHelper.ReadPrivateKeyFromPemFile(FileUtil.GetInputStreamForFile(SOURCE_FOLDER + + "signerkey.pem"), PASSWORD); + IX509Certificate certificate = CryptoUtil.ReadPublicCertificate(FileUtil.GetInputStreamForFile(SOURCE_FOLDER + + "decrypter.cert.pem")); + Dictionary encMap = new Dictionary(); + encMap.Put(PdfName.V, new PdfNumber(6)); + encMap.Put(PdfName.EncryptMetadata, PdfBoolean.TRUE); + PdfDictionary dictionary = new PdfDictionary(encMap); + Exception e = NUnit.Framework.Assert.Catch(typeof(PdfException), () => new PdfEncryption(dictionary, certificateKey + , certificate)); + NUnit.Framework.Assert.AreEqual(KernelExceptionMessageConstant.CF_NOT_FOUND_ENCRYPTION, e.Message); + } + + [NUnit.Framework.Test] + public virtual void EncryptPdfWithMissingDefaultCryptFilterTest() { + IPrivateKey certificateKey = PemFileHelper.ReadPrivateKeyFromPemFile(FileUtil.GetInputStreamForFile(SOURCE_FOLDER + + "signerkey.pem"), PASSWORD); + IX509Certificate certificate = CryptoUtil.ReadPublicCertificate(FileUtil.GetInputStreamForFile(SOURCE_FOLDER + + "decrypter.cert.pem")); + Dictionary encMap = new Dictionary(); + encMap.Put(PdfName.V, new PdfNumber(6)); + PdfDictionary embeddedFilesDict = new PdfDictionary(); + embeddedFilesDict.Put(PdfName.FlateDecode, new PdfDictionary()); + encMap.Put(PdfName.CF, embeddedFilesDict); + PdfDictionary dictionary = new PdfDictionary(encMap); + Exception e = NUnit.Framework.Assert.Catch(typeof(PdfException), () => new PdfEncryption(dictionary, certificateKey + , certificate)); + NUnit.Framework.Assert.AreEqual(KernelExceptionMessageConstant.DEFAULT_CRYPT_FILTER_NOT_FOUND_ENCRYPTION, + e.Message); + } + + [NUnit.Framework.Test] + public virtual void EncryptPdfWithMissingCFMTest() { + IPrivateKey certificateKey = PemFileHelper.ReadPrivateKeyFromPemFile(FileUtil.GetInputStreamForFile(SOURCE_FOLDER + + "signerkey.pem"), PASSWORD); + IX509Certificate certificate = CryptoUtil.ReadPublicCertificate(FileUtil.GetInputStreamForFile(SOURCE_FOLDER + + "decrypter.cert.pem")); + Dictionary encMap = new Dictionary(); + encMap.Put(PdfName.V, new PdfNumber(6)); + PdfDictionary embeddedFilesDict = new PdfDictionary(); + embeddedFilesDict.Put(PdfName.DefaultCryptFilter, new PdfDictionary()); + encMap.Put(PdfName.CF, embeddedFilesDict); + PdfDictionary dictionary = new PdfDictionary(encMap); + Exception e = NUnit.Framework.Assert.Catch(typeof(PdfException), () => new PdfEncryption(dictionary, certificateKey + , certificate)); + NUnit.Framework.Assert.AreEqual(KernelExceptionMessageConstant.NO_COMPATIBLE_ENCRYPTION_FOUND, e.Message); + } + + private void DoEncrypt(String input, String output, bool isPdf20) { + IX509Certificate certificate = CryptoUtil.ReadPublicCertificate(FileUtil.GetInputStreamForFile(SOURCE_FOLDER + + "test.cer")); + WriterProperties writerProperties = new WriterProperties().SetPublicKeyEncryption(new IX509Certificate[] { + certificate }, new int[] { EncryptionConstants.ALLOW_PRINTING }, EncryptionConstants.ENCRYPTION_AES_GCM + ); + if (isPdf20) { + writerProperties.SetPdfVersion(PdfVersion.PDF_2_0); + } + // Instantiate input/output document. + using (PdfDocument docIn = new PdfDocument(new PdfReader(input))) { + using (PdfDocument docOut = new PdfDocument(new PdfWriter(output, writerProperties))) { + // Copy one page from input to output. + docIn.CopyPagesTo(1, 1, docOut); + } + } + } + + private void DecryptWithCertificate(String fileName, String srcFileFolder, String certificateName, String + privateKeyName) { + String srcFile = srcFileFolder + fileName; + String cmpFile = SOURCE_FOLDER + "cmp_" + fileName; + String outFile = DESTINATION_FOLDER + "decrypted_" + fileName; + IX509Certificate certificate = CryptoUtil.ReadPublicCertificate(FileUtil.GetInputStreamForFile(SOURCE_FOLDER + + certificateName)); + IPrivateKey privateKey = PemFileHelper.ReadPrivateKeyFromPemFile(FileUtil.GetInputStreamForFile(SOURCE_FOLDER + + privateKeyName), PASSWORD); + ReaderProperties readerProperties = new ReaderProperties().SetPublicKeySecurityParams(certificate, privateKey + ); + PdfDocument ignored = new PdfDocument(new PdfReader(srcFile, readerProperties), new PdfWriter(outFile)); + ignored.Close(); + String errorMessage = new CompareTool().CompareByContent(outFile, cmpFile, DESTINATION_FOLDER, "diff_"); + if (errorMessage != null) { + NUnit.Framework.Assert.Fail(errorMessage); + } + } + } +} diff --git a/itext.tests/itext.kernel.tests/itext/kernel/crypto/securityhandler/StandardHandlerUsingAesGcmTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/crypto/securityhandler/StandardHandlerUsingAesGcmTest.cs index 1a2b608dfb..9ca2836823 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/crypto/securityhandler/StandardHandlerUsingAesGcmTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/crypto/securityhandler/StandardHandlerUsingAesGcmTest.cs @@ -24,6 +24,7 @@ You should have received a copy of the GNU Affero General Public License using System.Collections.Generic; using iText.Bouncycastleconnector; using iText.Commons.Bouncycastle; +using iText.Kernel.Exceptions; using iText.Kernel.Logs; using iText.Kernel.Pdf; using iText.Kernel.Utils; @@ -33,77 +34,90 @@ You should have received a copy of the GNU Affero General Public License namespace iText.Kernel.Crypto.Securityhandler { [NUnit.Framework.Category("BouncyCastleIntegrationTest")] public class StandardHandlerUsingAesGcmTest : ExtendedITextTest { - private static readonly IBouncyCastleFactory FACTORY = BouncyCastleFactoryCreator.GetFactory(); - public static readonly String SRC = iText.Test.TestUtil.GetParentProjectDirectory(NUnit.Framework.TestContext .CurrentContext.TestDirectory) + "/resources/itext/kernel/crypto/securityhandler/StandardHandlerUsingAesGcmTest/"; public static readonly String DEST = NUnit.Framework.TestContext.CurrentContext.TestDirectory + "/test/itext/kernel/crypto/securityhandler/StandardHandlerUsingAesGcmTest/"; + private static readonly IBouncyCastleFactory FACTORY = BouncyCastleFactoryCreator.GetFactory(); + + private static readonly byte[] OWNER_PASSWORD = "supersecret".GetBytes(System.Text.Encoding.UTF8); + + private static readonly byte[] USER_PASSWORD = "secret".GetBytes(System.Text.Encoding.UTF8); + [NUnit.Framework.OneTimeSetUp] public static void SetUp() { CreateOrClearDestinationFolder(DEST); } [NUnit.Framework.Test] - [LogMessage(VersionConforming.NOT_SUPPORTED_AES_GCM, Ignore = true)] [LogMessage(KernelLogMessageConstant.MD5_IS_NOT_FIPS_COMPLIANT, Ignore = true)] - public virtual void TestSimpleEncryptDecryptTest() { + public virtual void SimpleEncryptDecryptTest() { String srcFile = SRC + "simpleDocument.pdf"; - String cmpFile = SRC + "cmp_simpleDocument.pdf"; - String outFile = DEST + "simpleEncryptDecryptTest.pdf"; - DoEncrypt(srcFile, outFile); - TryCompare(outFile, cmpFile); + String decryptedCmpFile = SRC + "cmp_simpleEncryptDecrypt.pdf"; + String encryptedCmpFile = SRC + "cmp_encryptedSimpleDocument.pdf"; + String outFile = DEST + "simpleEncryptDecrypt.pdf"; + // Set usage permissions. + int perms = EncryptionConstants.ALLOW_PRINTING | EncryptionConstants.ALLOW_DEGRADED_PRINTING; + WriterProperties wProps = new WriterProperties().SetPdfVersion(PdfVersion.PDF_2_0).SetStandardEncryption(USER_PASSWORD + , OWNER_PASSWORD, perms, EncryptionConstants.ENCRYPTION_AES_GCM); + // Instantiate input/output document. + using (PdfDocument docIn = new PdfDocument(new PdfReader(srcFile))) { + using (PdfDocument docOut = new PdfDocument(new PdfWriter(outFile, wProps))) { + // Copy one page from input to output. + docIn.CopyPagesTo(1, 1, docOut); + } + } + new CompareTool().CompareByContent(outFile, decryptedCmpFile, DEST, "diff", USER_PASSWORD, null); + new CompareTool().CompareByContent(outFile, encryptedCmpFile, DEST, "diff", USER_PASSWORD, USER_PASSWORD); } [NUnit.Framework.Test] - [LogMessage(VersionConforming.NOT_SUPPORTED_AES_GCM, Ignore = true)] + [LogMessage(VersionConforming.NOT_SUPPORTED_AES_GCM)] [LogMessage(KernelLogMessageConstant.MD5_IS_NOT_FIPS_COMPLIANT, Ignore = true)] - public virtual void TestSimpleEncryptDecryptPdf15Test() { + public virtual void SimpleEncryptDecryptPdf15Test() { String srcFile = SRC + "simpleDocument.pdf"; - String cmpFile = SRC + "cmp_simpleDocument.pdf"; + String cmpFile = SRC + "cmp_simpleEncryptDecrypt.pdf"; String outFile = DEST + "notSupportedVersionDocument.pdf"; - byte[] userBytes = "secret".GetBytes(System.Text.Encoding.UTF8); - byte[] ownerBytes = "supersecret".GetBytes(System.Text.Encoding.UTF8); int perms = EncryptionConstants.ALLOW_PRINTING | EncryptionConstants.ALLOW_DEGRADED_PRINTING; - WriterProperties wProps = new WriterProperties().SetStandardEncryption(userBytes, ownerBytes, perms, EncryptionConstants - .ENCRYPTION_AES_GCM); + WriterProperties wProps = new WriterProperties().SetStandardEncryption(USER_PASSWORD, OWNER_PASSWORD, perms + , EncryptionConstants.ENCRYPTION_AES_GCM); PdfDocument ignored = new PdfDocument(new PdfReader(srcFile), new PdfWriter(outFile, wProps)); ignored.Close(); - TryCompare(outFile, cmpFile); + new CompareTool().CompareByContent(outFile, cmpFile, DEST, "diff", USER_PASSWORD, null); } [NUnit.Framework.Test] [LogMessage(KernelLogMessageConstant.MD5_IS_NOT_FIPS_COMPLIANT, Ignore = true)] - public virtual void TestKnownOutput() { + public virtual void KnownOutputTest() { String srcFile = SRC + "encryptedDocument.pdf"; String outFile = DEST + "encryptedDocument.pdf"; String cmpFile = SRC + "simpleDocument.pdf"; - using (PdfDocument ignored = new PdfDocument(new PdfReader(srcFile, new ReaderProperties().SetPassword("supersecret" - .GetBytes(System.Text.Encoding.UTF8))), new PdfWriter(outFile))) { + using (PdfDocument ignored = new PdfDocument(new PdfReader(srcFile, new ReaderProperties().SetPassword(OWNER_PASSWORD + )), new PdfWriter(outFile))) { } // We need to copy the source file to the destination folder to be able to compare pdf files in android. - TryCompare(outFile, cmpFile); + new CompareTool().CompareByContent(outFile, cmpFile, DEST, "diff", USER_PASSWORD, null); } // In all these tampered files, the stream content of object 14 has been modified. [LogMessage(KernelLogMessageConstant.MD5_IS_NOT_FIPS_COMPLIANT, Ignore = true)] [NUnit.Framework.Test] - public virtual void TestMacTampered() { + public virtual void MacTamperedTest() { String srcFile = SRC + "encryptedDocumentTamperedMac.pdf"; AssertTampered(srcFile); } [LogMessage(KernelLogMessageConstant.MD5_IS_NOT_FIPS_COMPLIANT, Ignore = true)] [NUnit.Framework.Test] - public virtual void TestIVTampered() { + public virtual void InitVectorTamperedTest() { String srcFile = SRC + "encryptedDocumentTamperedIv.pdf"; AssertTampered(srcFile); } [LogMessage(KernelLogMessageConstant.MD5_IS_NOT_FIPS_COMPLIANT, Ignore = true)] [NUnit.Framework.Test] - public virtual void TestCiphertextTampered() { + public virtual void CiphertextTamperedTest() { String srcFile = SRC + "encryptedDocumentTamperedCiphertext.pdf"; AssertTampered(srcFile); } @@ -125,6 +139,9 @@ public virtual void PdfEncryptionWithEmbeddedFilesTest() { encMap.Put(PdfName.StrF, PdfName.Identity); PdfDictionary embeddedFilesDict = new PdfDictionary(); embeddedFilesDict.Put(PdfName.FlateDecode, new PdfDictionary()); + PdfDictionary cfmDict = new PdfDictionary(); + cfmDict.Put(PdfName.CFM, PdfName.AESV4); + embeddedFilesDict.Put(PdfName.StdCF, cfmDict); encMap.Put(PdfName.CF, embeddedFilesDict); encMap.Put(PdfName.EncryptMetadata, PdfBoolean.FALSE); encMap.Put(PdfName.O, new PdfString("\u0006¡Ê\u009A<@\u009DÔG\u0013&\u008C5r\u0096\u0081i!\u0091\u000Fªìh=±\u0091\u0006Að¨\u008D\"¼\u0018?õ\u001DNó»{y\u0091)\u0090vâý" @@ -155,6 +172,9 @@ public virtual void PdfEncryptionWithMetadataTest() { encMap.Put(PdfName.StrF, PdfName.StdCF); PdfDictionary embeddedFilesDict = new PdfDictionary(); embeddedFilesDict.Put(PdfName.FlateDecode, new PdfDictionary()); + PdfDictionary cfmDict = new PdfDictionary(); + cfmDict.Put(PdfName.CFM, PdfName.AESV4); + embeddedFilesDict.Put(PdfName.StdCF, cfmDict); encMap.Put(PdfName.CF, embeddedFilesDict); encMap.Put(PdfName.EncryptMetadata, PdfBoolean.TRUE); encMap.Put(PdfName.O, new PdfString("\u0006¡Ê\u009A<@\u009DÔG\u0013&\u008C5r\u0096\u0081i!\u0091\u000Fªìh=±\u0091\u0006Að¨\u008D\"¼\u0018?õ\u001DNó»{y\u0091)\u0090vâý" @@ -171,35 +191,72 @@ public virtual void PdfEncryptionWithMetadataTest() { NUnit.Framework.Assert.IsTrue(encryption.IsMetadataEncrypted()); } - private void DoEncrypt(String input, String output) { - // Pick user/owner password - byte[] userBytes = "secret".GetBytes(System.Text.Encoding.UTF8); - byte[] ownerBytes = "supersecret".GetBytes(System.Text.Encoding.UTF8); - // Set usage permissions - int perms = EncryptionConstants.ALLOW_PRINTING | EncryptionConstants.ALLOW_DEGRADED_PRINTING; - WriterProperties wProps = new WriterProperties().SetPdfVersion(PdfVersion.PDF_2_0).SetStandardEncryption(userBytes - , ownerBytes, perms, EncryptionConstants.ENCRYPTION_AES_GCM); - // Instantiate input/output document - using (PdfDocument docIn = new PdfDocument(new PdfReader(input))) { - using (PdfDocument docOut = new PdfDocument(new PdfWriter(output, wProps))) { - // Copy one page from input to output - docIn.CopyPagesTo(1, 1, docOut); - } - } + [NUnit.Framework.Test] + [LogMessage(KernelLogMessageConstant.MD5_IS_NOT_FIPS_COMPLIANT, Ignore = true)] + public virtual void EncryptPdfWithMissingCFTest() { + byte[] documentId = new byte[] { (byte)88, (byte)189, (byte)192, (byte)48, (byte)240, (byte)200, (byte)87, + (byte)183, (byte)244, (byte)119, (byte)224, (byte)109, (byte)226, (byte)173, (byte)32, (byte)90 }; + byte[] password = new byte[] { (byte)115, (byte)101, (byte)99, (byte)114, (byte)101, (byte)116 }; + Dictionary encMap = new Dictionary(); + encMap.Put(PdfName.R, new PdfNumber(7)); + encMap.Put(PdfName.V, new PdfNumber(6)); + PdfDictionary dictionary = new PdfDictionary(encMap); + Exception e = NUnit.Framework.Assert.Catch(typeof(PdfException), () => new PdfEncryption(dictionary, password + , documentId)); + NUnit.Framework.Assert.AreEqual(KernelExceptionMessageConstant.CF_NOT_FOUND_ENCRYPTION, e.Message); } - private void TryCompare(String outPdf, String cmpPdf) { - new CompareTool().CompareByContent(outPdf, cmpPdf, DEST, "diff", "secret".GetBytes(System.Text.Encoding.UTF8 - ), null); + [NUnit.Framework.Test] + [LogMessage(KernelLogMessageConstant.MD5_IS_NOT_FIPS_COMPLIANT, Ignore = true)] + public virtual void EncryptPdfWithMissingStdCFTest() { + byte[] documentId = new byte[] { (byte)88, (byte)189, (byte)192, (byte)48, (byte)240, (byte)200, (byte)87, + (byte)183, (byte)244, (byte)119, (byte)224, (byte)109, (byte)226, (byte)173, (byte)32, (byte)90 }; + byte[] password = new byte[] { (byte)115, (byte)101, (byte)99, (byte)114, (byte)101, (byte)116 }; + Dictionary encMap = new Dictionary(); + encMap.Put(PdfName.R, new PdfNumber(7)); + encMap.Put(PdfName.V, new PdfNumber(6)); + PdfDictionary embeddedFilesDict = new PdfDictionary(); + embeddedFilesDict.Put(PdfName.FlateDecode, new PdfDictionary()); + PdfDictionary cfmDict = new PdfDictionary(); + cfmDict.Put(PdfName.CFM, PdfName.AESV4); + encMap.Put(PdfName.CF, embeddedFilesDict); + PdfDictionary dictionary = new PdfDictionary(encMap); + Exception e = NUnit.Framework.Assert.Catch(typeof(PdfException), () => new PdfEncryption(dictionary, password + , documentId)); + NUnit.Framework.Assert.AreEqual(KernelExceptionMessageConstant.STDCF_NOT_FOUND_ENCRYPTION, e.Message); + } + + [NUnit.Framework.Test] + [LogMessage(KernelLogMessageConstant.MD5_IS_NOT_FIPS_COMPLIANT, Ignore = true)] + public virtual void EncryptPdfWithMissingCFMTest() { + byte[] documentId = new byte[] { (byte)88, (byte)189, (byte)192, (byte)48, (byte)240, (byte)200, (byte)87, + (byte)183, (byte)244, (byte)119, (byte)224, (byte)109, (byte)226, (byte)173, (byte)32, (byte)90 }; + byte[] password = new byte[] { (byte)115, (byte)101, (byte)99, (byte)114, (byte)101, (byte)116 }; + Dictionary encMap = new Dictionary(); + encMap.Put(PdfName.R, new PdfNumber(7)); + encMap.Put(PdfName.V, new PdfNumber(6)); + encMap.Put(PdfName.P, new PdfNumber(-1852)); + encMap.Put(PdfName.StmF, PdfName.StdCF); + encMap.Put(PdfName.StrF, PdfName.StdCF); + PdfDictionary embeddedFilesDict = new PdfDictionary(); + embeddedFilesDict.Put(PdfName.FlateDecode, new PdfDictionary()); + PdfDictionary cfmDict = new PdfDictionary(); + embeddedFilesDict.Put(PdfName.StdCF, cfmDict); + encMap.Put(PdfName.CF, embeddedFilesDict); + PdfDictionary dictionary = new PdfDictionary(encMap); + Exception e = NUnit.Framework.Assert.Catch(typeof(PdfException), () => new PdfEncryption(dictionary, password + , documentId)); + NUnit.Framework.Assert.AreEqual(KernelExceptionMessageConstant.NO_COMPATIBLE_ENCRYPTION_FOUND, e.Message); } private void AssertTampered(String outFile) { - PdfDocument pdfDoc = new PdfDocument(new PdfReader(outFile, new ReaderProperties().SetPassword("secret".GetBytes - (System.Text.Encoding.UTF8)))); - PdfObject obj = pdfDoc.GetPdfObject(14); - if (obj != null && obj.IsStream()) { - // Get decoded stream bytes. - NUnit.Framework.Assert.Catch(typeof(Exception), () => ((PdfStream)obj).GetBytes()); + using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(outFile, new ReaderProperties().SetPassword(USER_PASSWORD + )))) { + PdfObject obj = pdfDoc.GetPdfObject(14); + if (obj != null && obj.IsStream()) { + // Get decoded stream bytes. + NUnit.Framework.Assert.Catch(typeof(Exception), () => ((PdfStream)obj).GetBytes()); + } } } } diff --git a/itext.tests/itext.kernel.tests/itext/kernel/mac/MacIntegrityProtectorCreationTest.cs b/itext.tests/itext.kernel.tests/itext/kernel/mac/MacIntegrityProtectorCreationTest.cs index 7d710c1a5f..2aac77d3b8 100644 --- a/itext.tests/itext.kernel.tests/itext/kernel/mac/MacIntegrityProtectorCreationTest.cs +++ b/itext.tests/itext.kernel.tests/itext/kernel/mac/MacIntegrityProtectorCreationTest.cs @@ -101,7 +101,7 @@ public virtual void StandaloneMacUnwritableStreamTest() { .HMAC_WITH_SHA_256, MacProperties.KeyWrappingAlgorithm.AES_256_NO_PADD); WriterProperties writerProperties = new WriterProperties().SetPdfVersion(PdfVersion.PDF_2_0).SetStandardEncryption (PASSWORD, PASSWORD, 0, EncryptionConstants.ENCRYPTION_AES_256, macProperties); - MemoryStream unwritableStream = new _MemoryStream_120(); + MemoryStream unwritableStream = new _MemoryStream_124(); String exceptionMessage = NUnit.Framework.Assert.Catch(typeof(Exception), () => { using (PdfDocument pdfDoc = new PdfDocument(new PdfWriter(unwritableStream, writerProperties))) { pdfDoc.AddNewPage().AddAnnotation(new PdfTextAnnotation(new Rectangle(100, 100, 100, 100))); @@ -112,8 +112,8 @@ public virtual void StandaloneMacUnwritableStreamTest() { unwritableStream.Dispose(); } - private sealed class _MemoryStream_120 : MemoryStream { - public _MemoryStream_120() { + private sealed class _MemoryStream_124 : MemoryStream { + public _MemoryStream_124() { } public override void Write(byte[] b, int off, int len) { diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/cmp_externalFile.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/cmp_externalFile.pdf similarity index 100% rename from itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/cmp_externalFile.pdf rename to itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/cmp_externalFile.pdf diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/cmp_test-document.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/cmp_simpleEncryptDecrypt.pdf similarity index 52% rename from itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/cmp_test-document.pdf rename to itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/cmp_simpleEncryptDecrypt.pdf index dea9456ffeb066eaa4b6879b4c039d459fa9689e..fcf26de22f55e2f22eede7498eeedce6b222c7cb 100644 GIT binary patch delta 1331 zcmZuw&2Jnv9Mx`;rkVZdR&62Bf(DVOn?~8OfBuf5MUr9k(`kxlBwNq#J^%b{KX~I&*je0K zzqEpTB3OL<=dZs7>|y7tGc-hD7JnS9twrx-!?78T^N>CKe&;0ki9s|ld3JY{m^>72 zr8a+)ROln4$Gh2ZU5`z7eH9Q;q_Dt*QJ~9+oJZ*VQgk&-|Bt{A30tEqy_=X(*WIsQ zKfurYH}-usxnCgnwOxL1^P`)-zo>Kbff*HW1U(cTlCGG0=5|N`A@U3yn0vbgwOdq2 zmZJ9uSGqgn@tu4%iuU&Qdb@en%SN}Ne5{A59;MMdWm53o&iIqtOa1vt1$&CQzuK?4nbv8y(mJz=)C9&AxhP^gBA48!e*{DR zBnqga#qL4-)HKEd+_}~(Z&qh0d%+bmBwe$;a0AQY9G|zxl9#1bcY&ZRqhbtL9`5Yv zZUKmJUwC6+#Z`IU7#M${5`>^EplU3^U%n$+DUtiVy)aEM#jbPW)dQnrs+d4BA!$rf zZiLZN#M(by|Atd+jPV3zDcCqQj7ep=He4sl;=}^sMr$f5JM5Ok>^w$(cLMtWWL?vFEC~CFkU~QUs8Aq5?m0-*Slg5H% zSW_f{#w0eHcse00mIQHZKyhNQMFt5L$Nu$7#k^ecSOH5#Y`CG^B$!xePsDy@y9uTe6*)PYa^+vWM zk(0#*i4!VM+&O^6p_d|#P)OGAM@Ic9N}aZ*a;PWt=j@LPoDpc8Strom;l&T$+ z*C^EjcP9*Wio2wg<1X;bk%Ok$?#@m(lui{sboh@T=$weFXhi2u)PDtV!I7uYqr#{> z>IS<-`m}_Q8ZMZU+La)%giGyUZ&aj5Nj6$bHtb+j5Y}O;L&?pxgURG@yb%P6gZm?U zcrZxDonq9#*?xuGEz&_g$Wn4N9t`^gJ})h1IX=vSEjzJyihj52 zWy93X#M%Cx&Czf|Sa5BSj^E?(ZFvmSXyXGH^}|q14YzK(Zr1k5kp*1 zR3Z{NrHkuH1h`r=@KLn^KUXfp!|IPE4d0*NE-~2kE<@+JFG>ckS2euq)yqu7Ti(M` zbOIdL>HyW3;p-Z}?TQcYR@avVn|oV0L-rMTyznV}R@o_YfyXv1F5WM3bYS55b3VL@ zgd67`VId*ZYXWwwK3uG=!N=z%X3#+7!J+`a7Q(T=(v(C=DJ02>hjVvJs}O$hTMLFs z_{D!|%0l8`Hb;p4_~aVn3R`swlLC8m3eyp`>sgFbc@`6FhFzNr!W9)~E=TN4 zV9XZBg=;Qp9${Ty)?cg$G{Ud-l_ot+5mcEI%go{2Wq}`{vjA-@R|M1igmxx|;5>vs z{T2ACu?&y==7MGhzH6*bwaz1MBV%HnQzmR~xyMD`8cd2x(bn(VmMu(@G@~ zqcY}}W3FoaR2}S diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/decrypter.cert.pem b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/decrypter.cert.pem similarity index 100% rename from itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/decrypter.cert.pem rename to itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/decrypter.cert.pem diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/externalFile.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/externalFile.pdf similarity index 100% rename from itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/externalFile.pdf rename to itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/externalFile.pdf diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/invalidCryptFilter.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/invalidCryptFilter.pdf new file mode 100644 index 0000000000000000000000000000000000000000..086d385149f31b58f5622d1da12343b038b462ac GIT binary patch literal 5766 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 literal 0 HcmV?d00001 diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/signerkey.pem b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/signerkey.pem similarity index 100% rename from itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/signerkey.pem rename to itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/signerkey.pem diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/test-document.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/simpleEncryptDecrypt.pdf similarity index 100% rename from itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/test-document.pdf rename to itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/simpleEncryptDecrypt.pdf diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/test.cer b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/test.cer similarity index 100% rename from itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/test.cer rename to itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/test.cer diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/test.pem b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/test.pem similarity index 100% rename from itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PublicHandlerUsingAesGcmTest/test.pem rename to itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/PubSecHandlerUsingAesGcmTest/test.pem diff --git a/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/StandardHandlerUsingAesGcmTest/cmp_encryptedSimpleDocument.pdf b/itext.tests/itext.kernel.tests/resources/itext/kernel/crypto/securityhandler/StandardHandlerUsingAesGcmTest/cmp_encryptedSimpleDocument.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d770a7aa3c2016c29c5b83900ae188848194f71e GIT binary patch literal 7843 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 24)), (byte)( (int)(((uint)objNumber) >> 16)), (byte)((int)(((uint)objNumber) >> 8)), (byte)(objNumber) }; @@ -97,8 +103,9 @@ public override IDecryptor GetDecryptor() { protected internal override void SetPubSecSpecificHandlerDicEntries(PdfDictionary encryptionDictionary, bool encryptMetadata, bool embeddedFilesOnly) { - base.SetPubSecSpecificHandlerDicEntries(encryptionDictionary, encryptMetadata, embeddedFilesOnly); - encryptionDictionary.Put(PdfName.V, new PdfNumber(7)); + int version = 6; + PdfName filter = PdfName.AESV4; + SetEncryptionDictEntries(encryptionDictionary, encryptMetadata, embeddedFilesOnly, version, filter); } } } diff --git a/itext/itext.kernel/itext/kernel/crypto/securityhandler/StandardHandlerUsingAes256.cs b/itext/itext.kernel/itext/kernel/crypto/securityhandler/StandardHandlerUsingAes256.cs index 1ec740770c..7e1264b6a3 100644 --- a/itext/itext.kernel/itext/kernel/crypto/securityhandler/StandardHandlerUsingAes256.cs +++ b/itext/itext.kernel/itext/kernel/crypto/securityhandler/StandardHandlerUsingAes256.cs @@ -40,10 +40,10 @@ public class StandardHandlerUsingAes256 : StandardSecurityHandler { private const int SALT_LENGTH = 8; - private bool isPdf2; - protected internal bool encryptMetadata; + private bool isPdf2; + public StandardHandlerUsingAes256(PdfDictionary encryptionDictionary, byte[] userPassword, byte[] ownerPassword , int permissions, bool encryptMetadata, bool embeddedFilesOnly, PdfVersion version) { isPdf2 = version != null && version.CompareTo(PdfVersion.PDF_2_0) >= 0; @@ -55,6 +55,14 @@ public StandardHandlerUsingAes256(PdfDictionary encryptionDictionary, byte[] pas InitKeyAndReadDictionary(encryptionDictionary, password); } + /// Checks whether the document-level metadata stream will be encrypted. + /// + /// + /// + /// if the document-level metadata stream shall be encrypted, + /// + /// otherwise + /// public virtual bool IsEncryptMetadata() { return encryptMetadata; } @@ -71,6 +79,57 @@ public override IDecryptor GetDecryptor() { return new AesDecryptor(nextObjectKey, 0, nextObjectKeySize); } +//\cond DO_NOT_DOCUMENT + internal virtual void SetAES256DicEntries(PdfDictionary encryptionDictionary, byte[] oeKey, byte[] ueKey, + byte[] aes256Perms, bool encryptMetadata, bool embeddedFilesOnly) { + int version = 5; + int rAes256 = 5; + int rAes256Pdf2 = 6; + int revision = isPdf2 ? rAes256Pdf2 : rAes256; + PdfName cryptoFilter = PdfName.AESV3; + SetEncryptionDictionaryEntries(encryptionDictionary, oeKey, ueKey, aes256Perms, encryptMetadata, embeddedFilesOnly + , version, revision, cryptoFilter); + } +//\endcond + +//\cond DO_NOT_DOCUMENT + internal virtual void SetEncryptionDictionaryEntries(PdfDictionary encryptionDictionary, byte[] oeKey, byte + [] ueKey, byte[] aes256Perms, bool encryptMetadata, bool embeddedFilesOnly, int version, int revision, + PdfName cryptoFilter) { + encryptionDictionary.Put(PdfName.OE, new PdfLiteral(StreamUtil.CreateEscapedString(oeKey))); + encryptionDictionary.Put(PdfName.UE, new PdfLiteral(StreamUtil.CreateEscapedString(ueKey))); + encryptionDictionary.Put(PdfName.Perms, new PdfLiteral(StreamUtil.CreateEscapedString(aes256Perms))); + encryptionDictionary.Put(PdfName.R, new PdfNumber(revision)); + encryptionDictionary.Put(PdfName.V, new PdfNumber(version)); + PdfDictionary stdcf = new PdfDictionary(); + stdcf.Put(PdfName.Length, new PdfNumber(32)); + if (!encryptMetadata) { + encryptionDictionary.Put(PdfName.EncryptMetadata, PdfBoolean.FALSE); + } + if (embeddedFilesOnly) { + stdcf.Put(PdfName.AuthEvent, PdfName.EFOpen); + encryptionDictionary.Put(PdfName.EFF, PdfName.StdCF); + encryptionDictionary.Put(PdfName.StrF, PdfName.Identity); + encryptionDictionary.Put(PdfName.StmF, PdfName.Identity); + } + else { + stdcf.Put(PdfName.AuthEvent, PdfName.DocOpen); + encryptionDictionary.Put(PdfName.StrF, PdfName.StdCF); + encryptionDictionary.Put(PdfName.StmF, PdfName.StdCF); + } + stdcf.Put(PdfName.CFM, cryptoFilter); + PdfDictionary cf = new PdfDictionary(); + cf.Put(PdfName.StdCF, stdcf); + encryptionDictionary.Put(PdfName.CF, cf); + } +//\endcond + +//\cond DO_NOT_DOCUMENT + internal virtual bool IsPdf2(PdfDictionary encryptionDictionary) { + return encryptionDictionary.GetAsNumber(PdfName.R).GetValue() == 6; + } +//\endcond + private void InitKeyAndFillDictionary(PdfDictionary encryptionDictionary, byte[] userPassword, byte[] ownerPassword , int permissions, bool encryptMetadata, bool embeddedFilesOnly) { ownerPassword = GenerateOwnerPasswordIfNullOrEmpty(ownerPassword); @@ -141,38 +200,6 @@ private void InitKeyAndFillDictionary(PdfDictionary encryptionDictionary, byte[] } } - protected internal virtual void SetAES256DicEntries(PdfDictionary encryptionDictionary, byte[] oeKey, byte - [] ueKey, byte[] aes256Perms, bool encryptMetadata, bool embeddedFilesOnly) { - int vAes256 = 5; - int rAes256 = 5; - int rAes256Pdf2 = 6; - encryptionDictionary.Put(PdfName.OE, new PdfLiteral(StreamUtil.CreateEscapedString(oeKey))); - encryptionDictionary.Put(PdfName.UE, new PdfLiteral(StreamUtil.CreateEscapedString(ueKey))); - encryptionDictionary.Put(PdfName.Perms, new PdfLiteral(StreamUtil.CreateEscapedString(aes256Perms))); - encryptionDictionary.Put(PdfName.R, new PdfNumber(isPdf2 ? rAes256Pdf2 : rAes256)); - encryptionDictionary.Put(PdfName.V, new PdfNumber(vAes256)); - PdfDictionary stdcf = new PdfDictionary(); - stdcf.Put(PdfName.Length, new PdfNumber(32)); - if (!encryptMetadata) { - encryptionDictionary.Put(PdfName.EncryptMetadata, PdfBoolean.FALSE); - } - if (embeddedFilesOnly) { - stdcf.Put(PdfName.AuthEvent, PdfName.EFOpen); - encryptionDictionary.Put(PdfName.EFF, PdfName.StdCF); - encryptionDictionary.Put(PdfName.StrF, PdfName.Identity); - encryptionDictionary.Put(PdfName.StmF, PdfName.Identity); - } - else { - stdcf.Put(PdfName.AuthEvent, PdfName.DocOpen); - encryptionDictionary.Put(PdfName.StrF, PdfName.StdCF); - encryptionDictionary.Put(PdfName.StmF, PdfName.StdCF); - } - stdcf.Put(PdfName.CFM, PdfName.AESV3); - PdfDictionary cf = new PdfDictionary(); - cf.Put(PdfName.StdCF, stdcf); - encryptionDictionary.Put(PdfName.CF, cf); - } - private void InitKeyAndReadDictionary(PdfDictionary encryptionDictionary, byte[] password) { try { if (password == null) { @@ -183,10 +210,9 @@ private void InitKeyAndReadDictionary(PdfDictionary encryptionDictionary, byte[] password = JavaUtil.ArraysCopyOf(password, 127); } } - isPdf2 = encryptionDictionary.GetAsNumber(PdfName.R).GetValue() == 6 || encryptionDictionary.GetAsNumber(PdfName - .R).GetValue() == 7; - //truncate user and owner passwords to 48 bytes where the first 32 bytes - //are a hash value, next 8 bytes are validation salt and final 8 bytes are the key salt + isPdf2 = IsPdf2(encryptionDictionary); + // Truncate user and owner passwords to 48 bytes where the first 32 bytes + // are a hash value, next 8 bytes are validation salt and final 8 bytes are the key salt byte[] oValue = TruncateArray(GetIsoBytes(encryptionDictionary.GetAsString(PdfName.O))); byte[] uValue = TruncateArray(GetIsoBytes(encryptionDictionary.GetAsString(PdfName.U))); byte[] oeValue = GetIsoBytes(encryptionDictionary.GetAsString(PdfName.OE)); @@ -302,6 +328,7 @@ private byte[] ComputeHash(byte[] password, byte[] salt, int saltOffset, int sal } } // d) + System.Diagnostics.Debug.Assert(md != null); k = md.Digest(e); ++roundNum; if (roundNum > 63) { diff --git a/itext/itext.kernel/itext/kernel/crypto/securityhandler/StandardHandlerUsingAesGcm.cs b/itext/itext.kernel/itext/kernel/crypto/securityhandler/StandardHandlerUsingAesGcm.cs index a6a6d39014..21b62f5a4d 100644 --- a/itext/itext.kernel/itext/kernel/crypto/securityhandler/StandardHandlerUsingAesGcm.cs +++ b/itext/itext.kernel/itext/kernel/crypto/securityhandler/StandardHandlerUsingAesGcm.cs @@ -61,27 +61,13 @@ public StandardHandlerUsingAesGcm(PdfDictionary encryptionDictionary, byte[] pas : base(encryptionDictionary, password) { } - /// Checks whether the document-level metadata stream will be encrypted. - /// - /// - /// - /// if the document-level metadata stream shall be encrypted, - /// - /// otherwise - /// - public override bool IsEncryptMetadata() { - return encryptMetadata; - } - public override void SetHashKeyForNextObject(int objNumber, int objGeneration) { - // make sure the same IV is never used twice in the same file - // we do this by turning the objId/objGen into a 5-byte nonce (with generation restricted - // to 1 byte instead of 2) plus an in-object 2-byte counter that increments each time - // a new string is encrypted within the same object. - // The remaining 5 bytes will be generated randomly using a strong PRNG. - // This is *very different* from the situation with AES-CBC, where randomness is paramount. - // GCM uses a variation of counter mode, so making sure the IV is unique is more important - // than randomness. + // Make sure the same IV is never used twice in the same file. We do this by turning the objId/objGen into a + // 5-byte nonce (with generation restricted to 1 byte instead of 2) plus an in-object 2-byte counter that + // increments each time a new string is encrypted within the same object. The remaining 5 bytes will be + // generated randomly using a strong PRNG. + // This is very different from the situation with AES-CBC, where randomness is paramount. GCM uses a variation + // of counter mode, so making sure the IV is unique is more important than randomness. this.inObjectNonceCounter = 0; this.noncePart = new byte[] { 0, 0, (byte)(objGeneration), (byte)((int)(((uint)objNumber) >> 24)), (byte)( (int)(((uint)objNumber) >> 16)), (byte)((int)(((uint)objNumber) >> 8)), (byte)(objNumber) }; @@ -98,12 +84,21 @@ public override IDecryptor GetDecryptor() { return new AesGcmDecryptor(nextObjectKey, 0, nextObjectKeySize); } - protected internal override void SetAES256DicEntries(PdfDictionary encryptionDictionary, byte[] oeKey, byte - [] ueKey, byte[] aes256Perms, bool encryptMetadata, bool embeddedFilesOnly) { - base.SetAES256DicEntries(encryptionDictionary, oeKey, ueKey, aes256Perms, encryptMetadata, embeddedFilesOnly - ); - encryptionDictionary.Put(PdfName.R, new PdfNumber(7)); - encryptionDictionary.Put(PdfName.V, new PdfNumber(6)); +//\cond DO_NOT_DOCUMENT + internal override void SetAES256DicEntries(PdfDictionary encryptionDictionary, byte[] oeKey, byte[] ueKey, + byte[] aes256Perms, bool encryptMetadata, bool embeddedFilesOnly) { + int version = 6; + int revision = 7; + PdfName cryptoFilter = PdfName.AESV4; + SetEncryptionDictionaryEntries(encryptionDictionary, oeKey, ueKey, aes256Perms, encryptMetadata, embeddedFilesOnly + , version, revision, cryptoFilter); + } +//\endcond + +//\cond DO_NOT_DOCUMENT + internal override bool IsPdf2(PdfDictionary encryptionDictionary) { + return true; } +//\endcond } } diff --git a/itext/itext.kernel/itext/kernel/pdf/PdfEncryption.cs b/itext/itext.kernel/itext/kernel/pdf/PdfEncryption.cs index 7c48745450..0301e80a2e 100644 --- a/itext/itext.kernel/itext/kernel/pdf/PdfEncryption.cs +++ b/itext/itext.kernel/itext/kernel/pdf/PdfEncryption.cs @@ -952,7 +952,24 @@ private int ReadAndSetCryptoModeForStdHandler(PdfDictionary encDict) { } case 7: { - cryptoMode = EncryptionConstants.ENCRYPTION_AES_GCM; + // (ISO/TS 32003) The security handler defines the use of encryption + // and decryption in the same way as when the value of R is 6, and declares at least + // one crypt filter using the AESV4 method. + PdfDictionary cfDic = encDict.GetAsDictionary(PdfName.CF); + if (cfDic == null) { + throw new PdfException(KernelExceptionMessageConstant.CF_NOT_FOUND_ENCRYPTION); + } + cfDic = (PdfDictionary)cfDic.Get(PdfName.StdCF); + if (cfDic == null) { + throw new PdfException(KernelExceptionMessageConstant.STDCF_NOT_FOUND_ENCRYPTION); + } + if (PdfName.AESV4.Equals(cfDic.Get(PdfName.CFM))) { + cryptoMode = EncryptionConstants.ENCRYPTION_AES_GCM; + length = 256; + } + else { + throw new PdfException(KernelExceptionMessageConstant.NO_COMPATIBLE_ENCRYPTION_FOUND); + } PdfBoolean em7 = encDict.GetAsBoolean(PdfName.EncryptMetadata); if (em7 != null && !em7.GetValue()) { cryptoMode |= EncryptionConstants.DO_NOT_ENCRYPT_METADATA; diff --git a/port-hash b/port-hash index 0ab469136a..38a023f0cb 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -372ff5bcad8a28fe396b40fbb51d89e728a33728 +e3aab4f3d591b970957e3f568ad458ebc0d76578 From 87f48a96b358bfd75a26308626e3399160afb768 Mon Sep 17 00:00:00 2001 From: Angelina Pavlovets Date: Mon, 23 Sep 2024 10:34:38 +0000 Subject: [PATCH 2/2] Get rid of legacy list box drawing DEVSIX-7517 Autoported commit. Original commit hash: [a1e83efe1] --- .../itext/forms/PdfFormFieldTest.cs | 5 +- .../cmp_choiceFieldsSetValueTest.pdf | Bin 5801 -> 6038 bytes .../cmp_choiceFieldsWithUnicodeTest.pdf | Bin 14183909 -> 14183846 bytes ...lightCenteredTextOfChosenFirstItemTest.pdf | Bin 5381 -> 5745 bytes .../cmp_corruptedOptAndValueSetToNullTest.pdf | Bin 1738 -> 1916 bytes .../cmp_longOptionWrappedIntoTwoLinesTest.pdf | Bin 1618 -> 1745 bytes .../cmp_multiSelectByIndexOutOfBoundsTest.pdf | Bin 1663 -> 1849 bytes .../cmp_multiSelectByValueTest.pdf | Bin 1649 -> 1807 bytes ..._noWarningOnValueNotOfOptComboEditTest.pdf | Bin 5455 -> 5819 bytes ...mp_notInstanceOfPdfChoiceFormFieldTest.pdf | Bin 1518 -> 1672 bytes .../cmp_selectByValueRemoveIKeyTest.pdf | Bin 1909 -> 2095 bytes .../PdfChoiceFieldTest/cmp_topIndexTest.pdf | Bin 1791 -> 1953 bytes .../cmp_choiceFieldAutoSize01Test.pdf | Bin 2287 -> 2418 bytes .../cmp_choiceFieldAutoSize02Test.pdf | Bin 2151 -> 2212 bytes .../cmp_choiceFieldTest01.pdf | Bin 2199 -> 2260 bytes .../cmp_maxLenColoredTest.pdf | Bin 1742 -> 1877 bytes .../cmp_maxLenDeepInheritanceTest.pdf | Bin 10191 -> 10344 bytes .../cmp_maxLenInheritanceTest.pdf | Bin 3297 -> 3460 bytes ...mp_maxLenWithSetCombFlagAppearanceTest.pdf | Bin 4058 -> 4048 bytes .../cmp_noMaxLenWithSetCombFlagTest.pdf | Bin 1506 -> 1602 bytes .../cmp_pdfWithDifferentFieldsTest.pdf | Bin 5147 -> 4901 bytes .../cmp_regenerateMaxLenCombTest.pdf | Bin 8749 -> 8813 bytes .../cmp_setValueWithDisplayTest.pdf | Bin 5371 -> 5284 bytes .../forms/XfdfReaderTest/cmp_xfdfDropDown.pdf | Bin 5722 -> 5855 bytes .../forms/XfdfReaderTest/cmp_xfdfList.pdf | Bin 5688 -> 5891 bytes .../cmp_basicListBoxField.pdf | Bin 1912 -> 1893 bytes .../ListBoxFieldTest/cmp_colorsBorders.pdf | Bin 2141 -> 2120 bytes .../ListBoxFieldTest/cmp_exportValue.pdf | Bin 1999 -> 1979 bytes .../ListBoxFieldTest/cmp_justification.pdf | Bin 3090 -> 3033 bytes .../cmp_listBoxFieldCannotFit.pdf | Bin 2028 -> 2009 bytes .../cmp_listBoxFieldCannotFitByWidth.pdf | Bin 2089 -> 2064 bytes .../cmp_listBoxFieldWithHeight.pdf | Bin 1921 -> 1897 bytes .../cmp_listBoxFieldWithMargins.pdf | Bin 1962 -> 1939 bytes .../cmp_listBoxFieldWithMaxHeight.pdf | Bin 1875 -> 1854 bytes .../cmp_listBoxFieldWithMinHeight.pdf | Bin 1920 -> 1897 bytes .../element/ListBoxFieldTest/cmp_longList.pdf | Bin 2264 -> 2243 bytes .../itext/pdfa/PdfAFormFieldTest.cs | 2 +- .../cmp_pdfA1DocWithPdfA1ChoiceField.pdf | Bin 18085 -> 18092 bytes .../cmp_pdfA1DocWithPdfA1ComboBoxField.pdf | Bin 219894 -> 219894 bytes .../cmp_pdfA1DocWithPdfA1ListField.pdf | Bin 18138 -> 18270 bytes ...p_testMultipleCombinationsWriteAndLoad.pdf | Bin 273638 -> 273472 bytes .../itext/forms/fields/PdfFormAnnotation.cs | 107 ++--- .../itext/forms/fields/PdfTextFormField.cs | 8 +- .../forms/fields/TextAndChoiceLegacyDrawer.cs | 382 ------------------ .../itext/forms/form/FormProperty.cs | 15 + .../itext/forms/form/element/InputField.cs | 49 ++- .../itext/forms/form/element/ListBoxField.cs | 16 + .../itext/forms/form/element/TextArea.cs | 21 - .../renderer/AbstractSelectFieldRenderer.cs | 3 +- .../forms/form/renderer/InputFieldRenderer.cs | 78 +++- .../renderer/SelectFieldListBoxRenderer.cs | 19 +- port-hash | 2 +- 52 files changed, 244 insertions(+), 463 deletions(-) delete mode 100644 itext/itext.forms/itext/forms/fields/TextAndChoiceLegacyDrawer.cs diff --git a/itext.tests/itext.forms.tests/itext/forms/PdfFormFieldTest.cs b/itext.tests/itext.forms.tests/itext/forms/PdfFormFieldTest.cs index b570abe7dd..d297f34141 100644 --- a/itext.tests/itext.forms.tests/itext/forms/PdfFormFieldTest.cs +++ b/itext.tests/itext.forms.tests/itext/forms/PdfFormFieldTest.cs @@ -38,7 +38,6 @@ You should have received a copy of the GNU Affero General Public License using iText.Kernel.Utils; using iText.Layout; using iText.Layout.Element; -using iText.Layout.Logs; using iText.Layout.Properties; using iText.Test; using iText.Test.Attributes; @@ -978,10 +977,13 @@ public virtual void PdfWithDifferentFieldsTest() { // list PdfChoiceFormField f = new ChoiceFormFieldBuilder(pdfDoc, "combo").SetWidgetRectangle(new Rectangle(36, 556 , 50, 100)).SetOptions(new String[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }).CreateList(); + f.DisableFieldRegeneration(); f.SetValue("9", true); f.SetValue("4"); f.SetTopIndex(2); f.SetListSelected(new String[] { "3", "5" }); + f.SetMultiSelect(true); + f.EnableFieldRegeneration(); form.AddField(f); // push button form.AddField(new PushButtonFormFieldBuilder(pdfDoc, "push button").SetWidgetRectangle(new Rectangle(36, 526 @@ -1139,7 +1141,6 @@ public virtual void SetFont2Ways() { [NUnit.Framework.Test] // Acrobat removes /NeedAppearances flag when document is opened and suggests to resave the document at once. - [LogMessage(LayoutLogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA)] [LogMessage(FormsLogMessageConstants.INPUT_FIELD_DOES_NOT_FIT)] public virtual void AppendModeAppearance() { String inputFile = "appendModeAppearance.pdf"; diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/PdfChoiceFieldTest/cmp_choiceFieldsSetValueTest.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/PdfChoiceFieldTest/cmp_choiceFieldsSetValueTest.pdf index e486ae965c990fadec0e5d862df983860ac764e0..504a2fbb9651f824ead22ec3ca8992bc49b58715 100644 GIT binary patch delta 1985 zcmZ{leKgaHAICk^(l9Fz5o1WkHNN}q!FRTpJj8Apl7}K~wnegO%a9nZ)zr_jCO41W z+mq*YFN)GtQXW$BkjN#9uB)O_9uv3D`TcXx`ThQTpYu8I^E$6{KIgp4u(=M|d*$_! zngoE1g8&c&@HoW}s`Tw{d;tedwg>D1>~0@d-`!q}0CXtEb%*axw1^`RM)7%}Hs~@C z001lqfCRK_tRPXyLGKXo<6_Z1fi}+0azCsZ2+30&H-QiuK=WCL;8d!^P7d$j(MU8N zMuQ*>DrZ zdW5wqpui!hY7kLTuHz|AmNy{o0a_mMV#$tR{|57zkkb!aQlk2>F@4 zENhcnekm@1R5HeF%!v_y_jVMaLU>kZaM+YragUKnRTa+TR8HZ z;aG>9y3!UIEtNdFjB(p{3KfIbipPZ&m3LG*^v}U1`nCHc$NO|M89{c6Xr!rvf&kSZ z!hb!UAkqP?miNi0OlQHtmnzo`>l1;HSDF}i^{p4znT_z6z$$mL=gQZVk!MzOX|F}< zLG@n14VqV5lyb%-?&`p3Yz9o^Z^Z%bchPG|$`|S-dHnfS#Qvv6DsC;iJK_)gC$E&M zJE^!k5XC^ zlCpP`;d|DtQbzMsW9`Ax%Ix9t@seTy6*vIr@Yuqm0uD3gd;0ztp!}OyA+k)of#nh! zCSN>EOBtJaY+gy1p6Dhd%|Gi~n>_EZ5XqS5eeeZ$7W& zJyK9V3{{TV8TB02QbdsoWq7d{26moCZ*7M154T+!&L2xtjClARaSODjRSQaLZUvq= z?t^#aPxu;2E{~zl(M<>cPd>NF$eY^b$tr zwH9htBQdCzp+q2o`(2F$|cYijS@%f_&IIE+yst9koV&qkDEqQn9 z^2cShn0DWNHgfTdchytz7Zc~x7uO>Sl&_F;)L1_X-&eJ>U)|P6GB%fzLJ3-Q*on?k zh6dD4C*bNc!UvAOZJc{{H&4SJ=d|C#J}kf1`@s11k@TR$gFD?r1eK_QT2DfC-*T3E zdtM;Xe*1(doW7##l{VEOY~A?$`7PGqv{enJjNZ4bFBL^?v}B8$%=6S1nde?=o6-@z z>$B(A5(C3a-RPVNb8Bc+aC znatc9K*^cEcta{29ekG)6C9Rt8R#-NsZ`uv^@dMZ4fK9K^Cw{192xjwTW=f9CN!7U zNT`0Ca8qT*uvC29e$C8~!Q4h!wqJVztcV@!EA3x16`qo1y&+rD2ag}PFm$ND%95_z zkDYz^7Tb%ls0x#YqGaabS5BX`)Q3JN2z|A#+AgW)zcz5;SJ$NmiGCC}_)3fo&*YCiFt=*XcvGy) ztvk4j$0^vKd;N`BZq(RcYV(w>9Y|Y~h9r2$`Nc$w8f5%4vuAl`Zs1!?-r`~*lfmn} zX{Xj^k!rVuKHa%!KQO$up`md&>|h-*@PKc=07BTGdaK{pQjOv|la_yw{zQGnJb$tz z^@AR=cu7OdD4GyvWV?+cSM`l4Fjzi#bK@yn*kRyly z3j!d31QH3~T3il`LxPw9n?(khOcIy};Od^NHCUOB{1PRY!;y@OFXR}!df^(RI zH;>Ip*ax8Tctw-GttwveP9GgkMx+8-?%lZT-!k|3nj<{D+qEYlSbvjC@I&E-BzF7w zxo!alP0R4fjS5m#wW#&YM~HUhJ@;;zX6Q!a?N)wGlTR_qemOxXbW@*%F%pMtoW8!+ us;g=2S%)=*ZB|4Z7} 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 delta 2877 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 L;N%n(6-@XK(NpT# delta 1402 zcmV-=1%>+YEQKl&B~V00Eio=O3MJy>&(jJsGLaFMkq{-3%u17R0u=!>lZFB}lNAAJ z3otM>F)}eSH8e3elZgRO6*4VTPC-ypNKaHCsWLDyFfB4LGBA_v0U!e@K0cEH5flqd zWo~D5Xdp8&F*CE&0>c6pGA&b1K~PgjPgEensWLDyFfB4LGBA^^1s;IQiTlami80X37m4?Gq!H!n?LbaH8UTQMLoATS^?ATS^>U6c6_ zMt>{hGE_+CGEgv3Ff=yTGdEW-GSf3ORVYg3O5-xnGgW}$Aa|^ag1G{@^g}8XoP3?R z3b~9GjDac)!75CkD#E$)fHF=YT>5T?3WkOXA!$Hm7JB9iAt^u$3@j}akjbKSE)AE| zw8YY!63vh-F4qvC`GH)nK+^$N1S6ITWs|879FZFnlPD25f3`2BWjDS6MF1ytc7tu} zA{U@(kOx{C$=pz+%S&4K>-SI^N7{!PuqblooH;xku{aYGF?}zJ`I%UV>1-vIV!B+3 zm6*+DqA0{{QHbf8ct2T+4Evyp5JkFzOoH=q`|lf3lqaN&MEPToyK{?Cgk zo{JTpPx3QWe_H)9`c-)l=ZavGHxyj*B?Z*{w%z?pWyIT63q4uz%{hMZ#zhrLOyu41 zKp<%7{5*@iP=T%>RQ^rog`zH%+}P4p+BSJBng5GwsSC^7w2K*@If|YsV|%7cm$D{# zrG1ESCPP1|*Vit4o1)Q{LXTLB&XLo07JZ(MhTdEle`TLVmie~N{rFgPYJ~ju@LhCH z2%C&~lDG0Ncjx}E;U8TE20RTr=CU7kT@xz8u}7Sy+$UX!%x3K**6XzF#d$Gp`xf#*Oz?p+GX zRxApIb~x%`*5gkzhIi9ZWW3y!={cfT6}8I4fm&ykLVgOSQ@q^>dCOKlR2n{a8~e^n zaMVx;02u~2@CAk$))HT_F$#k02n2Pl3S}~#yydbB|47Qm+!uJ?D^qhRUJkfC zf3S^p-%oPQb=Tu&UH5G$*MlYNzCYJElgn2v8z$K>$!1Kl8Nk<^cg=a%|L0blG$Dr*gX#ls$M13$vEOI~GGs8VI+>aUV2jm0C@Al5;?}B`bZr>S%6jLZp zQDX|lBGf>odYe?f1YT_-CLt!FF$oP|PtAFn^Yl1R4|$YrvRvFT$T7%`LGF|^fGho? zyCpU$F+MRqjqz!~9XTF*la8kdUy7%j9{1vZ)qP6n3T19&b98cLVQmU!Ze(v_Y6>$p zkr5q}#uO(YWidH3G&C?XGGQ_?IAmmDF=Sz4GBIQ~G&nJ0HDfa}lWi3w6*ezYZ*O!U zF*G1BAW|<=X?kTKGdGi_6(VGSFbsv^mpUv2M;yRu;kn!i9?eU68S~pNzLHmxR5JMq zTnVI*K@O!X=um(JQmKtuW_Hor$jk<29F!ex1N8o&lWd|KVTL6R_{pV}tbh&n_$BXs zT-8pvoyJ#N^-3R2mIYsvFBTakH!d+QF)}SvPC-ypNKaG>b97;Hba--QW(qYhGBye& IB}Gq03P_e%ivR!s diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/PdfChoiceFieldTest/cmp_corruptedOptAndValueSetToNullTest.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/PdfChoiceFieldTest/cmp_corruptedOptAndValueSetToNullTest.pdf index 955b6ff46ce829b37d2dacc0391d156090311ef7..b2d908e99eece8dfcb6b3017c4a4d54ed6f4be80 100644 GIT binary patch delta 611 zcmY+CT}V@57=SxF&hSJgiJ@lfG~3i-@_y$#Ki{Dc&72yxDGotf*7+Mqpth-4QY)rj zSk&aBUnEnBsIaW)LMj6jf}$HKE6Iy4OerDAAP|)-=%Txa=knoswQ)H)?qu+T>=O+A z$P{c4K}7^1NydmeZ7~~C=`9;iTW#ru#Z6(0SMwnsJk`FU%IY$IfDh&tl~z{pZB{ta z(9{^r<8KQ9;1NI&`J(3V@rcEjhMQWOd0$N)rHq$O+Fml4USma8Kr)?Wz0uy++&H9^ z{8~(V^tS7m`+~bMZDusZwt9NlIjvXyTzoS$HK=#P_R+a7-4!eB+&6phMlyw(C+oet zU*P%Lg&gQSzxR9Q+zcldyU(UhTpeJR9xing=!;*UU$;6H$??~pyp#3S)1Tgxy#TWp zTR&VHIdH$P3>H3*RaIX$qMbMWZig_`HCf*FOkp$Zb#<{F!9L&4 z)Y$%jFYZ0W?;0?ljxEjJt&N`>TiIIrzWCs3xpR0Vuk78Y>G~~4Gfw?TB9D)((9a2( zj7XOgvK)%2@@r85_(q=l3jjn_{yDnIzKsU#xvVM@8nwGv0&C6fKAM!cIRODE)RDL+ zs;Zi#A(QA@NU;p02!^Ihrc4ZMXr^XjY!Cs9nCQAjbOULkEXks!hOiRSK}VXbs}>Su zotTzrnYs{CL68YpNFs&=Azi>4C^}%p!X_XrB6H0s3ei9^4MkuS+L7oG#exFP)ex}S fTReYm@ce%R7irPLE$v||#33w8oXb_>_j11hwa3)K delta 448 zcmeyvcZzp{5~ImRZ<%Z+&th#Oj%>iZ^^6lGRK8!8w8A()Jvtij?|KVd&#lLODO?{=>4v8T3%TSOSXc+wE} zh?_%-or7g@|9jbH!++lGW^dQW?<-?yHY}UH(}VXJ+i|vU0nU%!N92VYG`M!JdhyA^ z%0WD8X?x1q6HWVgKc5Mlw$T32qW80w?ss_Fe29ITR^;4`FR%SSHs$1ro`>8iCvG^g z@NP7EuBaWfJhJhz=9-R4lQSmiMt0iW&Oi0&glnR+-c+ZLw(M(o@0y7K@Ow1=QVYOnmFf*L|kX4o0+{g$>3s06|vt}|hp6tq|!eU@)WH33G%|^k{ z$k5o-(jX<#%*YI=J25#eH7zO4$TZc+$Rg1)$zZZ3yS#y^ogJ5IW=Lv9iLSYxp`M|E gZm^$YK(L2@2v>1QVo?d$Rfa}p=3J_(uKsRZ0FQH^kN^Mx diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/PdfChoiceFieldTest/cmp_longOptionWrappedIntoTwoLinesTest.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/PdfChoiceFieldTest/cmp_longOptionWrappedIntoTwoLinesTest.pdf index f77abb317ab7fcbfb2f218ac0170845ab2d2d082..5fdd28ee6839338f404dcf3baddc384bd49d3f09 100644 GIT binary patch delta 865 zcmcJOT}TvB6vvz07GbCeiL6k&W$OpE?!9;J%-ox@v8n49skK&=S=`x~DI<4eb_#=1 zU!)=nZK&vjSc#H~9(*%ML3@ZIAx$iLC<>wnU+krqvf2bg+LvBBPlw<6^XCueoXKSq z%X>EpurKehK>K=X1lISaDvtsPEbXXRS{e+;cJ4W0|0OnQ*2i^BV z&K3e0q6o=~gf>H|0K$Tz;0{YK=Z;ZWz7<2fNZ=NFa(%2A7DKnzvni8+aGQNHVSq~8 zI^G8A_7u6-govQJ=RKA{-R~Zf>XCPY0Ntop^(f3udb3h!$Q$Uq{Bn537+9GxJ9q2j zw(0Qm%KoA0sp^cpbHU`p>vxa58hv{80m_eLJj$*do9pU5Q*wX&QhaLQX45loW=&}C zJ&jIwyuC8Un)g?IV8hDlvRd(-_<3-)A+lyX+288foji3XNwz;}4dryTfsrsCKQTai z&c6PV{cYb+Lr&qy=%g5hFQx~riQ)X!YdcB?x~JTkA9i=vryHjqU%Xv+=X)5~I;X<#Z-PgNfZ#5>DVY3%QI6GI&q&W`GB=ZojFCcSNNPoi zf_qVZX@P=Yn5LZ_S885Leo_{f+2jtUe2|Slm`oVWChIaQG8#?xXExU}H_-P@EGf#Y zh&EI(075Vss~?nFoL^d$oLX#SqwkiVR|29870f0tVAiegop74#kb!{f_s^o6*UUDV zyreQmyL4%H(gFDkzZRHmD|z_bTF^yhVJgDj31%? z>y12XK%OryDN0Sug#|-JQED0&(38eo1~6c*U}kD+Y^so^024DYv{V4gD&)b%%#AJJ zVsJqdb1Vui4JN;0QLQ&K1%@UFAQ@s{05QZ6$ua{2h#9D25WUD^MivMMz#M91Xo6vf zg$dZa2#CccMTwa?sYP7C=<{?@h_*2{PfAL)FiAE{v@}XHF-tWwH!(;~HZ@7KFg7-} zFi5o{sA6&*o4koJFkz{J)0(bxeo?9}I0@2nsj^-U}k(PmmCv8ZjvGa5PPT0^es3D<}lTZ!VJ@=jgm1gA5WKJX| zEy5ON9Lg4j_O~b@n}x(EL_dT?e@Y@kNsBBhf)*h`Eo^Mjro{&@AMf*h@baz}WHt#*wVVM zISe9|!G@Oopocq&j(99m^^d~}2zEQE1P2XH{CGELYO4|_rFxNZ%}7KHxK)>-h!^g< z{=N$@<;Sq#^!L=c(v_nl^RcD7BJ~3los#sr%%Mk{ z4&Tr3TXe&(u3cmD=!5g89m8H(=bi$}SGv}@Sn3)Mpn0Ji% zy!M;RBjfO?cr~|h&pWYm{r0XCzPSSmKyS*Q&weu(CRg5F8N=6}6kr`+rCs0;y8L^`LmT1N`V zCI}&j0r{_h(9rOIJ7S2RIlJ8y5utc|Ze3SI#M2}mcnaNA$70@7+piKE5~x9yAx5<9 zVP<2CGnFc~Mkz4}F|t-F;+#>4v4wSp3Dc0GstiZD%1wkU(~4ReB@n6EM;fQL zt{Pa=Y?~>T8HL%gplxMYq9Ux@Q9VkL1O?13D^dah+1C-~y-ELC5&UaK5be2}WlRm( K=c{Y3m;V6j!^s2y delta 387 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 delta 1620 zcmV-a2CMnIEzc^DT9dQ^B>^*&+5tC_S!oL}Ff}nUF)}qYGBAc6UGL!5CGm~}&xDYTcFf}bP zGE^}#IyE#pGBC3~26+gR=ME>6`4kJ284ocRF*7+YO<{C$X?R;PATS^>ATb~?ATV8% zO%FzYZOyR?!Y~wt;r%?t8Ffi=jWuqE#ko>lVH`vtYi0<`|EEU8$WWT(1b;)M07c(rmmFAKyV8|9LcDG}T z60Rm!NjzrXzY^)~-8vc&t$#M`_RBgRL>uz4Jec*F04^3nH*S2!T-60lRy(1K%ME*U zNm5ws33Ic)$_B$UrF16QAae<(<3Tc_ypqu%O41E`wp(*NAp27k6&kh*#D8q%Hm7y1 z412wJ<bpt&yU}CI|sOT39O)k<+;;^?QC6fZTFH}TB%Ca_yJ72z?c!TK>8$r{jkbl zLz@y|G6q&@PSkOdkrxsQ30m-~LVX&GtptWribEqBn(YhT>}ah0SV~1MXw*D6!i85^ zAzKF$OVe9wQSE5G7k{-So&##LQ?}uC5rQH|TWYgza&Gnv-nX2fkl7H?tU;}y=NOyw9N;H%s zl16);`}nZZND&>RZGx8OZ`D{5R4A&N+0k*gK=%q+w&&3vJEfG+T$OVYvcNY<~uIS;3{mpn~Bnx`hH^5;CI?@)~RnpHti&t`u?0! zP43RI%mc|hkblhkB=Zh@AMEaf-F@HgzO$Pfs^UX%z6_vc04@8V<;kc6@9EDV4)REw zp&woX!%JXz=`*}^$hUC5+9~b63)Fk+_N}BN9w>M);e84og5Vt$_cC#J37loZK!Sk; z`y|+bMX(dWPW0_WXNOLvIyhGWqyk9wLF#1GfeY~|+D5G)k_~tp@V1Y)9qt&;jTh;7 zItdr@>2Ce)H}uXA<&3ts+%*2rb&1N@3T19&b98cLVQmU!Ze(v_Y6>$p zkr5q}7ZoQUGGSveIXE?8HZe0fGcsg3GB9B|I5=fAI51%_FkxdhlfD%s6)`VTZ*O!U zF*G1BAW|<=X?kTKGdGj>6)1n!85|K@IN}97k9+SZcsl#jEWQ$w7b=-TIUWxQq>w=^ zb2{ZAffOppOfT6^X1cj?k{DovkwMGK6tCn^NONo*ln`nmu|f|!9Px8z_66G~&|K0F zlj8-K3T19&b98cLVQmU!Ze(v_Y6>N3RAqQ{EjKPPE-^AKQ%*rpQ%D$3R0?x+VRCeM Sa%E-;H8C(X3MC~)Peuytci#a3 diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/PdfChoiceFieldTest/cmp_notInstanceOfPdfChoiceFormFieldTest.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/PdfChoiceFieldTest/cmp_notInstanceOfPdfChoiceFormFieldTest.pdf index 959b0cf421df767ed5c6ddaece9facc544584063..523c29b0b116228245af18fa3aeca8be5e1a367c 100644 GIT binary patch delta 844 zcmb`FUq}>D6vo-q#IeMOpg$O1$;Dk__1-%(ckW#mOEj&>KcTr%Lfn~qCst~AnO(!h zV0((N$YAIpL41kGAgKrvlE_4*9)z+G3L+$xAd;xJ0^5~}V0#HVPlw+*eCIpxeJZ}N z`AUU{-Q9KAR6>GgC$_OS z4qChXZjYzQ4R4t7Ft;7jAB!%HJ^@p5wH^T^=to zw&j%-H!ThIU%WnX|D=UZ3_QMvOKJyS`=%Cak4!#WI3|Oiua;H5uv6(9BZXaOX9vcY zkB+gKHPHVm96dPrefs^SrNX!Kl|jEEqau-XBtM<)VrGxh=SW+D06``5>dyj1*Hs zhmaJ~MiNTQO^tI?wV7%PPM8L{Fc8-$R&B`2l`a7PNtx4^nO b#k-#GKsMfiY`opMf~`eRSG?YRZB5D#bPWYZ delta 650 zcmeC+eaAgPk;%|tqf#K_WO*i=$;FJaItB)YhUSJQMkWS^+6Knz1_tVy`o8%oE{P?n z8ZK5w21ZB)H5{D4fb;k2=?#~QCJC7VW10AsE`?wT2Z3lUX)*2px_s# z5ToJf9^j)}mReMtnV%PpLH$x6&-q89qTi6upu714$Y20#cVV<$&4yVq~z zJ7mD)QeNMBeAAA?M=EclLd@E{CjMXy5^!Ga;`-s|5?O&&M@lBuey=HNVtn=C*t?n* z7B=3l1^EWN`%>+eD2vZ4#|q9er@Gs#wI6O+_b=` diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/PdfChoiceFieldTest/cmp_selectByValueRemoveIKeyTest.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/PdfChoiceFieldTest/cmp_selectByValueRemoveIKeyTest.pdf index ddcb212d4e7e2a8cc4298beae95e743cb0572fe7..fdc407fd3a454181461b6d230096dc7df8ac3ddc 100644 GIT binary patch delta 621 zcmZ9KO-NKx9L1R#9qVZkRv2h_)27CuvH!jA-uvzglZHVJ36=bSN~rhdy#bYG;>~0Z zBpNM57iC<^h(h~XRFDZtsH+NzicCpFC~1*JMbIKlU_f%VX(x- z#!CHe+2^jzrJ!ShG2<$hv+j7FhVBpm2ok`$Z1x~o>e;d{9CvJ_mqR%O8|y+1jr;4H zP^&*w({KQF+D@V^9&0W8+anZ(PB^KAjcT0u$rGrqrA&t0)w0(!<6^Qti@61rSF);l zx-Yy^o33I0$o1z1mjYu=uBp9~?=PDn zV%8k_{blF)?3s?qsjX0a@z?o+jh)T4iXF2ONyj#huc)}$u5>weQ~`v!?8z<)=vYM= zf&eInlvM#3IR4)QCggPX9uLlNc6)suT~lSiTPGiS^W}iopM|j|_k4X)t2>_K7 zn{l0(gaQbnSwd&rBqngp1_I3HYQ!?sCxPtBhBdge^cmL&z5 zPo6K$YD+2H*~Z{|ARsMkQF;zjSXj`!{^*&V3+FWoxIrH_*!B>|)d3QfJ z#k4b~@f;f)gNLv|!{l?UQjF%4U$V+*nOc}D7=VC6o&pz`VPIfsVS*uMW-?iy&5GH; z#AtF3n<}$~rP<^uY<^6JrjwtrSxkPwCch((A3z#G|ALr@*Q@00dqS$F4fGC)QS>ab3H>n!^!*{VqC_S7F?>TuKsRZ E0J=(hCw z8+98d<$vWO*aD`T^t%)nC^wCLMh^{eDYyy337wtR*G}RI6yjbjJvQy7| zUEcYry8Bu4+Pj8{`8-FklUp73T=%a0#_?Cdkwj1ai^ZO~Z&Porjhm0m^(B_$_F&aQ zM(fN^M`(C(?APh1Up$osqf<4*9}`_Gy(Vem%ppw_KxXU_Lk@M)q6$#*V5hIsONCJsD_;$fP)NZR1cnuE^U3^ zjDnj^WQ5M{zXN-_=OeI@N@!fZq_KXfSWh}bhd~bYtNVUy(kq4|1jkL5{206Np zVp=`hVHqY1I4IIg=awu5^IUQx0Jtc}{sRDD5&YLEaAwjrr;ovqUUquzNaAV2SwdA; zngap}&2H22@N;h#4W6h=K-nNymZ+Pz1@4NCXmykS@byhoI}cAQQxE z1Vs!(R&;~c05LU9QzA+-fprBDBmx!X fRatLch0)RKU;l=G{TuXy%fpI*XT9Eir6Kk&-B;4; delta 451 zcmZ3;|DSh)5~Jxx<)w_1C75j{pJ24(HZU+WG&3|eGBPoqEXdS6*@;PsQFF2v^F>C} z$ucY^;)dp?`o4)JMVS@Rh6)Bi2qt4E2eY`88r^!&yjW$k z%gIMqbIH1?PMRH^tESBCSz9P4lpA?ND}RDm)YGMQKh-j9rm#B&z4+Z@nW+0KdXnYh ztYi1*q#TVl-s5!VC;OIv^AB&hFh|x^qW$+KUL($xVFrDMImM?qw=pi#M0~oMWFf%nZHdRQQypL5@%)-=I0W71C zrvOu9YB>2Mt2L8>$z(P*Rc3QD)5&^leqx3Yg@y`gaD@hjCX=(+R9Flw&5S2cVzW^& zGfOrxvotWXFi$c{PBcq0Nli2~GBHawPD)L*FtJFS?8h!IU}k5>rJ5O%T2Z2Fu4kxc UIJuEsjLX=-fJ;@?)!&T^0H+?C2LJ#7 diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/PdfFormFieldTest/cmp_choiceFieldAutoSize01Test.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/PdfFormFieldTest/cmp_choiceFieldAutoSize01Test.pdf index 7af2298409b4d2e26fa7df2d6a64b49c92bba288..9f66295c4464c69739ae16952cefc8cae13fede9 100644 GIT binary patch delta 1215 zcmaDa_(^Dj5~IBD5EaQ;Re*LsBbB)+spW7o{p#>KW)6 z=mz^a1_XQfhbY8oIJyV;D3qlZ6=&w>#b_$5G%_$S&;^;O;8;*pS)8iiUX;&PTA<(; zra8Hr$&Jx`awT&C(8aHqO@M597BQ&1?d-Tx^HM-&SJ)7YBqU3t2j{2Y8Ku4 z+zSV}4jJ&UJ*b}d$o|#R>{nX1OE)#L^E(|7FAzS;yTe`T}*~N$KO|W$$U-7z4h{Vj3_I= zTne|{0jqU-bqTTuk8huOuFs0&wt&>7KmR;mSllVxH0Kbj-$~U?N97g1sLC~VO=@PI zFfrnk$QJRZU&O-lL-fweY@Jba)cPR5is6j}{}=rW`8~Kzitd(F?nwW6!oyC}*~tA~ z@|uLZZ>;M%4dyLZZ%yRpnk#%Q>BfPCef`&^#7j$M+Tv%l-m%)Nl^(!#{@qkFn+_*$ zr|2b0JH?_l*1fxTd3);x*4O3UJo{F?|D1XG{guZ&oGWMTJd`K@fAuxL9ea-a6nlNQ z+Vr;0-|x(tZ8_eUfl*PEn#N_IU~6c?1xy(bV5VSZYHDn%kfs0=voJPR0Lv-l!Nn{s zfJq$$6!IotV3T1nG%z-vEWxfSZ(v{vmM}y%z!Gl2dQHZuNOfySKN;FC}GOhKPEJd-G)grvGBYwZ zFiNs8OG`2}PBJpJFt#u?H!?I&wJ^6dG_f#AOfxYtFibQtH%v`VPBu+8Of)w!s5iDq zF-$T6sYG7)fVrgiWnqp~^l#*gcMJJd6 r-9UyDCNJQS6Eidc=1Em>=GO(~eO++gpL~HsjMLnZOI6j?-;E0Z#cGuI delta 1132 zcmew)^j>g+5~Ib$f3g!Dq8Uvl&hZnmR4`D;Ps-x5vC(%701|!*hL#im6*HPlE@BMi zGKI@dp2#Xa`30jYP=b$1TnMBsC|2J&Kd&S;ucTPP&~&mnQ`}@nW}C@VnPhbg3``A; z42?`pjE%JojMWVc)HU^e^HW?BOHwsltc(ndkQ7Y5$0X@yu4kxcXrvqL=NJ&|;UA)~ z5~#vJ7o<=jGbFX5M8Ul%zqCNXFH9ju!_hs!N4G4ss5mn}FGf?-&WM{p~cW*vJZ=yn1QLjZ(>PNW<|6iP?>=O zn2epgo>iRDZ1Nly-FodOMga^570L|`U%29M@Pxxcjj7r*v?qAmFL63}^7_ox6HZ4Q zj5v7Vh|9qXOe*5%rm~9^b3MFNZp^~dKw7 z6eDBSDLQOs+8NWR#>l{LDv=KINpVS0YGN+TPln(Knq19lC~jzJM8K7;0ektH9C+^i z7LhGo8NOq2`D(V_X6C9+{sjs%G#(x~a{POPr>sxA+1u}zw=uUmzcEif=(aFe!pp*e zk^BFlr+KWhOJ*o#_g>@Mtb8Xq|7GIFG!ZYMFQF|FY8zjiH;6WWc=7Qz{ruwk);sQN z`9xM;ab2Ty?TlI4S+!yby@}dBx##@EmQ)z5bi35wxkSZihKA5&i{AT|r_S;{UAcGu ze(@g{Pw{w~>AiWa_UE{?;>F92Z;iivRbSX(^Y0aJqqC0?rtd3?Qq#B$6pReGfXM*@ z%oWT`O^r$CVa*ByrN^)wFp`~%EWwK?8SyGa* zd18{8Wm>99vK>f;EM6s(E8c6Ro_5@@3_MeLE(18RlcW=86<+a_D^Km$d^ zYC*$_@vKxzQ4kRyITpg!5om{v~&B`%N%T6>B z7l{Crxg2To2QAa4rkwzq^Nm~Mq&>4nNl-&7k|hzT&VZ-jkMj#pkyk5+<7fq+2GSf&OfIunP< z9C4b4O?3%OuW#*xai{BAKeoRqdv%jHcrWh_MtScXe&@-Cv#sY2Mf1~_kM?x*q^iP& z>7MS>9f!LwR)vN1u0~eh*4eSPdfizTE=aG>UkRpN@+{-?s#i?v&!{ErIMp`}>0(Fl zDjXcrEl<`i9D4nFvf{+EwebzSI9oaqWSZGIS4-`NWnlMC|2J&Kd&S;ucTN3DEoskZZZ?I&Ezm9S#Bc(BSSL-Gb3YTv&nT# zVkrFiOmeK|dPaIilMgYe$QUVPhNM=MD7Y8pmli1ag=yN^ai!*^PNW<|6iP^p0e zn2gmAN-fSWElN%;271vA=zI`ms9-kPfmJs{`w7>ROZ+PX3Ohxv&JtH^n7IsfoETe;JwsooKFWN}}`h>iakHH8}{l{QldeyEQT|zn?jZ zM@3BRi1!}`#-lDg>aFwNJ5^p)nLV@8n!98|tNgX;!a52XC(b2CCdoWt+kEd8L*(fb zVux3>EmC-I_@y9Y`H$F-d-&cbS2zl9$z*hP)5^XmVEruUYT-NW9{#gcY9Fl|T94%Q z6#A?3y!W_s%s@Hh$+n^ytG3CmJN(!9yQY2SshK@@_w%0DRC~uK75kU{t*VvHWNtR8 z7z-`~7%*2bGc`3fRY+5SiJ2J~D}ZGc^59~YM!;wU0VFXqGc4-NO(r+8sn%NVh+#Zm^$Y fK(L2@2v>1QVo^y&QED2Op_!o>m#V6(zZ(|-HOepp diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/PdfFormFieldTest/cmp_choiceFieldTest01.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/PdfFormFieldTest/cmp_choiceFieldTest01.pdf index fd731e932b0ab3771f034233b08149e59cd3534d..62aa5fd424e816591c4e894795f0d27fe6ec72bd 100644 GIT binary patch delta 1147 zcmcIjO=uHA6z*nCDel3 ztBPYw7%rWwP6tAals?)z7Xk=OWtYq6^9I89u^u2ko!iMs)@CNmQ0p2KTqzag#A0Tm zr(Lj-2tfJb$Tn}Y8B6G~L=T|WBFA>?j$`3;3@MTj!5pI2TSuj*z^{XRErhizyy3X1 z?N#;o@{TsWH!%X5&A1Mz2YR68W|x&=5a^2U>(Q++JJ&kk@G+vLv!*TVHH)jod}qIH z-qjuYZtX8c>F1S}e_A~wSjlPg?Yd*mhUm-kE8(s$d*82|c*-iQlXW&nS?5yr;JLPu zt{W$!Wtq`a*;F>&6kL$W4qr)~9KO>ObY%wHjSbyHsU4wRBSx??(^<9&RNZx~V@pCC z=iId3GIJQ-s&|SE{?o~m43Eu9!5O39R`fmUKmTU@#HJa`s(n?N?i@ z_PtoM<2Vpro5Mj3VI+& zXdX)zCL*q|Ng^(H?AGJ??;lzP+IJZFqRc4VFWdbh$xDJf^{k* zstFiLqAC-ph<2D5Sfr{*Bu!Bu4-LX=NPv*4d{QEiv^D&Tgl*nX%rJrd?jYigm}Ual0I delta 1036 zcmca2I9+gp5~JC~cXAUQJ(&y*CU*Oa7%3PiVE87chyT@DDP{v6|}{=^0Ia!lc4(q>vesT2V4tfLVmmY;q!VKFGd{%qCi9ARFv} zK;JDhH7BJw+7u+9UV3ZMCEc5QH59e9?y?@`>Z9PTL!rIu>OpdD0{ zS`w|5Bw^(1wVub(Z0gQq5ze>Y-HBVivGZqO@F|ri+t$8j|9^h1&dv9kmrv{eUBA1{ z=+6u0-0QB(CR?*f#aM6|z<{}enW?Fs2q1}>Sz@R& zG%&E3ypc^c*uu;LLp@LqEM|ygmw|yLrkJ5IhM0+^H>evdh(*LzEzS!O++Um{?&3mJ}ss=A;&ZvX`feLbOdbIfVcK diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/PdfFormFieldTest/cmp_maxLenColoredTest.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/PdfFormFieldTest/cmp_maxLenColoredTest.pdf index 9be43336d5288bc189eca7506065ed1fca2043a1..294e248d67e8955557cfaad7a9bc7549d4dcfa59 100644 GIT binary patch delta 723 zcmX@ddzDXFHNeG9*HF)#OZCy?^Ow0y6$}*eld`yMZ1f!ifP|ldq1og&Ow%U{oS7`a zXvw>=md*%pEnX*Lvda$hXevYjN zg0Gw3*mC`<`oq5Nvq3vIpR1am+9!2grfk>ux_^_1Vv&k5=K=-?1eht9nVK4#Dx@jE#LP^L6~J-| zd2lgvOCt<1V@m@JF$)uu$yZp_CcClvGn*S2PoBYQX>Vj|iJ{KW0vOLAfMf@V2NE(w za*L&b$z&BaoBCw4)FcaI^E4x)RFl*cV@nGQ3*$r+AV@T}G&4vsPBAn}F;2ELw@9>1 zOEfh%G)OZ_H8L_ZGf6Q@PDwK}HnA|aG%`vywn$1&N=;5SG)*+Ov@lLeN;OI{Pf0aT zOiM8{HAuBEHZVysH83|aGqo^HNlY|0Pcbz#HncQhOq$%lCNFAkXUCL7@AL1p3Z1Kxr^CM+|a~Q-#4+O zD6=Bk5U9{V0ZhhDKFsV^UwdIA*C7J|wg-RfyQE8ZKAW|~_nKE}(TaQA9M_r>79Kr# z+}z4b={W!Pnh*DN4Zh60{BXBLvPaN0!E~M#UtI4NwzC#{Eno4?X{-8PM<#FQb!pk2 z>nF6dUgMm7Jna1o)0grW+443&3KB}Pbw4?ArN^Sw$Hgf+6K_dRo1t9X8DS_Qv+3wO z*Gm><5C8vU{`KXJxua%?$>awtQj8Xpf3wI08yNxJ3jzvx3S3}@fq|K!8HSjV1r~K? z78vTxjVvZ-u_iK`8ktW%$7;!JU|~5qj8#nwYNVk;8r&L?r63!T#Vjl>CcClO;;q%(T|Bq@3l%Pc>jdXr^7SP`JLeznAdp|+pn(m zQ-xoUz2nd=lRu(eenELAQ5}{Ni~)l{CXfIm-h_Gln8>umTdnG;Se9EB_??(go^kYlTqG0kR5U!ga(fOyy>dD7m+-$^?u*ztAMO!Nm6|{ z8SEbY5+Wr9r2A*}YvaG)O)bgjcvN`0A+2%q%E70SqiJCy=B`aduQIY>Z)E@jE+;pJsg;e{Yq#<## zXv_1%!C|{1t4)2!(pFu1miwtbF+98UdMN72I5#vlZhE6+t}?%qB92k&smgtxo!p$VrBp+m@BAC3L%I{y5tjQ3oDdJbDdN;uTg~m zX~Gm6DRN@huYmuQc^9KVT#mJsD~nGEP?15CRRe)w;CrswTG&kpG|sBT=%e^AFJ@s_ zk!7|Rs6aqPzSXwTa7{%)s==*71Azj}M7PzJU?5OzBv7niVT#KYGjSGC5LXsX2{t55 znaqS_vzIfsj45&}I>(44aM0X;Eat?so1yw|- z%z=)biqoY77gP|HRTUyah#PVZa^y=%LlF6PFvL_qxaKoMt^*1+AJO-voUuh&5KBoh dTaV=PvXaDfkC!Jh(PoP63DM zeL_8kP2#hv>CcRhh1xUKzXY7@di$5j*hgxuL+MtDK(`Me##vq(`Wt5aF1_k`?o*@R zmap?~J6sh1v*Gbv)%aQa-&LF!kx@zEjMb$ zWJ3;NMuVZ_Tx%6cQ4>Qh11K;uS1>a*H8xd9n>a?2>b9onGNuORMi^p-<`^cJni!Z*4pbGk#Z+x>YK~!og$afUW`>3q zlNYKAGn!A{s;VxE;Sw`5W3$O0RfR<@&`q;2FtL~{siw|oI@wW8Skw$d-o(s!a;BOe zld<{aooXE{1_s6!lb5QgNLZMfm|!TjFgKVSscutjoNSzwlw^@)Zf>4zWRYr~oNQ@k zVQy|gw;t1ps-dB9Z_A diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/PdfFormFieldTest/cmp_maxLenInheritanceTest.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/PdfFormFieldTest/cmp_maxLenInheritanceTest.pdf index 10441505458dae5095eefc920337071e8bf9b072..35a9ef00da8f7192d79f9fd28f2ea6e4eae567a7 100644 GIT binary patch delta 881 zcmd6jO-K|`0LPhKtaV)cmXs}aWD|D%s5fus&CF}p#SE>8v`-BW)qK3M6?JV_%Qk5# z!c0q)mz9(e64@=v4D?WTi9!hU5QbJ-;XzQSG({-F4jt+o^gsRh9sY;kbjEo{hl>H7 zqvf5a4>J6NQ5Qpbi$6{T7y=$a1VkFK3^SN|t?p!z+gcYo6(-#FP_UtnD=G8PS!PFn z)LLU<0G*53Vuetk{x!wX%N--}=Rji7($}<)C9>W(;Cq}tIS2wD5|&$vcW>OZ+|=iO zH02TlXJ6%4R?Oda52Rn6wXtb4&B<-m$2#?a3)bqX`M4{~naoT6;kU({PeVK9BkNk; zv=z)bPF}n}bZE@u?O91&y76OwYrCVXRm^sunV#&8GJ-iR3Qce(V(ngS>_=GA_1lXu|_mS zR80e$NRdp8peRZbF$o4Lugi)~blPrrCPBZS%?cbKjrDokf+3QJ=@WYfD~OoQ$|@=? GW`6>b!%8y% delta 668 zcmZpXekeIXnbBzC#qf#Mp^U~GFDf%mc4D@h{FTv`+t|R!z|zpn$jsPqvMtjAMvKY+ zm^1{96*5CoD@qjHi}Fhg6#T+8HsIeI|S6{F|x$<-&=kw?7$#_XKTYIy-UVcMW9=BRNye{-Wl$$?Eky%QeadWPmblDCuU**)@Z1Z2GeM0Y-BK5 zkjGlo1j9%J6T`^|xrHbH;T94%H8e$+H?%M|nOw?aE1zUwk&>2{VrH0VXl$06WMY_V zVQiXgWR#McYHn$fG}(|>UeLtOj!PAsmUNx-i&AwhCMWVrav7NzajB}h`nz!f0Ns}H A&j0`b diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/PdfFormFieldTest/cmp_maxLenWithSetCombFlagAppearanceTest.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/PdfFormFieldTest/cmp_maxLenWithSetCombFlagAppearanceTest.pdf index 2eaf41080a785ead9e51e42691699e1063833a3f..5a36797ec410876c542321f8354b2982b46b6602 100644 GIT binary patch delta 1305 zcmb`HOK1~87{{Bev2|^2DT-P_S8BiqX=i3<_Mx?ys%b>6(NvN8pu5SeY1Aersnmmr zMT^ynwsWW=sHwKJKJlm&4+V=TVtk|M#ahveFT{%=PU6X?AO$Zwf4*J*-*4xe`M;Wz znp5iZt?;;DnJPNp4nKS%5(!8VGb~nAl)HWWQ6pi*3`Z5S1g{OVddFh+QP^n5m=|@n zZvvMj^S;=z){Ye}PjnQ1WZ1SeA7P*)00|-hv;DU4vgMH&mGm-D23-Ccx6kigS1WCu z@2>W(k@nJ9ydl!Kb%E56001ro5SHB0*uFTGs$-F+s8q9QLB}T#TVx;M7?1K)J0J|^ zdgeVT?Ds{#HN9W>?w()@4#80>2#&aLxV!dR^!%yH&VkCKb*xRCs~lQXl(+5R;x8Yt z;(iuhF|f&xw;cZ(>baKJekhgmE9H43(#Bvs5u?WLv`X&+mf7oEB0vbzy$<}VR|Q&f z^8U2DgXJ6Uj!Yfw`E2#ohb|U%4$*M`j!;zd6GP8Sh99jS$iVz~RlR%+82;lK8la7bru(pWZkIo=>-L#sOR}TNThf)h(RMa@ zy5&alEIfH`u*c||*?DKA#Qt>E=Ii~=OWR9}zt^3AxwE}@x~D3XGw)pWg)vx&#NOm$ z0m^t>Q}B;Dg|-*rgVyCqU+W4AQdfx6U4AR_z?(YuXGc*Q? z@@G@V2~zjpL7HRK5`lzOW}7@~8AP%w@skXI)F_D=0idiYqiaCd@aP)Evc`(?XR@Zr zTey*)WdtKqWA%1_|ayi3tGd8at8}7^BVtz7kDk%>_g3-jr$Uv!I}=X8H3Q zsgL$YNXzPp2+Xt)6cT8=O(2S<*4PWj za#5mW!c7mDG*CQo)RRW#pfy&Bi81jajWHfX{RecqM1!;(jLzZ7li7FX`Mqy4TWNpS z?h+IIu>cIpy!c`Bs!zUI0Bec7e0-01lAnQ8<|D5&(y=kIU+H8lVb{R|dWOo8V*KrE0F;7>OufBGd5|_VU{n%N3W=hg|TL(0+G{x_%*;f1fV|@J8 zNj%r(sAeq>jE3S9pOx2U(pPd>ZSrEx)d(4l9wY4)qt(SM?+eb#QA^ZcxP^mfh9XhP zl8Q!Bf?ODSoRE%Oe@@IRw)j$Eo5AU<+`x19bO_F{Df%unfPnu75lwl2Q}phju#Xo@ z;_9IPc4wec{smz&wEggv8$ciiA-ABt2GMxl!@K9bUaW90`n_Yk-uTnf{`ZR+W%TZ` zjYG?WxohVhj#{(#Ia7;`+phoSuMi@fne&hw~YXV6#>+iFeC7~ z0U(5N-JS#*)TyDmI$6PV-ac^v5W=3xu8V=9(tzWjduN!6B(|3`LlBZ_v1Sm2^sti| ziG=8)bDhJ8cDTGoNmr~Z(KV#2tgAwo>|Q$NYCg>#(x16d4%Ib;0IaJ+h}1QNh=k}P zS6CpB5LL>gfR@Un(-{?EEuB=7a#~RVBC1Mf-98V&Jw3cQHKOHnf$hJ>n!D8o6kZfh H49EDN2X9!- diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/PdfFormFieldTest/cmp_noMaxLenWithSetCombFlagTest.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/PdfFormFieldTest/cmp_noMaxLenWithSetCombFlagTest.pdf index 7918f1b2ff1536e15b437ab22b7ef83ea9b71f46..0034cbe7a4d9c93e859033e24194a7b206134749 100644 GIT binary patch delta 870 zcmcJO&1(}u7{;@SL0KzCs2?pJMq!)7D3 zhlc(Ef^kpYwb+aQg3yBpp(ys?#Z&z_h#>Ul%}GVE!7*o*}=Pt!lRdpFClPTmm1BN!zmCx#7^=mr&wtDT`_|~)U-t${`o~9nZ zg4V`uZzFd8;rfU1{ITinN0;*NQ!l1am|R{Tq$XphV-ssCv_&@zz`i$B!&a>X;Hel9 zqRJQiS_U#0qYQa9^xI^Vp#4kK{^J?k8u2I_^*F^*Dw&CX92)O4YqX9=@kkxQ_=v~N zziNkp-MS0GaMH6gXt4;6$!(2bYU)_%)b?!QIS%F2qPoTiGdaV+`e1NOm@RbOd8oI@pDX<`p0S=Y1v0N802uD!eE&U5Z zUo!khgd2s~w&x=%e?goSB~&qp4|U$Ca9wlAn~tWi~m0DIe&7$p@HB7|kYs zWl|6^RWMKhN!i%wI|cv=KLtb6iONPGSBAMW8JbQOXEqZvGu8J^EGf#Yh&BW&H&6hR zv6KCo#et@zGwarCKjC_EiGO84!Kcz^T2D?fCoLDyt2K9KbyjYjV4~-3Y-?=Hs*uU^ zWLZI`L{?i$;m$S&Q`VxLOj{Wk_Nwq!fZSJHQk0sQ3v+2jQED0&&>}M~pf@4FT*1uL z)Yw!ZO#vomWCU~!2-GX&!39l?O(23uVn!BFg-Bwi7G@ag%uIm60Rl+sOiVD<85mfA z)fqw^;|+QH?jZfLH`}P)Si@ zW=?7mD5^YN6ryd+EK&?DO)ZiwQVq>h3{8^L(u|GGO$?F^lM^kC49qO-2&$O;o>gAo h446Jt!D&brHH~oTSTmV@Hx4{4a diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/PdfFormFieldTest/cmp_pdfWithDifferentFieldsTest.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/PdfFormFieldTest/cmp_pdfWithDifferentFieldsTest.pdf index 47b9dc46e2ad559896fddc75d40165826ec85561..6a1567774894981b56707d03e36276a583da019d 100644 GIT binary patch delta 1752 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 cOpZ;k=u;e`-Lc26TJm@n;Dx< ze!!8>XfZi}Q-jfXawVtC=8K#^SSMc>v0wtq$#X~5m!99qb;yB-?ZMyruAW^>Ja50A zo4wS^GUPKyuA`>Y+?ty8e71sp0zcaIKcqKau)6-)e2P*C=U%rv7Zz_Y-#T4c%;xd7 zwns}QPVfy#T`po#v59eaWau#Dt{K~nD_uGp{Z13em zF4?S`>@7ZRvc3r0WG>-Fp!j&mZ917x)CVZE5*QZ{-dA8;09m+PPRGDJ%vN3UQTjW7 zsFBSUuGGAg;*z4 R<7KPijL(9jI(;)uy_#g~Yfa~Z&ZnSzeEX~9~0c?swo&wZ7 z6EiGgmd2Lo>P(G{EilAPjmd1!51}Ddc^)rnaP3gm@O@T;Ibgp|)*%UB_^R5xd zy0`C=5EV6qF~T&1NHapsskXzTtV1uDEgidU`JV!qa@V_PD{4is>~7*Dc;wy+UtR6+ z)_u%or0QAh@BQUA$8$N}9ATrz5RYYeABaNQ^TJNN>Xjkmyiqy=PZYe~2KdQ; zgYTZ`f^P-hc_RzH2D|8JXQLxH&~oS#Uv-gQ7+ZS~OV`Cyv!(Ia`f_?{Z8)iFsD^_tZQCk5;e;A(d5$Fmez~^6rFI#G$ zJCKFAUxoTW99Dc~PVF46d=~tHG`y*nArhRo|LaoZ55N4KT zQk2h|c|;YgB1^(l7Y$vP3=QcD!lINn#JsLqdBqYnOH!#}sj8-Gl0`+P64jC`_Vv81GQ==7jTt4^{y#@>+A}C{E3!k9?ZrtB_M6j%?7qQNBTN@`uWL%K2eySFfCrfqRJ6!s=fY{teLYg%g|@y1%xRFlk|nfsCue6+qzUs4bg@aEnd4OAP_RO(8^ z2iBG8K~T}1E?Q6&MHCfRii#qLKcOlWH|jo zG6_qA$-Y8CqRLdmenH_xTbo)#?c!Kz#5~$T@DX!l+>xjT)rOCabe@!m0w+9&;fgl} zpFN><6e}{7F*S(17Skxk(O7c#sNG{$oUWer1d{~`u-+T?=n0&VA?IDwOr?#b^3gFz z+FBkRFG-o<7`*mcf(CT)bFtoRzGp6-hWjWq)zkqy8)x9tk|6keZ{bZ-3qMyw5M74{ z{@?L8^cBu5T>;&V5$I^T2_dnS$5N}ICwH5ba&cmx%wNP(&F3KQ>)pS07R|m9r~6A^ z#@~0(l3_fI@2~-Ur@w2*JM`g&`>b)QH1}X-cUybxL_=hYpJjzKdsqI>L2RB~?+VA{F3KAPlzyK|#O$EU-cF@d>!eocOscv;q@S zze|6L2?Jkqly{PwpB`hs6R>o+o55DkahPJ+1|<$r3WiEdC(q?;hE0y?mSR$wn)9%oH+4nD3_As?6$}oks##!~ zq3MjOcHSV^riO_vn^-cXx~yszQ*G1HD0Upi@|J1yjWZ0)R5|@m60%&wf0F@!FEdhcX-chqm?YL1PuOT$w041;hwrsI#-TZwvYb`_~P` diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/XfdfReaderTest/cmp_xfdfDropDown.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/XfdfReaderTest/cmp_xfdfDropDown.pdf index 0218a7c84b34eb5ba97b5eb45317184a0c750204..c57e22b43782834888f0a71c83da815de4e5ad47 100644 GIT binary patch delta 1037 zcmcbmb6f<6306k;?S z-2;3S%2JDpGxPIeG!<4F85kJo0`-_EI2IID7N;t>7v+~0DENhG+SyGE(q}ZD*kmDY zY^-3Qke`&rWn-i7lbV-alA&O1XlAnc5~B%|fQhbwrLLhxh=Gxnk%5(w*=8}88H{$= zY)7$NQ{fP9%Qrt~Rpgi)z$P*|fm3EO2cHI`>10DbQzirB$u)c)^#}Qy40zh!*LKN$ zWs2?eSue4t(jf8?w}uLv?~^BwqoWd-&pOR2`TxIu@!7-dt3M0g`!MNzB6my6yosE@ ztxXChnk}4sd3(`&z8@^>w=z#IEn1)YX4Y|EIk)ZdHYQi{zV)@P-TmkXONxwFK^^0w zHD5mEoDS#fpXFk8@qfXQ#OG}_3Mg~BhrKLqulDWBYN>XA{vU!SmqPdBMiJ3`qQi_3@g{7%cqD7)f zl3|)flDUnAU97%mUP@|3w1I-5u{ns7makxF0!$x4@T6g2svne}U!q`W1{My^tV#tb zo_tY6q5h^{h@$|*g?*b9&M;4AIJL-8NvTUoWA=gvP11S|TpV3iS~D0^Lxm5-p8PY7 z|KE(-9e)dU?V7YMWS3Qo%8{uXpKfTjSrx$HsTSfSX8FWfW7$rgRRtQH=R;OS zn=>yeUrfFzd?rDxxT334=fQ)U^LKCT5U=PA*LY}p?}6^L4L#)=$0r_bJht`Gj;`-N z8cf$DGta(p$jt7Mu${j0Y`#|szgh*#o__nl8vl{^{zqo}kKFq|vj2YB-Xs4qf6EX3 ypy)o6Bk8~RV|Hl1nk*wGsR_zUx~MsstGFbwsHCDOHI2*E(9(iSRn^tsjSB!a{)@o? delta 930 zcmcbwdrN0R^yEZFHAa)k9gG$eqtm$!3=NG;jEsy7OpGU<^^7&wGt@IQ(GB)<3<&n{ z4^dcYWME*RYh++#ppY4oT2Z3lUX)*2px_s#5ToJf9^j)}mReMtnV%PR?W8g9PMXu>35plfKTYh)5)WMpMzU}a)Fxt>LQ zvk^-pqb0iKhj81DV!7t#kF1Iulb!f9CI^UcPcG%t7Be)^_f0G*%B+Ys1Ukh)0ZhhD zUc~27Z_9VcfTy*5{vl%-1 zO~Zr>Mn(@Sn#20suKnaVyhql0;!Ih)1HW!Hud3epJ@wtT3mwN<_!r;wlbe;bzvB6! zTcPI?QUVZr_^O$QDCU;71hvc5IUSpV_Q?0qfo zAN7b#YEy5%RPz6Vg{u9M3HKb{#YN2hmZY=cz@|A*KE;byc&#p)Ab;fWi>RIVQ(E7w z+hCMk-hS(6L)4l4J?@DtlQ;5AWmAo zf*~j#gWyqUV5}dMpI@S2Xa*Jz&a6rWDV`i4s!*RDd^S*o{lQoJ=OR@P&lGrM8K`u5 zm58@a@D`s^bZ3`;xstKo%9vUEI`j`Ne{J*c_tDMQz-T8Cte` z^B$VLTOeOv$p782fxV)`y`smFC-DZiTZn&%f9QFGE<>B+7HS`uT=$eb7L9w%doM{S zc*ZfFG{g2v9f`=eQ;Qx8P21QMy5^zmy<}PW4}#J^T5_yb=>EUFzT?ND@1plNbiTiF z$gJ!Gv;9Zz{TpZhJEh|JZ|a%hHz{03nNVr~m)} diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/XfdfReaderTest/cmp_xfdfList.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/XfdfReaderTest/cmp_xfdfList.pdf index db29b7fb5f0ff4fecab01f1fb840a4c7d277912a..27637b77554b78f20c1c8f88739dd9cf46c00861 100644 GIT binary patch delta 2090 zcmZ{lS6EXC8ioy_Xq134phFE!1W9sEdME*c0xBkS29%PJLz5TicK7bT`2O#`_%7ZDCdmZJv8;!I+bIAO zWPmg(NCIFJ#38m#L==Q$5&!~#ci~t&y4Z7FamV*r+c`SmVxg$$;E3?!Mz~){007`g z0EvRLj*Lo(hH!RK5iyZCj=K?ymE}xCFtU;uyFmsHz(w#wQ0C@D2PiyH7=$B(G)iqR zf+C|#!2?V@$Z!Q|rc}_B1k|d^<{()Ai~cvb5w7|F!)vGIbhg5d@>tk!n+CiUy$=Dv zAleK`A~WG+w4Lb6Q4SK^Vf%@ddL24~unQn1&jHg8OdV8k404-LT$>u5tAj1+;EbB|; zE6BN$(h#fzE7$uk-v-8Nozue?2h2_5Uv_2A8N|A+M5>66po^ciZ@$u$j(bXvH29R~ z=E=V|EH@239hqZXDxOz#mlmICtjL8Btp`}@*hQPBU3SU6XWHF5$BN9Y9E|EUvVK{0 z%D=ohhHiEF@MA5t4USt0^i4N#k`NZ~)fMHPLbfPw!>j=Dr7}*8g2DyS!YGIr_Wk-k z0}=$8FcYf@S1IihQHdNJ2ohZrA|WD|AL1emW3m1dkIz5jJ{&d4P~OZ=Ou4>w`0P

f+C?wjNGQ2WchSfyrFTNNHyLou7{U(CYu7hUIBd%PcZ&-4X*+mqFtt~#4%?h^-H zB$l3}6<^%jkrF^T6o_r5q;ju1QZDF;L2{lzbX6aF+1cR|UtA(^=`8!oqIOlffPvNcWci4ySXL~NYjr_++>y+N4T^G6>-zN~W-e}k-++gAF&l%-{fjRx=enGYu8=4|m_NT?411GTF^Ji&H8ONgq6&s5A^?az6qyjIuCAyfyeyi~2;|CcKN@?-`ka93oI@Lvgeh5ItCYz=>( zEh^nS(vMC$oLM%Ad_F3fMn6l_)I8|f+fIm)(jB^POj#MXW;wn^>NMz8M*nnUwdSAT z*T|6{pAdU2Bkw5{Hw))0x%`z_%j$%5v&9HeUqXZ8;3HTtw$RNCiTZT2izG2YcGPfd z<{Fin7IoGvRyVawpOhX{d6G79cZ-)?PnnXJcfRR|S4R7}vllz6v~MC?qW$6*$mVhF z*Zq98e_fhp=jg?L<}^J;$|(^Zahq%~k4h%X9Y%a*7D*Xax-uE>;B>S}a^a4|nngpA znWYpeV@GOQnVuDD-zIW2A4n`AvdV!d#G=gD$EAvvg5=RU-2&pZu+y)72uq^z7li_+ z^B07}zsX8X6Gd0;;^8G1jMg89dkDwhu?P#hO~1~kHtwG)MC1(9EkX#(9*+msMaazL zxGc8LsUdTP;c=frkHjHj1La+Tk5*ol3)$AHf)16711dSMgWf@ zpphUFiOJycL5K!W=uCf*&H(%Ye+C55Df|G?pFsf`{v?P&0%&}QMkh0vbPDt>5COJ)zroOma+ZD zAy3m#KM!E$ERJXNPiZD7F60#?8#cht1th(KjxoEtHde-X$|c zt1Vmf{gl)E_SpJiuK@B>K$9#C$h`)TwSdA()s_oYvRzd&cdO*zOOg}^QtGkuQpGVTk|o{#cyxX4qo`bJ$vG0!fmzS`f(VV(z4YG_FbH;q;)VF{qQ(DR^QdSc WFG?661qGm}BpMTCU~rIYi~2XEM3{vD delta 1919 zcmZ|Qc{tk%8o=>76QOYhiX_1t+G%YW%IM(;)jm|w3Pp69x{8h}Go5{Q|JZq+{pWq&|Gw{EpI7ME?jWLy=?c~g zZsH;Z*HUVdIvNcCSODkbjBzTJkYaF-fFpoLhLQp^<0+31GtjoV$~=JH|;YP&R18DCa7;{WaeE|Lgw~w{2TfF$0Uepa=y( zoC@_Y09>6=0d!tQGM@^3xdaXW_lyxYL45@xH)yY?hR?}My$ojU8o$!t7u)Aqdl|qk9L+v=0nFO|JNqp$`y1*R_I4=8EEnhO7+*R%#C$VB&`AIfUW!O_!Rl=VbO;+Wbpw z_C!3MW}5%$EopqmjQSaPQXv2Skvv8=OxE_N=ya1Ozwsv*P>uXYNo$N>kS8}z9`=-z<^`F$ zKlW3~CCrQD+hvi5N$y=26DPJUJB%K`LGCPOZk^JRcQ_oSzsy>V9Is?=-sV3U*DP<@ z{2*<(;Xr(y7E77Lbhp;j5S72aWgOEv;t>-W?4nEZpl_%pNKAHd#qpmT+a^{v&mt^; z9~tvydoF~IE;o)3&tK{4D!>L#W(e$=edDJh+E!R;=R0AnuzQ{QAHhG63R^I;w8(|~ zBFbCwo9(Xk24>}q-s*wi!TDC?^SVsDY9?xbLch^c(%x&rL`Jg6Tnm9b7;aaPo>E59zR+(N~8 zfbCrFBx-)MTyW?_J667g7$_rVHmM6}QR4>;LTpQNnoYo?2fwTH82ft_L$a>iRKi+ndKcs}W#7$Dm&YDnQ!=f)vwn5BT0=JLhCT!;kl}yf7M@aj_fCl2 ziv@H0l4ook);xQJYAd0uTFNWe`1ZOV&p+t!Hy0Iont!sqqBKae5!T741pUKg{)J{~ zG)M%6zXH8I8w_%s4}9sbQX2iBBj?2F&Ufju7B;nXxT=D+^DNe6P0%g5ln`84$eW_% ztsdw$SkO+vWFPgSXZQBztG{~uaMw%LO#z1)#;LYUk8d;%v_*7HYzvf%b8)3!Jtrs2 zh3`3IvWiPv>geV6n^Sq_Z)SfFO?N!Bq1kQzNcgA7|KZ`kHe)d2HO+(KpI|odL|5D~ z91iD{fWaj)oUnAdi<`5n8`jkY=jsLk#{hA(o}~d6g9_nrcyIvw#nBK{XmS<<4t!C& zN)Ij=BMS*y1+$zz$Wx_@Qhj)P`P}j{!O!owUwYvNru|^M`<7(5NBoMEh`CS-T`(7s z=6 z=6-wx+-04Wm&nWwX9_cya>z$K4J_*g##xsQK3z6drD+vZ)BZ-J!5+~LSkrVGX-0`O z{Y9FIK25ulW*AP>8>bz_(sb|c_C|+!S4Q6DzklE;@4;V{?t3Q6wXiFhRVL4B49_Y$ z&O&a@s(NL&0$k9y$9D0{Ap}pEQQ(t<>Cy=t!5py$f gkG`SRUp^Ov%cE!T_!*2uhzo#ohFDqo1QH>C0F|FlkpKVy diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_basicListBoxField.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_basicListBoxField.pdf index f3d1ce83cf217d6f97e229153a3b7802182b1758..ad543c9f93f332dfab0785144f961949f8e66487 100644 GIT binary patch delta 968 zcmeyt_mppf5~IOH<-_%+c6P-jMX8CoTorTXUOdZn$bg6aL-jl*_q|8VJom3_y4TvI zzd+bFC-29<8@XCdR<2HYo^|!N#CX_xMOb2sPE6dBw7p&T%7sHlhm&$I8a?AuN%%0Y zC+Xh7HJ0&xzP)Ah{5PE1pn17%&+`Wt0^V3}vUtOHc%B+p*C~+;T%6xsTugQL3asNP z^p|+ET4qP|pABrhwVuMq?_3Oe)Okn9dGlUyeeX)2IC(kaA%7DCOG67oa|2UDLu~_Nbpr!+O?}_|6qm%3R1Fs^BLgFB z3IdAqQ%aLli!?GrQY%W z>iw+wfMImEw#)ob!)ps)scVZi87jCwVhUh!j@Dx9^N(R+-Zt;e!@sNkI91=c*xc6S zDAv9UFC$hQGRzWIn8V{) zd!WWtFzYGXxy|9l@5F!2-~2q+DE+n4vfpkm^y?38)4qD&aJJS`uGG8~Xw(5&`AJz^ z6-B9OTm}k;hFk_PV6I?hYHDn%kfs0=GdD9*0Lv=m!Nn{M4KTz^EiuJROpGVjvRY04 z%qmoGU}5Q;m(x(<}^4 z%}oqalg$lMEmAEk4b3e~k}VPw6U~wg41qD20`!ZCkwuD`xp`8(iHVW9S&FHNiFsOL zQlha*l8I4@xv8;bqJ@EZvWcOgVTuuuGDt}^HZe#xH8BUONHnxCHcYliHcLr00lLb< z(j?8&j!Y+b0o_0)Crnmlmp3uAv*S_)r$Sv&BGd&ZLfv3L$ADlD{}8U?lEk7CaQqq? O8<=sas=E5SaRC7A?>`0r delta 975 zcmaFL_k(YO5~JZn<-_&Hc6P-jMX8CoTorSsPB_hV$brZ8`_C?&QepL(C34Y@-w!p| zFA$9l(f((@Y;D(qua07k6YdmyaPuuz>yld?vrvVr>$&clg^gm*Skt`S#B@x5bQrP} zb)_;-e*AKiz1fM&MGdZvQ**6LmRtB z#+-~)#_~xv9?aS^yrtF%2T$X_W;f~6{cDF(1nncch3Y5DvA3>SQpw=C<8M976P_pc zC;hoxy>7a9TJYqRjED4%4GoP9jEoE|O^mb+4Al(`)HU^e^HW?BOHwsltbkIe3MS8D zl4iBgGte`hyo*VN(RlNHCOJk%!^!`ct(Z&>wfB5|O;Fm3L6WRSGa?DCU9BPoUn=NunttR%t7Ky0V ztn(+DZZ&5v>!@nG`lI6hF~-WZ z6_Mw==Kg&rt+2nI;r%(e`HXjMwXC^P^HQL31Z3qWWpPy$rKWKiC>R=X8Nh(Kf|;qQ zv8h6u0!+-@%s>GwtB?m5vox^45Hq#F6f-da21XsLm6jpI3_~PyEln*k%&;&rn7oWt zrQXoM5XrETqQuOc)FLh$8+}g~g=ibgv_vB#12aRDWE0EeL{kHU6yszQgS135WAkJ~ zvy>#GRI_CBM8hO=6C*PdgA`L!i)2G1^F-rh^Hif`1H)7clQeUaRD-lMV-r*3lr#gQ zq_ni;q{PJ3BtxS_3$w)3dZSdMR8u31v}B`X!=w}oQ}Z-46JyiVGy_YMWFXs)#!e^& zx`B`rV)Z@q(()CI6$})D^n>#AOB4*j%;3zbRA7wS*>S06hNM=M=sM>YrRsvysBW;I dV?eNne+XA`Nn%k6IQ9*V4NSRIRbBnvxB%DRLG%Cs diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_colorsBorders.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_colorsBorders.pdf index 59e98de8e637b3d7f60cfc72cfa8ca8a2b1e192d..1f683ffd8f88a0795fd3c7770fd93df9c91a466a 100644 GIT binary patch delta 894 zcmcaBa6({$5~IOJWeLXmjeg9AJPzgct;aXbIMVm{P8W-g&H+!J4#q3lp$l|v6+iyA zD8IgFmBK=epfx{!TAt%mVvGMPq_TLa%dr)WJjE({H_A6OMBiw9Ab#aYNBQ*+5~95> z^9{sKwG~fb^Y&P>qfN=L|Dg4q|9sr4g%*=t+q;FV6-C#%dxzcrG1)GRzuwM!=8U}! z=0Yl?q%Q-565lcim4_2&JSz>v9VpBSX~@6LGmM=L2MM|^_K=FTa`+lp6gOI)$} z?eXVXyAM`e+jl6{dfFEiv!f16-yK?Hx>d|T)zIgSewWiB`_J};ksmdC))l;Y)cl%d zP5qhHLk#Eg!e;Zu|9bcHtwRm-_e**DlP#GJ>6;i>8d?~d8<-jzX&V@;8yKi->ig!W zxFnXOYPeV#85p4|n5@Mt&1$J=ap?{RUBP0=e^}7Sc4p#^2Z@~8I}95hY`m&;@7zPj06E>r8yovfMD93A^<0^pzTb2Pm=2QmogxulowlY~5adg&(_;`;W=?m&hTr`TW zbM7zw5q&&2E&dzh?uXIwli#pPF&a*0XInY>2Ajy_BWyyGU$M#6Cz%)}TO^vNB^j6* zC#9O087HPB878Ns8ki(o7+WS885t%UrkSOgr=^&f8YZR~n3@BH%`FX5fgzugn3`f~ zX=0R^oRnx_nVe{5Y?f-CW@M3^Vq%nJVw{+iY+wmgmy}{+Zkl9fXqlE|Y?73cVxF34 zmS|>?nrLWfR&Q!&GmuVT0lL9-G8c!usG*%5muhB6YDI~zbAC~(E+m=QafovmbE&Gj I`nz!f0C1sL3jhEB delta 915 zcmX>ha93c05~JZpWeLW5TYqLl9*6S(T>Ytrg)+x?igHFoG)$HdU|w;3mBackEl2Jj z-x)5h$ zX8G?|`}WsdvO8R9y_9E)PR8S6&qFKO!tP8tV&GcO&+Yl=)xU`+yS^`&_2}U|kc;O#qAuT)dvvlT(;BE1(prg2`IU(ySJG271Pmy_i)PjW_2r%P}$v~ezvat&m8-N8Q!7Uja&Fun%-Zr!73n-DKt!}>a&wj{js0!t}Uxx zXqBaY^H#kVdZ+DMqB-lwsIQY>vq~`Hr2^%*~BJaXOpQmH8nLdOtVZgw@6AhwlFhGGPX1{vP?0zNJ%y{wX`%&F*Zz2NlQ&l zH8(UeHZnIdH8VCaNij?_NHH?Av@lLKG*2}#GdD>wOExetF)%kXFflhaPffK*H3ZsX zXkuVw38d4^ERv0q>&@+K2GR*EKsT6A{>mrJ5O%T2Z3woL`ix3r;Dz!G4Yb e!5;o0T*W1cMI{wQscBq>rp6{*s;aL3Zd?Eri(cXY diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_exportValue.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_exportValue.pdf index 7ab9e1885fb628065e59a9c3e523c745363b4cad..23596f7f121c1d5239f88d104e64aac229067f5e 100644 GIT binary patch delta 867 zcmX@lzng!85~IOJWhTaYb341@lA_eaT&{{ay%%h`4;ctFJp5aCw71mq^F{AVp=%U& za4}-s#;#8M*F)r81KWPlM%X!9Mp*=279_U;YT^kaYXcw=m?z`JT5S-(oFe?rGj}t+*)s zBj3?~avZA^(8-moa<=9Q1|Xo2r@#ef7#LWZnPP~UnP7^USXxZJ!m7?_KKT!;+GH;_ z5ivtEbd81v=BASq*re*s6O)otjLglA(-IAnQ&SBLjLl4w49v`ojZ=*blg*6HlZ`Ab zl2R=aQw@yFQc?}gQccZL4bl>m5>pI}la0+&Qd1I>QVdhgQVoIXQ!NZrl2cPGjg!sN z3``A-Q_YeL3=@-0(o)k*%u>x0Q`1t?j1w)*Qd6^@(;i1L*`7pc@h=*Racr W8rs=$se%)fE+{?eLekR)c6k7w1~A9~ delta 862 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 Js;>TSTmb)t#9sga diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_listBoxFieldCannotFitByWidth.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_listBoxFieldCannotFitByWidth.pdf index b1729f065a34837f88817fad01885471e67e74df..876f01f603ac1cd5a8965a4e3c1243983b187012 100644 GIT binary patch delta 1020 zcmZ1}FhO8~5~IOH<^T02c6P-jMX8CoTorS2C!EbYWFXM;{BgHED>EN6HB}|cx+q!9Q0gnL^WSpE;D+K` z>r|6_%C-IXYj?-IKkm&Mw?sZ_d1cPiDxKAL7yMhEZ^e@owzj5vjaSXpr_VDPvpW>2OlB(fiWn^H4s$lYeCTUhnJp(<1 z$@0u9j3%31nB^E54JIeESTh<-!8pU#cgvB90)Uh7c*nR4`#bX zg*8W8=j$6NEmr1T*jSyn(C4pk`f1BM4`kGoTX(!y)NA9Isr^)IPkti%YJ~+l0#4KW zqAr*{SASus{$gp6ioILwyE#ppHZP3dT{qWWjWH*AZc0Ew)#S|TA00kBAI`N7+jpUJ znMM60vEb>~b~?Yl;uLhuW9`H#y_da~25TOhHRbY(t*+~)ZeF_5nEx`XGWV}oAt_b1 zzsq7uN_N`uO*j5@Lw@1MdQD%ioF$tg>>f$@{&*tJurTE`S884gG(`Ye`AJz^6-B9O zTm}k;hFk_PV4+}UYHDn%kfz`c6SOchQ~*mWlDc@)9;-aRW00be)EVhL)3eu}RgN0j)AKO*61GvM@?bOiD~KHZwJ_Oir{&NisDv zF)~d_GfguxGzUrl#KhRb!r0ir+|1lCDbc{fG%?Y<-q6lwAf3Ph zbc5mKYwYqShIV#bs+l3F6(zdP`9-O^;B=}R?B^H|?BO56Ra}x-R057XLlbjzE>%@m He>W}w@w;RH delta 1020 zcmbOruu@=x5~JZn<^T0&c6P-jMX8CoTorS2C)(#9G7vcW{kMqup`@B^=j*R|r6xIU zy0WvQp+RlRiu>`Uk1RL^DnHz;+yA}fIlI8AEw_v_y3I5cWur7FdUP+?xb^`{bwz`Y z(Y6{^*R% zyl3;HX72vbbh6-Jk$j?D`Lq(+wB1tyyt(Mcw7{zm{UlroY$oZEfH7YhUjH z`@P?a6u46JQlP#CvhtI%xF*XnZO}J1G&C|WGBUI@G0-+JR5vhC*VOmTPjN{sN!4(% z0!pDOnEaPXn$<$jK+kxxEVBxu@n$DxIYvgq$%!o1j3$%kvbfj#@*h&*X?y=y)b^EQ z&dnPSR?Rf$S5x`NXus&@GCjFJKgHDY>MjUKRm|TW@a$h>_gA633#U?4I^S_5YIaPp z4AwiG$IpJFqhXSR@UDt04I4GrCmy+C;PqAEr;*f)d!AGF^48w&ef`H!a06%QqJs^W zyL)c$@AsJUdvEdiSNtVu8udLJj$T=w`s#w&wg8Q((^KZGF*|S3-zwo9bZ&v6*v^o1 ze7dm}GuBH)F1B|`Tv*arr#@fM>BY&XRraw_PgdGHKm8xnHf39*SJGdx_7zXM=UY{# zBw_|#MNw)Rmw|$z5tjiBSSXm8ni`uG@cyDrY2@+0M=xvkcKeG%xH2dn<}%Rk>TWpY*O`>X=X;2sRk*Qrb(%m#zu(- z$rdK&X6A;bX{L#07ReT==9VdD2F4ba<|fG&<|f9eNlC_*h8E_@CaFngrY45Qrk3Uw zM&>3-Y38PhCdroOX-R3xrskHGCdNkQ=9VC%fc`SEFtA8XN;Wn(Fg7*^N?Vwlnwc4z zrl!`X+Sv@G6Ig(5NS(ZwU0&44&W=kpGbFX5MAtdLC{-7dNI$ZRaatI0sj9mAyKw;k DkUDbA diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_listBoxFieldWithHeight.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_listBoxFieldWithHeight.pdf index e02d5b1b4b37e2d1e3540fb8610835de4fd08e18..c0ae1155243a09ac1b6a4aa099b2a2137d47cefd 100644 GIT binary patch delta 894 zcmZqVf5|sNiP2!9@{M{6JG35a}c3j)F^U9+rcHJoXj-6%IyekjCz7spo`w{n?49l~VmoOgkH!-j@v@kR`Ff}yL zHZWEf~~XgG;UadHTYTD>hOBwEYoA5!L7vhB0A_|#rTO(F3HC5b2p z9vS)F0TVtk7sa*ZbQr7ao$mnHFi(FaOdZoyf$G_~Wee-wA z-LMR^9-WBlUag}`TfQ=MfBa?9&-`gq+=A7?A}iG`m3Ah@9&vwclvZe$D3DzJ{Hgo@ zZjtjBe>2_+2nPsYLox43e_7}nwp|(H8e0p(pplKn3OWmVq|G*X_R7Mm}rt}U}9`+l9W=PW^N8tXKI$1Y@C>unqp>ZVqs`$VrF0jN>#exRHYm2 h=NJ&|;UB_PT#{H+Qc;we#${-1Xuzea>gw;t1psRtEp`9^ delta 866 zcmaFK*T_FXiP3PP@{M{+JG zqb`d!86Nz9+|ytq$94&eg7-7!bfnG}uz!>2aTnyu=v^cwW#P!5_9%2!T20%ciusA< zTQX#yu~{T|INeL$cW_yC{jGHi?mlCe`ILWT0!y&!-oP8DmRt$zSdvz#wRmdh-TS+R zT)cG_J1lf#Pn#U=^LmlHys)AF{Jpn=9+$4rKfm-NtFDt}^5n&ghy0BV4UG(pj0`PJ z473dl)eQ{PHT8Y-Q(O{DQZ-zxfKu2L1Qg|`lqRPZX=H|^R+Ow$aLzAERj|-A&@-OA zg-M0cc=JsrIYvgq$v>Da8BHetXH=XV%%WDmo9~bTk862-tGh(O<0F+D#HRK#o)ofY za5dP{An~JS&ZkKyLQ|~6?ZPv^G`>w^4VQRhWOey1$JUMjw=y&N1?_8ZcE5OK*nf9* z_3ho6yF)Xs^}GqJcAn~_x$s@0S=_tjg%0yxOIpnhU{gG)r?*y&Q^$0wVKo=$(d$nf z4*uWtU;Ke(&;+jS>XUWrgZ`K=UA1|?E#tu_hE9`tSfv<^Cabf`*_taDfPg}t0vDKJ zU|?xriXmodfhlHUY%#fsRh`j%@+wv}pwBO|iZGf@-p8uKVrXD!I{6o?RDEJ%YMP0G zd8)Z(s=2X=fsv^NFxU+(EsV`f4NT1w%}tCA5|d05QxgqSQVdfJ%?wP8O)ZU$l2T1A zQcca0%`7a;jFOU!(h?0V64TPsQY}&wjV;X5EQ}0H4U6A!W0yBEva{n-1*aTcP{Pp#Cmh{iKgWPz d5C0IZ;*!Lol8U0#G%iD9LlZ7lRabvEE&w|ICNuy5 diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_listBoxFieldWithMargins.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_listBoxFieldWithMargins.pdf index df56acf0b06373d8adfb88bb12b80deb935a43b0..f9de9bd764832db60715b33decbc5f12c3656f05 100644 GIT binary patch delta 930 zcmZ3*Kbe1m5~IOH<@@!%MWW0=Q~&xNoeBPj1;rLtcJ>H{DJxIE#<^11$L`)%meS+5 z8UKkU+U5(cd3}GQ%lRs6pLmmbN(QCY&t2PYTiu>B?-p-~hTECmml=o8TdnDh{VQ)J zbtv3wN}k~UR|1okNM9~wzQIMetn)<%^DK3d6 zsTwX;Mg~Tx3ML<5l4iBkGte`b{D4V?(PT3#vm7I%!DJN{D<%`m$q6j(^&9yPIdHU< z&ua=~Utgg9_HI?(A&0cuRc+>Ga%?Sz5g`XL(Id=TD8Q+Q5HSK!h zhDD`sr5%edD*aM8c8x8Md-u=8|DN6T+&QOA?%OE;X)<{KWhXz2o8bbk)VvgEtN~g1 zNm*PKMX70A1`39TTm~>;pxOwugU%uLLZEfUR442_Ho3=Iq{6HU^RER&KfQ;idi6Aeu)EX+(z z41lH>nOPq$HXr8<`sz8>OZK4M|QkOG~yiFtac; zHmOguvl&PyumIhVHaVPK-o(((j!QK&B(gw;t1pvmFIidgn delta 933 zcmbQtzlwi?5~JZn<@@!fc6P-jMX8CoTorSsPB_hV$UwmL`)AS3SA5Srxu_ED_}%Hi z)}*Pcwruf(?4@;R#nvOsWxbtH|K)XV?MR3PoqLqFPX?C3I$&?EA1+C!Q5 zQf{YreE+X{_y&uFwsYn}pt!U^WZA9BXBiLa8ygxL85kKETACPZ8yKn^7^rLN`{t*( zB$lLVxL5(DP!&wx$0W^ap=Y3HJoz4z3ZwC6W@b4?M#ITUELKdW29x7h-0KelgN3K< zePx%-*M#d^cw^U3uKcXPQo}g+MdIa$2alVtw7BqZ$`rGocDGJ&@BS+$XYfkx%dDSF zVHP`jLSixt?G7`r=ib<`ed+oq_RE((jNqK>uvvLYgAqfria6IP&algWE9bf`*?MQe zbgtkY@0-OJZ!PmUd1lRlJjEyw}H9GcV#YG~-ImOMyll zkd>d5#Z^(1n#N_IU}!WskX6Rs!oWbm00b2B6u7_)0|QGF3k)$cBTO+93&Y84Sk;)! z3?^S;RTDFWm}IDshA_#}a`FpSm3l)1QzY#rMTwa?sYP5iHu|0}3eh%+<`#*T2FZy@ zrl}UG$%bi$W~RyJ<_4w)CaEa~Mk$tNMyUp7MkxkKhDpg5rm2aRmdPoW$p#iChK3eE z#fIkQNkAr0Rf>hNv5|?1DNwnonT4^LSz=0>ftk5UeTqezd9tCAnSq66a+*bwNup6& znvr3mnW>3+a*{=g9gUr!1at!dCrox=mp3u8v*S|D3`wmh(RI!*O4S9YHr-%9$ADlD a{}8U?lEk7CaP%1(o0@W|s=E5SaRC4%)IoFr diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_listBoxFieldWithMaxHeight.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_listBoxFieldWithMaxHeight.pdf index 470ad0c7ba12fea4ec5a90c270d4ebfdade5054f..14ef2bc145f55250f99aa7b1bbd20eeb6328775f 100644 GIT binary patch delta 599 zcmcc2w~udv5~IOJWoagT69Y>_3qx}QQ$rJN17mdq19eS(-~1Gp#FA7E7b_zJBUA;G zbD5-BE%gla3?}z7sW6&s-ozxw$Y?P6BC`df#bhoP_xinjhXOcS%jY!(vcGKoeff1% zusQqW**}<~7CW!*ZSL3KvQo{7Lq&ZK|Ef>No^5DW{}R>XSG=cbtH27kPK&q&&5Kvf zexVbRWbVJYYF627rmOQNvU)Ffn{y)B@^Dtgo;>INJ$mICr&FG2sIFADIu#aKW3u96 zv&IzL%AbY*=d^CqxjE-<(VM0T`iC}MU2nH(fq@uTYF&%_ChuYup8Swiwm#J?#WXD~*(l94+0Z!E+#t!wz#uU(CCM^1*(A-} zAUQ43Fg4Y{!XPy%CC$J*$;8sa*uc=x(m2H=#VE-z+0ZgM)gajzC~0VDY+`0)VUT8G zXkwX`oM@VuY-VVdnrLidU}2GLVP=?UZjokWlA2;{ZfTTaW|3%;Xk=nuZ)s;UkWOF$ zy1{Z1yS#~^ogJ5IW=Lv9iLP^gQK~LD#&v`J90P(q{6n~kOA?Dpz@cbpWMze?Vv=KIG@N{q*@Dq>G8c<`{YI`s4m@q&ZCu@C_rw)h-d;C# zmn8>dyo0vYmaP^)eyHhcRoJ^b)qSd8azWgzUDjs7c7F-q%c6TaT7)bgmo)PAJrxtfG_8 zvdYw(8d#X67^Wndq!}feSeROvq@@_8rJ7qL8kr@Uni(dWnWv>0rzIO$8XKpirKBY% z8kriKCYhV0Stc8sq$UAXnkQN&CmN(ATO?YhnV4CarzRO1rCAyzS{j;Jn3$LvrkNR~ z7@C=w8kw0`n3*Lf8JHRvrCL~+86;X58`qoK*$ku;Sb%OYo&1_jUew6Wj!QK&B(TuKsRZ0JhPx-T(jq diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_listBoxFieldWithMinHeight.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_listBoxFieldWithMinHeight.pdf index a23c7863455de6743a48b846f5b4a75aae9fe85f..88ac40201735d285ce7d7fc3e28197900c4fcb0f 100644 GIT binary patch delta 746 zcmZqRf5|sNiP2!9^2>S$p0@9Qx_WjU*?qcpUDLZmjhi2Zt}5Dk^nZWm(ozjYmU$nZ zdGbq5y;8vbO=60Bw&sGcCN7hLCb=s|VvCIJoJIGX-(a0}g{_!b#z4jUUh=+!%c|>d zty^^O8N1A<_Z@G13RY@)Y>WF*=D+Udgs~udxBhiCkeOC+CMKgO`>pZvs|su z5u3l?va%1p4$wQV`jK_6x#juEiy063n;2LcS{Rxem>L>t8yKq_7^rLN`{t*(B$lLV zxL6q(7-3ToP?Voinw(mskr|R&QL;|KIlm}X!BWpa&tUQvCKX1L%{Q6k7#R&F|6sOc zG@SgOQE_rGi(0)c-ys8@*7Es>lzEnH`)n;fwU<#-NW4KwBFceBMt*m|gb$OaM)=po zU%H~c?Y8NigbQgZSO2n*&&! zuMFKEe_8Z1f7%qcV0Ey_N_9)6ok_7r+#egI71|{VBv(Iw>i)l5h zp8V=dxxPxN;hM?(tWrQHYO$`I{F_y1@>5ok$-HcG^=6i7hUOL)CaH-AY34>IMyUqL zsY&J*#)$^W$!P}W#%4)|7M6*YiDs!LDVB!D7G{QN#%9Jwi3SD+$!W=HM&=fl1|}w^ zN#=&BNoM9Ii9lsZsj0?^$;L*>hRI23rm2Pork0k*sfJ1BW@f2Ct>z}FNhxL~ra(&! wE$fZ#YzEQ^EI>CHPu69Z7d5oA<5C63vMwl+bs>?Q$S%%dz@@6{>hHz{03-?wi~s-t delta 769 zcmaFK*T6qPiP3PP^2_=F9@p=Gx_WjUnLhpdPOe?t{BuO3S9)c4|Chg<^g6&O#-iZ8 zCx4Gy{*Gpr9<>FOh{)UU^4|Pq z*%P-vWo-W>ZTMu-$4Fz#M03rpqQaRL)={lT{_WLvOcJu^5_$FVK+dLaiOg6Yi6FI! zFE@u@4y%w|b-FmShEY$@GIjD|#zX$bhK5E4Mn;B~CWhJuhUx|e>YDn#`6(`mC8-)N zRzN9i3IdAqQ%aLli!?GrQY%WA;dbGf zUmD-0v4%^$F|xY+mSby2fLocF{DStiH@jcFGVH&*y88C+%-x|G*LvOrRy$91(p>m1 z(Jb!W@jSSL^O$^KpEK@8@ z6O&An%zy!9oM@SBXl9&fXklTRVv(AZl4_D>WSN?1lxk_3W|3%MU}0>KVr*uaY?PdA zYGImWm}-z{o|0x@YG`PhXklPxWMp8LW|3@^Vq|7)YH6ARG}AcM&>+Pm+0xR|(AdB- z)zH$?)VSWn&SoH;zyfrG$z(Bhc@rZ$J1$jlRO^CbS{EGCy1{;q0l^;rAzZ~JiA5z9 TMX70AhQ@}*T&k+B{%%|VG+_zk diff --git a/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_longList.pdf b/itext.tests/itext.forms.tests/resources/itext/forms/form/element/ListBoxFieldTest/cmp_longList.pdf index c2e67df2ddd633d84b3654199ffba664b544deb0..ca8ab0d367af81a0ff96119ca66bd1dae4b9c3af 100644 GIT binary patch delta 976 zcmc(dZBUDG0KiSlcq*j0p(aZf-P-?o_B?y`kQ{5SLoa6%Imh$ze<-mtqm`GrPF&P< zo}4bkx<0JDBxRi|bT=<2*O56Dc854}C~r*@6Q6wW-S^*z-~H~_9qI}#lZ!w@bg9US zrUjtEMc!fL$VKUGTQ8@t4hvc_i=Wt47w+ja6y3P~+E#}v>KuoT_BH;f`aEcBE59$r z;~a8@biVgpL35t>rssTu<-nz#Oj$))bUB%)-Ys+LCj4}^wj6v>72g@Y?d_V*r)QKw zx6<7Ys>AHbDF>%ShTQ3DT7}akxmIL<_O)U?{dD+IBYUbQcpMwjB zmPe+#m}OZNB`>ooFK?!>Hxz{x`B=x0yJz1>_ z=|iXb^wWl^9Dk6!LR`ak%bNE{>RIol?`OY>^uF`Q5xAAxZZ<)B3nE+?-JFI43e}<{ zAOIBy)CvF;b5totE{Qh7*ra(F!2SiKn~dBJ7MfzSS3-;VLX^&Ef>BgFhzCMbz$_8o z*b^WViGc7;yg)<>{?Rjq%)r^!d#NrEe5*ennejaRUc+Y9mGPz1B{j*dqn?N>vm6r( zn-x8dX+N8?@kyth^^k?#EPT%3D!t*2lhIJ-Y# zby7%~%#-2&H25&@S-rdQ$?QD;@eG}_@>RYQmTc*0Pq-Uey4iVZ<5l}Zt7BEHeQN#W zvAW{6Y7k)x6$wn-v%sQdszLwTHcO7aPj;;RW7vr`y1MsjKt;5>u!0An>2j`BRM zRg)Yw0^*FCBnXm*6i;&~pco3OF_P6_EXwg38pSYz(sGdEFieAMcm_fYCkQ~WB+oNy z3Ia|`6B;ec@oLCYEX$HsIx*pYDu_oMXrXBA3>-~NL}LCNrTjgV^3PC8L+YY*Lvq?m XWV@L*nMXSE2&y48NKA}AZ3*%Vg&BnM delta 979 zcmX>sctdc45~JZp(d~xn?{~Iy)KwcF zkCE>);?ix2pY-4U>^Z>|0$B{2OiB_)XPT>v7T?}^`&HgM+aC<2Pa_oB4^3FGZ`bOV zkBg0aAFO{pd-v*hA7y+w*QPnQ^Q~<)JUZ=}++5C?(N^DHEb-X4bm>A)j>YwpM5>EZ zd>N_8fy*SUObrdWZF5~TOzL? zZ9c`iEI6<`K5N#R4xQL~-p}T9)_u>6F~44zyF%F})ph?3minm8|2a9QC|^pvC};MV zLI3lIJ%3OCVBFQW<}g=kUP^IEQEFl?*W`6f+x?9V4UG(pj0`P}Ewl{`)eQ{PHT8Y- zQ(O{DQZ-zxfKu2L1Qg|`lqRPZX=H|^R+Ow$aLzAERj|-A&@-OAg;|Bsc=JtWIYvgq z$v;?Z87(INXHuLT&Z<^_(C@GTPuu%SF8PN6`r96_*~yo?T~^KY5$g>#fvkm29QWkP zqp$L0D2C0^__gN8_PrAK80iV@l;L-X6^j*g zd+&K-eBfpN(y3neU)P`9>S!5WbmjNH_jZXT=W~m7?ik3|slC*=Z{_*e;_J3;mVcSf zm@Y^~3T0q;=O<-xRTQzOrg0f47#dA(WLpUg8*O&g$r|iplY`i0>QfAok_}9a4U^K6 zQ;p3{Q;iKx3{sMkEz-=*%#4##&C-&SlhaHrEmDjvQ!G+VQVf$4EetG8Q;btBEs_(> zlFclV(+m@hlPr=|>Qn7(2GR*EKsTgLF5r+iF|xDcQUxa}T~M0R1*a+9U_ZxzU=RNg auHur!qLPXtU_ct0nVNH{s=E5SaRC6As(n-d diff --git a/itext.tests/itext.pdfa.tests/itext/pdfa/PdfAFormFieldTest.cs b/itext.tests/itext.pdfa.tests/itext/pdfa/PdfAFormFieldTest.cs index 17e445d865..799e18af71 100644 --- a/itext.tests/itext.pdfa.tests/itext/pdfa/PdfAFormFieldTest.cs +++ b/itext.tests/itext.pdfa.tests/itext/pdfa/PdfAFormFieldTest.cs @@ -196,7 +196,6 @@ public virtual void PdfA1DocWithPdfA1ComboBoxFieldTest() { // Android-Conversion-Skip-Line (TODO DEVSIX-7377 introduce pdf\a validation on Android) [NUnit.Framework.Test] - [LogMessage(iText.IO.Logs.IoLogMessageConstant.MULTIPLE_VALUES_ON_A_NON_MULTISELECT_FIELD)] public virtual void PdfA1DocWithPdfA1ListFieldTest() { String name = "pdfA1DocWithPdfA1ListField"; String fileName = DESTINATION_FOLDER + name + ".pdf"; @@ -214,6 +213,7 @@ public virtual void PdfA1DocWithPdfA1ListFieldTest() { f.SetValue("9").SetFont(fontFreeSans); f.SetValue("4"); f.SetTopIndex(2); + f.SetMultiSelect(true); f.SetListSelected(new String[] { "3", "5" }); form.AddField(f); pdfDoc.Close(); diff --git a/itext.tests/itext.pdfa.tests/resources/itext/pdfa/cmp/PdfAFormFieldTest/cmp_pdfA1DocWithPdfA1ChoiceField.pdf b/itext.tests/itext.pdfa.tests/resources/itext/pdfa/cmp/PdfAFormFieldTest/cmp_pdfA1DocWithPdfA1ChoiceField.pdf index 1e27c9906c58f684e5a772f9373f65d8d5f93adf..7936559ba274b21a0e85beb0172e3904cf05aa57 100644 GIT binary patch delta 904 zcmcJOUq}=|7{D8^B9=r$&xcCg_1|gdxihn~JG*jSitA;*)-}du9d7P z%?F`B!pRUw5Cl;qgp@+$Lr}d05fSv%d-xzd2|d(py}!`FsDzq0!t{qn(22n`RtpL&x*iRl|T!b7$b!BAk+d71{&0^Ov+{+ueX~q z#D4-}5$xMxHNhq*zJMA)#40!hpokPS04#B83x~;gcR{Zt-qguBi`9rM+WT70wT_OidMT@pybeREw#E5ACL%cTIPkk<$ zja^t7Svv6bz0Wz>=PQoE7$oD*J`|ST>Ro*MX1-fV{7g?ulTk?-PE1OVm#);6NlHUv z@AaFDv-gz2#GI12F|*ux=lgDXdE)5pmE7Hl2f7RIe>641qJTZLbj z;o6bYva}u`q(eg>yTq?;t>{z?+5z#zE*3d^yPs|%AjBFGuk647vK7-e{J) P5~2hXskXMgCo25{P96Jp delta 950 zcmc&zUq}=|7;nyu*ejyUNCj_8?N0C3oj*IfJ91fi=TYH#ryfU8g8OH-4D#e$Q83Vl zf?fn=9_y_HgNo=PgkB>;>cy9!XDy<)2zv3MJ&i!~y_sS7zHff>`~J*)PZz-Q0$4l? z@KQ?>u%*$S5P~97)4KGoHBi5wsj5f8Y>ps^7_3ejhd2shv|Y`X+_dHMSh@>CydNN6 zF1b?N5Y*3>z ztsD>45d}d7u>xdW)m66M}A`6RWW}=>|S<5ev z&0MQ`g!1-2B0igaBk>JsWBu5Z{KSu`FC81W2#YVYL0HMhu53zQ*J>noZ{pjVhK|#X z?ROu8&FsgY{fU#kL#x`>iOFG_dbxT%HJ=$>A!wbYxGZf82vKP6u|Y`mppbiUlnFl_t=~Z-+55|YgOmH|mRcA* zC>3wh(ZRipNYiML@oq-V_{TFsPz$QF3kRXWm`L_D&S|cPJ!D&k=^{^~m=jDKQ$q;3 zuIm`w)GWtvY|b>S6HRAcfV5r4Y>#2rL!LuSW)j=Ny6xJ~vzcd`oHI%g*AR4ViY?vK zES*`5I4;Lj#~vr#L6+w-)0*Sm$^RL`!5{`Mu4W=s@9vh`w%bFgc89Y4@s#0#p8W8o ZTtS-jt+GE;=AMKM!VIactuL36egpZd2VMXG diff --git a/itext.tests/itext.pdfa.tests/resources/itext/pdfa/cmp/PdfAFormFieldTest/cmp_pdfA1DocWithPdfA1ComboBoxField.pdf b/itext.tests/itext.pdfa.tests/resources/itext/pdfa/cmp/PdfAFormFieldTest/cmp_pdfA1DocWithPdfA1ComboBoxField.pdf index 619b096a9fdcf4b719171b2670a76b79b39bd346..4d84455d50b282df158b09f985e73abe85a0bccb 100644 GIT binary patch delta 1099 zcmcgrO>9j;6gKa?`ne_2w8USyrBA)e>zkQ-=iZs7o>cov-}6&i)l!N3GuKb_Jzg)7 zSRjZ63(Z|jtVGz@SV-gv7FHJ6h=oLAhaeVM*m57KXlrdIlg#f&2 zxVjpVi8V#UC(3ywBAjfQc-<05KbqrcH9DO&u^^mMLa4PK8?6|(rnB41evcE%bv+#v z)2W2$Ia*#P+HpIMKBE?7Mh%IL2uC{;X+)#biTkQhg!zr*o-Bnr=Q!Kl*E1kPov>&Z z3@kErtnbS9mP_GwXG~`Mdh^5i-sl0GK<0Uzyo8e|K8Y$$LQBW&-&wUc2LxH_N)8NU ztH(LOh^wzT7+Q>DwX%Ce>+H;Km8FB>A)Ru}s{1!WL!!~lV38qwkkSr9I(`+W&UL}c ze<-*(j$G)9- z-}d$?xKIamHj40HB;%hD~z45kPAB*vJj$S^df<4)9;Uiy0mEN*{ryGuG4$#sph@Dn<#9=`%2k z&*X9YFJocFIeb)BYJ<_&qwnjK++YE>g^j7SJjXMsAq;J(GBPd&dTMVRfH@usHF0?)Cike21Uf&_sZ z4pgl&8W>cex@nzkYINV0%~pz?L0@+IZ+x!c!F) QXf&?eVp=Md-_fi61m~3?m;e9( delta 1124 zcmcgrTSyd97(gk$#erervnXA~!dZYF3u5MdaGH2#&8M-U$2u2SY6+ske zOPuE*h~ADZABlSaoXyhIq3=W=S}> zL$8PRIP*y;7f2@G*Ce1!udl}4pZ6`6$P$!N^qkn(7zj;REa^zP4g)RW)+lo%q-Od+ zv`}$%B7yc)(&;hBSfD4|6A$-i7QrNcI|wQ+MY69(vITee?nbgfL(aOK$AbU~8ow3< zM9}%uAb^6wzXU<72>prK#gb>7vl7-6ZDFVh?D6d-egyr<7=T8D*S%Zv=@2O1R&YNA zD%Y>a--JM!Ko)+60NllgJ3tjb-3fB}TnDHv(ovw>bkZYJLtbbot<9(SlMc{k)h&z5 zuk!EpjenhdU%QNBFa}9KeArjru_At00-|wc{Nv;Owfhd#T)rc$+&KKLtE-?nvN-zU z=Jn|3<_C)>TV~p`(~o?4Sy{7a_cM_t?FlE%%rS50A&bbua3`1%1=TC4$-l=yZho^l z!8|~JgUN?tASKBBc?{IMV0ndKC_V;u3NB=oaZr3jm7qsbQWCutBdi)*crKghZaF>r zOHY$EelZTJ3iUM+k`fy(6j|oC;-ECgwZMwZU%G15TfAbVsKnUnRnc`W9R~%|>rOY~ zL5QH{BD^^VUD<}Gs#|O^(sc#@v31hs$S6yDFEiXK4K-TWwk?cxiXhP_rWDHRbi&qD znt;@@OvOY9%LdUb(N>n2l6e~ss*p%aMNu`;8?SK2D fJ)yqn(cS@Z!ZFj%RGKA3j0_|zVnsz;Z@c&luLm%6 diff --git a/itext.tests/itext.pdfa.tests/resources/itext/pdfa/cmp/PdfAFormFieldTest/cmp_pdfA1DocWithPdfA1ListField.pdf b/itext.tests/itext.pdfa.tests/resources/itext/pdfa/cmp/PdfAFormFieldTest/cmp_pdfA1DocWithPdfA1ListField.pdf index d7bfead5060154b7008bb36469533a90e7a102ed..abec3ad55530a27c9ece106e799cd27e00d6523f 100644 GIT binary patch delta 1320 zcmc(fUu+ab9LF;tLbhTw1(c@XQYhDx-tEln%?r*;Po4NERs2&4vHvv@H+O!%&ZX${+aTBmgc{kvdZ+ZZe>%kVlB?C{&6Du~A z3FL@jj5%RDpdNrQ5Y+bMoKCAKS~?>b;^hQMH|LDm!fnY6h*I%0wIk;Wm4{&%hW7Wx zlKXr14yXrOV%^DvdPum1OfGvMsGi0U!jSK%#`5lwf>68N+?`{2wQn#e-vD6%u%g?cVFv))&1!4}}QxrTtN_w0K60IE5#u4~C*qMPwb{1HpgH5+eIdaahF+ z(y5tHFOXdtk@sm~c}Uy0wKSTKbhyHc$d74flfS1BNIpUb!YFgiXv_ujpUox{go9{I93zI*UjWoZ1B{zSDm ze_>sr^Yo^>kAJ&*d+byA?#SSkx`!WIOAqdwjk4o|f4+XL(KuYWHaxu`rW-~V=8t~9 zO|Q?MKT0lrIC-`1orCkwzq)E-_PK=zU;6liQy*ok$?D04%k{mTPj^cI>H(g5Ao7|r zgs9@p&|(>?L8(sFw0etC=KVmw)a*@$5ar(NEMX85$Z8lu2BC6ASD?J;fNr}YL?EtF zLx@fOUj~gDhL8zszm5oH-rOze2oa9-Mb`AM))Bi2Z!-uP!7?0gC<~z*$krJl4yPuu zAWxgnHdCgsOx@uYXN;v75j4$o2c>LIu!)84Yd-_8`n_CKU1Nl Zw~$gOT5hrAinM}E17fAQxodA+`5O`lg-QSb delta 1140 zcmah|S!fec6lJEaW3?_cVy!xjjm^^Oyf?{gF)21}QoE#9TSahzEEA2TNlnt)LM4b& zL{JQ`b;IpLYE?>=2r7PP^+yyJ)F1s2D-@|8uDAq2d=rY9Y6+026-j7L?5Rf8S<4ci3ekXRCR$2pNN7P;Vl%2B3kefSm>Kj(BYNXF`004#q9H4`ZN_&j1jD%ZT z=(=_EMtxajeJ#_bM54iPXrsYUT1qJ)f7rW?f{6#ZWJ}fxJt3h>rX9I54d^wjD;$c| zd72frs@$=<%7yI3?mRW4GHf>1;fX3LpwstF>>4E+ zZjJbqDE2_ruWpc*QH{*T2dP^iyX#%YzWmp^rpK3?22jT*p#Mf%2X|jQ(b;+3?VJ)i z>9~E0T@uV;x<__>-kxJ$f4Og8e%7q{(xCn8n@PjF5|bMaXXV?1H)CCnwvj3ByL%RA zFIeb&G}{!tv-VkP@9oy(9}<4jG_vw-?@`^gx!k;G^}~h6lBTX)_m`%Txi5_$lgEDa z_olA(_a5>$-0$zJIt?zQdYjbZ1S z|MrBKEVp)1BnQyFihQF52sG|20O$}+r5_;VB{3rgfFPhb&UvI+M$4Q<@n3mJ2Yz!@ zqLk*0i$QEJUZXJx%`$Erb^Se01>j$xZe!~~Zek3x(zy5-Anv*e1vy+w1&$s9p&3Ko+%J~#82$W9eT;-yE0&k{E4FCWD diff --git a/itext.tests/itext.pdfa.tests/resources/itext/pdfa/cmp/PdfAFormFieldTest/cmp_testMultipleCombinationsWriteAndLoad.pdf b/itext.tests/itext.pdfa.tests/resources/itext/pdfa/cmp/PdfAFormFieldTest/cmp_testMultipleCombinationsWriteAndLoad.pdf index 28535fd9c8b04a1a7b95f658295d27087e314ae0..d5708194394c4aa487a80d2e296d224b8bc0b142 100644 GIT binary patch delta 1573 zcmZ`(du$X%7|&j(g&vpo=#>_($91v2_S#xHkKLW!+Efcj%j-DX0s$XnUk63#ReD9_ z)vC26H6pNt{fCE$MIJ_x8qP#8P(U<3(U^b~B_v=7^3s?w_tXhkSKOUCdm9coA>79NN%2CxzS(3L7r(^444-nGi-E-)OrFOPRGm?)fPF+%1SE2YzXn9 z%nU27t%(yj!CJwUTHd5K>!(DI^_U~bBCfEuC#Ch%8=4vy@)GKLZrEHdqu)(6kA;Cr z8kl73{P2w&v>KBOIH_xEvXkRz*KX&R;Q#2arasA0`{r2Sv7rwHtZesA2a)dsdflhG zE~Z}Qn7g>A#mP}i_Ahe?vbEnok4-PTvfEwR9Qzz`S9Zdo>lyG~dDG4M1+j%Zma!85 zF$IiqBr49JAa2y!~+F8KCGVd7eDlbTn13$>(>aLpQ1EXw% z2YGDq$Q)4F{LKt!H*_bS?|bCL!%g3P<+^1p>Ad#T@PucM%uX-*;KLiY^6K^$Y;rG$ zxBXM5{t<2}edFZk(Ovu7vRZ4MohcW3MsE*Cs$aXAX?PFHU-usWBx%Z)pT)ViU$R?r z`X+{^W>h)$z>l7tG$wg&&$dl{FYY)R`1mm1RQYK5K*qeq3+H5hy7`xm@B7Zh4jde| z=(qBBe)#KjX71YZPWvq%$hUWmV}m;fR5hcJFvFJH4UDvt`=tP+|98eVb?3n#z;e zpS7;@=DyOq=hu-VoS>|m6eb^YY;1WC%~!NB>9}X}tnSx$bk>wjTvB^&b>*4TZ{NHy zdd7<#SEuj0vhV8q2eZUWi95W_hf+s`DqQxtu^>NwX2RO2U-cT(W6PJC5htcBjNl9e9-lec`8T6)(60ah delta 1754 zcmZ`(3s6*581C*K7F-wv7jQ&`OFVYh0?y;!v-c9B5Q$?-ij0n-PWQFA&cGrpN=5

p%|D|&W}joIxtD7(w>Z3J zsw35sJ>~}6EVJ7l%OP`zeTEsZmn8_O-?>uJ13}CS*xY4bZllPY3U(zCOBGb-Ig5%4 zN~Ty#1y8Z1c*R^5RcfwrxHw{#*hKk!NS~D@+KYAvY5=l_WV>-a3eny~qCT2M&n2kfcoYb>wh?C>wo==_MfXA6H9a_!Wp9D$l zP%6kVGZNPJY#0{DvCLE;M|L&=v#vBtzMXK$CP+PDSDTZQO(}hWO@!vA^cOAmdR)fa zaT%QT*}`!d_TE2OXBvo&on+M2gy!;CqEh%&JQ!h%lJa3bX15YRmO%KD`i7Sq4Zge~ z*i_F~On-*24e9}Zz|i@o#z0*SAE+{#LwmaUXM+s}f8UcMj86m$TqF;{JS0~^xloh} zA$kg8wmuQ04_07H5k8R!E=9AyMgTYaYSi6YS$-N&+0As26pob6F)#l=O;zSSP2_&U zCr5#i9NU-$lJAP&XMaaYrA_`J(M5LAA}lbUAN-duL~U>!RCtX4yZf%XbTz+ZM*GFPkW4PyYMH zVr*`BSL^(7b1AxFzc4bp{==h_4h-)N9Xm4i>>9ltBskrzSLbF&sn_A6tyH{E(-4L??Q8g+VOsKHQb zBT}SOY5!BZA~i*`U?$*`rN)E!zPq8uMvvL!nGfwaP z83^mXUcK$~(QWYTh0wT>+QKNae$V@Tc)O5zQymN%v>A0NASEs%9gIu(><5>5Ej?))Mue=<(IIHXTQ807e*1nnU z6?x~PmiBF&*SvmVQfk?oX3G;De96H_ltv<5>imTdnOHtoH&4A$Oai)9CgC~ zh_IAgP-ug`aAhv2;aIx|xNKNpJKR8G4v+QnSKJ_llbO>4a%}`LY;o4+0eT9tCW=Lf z_w)DS5s6Lof^2rp1E#V0Uf^MeJs>Ih5tbriA9z89b+AZEr)d4<1HsrSFTkxntGOb? z*9`>6RECieFbE?=eh3p};UP?d14pCo`2BLcem09Fa#+cl*ES! zeJCKJ6tWYeL29d^2^v8d8GfuPx~7Yi2$F&|2@*-x2$2*;(xIecSu$i*q{#5;s-P$; zfqp-v5+Ry_R4hnD#}+D5sOW~KV5F#)6U7)}Yo|lQ5Rp&S41-WX6n%b5bY0PuR-?Gc zfU1TJQ4tJ{Qlv>LQ8Cdidl^dBiF~pwh)C7^RKfxg6^UxtXAnfNBw#2~MKM&O$yCGw zmI*ParXrt0{i3R>{* lfkg&SX>qYLr+)_KMJ8b0zy!>A8Vq;J6gqQqo_k@u^IsU)6S@EZ diff --git a/itext/itext.forms/itext/forms/fields/PdfFormAnnotation.cs b/itext/itext.forms/itext/forms/fields/PdfFormAnnotation.cs index f3a776f1cd..7ae69cf250 100644 --- a/itext/itext.forms/itext/forms/fields/PdfFormAnnotation.cs +++ b/itext/itext.forms/itext/forms/fields/PdfFormAnnotation.cs @@ -805,12 +805,14 @@ protected internal virtual void DrawListFormFieldAndSaveAppearance() { if (rectangle == null) { return; } + bool multiselect = parent.GetFieldFlag(PdfChoiceFormField.FF_MULTI_SELECT); if (!(formFieldElement is ListBoxField)) { // Create it once and reset properties during each widget regeneration. - formFieldElement = new ListBoxField("", 0, parent.GetFieldFlag(PdfChoiceFormField.FF_MULTI_SELECT)); + formFieldElement = new ListBoxField(parent.GetPartialFieldName().ToUnicodeString(), 0, multiselect); } - formFieldElement.SetProperty(FormProperty.FORM_FIELD_MULTIPLE, parent.GetFieldFlag(PdfChoiceFormField.FF_MULTI_SELECT - )); + formFieldElement.SetProperty(FormProperty.FORM_FIELD_MULTIPLE, multiselect); + ((ListBoxField)formFieldElement).SetTopIndex(parent is PdfChoiceFormField && ((PdfChoiceFormField)parent). + GetTopIndex() != null ? ((PdfChoiceFormField)parent).GetTopIndex().IntValue() : 0); PdfArray indices = GetParent().GetAsArray(PdfName.I); PdfArray options = parent.GetOptions(); for (int index = 0; index < options.Size(); ++index) { @@ -835,13 +837,25 @@ protected internal virtual void DrawListFormFieldAndSaveAppearance() { bool selected = indices != null && indices.Contains(new PdfNumber(index)); SelectFieldItem existingItem = ((ListBoxField)formFieldElement).GetOption(exportValue); if (existingItem == null) { - existingItem = new SelectFieldItem(exportValue, displayValue); + existingItem = displayValue == null ? new SelectFieldItem(exportValue) : new SelectFieldItem(exportValue, + displayValue); ((ListBoxField)formFieldElement).AddOption(existingItem); } existingItem.GetElement().SetProperty(Property.TEXT_ALIGNMENT, parent.GetJustification()); existingItem.GetElement().SetProperty(Property.OVERFLOW_Y, OverflowPropertyValue.VISIBLE); existingItem.GetElement().SetProperty(Property.OVERFLOW_X, OverflowPropertyValue.VISIBLE); existingItem.GetElement().SetProperty(FormProperty.FORM_FIELD_SELECTED, selected); + // Workaround for com.itextpdf.forms.form.renderer.SelectFieldListBoxRenderer.applySelectedStyle: + // in HTML rendering mode we want to draw gray background for flattened fields and blue one for interactive, + // but here we temporarily flatten formFieldElement, so blue background property is explicitly set to + // the selected item. We also need to clear background property for not selected items in case field + // is regenerated with modified indices list. + if (selected && (multiselect || index == indices.GetAsNumber(indices.Size() - 1).IntValue())) { + existingItem.GetElement().SetProperty(Property.BACKGROUND, new Background(new DeviceRgb(169, 204, 225))); + } + else { + existingItem.GetElement().SetProperty(Property.BACKGROUND, null); + } } formFieldElement.SetProperty(Property.FONT, GetFont()); if (GetColor() != null) { @@ -876,9 +890,18 @@ protected internal virtual void DrawTextFormFieldAndSaveAppearance() { formFieldElement.SetProperty(Property.FONT_SIZE, UnitValue.CreatePointValue(GetFontSize())); } else { - formFieldElement.SetProperty(Property.FONT_SIZE, UnitValue.CreatePointValue(GetFontSize(new PdfArray(rectangle - ), parent.GetValueAsString()))); + float fontSize = GetFontSize(new PdfArray(rectangle), parent.GetValueAsString()); + if (fontSize != 0) { + // We want to always draw the text using the given font size even if it's not fit into layout area. + // Without setting this property the height of the drawn field will be 0 which is unexpected. + formFieldElement.SetProperty(Property.FORCED_PLACEMENT, true); + } + formFieldElement.SetProperty(Property.FONT_SIZE, UnitValue.CreatePointValue(fontSize)); value = iText.Commons.Utils.StringUtil.ReplaceAll(value, LINE_ENDINGS_REGEXP, " "); + ((InputField)formFieldElement).SetComb(this.IsCombTextFormField()); + ((InputField)formFieldElement).SetMaxLen((parent is PdfTextFormField ? (PdfTextFormField)parent : PdfFormCreator + .CreateTextFormField(parent.GetPdfObject())).GetMaxLen()); + ((InputField)formFieldElement).UseAsPassword(parent.IsPassword()); } formFieldElement.SetValue(value); formFieldElement.SetProperty(Property.FONT, GetFont()); @@ -913,7 +936,7 @@ protected internal virtual void DrawComboBoxAndSaveAppearance() { return; } if (!(formFieldElement is ComboBoxField)) { - formFieldElement = new ComboBoxField(""); + formFieldElement = new ComboBoxField(parent.GetPartialFieldName().ToUnicodeString()); } ComboBoxField comboBoxField = (ComboBoxField)formFieldElement; PrepareComboBoxFieldWithCorrectOptionsAndValues(comboBoxField); @@ -1035,49 +1058,38 @@ internal virtual bool RegenerateWidget() { } PdfName type = parent.GetFormType(); RetrieveStyles(); - if ((PdfName.Ch.Equals(type) && parent.GetFieldFlag(PdfChoiceFormField.FF_COMBO)) || this.IsCombTextFormField - ()) { - if (parent.GetFieldFlag(PdfChoiceFormField.FF_COMBO) && formFieldElement != null) { + if (PdfName.Ch.Equals(type)) { + if (parent.GetFieldFlag(PdfChoiceFormField.FF_COMBO)) { DrawComboBoxAndSaveAppearance(); return true; } - return TextAndChoiceLegacyDrawer.RegenerateTextAndChoiceField(this); + DrawListFormFieldAndSaveAppearance(); + return true; } else { - if (PdfName.Ch.Equals(type) && !parent.GetFieldFlag(PdfChoiceFormField.FF_COMBO)) { - if (formFieldElement != null) { - DrawListFormFieldAndSaveAppearance(); - return true; - } - else { - return TextAndChoiceLegacyDrawer.RegenerateTextAndChoiceField(this); - } + if (PdfName.Tx.Equals(type)) { + DrawTextFormFieldAndSaveAppearance(); + return true; } else { - if (PdfName.Tx.Equals(type)) { - DrawTextFormFieldAndSaveAppearance(); - return true; - } - else { - if (PdfName.Btn.Equals(type)) { - if (parent.GetFieldFlag(PdfButtonFormField.FF_PUSH_BUTTON)) { - DrawPushButtonFieldAndSaveAppearance(); + if (PdfName.Btn.Equals(type)) { + if (parent.GetFieldFlag(PdfButtonFormField.FF_PUSH_BUTTON)) { + DrawPushButtonFieldAndSaveAppearance(); + } + else { + if (parent.GetFieldFlag(PdfButtonFormField.FF_RADIO)) { + DrawRadioButtonAndSaveAppearance(GetRadioButtonValue()); } else { - if (parent.GetFieldFlag(PdfButtonFormField.FF_RADIO)) { - DrawRadioButtonAndSaveAppearance(GetRadioButtonValue()); - } - else { - DrawCheckBoxAndSaveAppearance(GetCheckBoxValue()); - } + DrawCheckBoxAndSaveAppearance(GetCheckBoxValue()); } - return true; } - else { - if (PdfName.Sig.Equals(type)) { - DrawSignatureFormFieldAndSaveAppearance(); - return true; - } + return true; + } + else { + if (PdfName.Sig.Equals(type)) { + DrawSignatureFormFieldAndSaveAppearance(); + return true; } } } @@ -1166,14 +1178,17 @@ internal virtual float GetFontSize(PdfArray bBox, String value) { private bool IsCombTextFormField() { PdfName type = parent.GetFormType(); - if (PdfName.Tx.Equals(type) && parent.GetFieldFlag(PdfTextFormField.FF_COMB)) { - int maxLen = PdfFormCreator.CreateTextFormField(parent.GetPdfObject()).GetMaxLen(); - if (maxLen == 0 || parent.IsMultiline()) { - LOGGER.LogError(MessageFormatUtil.Format(iText.IO.Logs.IoLogMessageConstant.COMB_FLAG_MAY_BE_SET_ONLY_IF_MAXLEN_IS_PRESENT - )); - return false; + if (PdfName.Tx.Equals(type)) { + PdfTextFormField textField = parent is PdfTextFormField ? (PdfTextFormField)parent : PdfFormCreator.CreateTextFormField + (parent.GetPdfObject()); + if (textField.IsComb()) { + if (textField.GetMaxLen() == 0 || textField.IsMultiline() || textField.IsPassword() || textField.IsFileSelect + ()) { + LOGGER.LogError(iText.IO.Logs.IoLogMessageConstant.COMB_FLAG_MAY_BE_SET_ONLY_IF_MAXLEN_IS_PRESENT); + return false; + } + return true; } - return true; } return false; } diff --git a/itext/itext.forms/itext/forms/fields/PdfTextFormField.cs b/itext/itext.forms/itext/forms/fields/PdfTextFormField.cs index 0864d0c907..bec270b2c3 100644 --- a/itext/itext.forms/itext/forms/fields/PdfTextFormField.cs +++ b/itext/itext.forms/itext/forms/fields/PdfTextFormField.cs @@ -202,7 +202,13 @@ public virtual iText.Forms.Fields.PdfTextFormField SetScroll(bool scroll) { /// If true, the field is automatically divided into as many equally spaced positions, /// or combs, as the value of MaxLen, and the text is laid out into those combs. /// - /// whether or not combing is enabled + /// + /// + /// + /// if combing is enabled, + /// + /// otherwise + /// public virtual bool IsComb() { return GetFieldFlag(FF_COMB); } diff --git a/itext/itext.forms/itext/forms/fields/TextAndChoiceLegacyDrawer.cs b/itext/itext.forms/itext/forms/fields/TextAndChoiceLegacyDrawer.cs deleted file mode 100644 index ef7eb03e18..0000000000 --- a/itext/itext.forms/itext/forms/fields/TextAndChoiceLegacyDrawer.cs +++ /dev/null @@ -1,382 +0,0 @@ -/* -This file is part of the iText (R) project. -Copyright (c) 1998-2024 Apryse Group NV -Authors: Apryse Software. - -This program is offered under a commercial and under the AGPL license. -For commercial licensing, contact us at https://itextpdf.com/sales. For AGPL licensing, see below. - -AGPL licensing: -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -using System; -using System.Collections.Generic; -using Microsoft.Extensions.Logging; -using iText.Commons; -using iText.Forms.Logs; -using iText.Kernel.Colors; -using iText.Kernel.Font; -using iText.Kernel.Geom; -using iText.Kernel.Pdf; -using iText.Kernel.Pdf.Annot; -using iText.Kernel.Pdf.Canvas; -using iText.Kernel.Pdf.Xobject; -using iText.Layout; -using iText.Layout.Element; -using iText.Layout.Properties; - -namespace iText.Forms.Fields { -//\cond DO_NOT_DOCUMENT - internal sealed class TextAndChoiceLegacyDrawer { - private static readonly ILogger LOGGER = ITextLogManager.GetLogger(typeof(iText.Forms.Fields.TextAndChoiceLegacyDrawer - )); - - private TextAndChoiceLegacyDrawer() { - } - -//\cond DO_NOT_DOCUMENT - //Empty constructor. - internal static bool RegenerateTextAndChoiceField(PdfFormAnnotation formAnnotation) { - String value = formAnnotation.parent.GetDisplayValue(); - PdfName type = formAnnotation.parent.GetFormType(); - PdfPage page = PdfAnnotation.MakeAnnotation(formAnnotation.GetPdfObject()).GetPage(); - PdfArray bBox = formAnnotation.GetPdfObject().GetAsArray(PdfName.Rect); - //Apply Page rotation - int pageRotation = 0; - if (page != null) { - pageRotation = page.GetRotation(); - //Clockwise, so negative - pageRotation *= -1; - } - PdfArray matrix; - if (pageRotation % 90 == 0) { - //Cast angle to [-360, 360] - double angle = pageRotation % 360; - //Get angle in radians - angle = DegreeToRadians(angle); - Rectangle initialBboxRectangle = bBox.ToRectangle(); - //rotate the bounding box - Rectangle rect = initialBboxRectangle.Clone(); - //Calculate origin offset - double translationWidth = 0; - double translationHeight = 0; - if (angle >= -1 * Math.PI && angle <= -1 * Math.PI / 2) { - translationWidth = rect.GetWidth(); - } - if (angle <= -1 * Math.PI) { - translationHeight = rect.GetHeight(); - } - //Store rotation and translation in the matrix - matrix = new PdfArray(new double[] { Math.Cos(angle), -Math.Sin(angle), Math.Sin(angle), Math.Cos(angle), - translationWidth, translationHeight }); - // If the angle is a multiple of 90 and not a multiple of 180, height and width of the bounding box - // need to be switched - if (angle % (Math.PI / 2) == 0 && angle % (Math.PI) != 0) { - rect.SetWidth(initialBboxRectangle.GetHeight()); - rect.SetHeight(initialBboxRectangle.GetWidth()); - } - // Adapt origin - rect.SetX(rect.GetX() + (float)translationWidth); - rect.SetY(rect.GetY() + (float)translationHeight); - //Copy Bounding box - bBox = new PdfArray(rect); - } - else { - //Avoid NPE when handling corrupt pdfs - LOGGER.LogError(FormsLogMessageConstants.INCORRECT_PAGE_ROTATION); - matrix = new PdfArray(new double[] { 1, 0, 0, 1, 0, 0 }); - } - //Apply field rotation - float fieldRotation = 0; - if (formAnnotation.GetPdfObject().GetAsDictionary(PdfName.MK) != null && formAnnotation.GetPdfObject().GetAsDictionary - (PdfName.MK).Get(PdfName.R) != null) { - fieldRotation = (float)formAnnotation.GetPdfObject().GetAsDictionary(PdfName.MK).GetAsFloat(PdfName.R); - //Get relative field rotation - fieldRotation += pageRotation; - } - if (fieldRotation % 90 == 0) { - Rectangle initialBboxRectangle = bBox.ToRectangle(); - //Cast angle to [-360, 360] - double angle = fieldRotation % 360; - //Get angle in radians - angle = DegreeToRadians(angle); - //Calculate origin offset - double translationWidth = CalculateTranslationWidthAfterFieldRot(initialBboxRectangle, DegreeToRadians(pageRotation - ), angle); - double translationHeight = CalculateTranslationHeightAfterFieldRot(initialBboxRectangle, DegreeToRadians(pageRotation - ), angle); - //Concatenate rotation and translation into the matrix - Matrix currentMatrix = new Matrix(matrix.GetAsNumber(0).FloatValue(), matrix.GetAsNumber(1).FloatValue(), - matrix.GetAsNumber(2).FloatValue(), matrix.GetAsNumber(3).FloatValue(), matrix.GetAsNumber(4).FloatValue - (), matrix.GetAsNumber(5).FloatValue()); - Matrix toConcatenate = new Matrix((float)Math.Cos(angle), (float)(-Math.Sin(angle)), (float)(Math.Sin(angle - )), (float)(Math.Cos(angle)), (float)translationWidth, (float)translationHeight); - currentMatrix = currentMatrix.Multiply(toConcatenate); - matrix = new PdfArray(new float[] { currentMatrix.Get(0), currentMatrix.Get(1), currentMatrix.Get(3), currentMatrix - .Get(4), currentMatrix.Get(6), currentMatrix.Get(7) }); - // Construct bounding box - Rectangle rect = initialBboxRectangle.Clone(); - // If the angle is a multiple of 90 and not a multiple of 180, height and width of the bounding box - // need to be switched - if (angle % (Math.PI / 2) == 0 && angle % (Math.PI) != 0) { - rect.SetWidth(initialBboxRectangle.GetHeight()); - rect.SetHeight(initialBboxRectangle.GetWidth()); - } - rect.SetX(rect.GetX() + (float)translationWidth); - rect.SetY(rect.GetY() + (float)translationHeight); - // Copy Bounding box - bBox = new PdfArray(rect); - } - // Create appearance - Rectangle bboxRectangle = bBox.ToRectangle(); - PdfFormXObject appearance = new PdfFormXObject(new Rectangle(0, 0, bboxRectangle.GetWidth(), bboxRectangle - .GetHeight())); - appearance.Put(PdfName.Matrix, matrix); - //Create text appearance - if (PdfName.Tx.Equals(type)) { - DrawCombTextAppearance(formAnnotation, bboxRectangle, formAnnotation.GetFont(), formAnnotation.GetFontSize - (bBox, value), value, appearance); - } - else { - int topIndex = 0; - if (!formAnnotation.parent.GetFieldFlag(PdfChoiceFormField.FF_COMBO)) { - PdfNumber topIndexNum = formAnnotation.GetParent().GetAsNumber(PdfName.TI); - PdfArray options = formAnnotation.parent.GetOptions(); - if (null != options) { - topIndex = null != topIndexNum ? topIndexNum.IntValue() : 0; - PdfArray visibleOptions = topIndex > 0 ? new PdfArray(options.SubList(topIndex, options.Size())) : (PdfArray - )options.Clone(); - value = PdfFormField.OptionsArrayToString(visibleOptions); - } - } - DrawChoiceAppearance(formAnnotation, bboxRectangle, formAnnotation.GetFontSize(bBox, value), value, appearance - , topIndex); - } - PdfDictionary ap = new PdfDictionary(); - ap.Put(PdfName.N, appearance.GetPdfObject()); - ap.SetModified(); - formAnnotation.Put(PdfName.AP, ap); - return true; - } -//\endcond - -//\cond DO_NOT_DOCUMENT - internal static void DrawChoiceAppearance(PdfFormAnnotation formAnnotation, Rectangle rect, float fontSize - , String value, PdfFormXObject appearance, int topIndex) { - PdfStream stream = (PdfStream)new PdfStream().MakeIndirect(formAnnotation.GetDocument()); - PdfResources resources = appearance.GetResources(); - PdfCanvas canvas = new PdfCanvas(stream, resources, formAnnotation.GetDocument()); - float width = rect.GetWidth(); - float height = rect.GetHeight(); - float widthBorder = 6.0f; - float heightBorder = 2.0f; - formAnnotation.DrawBorder(canvas, appearance, width, height); - canvas.BeginVariableText().SaveState().Rectangle(3, 3, width - widthBorder, height - heightBorder).Clip(). - EndPath(); - iText.Layout.Canvas modelCanvas = new iText.Layout.Canvas(canvas, new Rectangle(3, 0, Math.Max(0, width - - widthBorder), Math.Max(0, height - heightBorder))); - modelCanvas.SetProperty(Property.APPEARANCE_STREAM_LAYOUT, true); - PdfFormAnnotation.SetMetaInfoToCanvas(modelCanvas); - Div div = new Div(); - if (formAnnotation.parent.GetFieldFlag(PdfChoiceFormField.FF_COMBO)) { - div.SetVerticalAlignment(VerticalAlignment.MIDDLE); - } - div.SetHeight(Math.Max(0, height - heightBorder)); - IList strings = formAnnotation.GetFont().SplitString(value, fontSize, width - widthBorder); - for (int index = 0; index < strings.Count; index++) { - bool? isFull = modelCanvas.GetRenderer().GetPropertyAsBoolean(Property.FULL); - if (true.Equals(isFull)) { - break; - } - Paragraph paragraph = new Paragraph(strings[index]).SetFont(formAnnotation.GetFont()).SetFontSize(fontSize - ).SetMargins(0, 0, 0, 0).SetMultipliedLeading(1); - paragraph.SetProperty(Property.FORCED_PLACEMENT, true); - paragraph.SetTextAlignment(formAnnotation.parent.GetJustification()); - if (formAnnotation.GetColor() != null) { - paragraph.SetFontColor(formAnnotation.GetColor()); - } - if (!formAnnotation.parent.GetFieldFlag(PdfChoiceFormField.FF_COMBO)) { - PdfArray indices = formAnnotation.GetParent().GetAsArray(PdfName.I); - if (indices != null && indices.Size() > 0) { - foreach (PdfObject ind in indices) { - if (!ind.IsNumber()) { - continue; - } - if (((PdfNumber)ind).GetValue() == index + topIndex) { - paragraph.SetBackgroundColor(new DeviceRgb(10, 36, 106)); - paragraph.SetFontColor(ColorConstants.LIGHT_GRAY); - } - } - } - } - div.Add(paragraph); - } - modelCanvas.Add(div); - canvas.RestoreState().EndVariableText(); - appearance.GetPdfObject().SetData(stream.GetBytes()); - } -//\endcond - - private static void DrawCombTextAppearance(PdfFormAnnotation formAnnotation, Rectangle rect, PdfFont font, - float fontSize, String value, PdfFormXObject appearance) { - PdfStream stream = (PdfStream)new PdfStream().MakeIndirect(formAnnotation.GetDocument()); - PdfResources resources = appearance.GetResources(); - PdfCanvas canvas = new PdfCanvas(stream, resources, formAnnotation.GetDocument()); - float height = rect.GetHeight(); - float width = rect.GetWidth(); - PdfFormXObject xObject = new PdfFormXObject(new Rectangle(0, 0, width, height)); - formAnnotation.DrawBorder(canvas, xObject, width, height); - if (formAnnotation.parent.IsPassword()) { - value = ObfuscatePassword(value); - } - canvas.BeginVariableText().SaveState().EndPath(); - iText.Layout.Canvas modelCanvas = new iText.Layout.Canvas(canvas, new Rectangle(0, -height, 0, 2 * height) - ); - modelCanvas.SetProperty(Property.APPEARANCE_STREAM_LAYOUT, true); - PdfFormAnnotation.SetMetaInfoToCanvas(modelCanvas); - Style paragraphStyle = new Style().SetFont(font).SetFontSize(fontSize); - paragraphStyle.SetProperty(Property.LEADING, new Leading(Leading.MULTIPLIED, 1)); - if (formAnnotation.GetColor() != null) { - paragraphStyle.SetProperty(Property.FONT_COLOR, new TransparentColor(formAnnotation.GetColor())); - } - int maxLen = PdfFormCreator.CreateTextFormField(formAnnotation.parent.GetPdfObject()).GetMaxLen(); - // check if /Comb has been set - float widthPerCharacter = width / maxLen; - int numberOfCharacters = Math.Min(maxLen, value.Length); - int start; - TextAlignment? textAlignment = formAnnotation.parent.GetJustification() == null ? TextAlignment.LEFT : formAnnotation - .parent.GetJustification(); - switch (textAlignment) { - case TextAlignment.RIGHT: { - start = (maxLen - numberOfCharacters); - break; - } - - case TextAlignment.CENTER: { - start = (maxLen - numberOfCharacters) / 2; - break; - } - - default: { - start = 0; - break; - } - } - float startOffset = widthPerCharacter * (start + 0.5f); - for (int i = 0; i < numberOfCharacters; i++) { - modelCanvas.ShowTextAligned(new Paragraph(value.JSubstring(i, i + 1)).AddStyle(paragraphStyle), startOffset - + widthPerCharacter * i, rect.GetHeight() / 2, TextAlignment.CENTER, VerticalAlignment.MIDDLE); - } - canvas.RestoreState().EndVariableText(); - appearance.GetPdfObject().SetData(stream.GetBytes()); - } - - private static String ObfuscatePassword(String text) { - char[] pchar = new char[text.Length]; - for (int i = 0; i < text.Length; i++) { - pchar[i] = '*'; - } - return new String(pchar); - } - - private static float CalculateTranslationHeightAfterFieldRot(Rectangle bBox, double pageRotation, double relFieldRotation - ) { - if (relFieldRotation == 0) { - return 0.0f; - } - if (pageRotation == 0) { - if (relFieldRotation == Math.PI / 2) { - return bBox.GetHeight(); - } - if (relFieldRotation == Math.PI) { - return bBox.GetHeight(); - } - } - if (pageRotation == -Math.PI / 2) { - if (relFieldRotation == -Math.PI / 2) { - return bBox.GetWidth() - bBox.GetHeight(); - } - if (relFieldRotation == Math.PI / 2) { - return bBox.GetHeight(); - } - if (relFieldRotation == Math.PI) { - return bBox.GetWidth(); - } - } - if (pageRotation == -Math.PI) { - if (relFieldRotation == -1 * Math.PI) { - return bBox.GetHeight(); - } - if (relFieldRotation == -1 * Math.PI / 2) { - return bBox.GetHeight() - bBox.GetWidth(); - } - if (relFieldRotation == Math.PI / 2) { - return bBox.GetWidth(); - } - } - if (pageRotation == -3 * Math.PI / 2) { - if (relFieldRotation == -3 * Math.PI / 2) { - return bBox.GetWidth(); - } - if (relFieldRotation == -Math.PI) { - return bBox.GetWidth(); - } - } - return 0.0f; - } - - private static float CalculateTranslationWidthAfterFieldRot(Rectangle bBox, double pageRotation, double relFieldRotation - ) { - if (relFieldRotation == 0) { - return 0.0f; - } - if (pageRotation == 0 && (relFieldRotation == Math.PI || relFieldRotation == 3 * Math.PI / 2)) { - return bBox.GetWidth(); - } - if (pageRotation == -Math.PI / 2) { - if (relFieldRotation == -Math.PI / 2 || relFieldRotation == Math.PI) { - return bBox.GetHeight(); - } - } - if (pageRotation == -Math.PI) { - if (relFieldRotation == -1 * Math.PI) { - return bBox.GetWidth(); - } - if (relFieldRotation == -1 * Math.PI / 2) { - return bBox.GetHeight(); - } - if (relFieldRotation == Math.PI / 2) { - return -1 * (bBox.GetHeight() - bBox.GetWidth()); - } - } - if (pageRotation == -3 * Math.PI / 2) { - if (relFieldRotation == -3 * Math.PI / 2) { - return -1 * (bBox.GetWidth() - bBox.GetHeight()); - } - if (relFieldRotation == -Math.PI) { - return bBox.GetHeight(); - } - if (relFieldRotation == -Math.PI / 2) { - return bBox.GetWidth(); - } - } - return 0.0f; - } - - private static double DegreeToRadians(double angle) { - return Math.PI * angle / 180.0; - } - } -//\endcond -} diff --git a/itext/itext.forms/itext/forms/form/FormProperty.cs b/itext/itext.forms/itext/forms/form/FormProperty.cs index 6475407782..01cab91ed1 100644 --- a/itext/itext.forms/itext/forms/form/FormProperty.cs +++ b/itext/itext.forms/itext/forms/form/FormProperty.cs @@ -68,6 +68,21 @@ public sealed class FormProperty { ///

The Constant FORM_CONFORMANCE_LEVEL. public const int FORM_CONFORMANCE_LEVEL = PROPERTY_START + 15; + /// The Constant LIST_BOX_TOP_INDEX representing the index of the first visible option in a scrollable list. + /// + public const int LIST_BOX_TOP_INDEX = PROPERTY_START + 16; + + /// + /// The Constant TEXT_FIELD_COMB_FLAG representing + /// Comb + /// flag for the text field. + /// + public const int TEXT_FIELD_COMB_FLAG = PROPERTY_START + 17; + + /// The Constant TEXT_FIELD_MAX_LEN representing the maximum length of the field's text, in characters. + /// + public const int TEXT_FIELD_MAX_LEN = PROPERTY_START + 18; + private FormProperty() { } // Empty constructor. diff --git a/itext/itext.forms/itext/forms/form/element/InputField.cs b/itext/itext.forms/itext/forms/form/element/InputField.cs index aa11303e0d..58ca5e557d 100644 --- a/itext/itext.forms/itext/forms/form/element/InputField.cs +++ b/itext/itext.forms/itext/forms/form/element/InputField.cs @@ -101,6 +101,14 @@ public override T1 GetDefaultProperty(int property) { return (T1)(Object)20; } + case FormProperty.TEXT_FIELD_COMB_FLAG: { + return (T1)(Object)false; + } + + case FormProperty.TEXT_FIELD_MAX_LEN: { + return (T1)(Object)0; + } + default: { return base.GetDefaultProperty(property); } @@ -117,11 +125,11 @@ public virtual int GetRotation() { /// /// new rotation value, counterclockwise. Must be a multiple of 90 degrees. /// It has sense only in interactive mode, see - /// . + /// /// /// /// the edited - /// . + /// /// public virtual iText.Forms.Form.Element.InputField SetRotation(int rotation) { if (rotation % 90 != 0) { @@ -131,6 +139,43 @@ public virtual iText.Forms.Form.Element.InputField SetRotation(int rotation) { return this; } + /// + /// Sets + /// Comb + /// flag for the text field. + /// + /// + /// Sets + /// Comb + /// flag for the text field. Meaningful only if the MaxLen entry is present in the text field + /// dictionary and if the Multiline, Password and FileSelect flags are clear. + /// + /// If true, the field is automatically divided into as many equally spaced positions, or combs, + /// as the value of MaxLen, and the text is laid out into those combs. + /// + /// boolean value specifying whether to enable combing + /// + /// this + /// + /// instance + /// + public virtual iText.Forms.Form.Element.InputField SetComb(bool isComb) { + SetProperty(FormProperty.TEXT_FIELD_COMB_FLAG, isComb); + return this; + } + + /// Sets the maximum length of the field's text, in characters. + /// the current maximum text length + /// + /// this + /// + /// instance + /// + public virtual iText.Forms.Form.Element.InputField SetMaxLen(int maxLen) { + SetProperty(FormProperty.TEXT_FIELD_MAX_LEN, maxLen); + return this; + } + /// public override AccessibilityProperties GetAccessibilityProperties() { if (tagProperties == null) { diff --git a/itext/itext.forms/itext/forms/form/element/ListBoxField.cs b/itext/itext.forms/itext/forms/form/element/ListBoxField.cs index 8de203c23c..691f4377f7 100644 --- a/itext/itext.forms/itext/forms/form/element/ListBoxField.cs +++ b/itext/itext.forms/itext/forms/form/element/ListBoxField.cs @@ -68,6 +68,10 @@ public override T1 GetDefaultProperty(int property) { return (T1)(Object)4; } + case FormProperty.LIST_BOX_TOP_INDEX: { + return (T1)(Object)0; + } + default: { return base.GetDefaultProperty(property); } @@ -127,6 +131,18 @@ public virtual IList GetSelectedStrings() { return selectedStrings; } + /// Sets the index of the first visible option in a scrollable list. + /// the index of the first option + /// + /// this + /// + /// instance + /// + public virtual iText.Forms.Form.Element.ListBoxField SetTopIndex(int topIndex) { + SetProperty(FormProperty.LIST_BOX_TOP_INDEX, topIndex); + return this; + } + /// public override AccessibilityProperties GetAccessibilityProperties() { if (tagProperties == null) { diff --git a/itext/itext.forms/itext/forms/form/element/TextArea.cs b/itext/itext.forms/itext/forms/form/element/TextArea.cs index d932492c75..62613bf043 100644 --- a/itext/itext.forms/itext/forms/form/element/TextArea.cs +++ b/itext/itext.forms/itext/forms/form/element/TextArea.cs @@ -56,27 +56,6 @@ public TextArea(String id) SetProperties(); } - /// Determines, whether the input field will be password. - /// - /// Determines, whether the input field will be password. - /// - /// Usually means that instead of glyphs '*' will be shown in case of flatten field. - /// - /// If the field is not flatten, value will be ignored. - /// - /// - /// - /// - /// is this field shall be considered as password, - /// - /// otherwise - /// - /// this input field - public virtual iText.Forms.Form.Element.TextArea UseAsPassword(bool isPassword) { - SetProperty(FormProperty.FORM_FIELD_PASSWORD_FLAG, isPassword); - return this; - } - /* (non-Javadoc) * @see FormField#getDefaultProperty(int) */ diff --git a/itext/itext.forms/itext/forms/form/renderer/AbstractSelectFieldRenderer.cs b/itext/itext.forms/itext/forms/form/renderer/AbstractSelectFieldRenderer.cs index 43ca315178..6fc959a791 100644 --- a/itext/itext.forms/itext/forms/form/renderer/AbstractSelectFieldRenderer.cs +++ b/itext/itext.forms/itext/forms/form/renderer/AbstractSelectFieldRenderer.cs @@ -49,11 +49,12 @@ public abstract class AbstractSelectFieldRenderer : BlockRenderer { /// the model element protected internal AbstractSelectFieldRenderer(AbstractSelectField modelElement) : base(modelElement) { - AddChild(CreateFlatRenderer()); } /// public override LayoutResult Layout(LayoutContext layoutContext) { + childRenderers.Clear(); + AddChild(CreateFlatRenderer()); // Resolve width here in case it's relative, while parent width is still intact. // If it's inline-block context, relative width is already resolved. float? width = RetrieveWidth(layoutContext.GetArea().GetBBox().GetWidth()); diff --git a/itext/itext.forms/itext/forms/form/renderer/InputFieldRenderer.cs b/itext/itext.forms/itext/forms/form/renderer/InputFieldRenderer.cs index e87abe8caf..d354ee7458 100644 --- a/itext/itext.forms/itext/forms/form/renderer/InputFieldRenderer.cs +++ b/itext/itext.forms/itext/forms/form/renderer/InputFieldRenderer.cs @@ -33,6 +33,7 @@ You should have received a copy of the GNU Affero General Public License using iText.Forms.Util; using iText.Kernel.Geom; using iText.Kernel.Pdf; +using iText.Layout.Element; using iText.Layout.Font; using iText.Layout.Layout; using iText.Layout.Minmaxwidth; @@ -46,6 +47,8 @@ namespace iText.Forms.Form.Renderer { /// implementation for input fields. /// public class InputFieldRenderer : AbstractOneLineTextFieldRenderer { + private const float DEFAULT_COMB_PADDING = 0; + /// /// Creates a new /// @@ -83,7 +86,52 @@ internal override IRenderer CreateParagraphRenderer(String defaultValue) { )modelElement).GetPlaceholder().IsEmpty()) { return ((InputField)modelElement).GetPlaceholder().CreateRendererSubTree(); } - IRenderer flatRenderer = base.CreateParagraphRenderer(defaultValue); + if (String.IsNullOrEmpty(defaultValue)) { + defaultValue = "\u00a0"; + } + IRenderer flatRenderer; + if (IsComb()) { + SetProperty(Property.PADDING_LEFT, UnitValue.CreatePointValue(DEFAULT_COMB_PADDING)); + SetProperty(Property.PADDING_RIGHT, UnitValue.CreatePointValue(DEFAULT_COMB_PADDING)); + int maxLen = GetMaxLen(); + int numberOfCharacters = Math.Min(maxLen, defaultValue.Length); + int start; + TextAlignment? textAlignment = this.GetProperty(Property.TEXT_ALIGNMENT, TextAlignment.LEFT + ); + switch (textAlignment) { + case TextAlignment.RIGHT: { + start = (maxLen - numberOfCharacters); + break; + } + + case TextAlignment.CENTER: { + start = (maxLen - numberOfCharacters) / 2; + break; + } + + default: { + start = 0; + break; + } + } + Paragraph paragraph = new Paragraph(); + for (int i = 0; i < start; i++) { + paragraph.Add(GetSubParagraph("", maxLen)); + } + for (int i = 0; i < numberOfCharacters; i++) { + paragraph.Add(GetSubParagraph(defaultValue.JSubstring(i, i + 1), maxLen)); + } + for (int i = start + numberOfCharacters; i < maxLen; i++) { + paragraph.Add(GetSubParagraph("", maxLen)); + } + flatRenderer = paragraph.SetMargin(0).CreateRendererSubTree(); + } + else { + Text text = new Text(defaultValue); + FormFieldValueNonTrimmingTextRenderer nextRenderer = new FormFieldValueNonTrimmingTextRenderer(text); + text.SetNextRenderer(nextRenderer); + flatRenderer = new Paragraph(text).SetMargin(0).CreateRendererSubTree(); + } flatRenderer.SetProperty(Property.NO_SOFT_WRAP_INLINE, true); return flatRenderer; } @@ -144,17 +192,21 @@ protected internal override void ApplyAcroField(DrawContext drawContext) { // Default html2pdf input field appearance differs from the default one for form fields. // That's why we got rid of several properties we set by default during InputField instance creation. modelElement.SetProperty(Property.BOX_SIZING, BoxSizingPropertyValue.BORDER_BOX); - PdfFormField inputField = new TextFormFieldBuilder(doc, name).SetWidgetRectangle(area).SetFont(font).SetConformance + PdfTextFormField inputField = new TextFormFieldBuilder(doc, name).SetWidgetRectangle(area).SetFont(font).SetConformance (GetConformance(doc)).CreateText(); inputField.DisableFieldRegeneration(); inputField.SetValue(value); inputField.SetFontSize(fontSizeValue); if (password) { - inputField.SetFieldFlag(PdfFormField.FF_PASSWORD, true); + inputField.SetPassword(true); } else { inputField.SetDefaultValue(new PdfString(value)); } + if (IsComb()) { + inputField.SetComb(true); + inputField.SetMaxLen(GetMaxLen()); + } int rotation = ((InputField)modelElement).GetRotation(); if (rotation != 0) { inputField.GetFirstFormAnnotation().SetRotation(rotation); @@ -213,6 +265,26 @@ protected override bool SetMinMaxWidthBasedOnFixedWidth(MinMaxWidth minMaxWidth) return result; } + private static Paragraph GetSubParagraph(String value, int maxLen) { + Text text = new Text(value); + FormFieldValueNonTrimmingTextRenderer nextRenderer = new FormFieldValueNonTrimmingTextRenderer(text); + text.SetNextRenderer(nextRenderer); + return new Paragraph(text).SetTextAlignment(TextAlignment.CENTER).SetWidth(UnitValue.CreatePercentValue((float + )100 / maxLen)).SetHeight(UnitValue.CreatePercentValue(100)).SetMargin(0); + } + + /// Checks if the input field is a comb field. + /// true, if the input field is a comb field + private bool IsComb() { + return (bool)this.GetProperty(FormProperty.TEXT_FIELD_COMB_FLAG, false); + } + + /// Gets the maximum length of the field's text, in characters. + /// the current maximum text length + private int GetMaxLen() { + return (int)this.GetProperty(FormProperty.TEXT_FIELD_MAX_LEN, 0); + } + /// Obfuscates the content of a password input field. /// the password /// a string consisting of '*' characters. diff --git a/itext/itext.forms/itext/forms/form/renderer/SelectFieldListBoxRenderer.cs b/itext/itext.forms/itext/forms/form/renderer/SelectFieldListBoxRenderer.cs index 24d21775f4..157c545c9c 100644 --- a/itext/itext.forms/itext/forms/form/renderer/SelectFieldListBoxRenderer.cs +++ b/itext/itext.forms/itext/forms/form/renderer/SelectFieldListBoxRenderer.cs @@ -101,7 +101,9 @@ protected internal override IRenderer CreateFlatRenderer() { AbstractSelectField selectField = (AbstractSelectField)modelElement; IList options = selectField.GetOptions(); Div optionsContainer = new Div(); - foreach (SelectFieldItem option in options) { + int topIndex = (int)this.GetProperty(FormProperty.LIST_BOX_TOP_INDEX, 0); + IList visibleOptions = topIndex > 0 ? options.SubList(topIndex, options.Count) : options; + foreach (SelectFieldItem option in visibleOptions) { optionsContainer.Add(option.GetElement()); } String lang = GetLang(); @@ -183,6 +185,10 @@ protected internal override void ApplyAcroField(DrawContext drawContext) { choiceField.SetFontSize(fontSize.GetValue()); choiceField.SetMultiSelect(IsMultiple()); choiceField.SetListSelected(selectedOptions.ToArray(new String[selectedOptions.Count])); + int? topIndex = modelElement.GetOwnProperty(FormProperty.LIST_BOX_TOP_INDEX); + if (topIndex != null) { + choiceField.SetTopIndex((int)topIndex); + } TransparentColor color = GetPropertyAsTransparentColor(Property.FONT_COLOR); if (color != null) { choiceField.SetColor(color.GetColor()); @@ -270,7 +276,14 @@ private bool IsMultiple() { } private void ApplySelectedStyle(IRenderer selectedOption) { - selectedOption.SetProperty(Property.BACKGROUND, new Background(new DeviceRgb(0, 120, 215))); + RenderingMode? mode = this.GetProperty(Property.RENDERING_MODE); + if (RenderingMode.HTML_MODE.Equals(mode) && IsFlatten() && selectedOption.GetProperty(Property + .BACKGROUND) == null) { + selectedOption.SetProperty(Property.BACKGROUND, new Background(new DeviceRgb(206, 206, 206))); + } + else { + selectedOption.SetProperty(Property.BACKGROUND, new Background(new DeviceRgb(169, 204, 225))); + } SetFontColorRecursively(selectedOption); } @@ -280,7 +293,7 @@ private void ApplySelectedStyle(IRenderer selectedOption) { /// otherwise it will be not applied due to the css resolving mechanism. /// private void SetFontColorRecursively(IRenderer selectedOption) { - selectedOption.SetProperty(Property.FONT_COLOR, new TransparentColor(ColorConstants.WHITE)); + selectedOption.SetProperty(Property.FONT_COLOR, new TransparentColor(ColorConstants.BLACK)); foreach (IRenderer renderer in selectedOption.GetChildRenderers()) { SetFontColorRecursively(renderer); } diff --git a/port-hash b/port-hash index 38a023f0cb..3bee91861b 100644 --- a/port-hash +++ b/port-hash @@ -1 +1 @@ -e3aab4f3d591b970957e3f568ad458ebc0d76578 +a1e83efe10856b980ebc96e01a9dfb89ddeeeee1 \ No newline at end of file