From 2f209e01da276e9862d6e0f63d02bcfb14728d9b Mon Sep 17 00:00:00 2001 From: Jakob Heher Date: Mon, 22 Jun 2026 12:49:56 +0200 Subject: fix placeholder parsing for pdfbox 3 (and test cases) --- .../egiz/pdfas/lib/impl/pdfbox3/SignVerifyTest.kt | 102 ++++++++++++ .../pdfbox3/PDFBoxPlaceholderExtractorTest.java | 69 ++++++++ ...SignatureFieldsAndPlaceHolderExtractorTest.java | 176 ++++++++++++++++++++ .../lib/impl/verify/pdfbox3/PDFBox2To3Test.kt | 93 +++++++++++ .../egiz/pdfas/lib/impl/pdfbox3/SignVerifyTest.kt | 102 ------------ .../pdfbox3/PDFBoxPlaceholderExtractorTest.java | 69 -------- ...SignatureFieldsAndPlaceHolderExtractorTest.java | 182 --------------------- .../pdfas/lib/impl/sign/pdfbox3/TTFFontTest.java | 46 ------ .../lib/impl/verify/pdfbox3/PDFBox2To3Test.kt | 93 ----------- 9 files changed, 440 insertions(+), 492 deletions(-) create mode 100644 pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/pdfbox3/SignVerifyTest.kt create mode 100644 pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/PDFBoxPlaceholderExtractorTest.java create mode 100644 pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/SignatureFieldsAndPlaceHolderExtractorTest.java create mode 100644 pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/verify/pdfbox3/PDFBox2To3Test.kt delete mode 100644 pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/pdfbox3/SignVerifyTest.kt delete mode 100644 pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/PDFBoxPlaceholderExtractorTest.java delete mode 100644 pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/SignatureFieldsAndPlaceHolderExtractorTest.java delete mode 100644 pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/TTFFontTest.java delete mode 100644 pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/verify/pdfbox3/PDFBox2To3Test.kt (limited to 'pdf-as-pdfbox-3/src/test') diff --git a/pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/pdfbox3/SignVerifyTest.kt b/pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/pdfbox3/SignVerifyTest.kt new file mode 100644 index 00000000..500b15ed --- /dev/null +++ b/pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/pdfbox3/SignVerifyTest.kt @@ -0,0 +1,102 @@ +package at.gv.egiz.pdfas.lib.impl.pdfbox3 + +import at.gv.egiz.pdfas.lib.api.ByteArrayDataSource +import at.gv.egiz.pdfas.lib.api.PdfAs +import at.gv.egiz.pdfas.lib.api.PdfAsFactory +import at.gv.egiz.pdfas.lib.api.sign.IPlainSigner +import at.gv.egiz.pdfas.lib.api.sign.SignParameter +import at.gv.egiz.pdfas.lib.api.verify.VerifyParameter +import at.gv.egiz.pdfas.sigs.pades.PAdESSignerKeystore +import org.junit.Assert +import org.junit.BeforeClass +import org.junit.ClassRule +import org.junit.Test +import org.junit.rules.TemporaryFolder +import org.junit.runner.RunWith +import org.junit.runners.BlockJUnit4ClassRunner +import org.zeroturnaround.zip.ZipUtil +import java.io.ByteArrayOutputStream +import java.security.KeyStore +import jakarta.activation.DataSource + +@RunWith(BlockJUnit4ClassRunner::class) +class SignVerifyTest { + companion object { + @JvmField + @field:ClassRule + public val tempFolder = TemporaryFolder() + + lateinit var pdfAs: PdfAs + fun captureSign(param: SignParameter): ByteArray = + ByteArrayOutputStream().use { + param.outputStream = it + pdfAs.sign(param) + it.toByteArray() + } + + fun captureSign(pdf: DataSource, signer: IPlainSigner) = + captureSign( + PdfAsFactory.createSignParameter(pdfAs.configuration, pdf, null) + .apply { plainSigner = signer } + ) + + @JvmStatic + @BeforeClass + fun setUp() { + // unzip default config to temp dir + val configDir = tempFolder.newFolder() + ZipUtil.unpack( + PdfAs::class.java.getResourceAsStream("/config/config.zip"), + configDir + ) + pdfAs = PdfAsFactory.createPdfAs(configDir) + } + + val getInputPdf = object : Function1 { + private val _map = mutableMapOf() + private fun normalize(key: String) = when { + key.endsWith(".pdf") -> key + else -> "$key.pdf" + } + + override operator fun invoke(key: String) = normalize(key).let { pdfName -> + _map.getOrPut(pdfName) { + SignVerifyTest::class.java.getResourceAsStream("/data/$pdfName").use { + ByteArrayDataSource(it!!.readAllBytes()) + } + } + } + } + + val getKeystoreSigner = object : Function1 { + private val _keyStore = KeyStore.getInstance("PKCS12").apply { + SignVerifyTest::class.java.getResourceAsStream("/test.p12").use { + load(it, "password".toCharArray()) + } + } + private val _map = mutableMapOf() + override operator fun invoke(alias: String) = _map.getOrPut(alias) { + PAdESSignerKeystore(_keyStore, alias, "password") + } + } + } + + @Test + fun signVerify() { + val signedPdf = captureSign(getInputPdf("align.pdf"), getKeystoreSigner("test-key")) + val verificationResult = + PdfAsFactory.createVerifyParameter( + pdfAs.configuration, + ByteArrayDataSource(signedPdf) + ) + .apply { + signatureVerificationLevel = VerifyParameter.SignatureVerificationLevel.INTEGRITY_ONLY_VERIFICATION + } + .let(pdfAs::verify) + Assert.assertEquals(verificationResult.size, 1) + verificationResult[0].let { + Assert.assertTrue(it.isVerificationDone) + Assert.assertEquals(it.signerCertificate, getKeystoreSigner("test-key").getCertificate(null)) + } + } +} diff --git a/pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/PDFBoxPlaceholderExtractorTest.java b/pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/PDFBoxPlaceholderExtractorTest.java new file mode 100644 index 00000000..e766c385 --- /dev/null +++ b/pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/PDFBoxPlaceholderExtractorTest.java @@ -0,0 +1,69 @@ +package at.gv.egiz.pdfas.lib.impl.sign.pdfbox3; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.util.List; + +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.junit.Ignore; +import org.junit.Test; + +import at.gv.egiz.pdfas.lib.impl.pdfbox3.PDFBoxPlaceholderExtractor; +import at.gv.egiz.pdfas.lib.impl.placeholder.SignaturePlaceholderData; +import lombok.SneakyThrows; + +public class PDFBoxPlaceholderExtractorTest { + + @Test + @SneakyThrows + public void nextPlaceholder() { + SignaturePlaceholderData result = getNextSignaturePlaceHolder("/data/platzhalter_en_de_test.pdf"); + assertEquals("Im48", result.getPlaceholderName()); + } + + @Test + @SneakyThrows + public void allPlaceHolders() { + List listOfPlaceHolders = getPlaceHolders("/data/platzhalter_en_de_test.pdf"); + assertNotNull(listOfPlaceHolders); + assertTrue(listOfPlaceHolders.isEmpty()); + } + + @Test + @SneakyThrows + public void nextPlaceholderDuplicateElements() { + assertEquals("Im0_1", getNextSignaturePlaceHolder("/data/Testdoc_Signatur.pdf").getPlaceholderName()); + assertEquals("Im0_2", getNextSignaturePlaceHolder("/data/own_Testdoc+Signatur-sign-sign.pdf").getPlaceholderName()); + assertEquals("Im0_2", getNextSignaturePlaceHolder("/data/own_Testdoc+Signatur-sign-sign-4_sign.pdf").getPlaceholderName()); + assertEquals("Im0", getNextSignaturePlaceHolder("/data/own_Testdoc+Signatur-sign-sign-4_sign-sign.pdf").getPlaceholderName()); + + } + + @Test + @Ignore + @SneakyThrows + public void placeHolderInAnnotation() { + SignaturePlaceholderData listOfPlaceHolders = getNextSignaturePlaceHolder("/data/Test-sign.pdf"); + assertNotNull(listOfPlaceHolders); + + } + + private static List getPlaceHolders(String filePath) throws IOException { + try (final PDDocument doc = Loader.loadPDF( + PDFBoxPlaceholderExtractorTest.class.getResourceAsStream(filePath) + .readAllBytes())) { + return PDFBoxPlaceholderExtractor.findEmptySignatureFields(doc); + } + } + + private static SignaturePlaceholderData getNextSignaturePlaceHolder(String filePath) throws IOException { + try (final PDDocument doc = Loader.loadPDF( + PDFBoxPlaceholderExtractorTest.class.getResourceAsStream(filePath) + .readAllBytes())) { + return PDFBoxPlaceholderExtractor.getNextUnusedSignaturePlaceholder(doc); + } + } + +} diff --git a/pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/SignatureFieldsAndPlaceHolderExtractorTest.java b/pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/SignatureFieldsAndPlaceHolderExtractorTest.java new file mode 100644 index 00000000..bdf5b760 --- /dev/null +++ b/pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/SignatureFieldsAndPlaceHolderExtractorTest.java @@ -0,0 +1,176 @@ +package at.gv.egiz.pdfas.lib.impl.sign.pdfbox3; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import at.gv.egiz.pdfas.lib.impl.pdfbox3.PDFBoxPlaceholderExtractor; +import lombok.SneakyThrows; +import lombok.val; +import org.apache.pdfbox.Loader; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import at.gv.egiz.pdfas.lib.impl.placeholder.SignaturePlaceholderData; + +@RunWith(JUnit4.class) +public class SignatureFieldsAndPlaceHolderExtractorTest { + + public String getPath(String resourceName) { + ClassLoader classLoader = this.getClass().getClassLoader(); + File file = new File(classLoader.getResource(resourceName).getFile()); + String absolutePath = file.getAbsolutePath(); + + System.out.println(absolutePath); + return absolutePath; + } + + @Test + public void notSigned() { + SignaturePlaceholderData result = getNextSignaturePlaceHolder(getPath("new_qr_2-2.pdf")); + Assert.assertEquals("Image5", result.getPlaceholderName()); + } + + @Test + public void signedOnce() { + SignaturePlaceholderData result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed.pdf")); + Assert.assertEquals("Image8", result.getPlaceholderName()); + } + + @Test + public void signedTwice() { + SignaturePlaceholderData result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed_signed.pdf")); + Assert.assertEquals(null, result); + } + + @Test + public void signedThrice() { + SignaturePlaceholderData result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed_signed_signed.pdf")); + Assert.assertEquals(null, result); + } + + @Test + public void noPlaceHolder() { + SignaturePlaceholderData result = getNextSignaturePlaceHolder(getPath("manySignFields.pdf")); + Assert.assertEquals(null, result); + } + + @Test + public void firstQrCodeOnUnsignedDoc() { + SignaturePlaceholderData result = getNextSignaturePlaceHolder(getPath("new_qr_2-2.pdf")); + Assert.assertEquals("Image5", result.getPlaceholderName()); + + } + + @Test + public void subsequentCalls() { + SignaturePlaceholderData result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed_signed_signed.pdf")); + Assert.assertEquals(null, result); + + result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed.pdf")); + Assert.assertEquals("Image8", result.getPlaceholderName()); + + result = getNextSignaturePlaceHolder(getPath("new_qr_2-2.pdf")); + Assert.assertEquals("Image5", result.getPlaceholderName()); + + result = getNextSignaturePlaceHolder(getPath("new_qr_2-2.pdf")); + Assert.assertEquals("Image5", result.getPlaceholderName()); + + result = getNextSignaturePlaceHolder(getPath("new_qr_2-2.pdf")); + Assert.assertEquals("Image5", result.getPlaceholderName()); + + result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed.pdf")); + Assert.assertEquals("Image8", result.getPlaceholderName()); + + result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed_signed_signed.pdf")); + Assert.assertEquals(null, result); + + result = getNextSignaturePlaceHolder(getPath("new_qr_2-2.pdf")); + Assert.assertEquals("Image5", result.getPlaceholderName()); + + result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed.pdf")); + Assert.assertEquals("Image8", result.getPlaceholderName()); + } + + @Test + public void notSignedAndNoFields() { + List result = getPlaceHolders(getPath("new_qr_2-2.pdf")); + + List expectedResult = new ArrayList<>(); + Assert.assertEquals(expectedResult, result); + } + + @Test + public void notSignedFields() { + List result = getPlaceHolders(getPath("manySignFields.pdf")); + + List expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", + "Signature_4", "Signature_5", "Signature_6", "Signature_7"); + Assert.assertEquals(expectedResult, result); + } + + @Test + public void signedOncePosition4FieldTest() { + List result = getPlaceHolders(getPath("manySignFields_signed4.pdf")); + + List expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", + "Signature_5", "Signature_6", "Signature_7"); + Assert.assertEquals(expectedResult, result); + } + + @Test + public void multipleCallsFieldTest() { + List result = getPlaceHolders(getPath("manySignFields_signed4.pdf")); + List expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", + "Signature_5", "Signature_6", "Signature_7"); + Assert.assertEquals(expectedResult, result); + + result = getPlaceHolders(getPath("manySignFields_signed4.pdf")); + expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", + "Signature_5", "Signature_6", "Signature_7"); + Assert.assertEquals(expectedResult, result); + + result = getPlaceHolders(getPath("manySignFields.pdf")); + expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", + "Signature_4", "Signature_5", "Signature_6", "Signature_7"); + Assert.assertEquals(expectedResult, result); + + result = getPlaceHolders(getPath("manySignFields.pdf")); + expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", + "Signature_4", "Signature_5", "Signature_6", "Signature_7"); + Assert.assertEquals(expectedResult, result); + + result = getPlaceHolders(getPath("manySignFields_signed4.pdf")); + expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", + "Signature_5", "Signature_6", "Signature_7"); + Assert.assertEquals(expectedResult, result); + + result = getPlaceHolders(getPath("manySignFields_signed4.pdf")); + expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", + "Signature_5", "Signature_6", "Signature_7"); + Assert.assertEquals(expectedResult, result); + + result = getPlaceHolders(getPath("manySignFields.pdf")); + expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", + "Signature_4", "Signature_5", "Signature_6", "Signature_7"); + Assert.assertEquals(expectedResult, result); + + } + + @SneakyThrows + private static List getPlaceHolders(String filePath) { + try (val doc = Loader.loadPDF(new File(filePath))) { + return PDFBoxPlaceholderExtractor.findEmptySignatureFields(doc); + } + } + + @SneakyThrows + public static SignaturePlaceholderData getNextSignaturePlaceHolder(String filePath) { + try (val doc = Loader.loadPDF(new File(filePath))) { + return PDFBoxPlaceholderExtractor.getNextUnusedSignaturePlaceholder(doc); + } + } +} diff --git a/pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/verify/pdfbox3/PDFBox2To3Test.kt b/pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/verify/pdfbox3/PDFBox2To3Test.kt new file mode 100644 index 00000000..847018c4 --- /dev/null +++ b/pdf-as-pdfbox-3/src/test/java/at/gv/egiz/pdfas/lib/impl/verify/pdfbox3/PDFBox2To3Test.kt @@ -0,0 +1,93 @@ +package at.gv.egiz.pdfas.lib.impl.verify.pdfbox3 + +import at.gv.egiz.pdfas.lib.api.ByteArrayDataSource +import at.gv.egiz.pdfas.lib.api.PdfAs +import at.gv.egiz.pdfas.lib.api.PdfAsFactory +import at.gv.egiz.pdfas.lib.api.sign.SignParameter +import at.gv.egiz.pdfas.lib.api.verify.VerifyParameter +import at.gv.egiz.pdfas.sigs.pades.PAdESSignerKeystore +import org.junit.Assert +import org.junit.BeforeClass +import org.junit.ClassRule +import org.junit.Test +import org.junit.rules.TemporaryFolder +import org.junit.runner.RunWith +import org.junit.runners.BlockJUnit4ClassRunner +import org.zeroturnaround.zip.ZipUtil +import java.io.ByteArrayOutputStream +import java.security.KeyStore + +@RunWith(BlockJUnit4ClassRunner::class) +class PDFBox2To3Test { + + companion object { + @JvmField + @field:ClassRule + public val tempFolder = TemporaryFolder() + + lateinit var pdfAs: PdfAs + fun captureSign(param: SignParameter): ByteArray = + ByteArrayOutputStream().use { + param.outputStream = it + pdfAs.sign(param) + it.toByteArray() + } + + @JvmStatic + @BeforeClass + fun setUp() { + // unzip default config to temp dir + val configDir = tempFolder.newFolder() + ZipUtil.unpack( + PdfAs::class.java.getResourceAsStream("/config/config.zip"), + configDir + ) + pdfAs = PdfAsFactory.createPdfAs(configDir) + } + + val getInputPdf = object : Function1 { + private val _map = mutableMapOf() + private fun normalize(key: String) = when { + key.endsWith(".pdf") -> key + else -> "$key.pdf" + } + + override operator fun invoke(key: String) = normalize(key).let { pdfName -> + _map.getOrPut(pdfName) { + PDFBox2To3Test::class.java.getResourceAsStream("/data/$pdfName").use { + ByteArrayDataSource(it!!.readAllBytes()) + } + } + } + } + + val getKeystoreSigner = object : Function1 { + private val _keyStore = KeyStore.getInstance("PKCS12").apply { + PDFBox2To3Test::class.java.getResourceAsStream("/test.p12").use { + load(it, "password".toCharArray()) + } + } + private val _map = mutableMapOf() + override operator fun invoke(alias: String) = _map.getOrPut(alias) { + PAdESSignerKeystore(_keyStore, alias, "password") + } + } + } + + @Test + fun pdfBox2To3Test() { + val verificationResult = + PdfAsFactory.createVerifyParameter( + pdfAs.configuration, + getInputPdf("align_signed.pdf")) + .apply { + signatureVerificationLevel = VerifyParameter.SignatureVerificationLevel.INTEGRITY_ONLY_VERIFICATION + } + .let(PDFBOXVerifier::verify) + Assert.assertEquals(verificationResult.size, 1) + verificationResult[0].let { + Assert.assertTrue(it.isVerificationDone) + Assert.assertEquals(it.signerCertificate, getKeystoreSigner("test-key").getCertificate(null)) + } + } +} \ No newline at end of file diff --git a/pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/pdfbox3/SignVerifyTest.kt b/pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/pdfbox3/SignVerifyTest.kt deleted file mode 100644 index 500b15ed..00000000 --- a/pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/pdfbox3/SignVerifyTest.kt +++ /dev/null @@ -1,102 +0,0 @@ -package at.gv.egiz.pdfas.lib.impl.pdfbox3 - -import at.gv.egiz.pdfas.lib.api.ByteArrayDataSource -import at.gv.egiz.pdfas.lib.api.PdfAs -import at.gv.egiz.pdfas.lib.api.PdfAsFactory -import at.gv.egiz.pdfas.lib.api.sign.IPlainSigner -import at.gv.egiz.pdfas.lib.api.sign.SignParameter -import at.gv.egiz.pdfas.lib.api.verify.VerifyParameter -import at.gv.egiz.pdfas.sigs.pades.PAdESSignerKeystore -import org.junit.Assert -import org.junit.BeforeClass -import org.junit.ClassRule -import org.junit.Test -import org.junit.rules.TemporaryFolder -import org.junit.runner.RunWith -import org.junit.runners.BlockJUnit4ClassRunner -import org.zeroturnaround.zip.ZipUtil -import java.io.ByteArrayOutputStream -import java.security.KeyStore -import jakarta.activation.DataSource - -@RunWith(BlockJUnit4ClassRunner::class) -class SignVerifyTest { - companion object { - @JvmField - @field:ClassRule - public val tempFolder = TemporaryFolder() - - lateinit var pdfAs: PdfAs - fun captureSign(param: SignParameter): ByteArray = - ByteArrayOutputStream().use { - param.outputStream = it - pdfAs.sign(param) - it.toByteArray() - } - - fun captureSign(pdf: DataSource, signer: IPlainSigner) = - captureSign( - PdfAsFactory.createSignParameter(pdfAs.configuration, pdf, null) - .apply { plainSigner = signer } - ) - - @JvmStatic - @BeforeClass - fun setUp() { - // unzip default config to temp dir - val configDir = tempFolder.newFolder() - ZipUtil.unpack( - PdfAs::class.java.getResourceAsStream("/config/config.zip"), - configDir - ) - pdfAs = PdfAsFactory.createPdfAs(configDir) - } - - val getInputPdf = object : Function1 { - private val _map = mutableMapOf() - private fun normalize(key: String) = when { - key.endsWith(".pdf") -> key - else -> "$key.pdf" - } - - override operator fun invoke(key: String) = normalize(key).let { pdfName -> - _map.getOrPut(pdfName) { - SignVerifyTest::class.java.getResourceAsStream("/data/$pdfName").use { - ByteArrayDataSource(it!!.readAllBytes()) - } - } - } - } - - val getKeystoreSigner = object : Function1 { - private val _keyStore = KeyStore.getInstance("PKCS12").apply { - SignVerifyTest::class.java.getResourceAsStream("/test.p12").use { - load(it, "password".toCharArray()) - } - } - private val _map = mutableMapOf() - override operator fun invoke(alias: String) = _map.getOrPut(alias) { - PAdESSignerKeystore(_keyStore, alias, "password") - } - } - } - - @Test - fun signVerify() { - val signedPdf = captureSign(getInputPdf("align.pdf"), getKeystoreSigner("test-key")) - val verificationResult = - PdfAsFactory.createVerifyParameter( - pdfAs.configuration, - ByteArrayDataSource(signedPdf) - ) - .apply { - signatureVerificationLevel = VerifyParameter.SignatureVerificationLevel.INTEGRITY_ONLY_VERIFICATION - } - .let(pdfAs::verify) - Assert.assertEquals(verificationResult.size, 1) - verificationResult[0].let { - Assert.assertTrue(it.isVerificationDone) - Assert.assertEquals(it.signerCertificate, getKeystoreSigner("test-key").getCertificate(null)) - } - } -} diff --git a/pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/PDFBoxPlaceholderExtractorTest.java b/pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/PDFBoxPlaceholderExtractorTest.java deleted file mode 100644 index e766c385..00000000 --- a/pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/PDFBoxPlaceholderExtractorTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package at.gv.egiz.pdfas.lib.impl.sign.pdfbox3; - -import static org.junit.Assert.*; - -import java.io.IOException; -import java.util.List; - -import org.apache.pdfbox.Loader; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.junit.Ignore; -import org.junit.Test; - -import at.gv.egiz.pdfas.lib.impl.pdfbox3.PDFBoxPlaceholderExtractor; -import at.gv.egiz.pdfas.lib.impl.placeholder.SignaturePlaceholderData; -import lombok.SneakyThrows; - -public class PDFBoxPlaceholderExtractorTest { - - @Test - @SneakyThrows - public void nextPlaceholder() { - SignaturePlaceholderData result = getNextSignaturePlaceHolder("/data/platzhalter_en_de_test.pdf"); - assertEquals("Im48", result.getPlaceholderName()); - } - - @Test - @SneakyThrows - public void allPlaceHolders() { - List listOfPlaceHolders = getPlaceHolders("/data/platzhalter_en_de_test.pdf"); - assertNotNull(listOfPlaceHolders); - assertTrue(listOfPlaceHolders.isEmpty()); - } - - @Test - @SneakyThrows - public void nextPlaceholderDuplicateElements() { - assertEquals("Im0_1", getNextSignaturePlaceHolder("/data/Testdoc_Signatur.pdf").getPlaceholderName()); - assertEquals("Im0_2", getNextSignaturePlaceHolder("/data/own_Testdoc+Signatur-sign-sign.pdf").getPlaceholderName()); - assertEquals("Im0_2", getNextSignaturePlaceHolder("/data/own_Testdoc+Signatur-sign-sign-4_sign.pdf").getPlaceholderName()); - assertEquals("Im0", getNextSignaturePlaceHolder("/data/own_Testdoc+Signatur-sign-sign-4_sign-sign.pdf").getPlaceholderName()); - - } - - @Test - @Ignore - @SneakyThrows - public void placeHolderInAnnotation() { - SignaturePlaceholderData listOfPlaceHolders = getNextSignaturePlaceHolder("/data/Test-sign.pdf"); - assertNotNull(listOfPlaceHolders); - - } - - private static List getPlaceHolders(String filePath) throws IOException { - try (final PDDocument doc = Loader.loadPDF( - PDFBoxPlaceholderExtractorTest.class.getResourceAsStream(filePath) - .readAllBytes())) { - return PDFBoxPlaceholderExtractor.findEmptySignatureFields(doc); - } - } - - private static SignaturePlaceholderData getNextSignaturePlaceHolder(String filePath) throws IOException { - try (final PDDocument doc = Loader.loadPDF( - PDFBoxPlaceholderExtractorTest.class.getResourceAsStream(filePath) - .readAllBytes())) { - return PDFBoxPlaceholderExtractor.getNextUnusedSignaturePlaceholder(doc); - } - } - -} diff --git a/pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/SignatureFieldsAndPlaceHolderExtractorTest.java b/pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/SignatureFieldsAndPlaceHolderExtractorTest.java deleted file mode 100644 index e1a7f09b..00000000 --- a/pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/SignatureFieldsAndPlaceHolderExtractorTest.java +++ /dev/null @@ -1,182 +0,0 @@ -package at.gv.egiz.pdfas.lib.impl.sign.pdfbox3; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -import at.gv.egiz.pdfas.lib.impl.pdfbox2.placeholder.SignatureFieldsAndPlaceHolderExtractor; -import at.gv.egiz.pdfas.lib.impl.placeholder.SignaturePlaceholderData; - -@RunWith(JUnit4.class) -public class SignatureFieldsAndPlaceHolderExtractorTest { - - public String getPath(String resourceName) { - ClassLoader classLoader = this.getClass().getClassLoader(); - File file = new File(classLoader.getResource(resourceName).getFile()); - String absolutePath = file.getAbsolutePath(); - - System.out.println(absolutePath); - return absolutePath; - } - - @Test - public void notSigned(){ - SignaturePlaceholderData result = getNextSignaturePlaceHolder(getPath("new_qr_2-2.pdf")); - Assert.assertEquals("Image5",result.getPlaceholderName()); - } - @Test - public void signedOnce(){ - SignaturePlaceholderData result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed.pdf")); - Assert.assertEquals("Image8",result.getPlaceholderName()); - } - @Test - public void signedTwice(){ - SignaturePlaceholderData result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed_signed.pdf")); - Assert.assertEquals(null,result); - } - @Test - public void signedThrice(){ - SignaturePlaceholderData result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed_signed_signed.pdf")); - Assert.assertEquals(null,result); - } - - @Test - public void noPlaceHolder(){ - SignaturePlaceholderData result = getNextSignaturePlaceHolder(getPath("manySignFields.pdf")); - Assert.assertEquals(null,result); - } - - @Test - public void firstQrCodeOnUnsignedDoc() { - SignaturePlaceholderData result = getNextSignaturePlaceHolder(getPath("new_qr_2-2.pdf")); - Assert.assertEquals("Image5",result.getPlaceholderName()); - - } - - @Test - public void subsequentCalls(){ - SignaturePlaceholderData result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed_signed_signed.pdf")); - Assert.assertEquals(null,result); - - result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed.pdf")); - Assert.assertEquals("Image8",result.getPlaceholderName()); - - result = getNextSignaturePlaceHolder(getPath("new_qr_2-2.pdf")); - Assert.assertEquals("Image5",result.getPlaceholderName()); - - result = getNextSignaturePlaceHolder(getPath("new_qr_2-2.pdf")); - Assert.assertEquals("Image5",result.getPlaceholderName()); - - result = getNextSignaturePlaceHolder(getPath("new_qr_2-2.pdf")); - Assert.assertEquals("Image5",result.getPlaceholderName()); - - result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed.pdf")); - Assert.assertEquals("Image8",result.getPlaceholderName()); - - result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed_signed_signed.pdf")); - Assert.assertEquals(null,result); - - result = getNextSignaturePlaceHolder(getPath("new_qr_2-2.pdf")); - Assert.assertEquals("Image5",result.getPlaceholderName()); - - result = getNextSignaturePlaceHolder(getPath("new_qr_2_signed.pdf")); - Assert.assertEquals("Image8",result.getPlaceholderName()); - } - @Test - public void notSignedAndNoFields(){ - List result = getPlaceHolders(getPath("new_qr_2-2.pdf")); - - List expectedResult = new ArrayList<>(); - Assert.assertEquals(expectedResult,result); - } - - @Test - public void notSignedFields(){ - List result = getPlaceHolders(getPath("manySignFields.pdf")); - - List expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", - "Signature_4", "Signature_5", "Signature_6", "Signature_7"); - Assert.assertEquals(expectedResult,result); - } - - @Test - public void signedOncePosition4FieldTest(){ - List result = getPlaceHolders(getPath("manySignFields_signed4.pdf")); - - List expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", - "Signature_5", "Signature_6", "Signature_7"); - Assert.assertEquals(expectedResult,result); - } - - @Test - public void multipleCallsFieldTest(){ - List result = getPlaceHolders(getPath("manySignFields_signed4.pdf")); - List expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", - "Signature_5", "Signature_6", "Signature_7"); - Assert.assertEquals(expectedResult,result); - - result = getPlaceHolders(getPath("manySignFields_signed4.pdf")); - expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", - "Signature_5", "Signature_6", "Signature_7"); - Assert.assertEquals(expectedResult,result); - - result = getPlaceHolders(getPath("manySignFields.pdf")); - expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", - "Signature_4", "Signature_5", "Signature_6", "Signature_7"); - Assert.assertEquals(expectedResult,result); - - result = getPlaceHolders(getPath("manySignFields.pdf")); - expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", - "Signature_4", "Signature_5", "Signature_6", "Signature_7"); - Assert.assertEquals(expectedResult,result); - - result = getPlaceHolders(getPath("manySignFields_signed4.pdf")); - expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", - "Signature_5", "Signature_6", "Signature_7"); - Assert.assertEquals(expectedResult,result); - - result = getPlaceHolders(getPath("manySignFields_signed4.pdf")); - expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", - "Signature_5", "Signature_6", "Signature_7"); - Assert.assertEquals(expectedResult,result); - - result = getPlaceHolders(getPath("manySignFields.pdf")); - expectedResult = Arrays.asList("Signature_0", "Signature_1", "Signature_2", "Signature_3", - "Signature_4", "Signature_5", "Signature_6", "Signature_7"); - Assert.assertEquals(expectedResult,result); - - } - - private static List getPlaceHolders(String filePath) { - try { - PDDocument doc = PDDocument.load(new File(filePath)); - List results = SignatureFieldsAndPlaceHolderExtractor.findEmptySignatureFields(doc); -// System.out.println(filePath + ": " + result); - return results; - } catch (Throwable e) { - e.printStackTrace(); - } - return null; - } - - public static SignaturePlaceholderData getNextSignaturePlaceHolder(String filePath) { - try { - PDDocument doc = PDDocument.load(new File(filePath)); - SignaturePlaceholderData result = - SignatureFieldsAndPlaceHolderExtractor.getNextUnusedSignaturePlaceHolder(doc); -// System.out.println(filePath + ": " + result); - return result; - } catch (Throwable e) { - e.printStackTrace(); - } - return null; - } - -} diff --git a/pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/TTFFontTest.java b/pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/TTFFontTest.java deleted file mode 100644 index ce395785..00000000 --- a/pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/sign/pdfbox3/TTFFontTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package at.gv.egiz.pdfas.lib.impl.sign.pdfbox3; - -import java.io.File; -import java.util.Iterator; -import java.util.List; - -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.cos.COSObject; -import org.apache.pdfbox.pdmodel.PDDocument; - -public class TTFFontTest { - - public static void main(String[] args) { - try { - PDDocument doc = PDDocument.load(new File("/home/afitzek/Downloads/pdf_groesse/willenserklaerung_signedByUser.pdf")); - - List cosObjects = doc.getDocument().getObjectsByType(COSName.FONT); - - Iterator cosObjectIt = cosObjects.iterator(); - - while(cosObjectIt.hasNext()) { - COSObject cosObject = cosObjectIt.next(); - COSBase subType = ((COSDictionary)cosObject.getObject()).getItem(COSName.SUBTYPE); - COSBase baseFont = ((COSDictionary)cosObject.getObject()).getItem(COSName.BASE_FONT); - COSBase aTest = ((COSDictionary)cosObject.getObject()).getItem(COSName.A); - - System.out.println(aTest); - - if(subType.equals(COSName.TRUE_TYPE)) { - System.out.println("Object Number: " + cosObject.getObjectNumber() + - subType.toString()); - System.out.println(" BaseFont: " + baseFont.toString()); - } - - - } - - - } catch(Throwable e) { - e.printStackTrace(); - } - } - -} diff --git a/pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/verify/pdfbox3/PDFBox2To3Test.kt b/pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/verify/pdfbox3/PDFBox2To3Test.kt deleted file mode 100644 index 847018c4..00000000 --- a/pdf-as-pdfbox-3/src/test/kotlin/at/gv/egiz/pdfas/lib/impl/verify/pdfbox3/PDFBox2To3Test.kt +++ /dev/null @@ -1,93 +0,0 @@ -package at.gv.egiz.pdfas.lib.impl.verify.pdfbox3 - -import at.gv.egiz.pdfas.lib.api.ByteArrayDataSource -import at.gv.egiz.pdfas.lib.api.PdfAs -import at.gv.egiz.pdfas.lib.api.PdfAsFactory -import at.gv.egiz.pdfas.lib.api.sign.SignParameter -import at.gv.egiz.pdfas.lib.api.verify.VerifyParameter -import at.gv.egiz.pdfas.sigs.pades.PAdESSignerKeystore -import org.junit.Assert -import org.junit.BeforeClass -import org.junit.ClassRule -import org.junit.Test -import org.junit.rules.TemporaryFolder -import org.junit.runner.RunWith -import org.junit.runners.BlockJUnit4ClassRunner -import org.zeroturnaround.zip.ZipUtil -import java.io.ByteArrayOutputStream -import java.security.KeyStore - -@RunWith(BlockJUnit4ClassRunner::class) -class PDFBox2To3Test { - - companion object { - @JvmField - @field:ClassRule - public val tempFolder = TemporaryFolder() - - lateinit var pdfAs: PdfAs - fun captureSign(param: SignParameter): ByteArray = - ByteArrayOutputStream().use { - param.outputStream = it - pdfAs.sign(param) - it.toByteArray() - } - - @JvmStatic - @BeforeClass - fun setUp() { - // unzip default config to temp dir - val configDir = tempFolder.newFolder() - ZipUtil.unpack( - PdfAs::class.java.getResourceAsStream("/config/config.zip"), - configDir - ) - pdfAs = PdfAsFactory.createPdfAs(configDir) - } - - val getInputPdf = object : Function1 { - private val _map = mutableMapOf() - private fun normalize(key: String) = when { - key.endsWith(".pdf") -> key - else -> "$key.pdf" - } - - override operator fun invoke(key: String) = normalize(key).let { pdfName -> - _map.getOrPut(pdfName) { - PDFBox2To3Test::class.java.getResourceAsStream("/data/$pdfName").use { - ByteArrayDataSource(it!!.readAllBytes()) - } - } - } - } - - val getKeystoreSigner = object : Function1 { - private val _keyStore = KeyStore.getInstance("PKCS12").apply { - PDFBox2To3Test::class.java.getResourceAsStream("/test.p12").use { - load(it, "password".toCharArray()) - } - } - private val _map = mutableMapOf() - override operator fun invoke(alias: String) = _map.getOrPut(alias) { - PAdESSignerKeystore(_keyStore, alias, "password") - } - } - } - - @Test - fun pdfBox2To3Test() { - val verificationResult = - PdfAsFactory.createVerifyParameter( - pdfAs.configuration, - getInputPdf("align_signed.pdf")) - .apply { - signatureVerificationLevel = VerifyParameter.SignatureVerificationLevel.INTEGRITY_ONLY_VERIFICATION - } - .let(PDFBOXVerifier::verify) - Assert.assertEquals(verificationResult.size, 1) - verificationResult[0].let { - Assert.assertTrue(it.isVerificationDone) - Assert.assertEquals(it.signerCertificate, getKeystoreSigner("test-key").getCertificate(null)) - } - } -} \ No newline at end of file -- cgit v1.2.3