Skip to content

Commit 03652a3

Browse files
committed
Synchronize Verapdf validation; switch on parallel execution for pdfa modules; fix some issues in pdfua tests
Looks like Verapdf is not thread safe.
1 parent 0d589c5 commit 03652a3

File tree

9 files changed

+73
-74
lines changed

9 files changed

+73
-74
lines changed

pdfa/src/test/java/com/itextpdf/pdfa/PdfA4GraphicsCheckTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1103,7 +1103,7 @@ public void imageTest() throws IOException, InterruptedException {
11031103

11041104
@Test
11051105
public void imageJpeg20002ColorChannelsTest() throws IOException {
1106-
String outPdf = DESTINATION_FOLDER + "pdfA4_jpeg2000.pdf";
1106+
String outPdf = DESTINATION_FOLDER + "pdfA4_jpeg2000ColorChannels.pdf";
11071107

11081108
PdfDocument pdfDoc = new PdfADocument(
11091109
new PdfWriter(outPdf, new WriterProperties().setPdfVersion(PdfVersion.PDF_2_0)),

pdfa/src/test/resources/junit-platform.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Enable parallelism
2-
junit.jupiter.execution.parallel.enabled=false
2+
junit.jupiter.execution.parallel.enabled=true
33

44
# Enable parallelism for both test methods and classes
55
junit.jupiter.execution.parallel.mode.default = concurrent

pdftest/src/main/java/com/itextpdf/test/pdfa/VeraPdfValidator.java

+53-50
Original file line numberDiff line numberDiff line change
@@ -109,65 +109,68 @@ public void validateWarning(String filePath, String expectedWarning) {
109109
* @param filePath file to validate
110110
* @return error message if validation fails, null is validation succeeds
111111
*/
112-
public synchronized String validate(String filePath) {
112+
public String validate(String filePath) {
113113
// VeraPdf doesn't work in native mode so skip VeraPdf validation
114114
if (isNative) {
115115
return null;
116116
}
117117

118-
String errorMessage = null;
119-
try {
120-
File xmlReport = new File(filePath.substring(0, filePath.length() - ".pdf".length()) + ".xml");
121-
VeraGreenfieldFoundryProvider.initialise();
122-
123-
// Initializes default VeraPDF configurations
124-
ProcessorConfig customProfile = ProcessorFactory.defaultConfig();
125-
FeatureExtractorConfig featuresConfig = customProfile.getFeatureConfig();
126-
ValidatorConfig valConfig = ValidatorFactory.createConfig(getSpecification(), false, -1, false, true,
127-
Level.WARNING, "", false);
128-
PluginsCollectionConfig plugConfig = customProfile.getPluginsCollectionConfig();
129-
MetadataFixerConfig metaConfig = customProfile.getFixerConfig();
130-
ProcessorConfig resultConfig = ProcessorFactory.fromValues(valConfig, featuresConfig,
131-
plugConfig, metaConfig, EnumSet.of(TaskType.VALIDATE));
132-
133-
// Creates validation processor
134-
BatchProcessor processor = ProcessorFactory.fileBatchProcessor(resultConfig);
135-
136-
BatchSummary summary = processor.process(Collections.singletonList(new File(filePath)),
137-
ProcessorFactory.getHandler(FormatOption.XML, true,
138-
Files.newOutputStream(Paths.get(String.valueOf(xmlReport))), false));
139-
140-
LogsSummary logsSummary = LogsSummaryImpl.getSummary();
141-
String xmlReportPath = "file://" + xmlReport.toURI().normalize().getPath();
142-
143-
if (summary.getFailedParsingJobs() != 0) {
144-
errorMessage = "An error occurred while parsing current file. See report: " + xmlReportPath;
145-
} else if (summary.getFailedEncryptedJobs() != 0) {
146-
errorMessage = "VeraPDF execution failed - specified file is encrypted. See report: " + xmlReportPath;
147-
} else if (summary.getValidationSummary().getNonCompliantPdfaCount() != 0) {
148-
errorMessage = "VeraPDF verification failed. See verification results: " + xmlReportPath;
149-
} else {
150-
if (logToConsole) {
151-
System.out.println("VeraPDF verification finished. See verification report: " + xmlReportPath);
152-
}
153-
154-
if (logsSummary.getLogsCount() != 0) {
155-
errorMessage = "The following warnings and errors were logged during validation:";
156-
errorMessage += logsSummary.getLogs().stream()
157-
.map(log -> "\n" + log.getLevel() + ": " + log.getMessage())
158-
.sorted()
159-
.collect(Collectors.joining());
118+
synchronized(VeraPdfValidator.class) {
119+
String errorMessage = null;
120+
try {
121+
File xmlReport = new File(filePath.substring(0, filePath.length() - ".pdf".length()) + ".xml");
122+
VeraGreenfieldFoundryProvider.initialise();
123+
124+
// Initializes default VeraPDF configurations
125+
ProcessorConfig customProfile = ProcessorFactory.defaultConfig();
126+
FeatureExtractorConfig featuresConfig = customProfile.getFeatureConfig();
127+
ValidatorConfig valConfig = ValidatorFactory.createConfig(getSpecification(), false, -1, false, true,
128+
Level.WARNING, "", false);
129+
PluginsCollectionConfig plugConfig = customProfile.getPluginsCollectionConfig();
130+
MetadataFixerConfig metaConfig = customProfile.getFixerConfig();
131+
ProcessorConfig resultConfig = ProcessorFactory.fromValues(valConfig, featuresConfig,
132+
plugConfig, metaConfig, EnumSet.of(TaskType.VALIDATE));
133+
134+
// Creates validation processor
135+
BatchProcessor processor = ProcessorFactory.fileBatchProcessor(resultConfig);
136+
137+
BatchSummary summary = processor.process(Collections.singletonList(new File(filePath)),
138+
ProcessorFactory.getHandler(FormatOption.XML, true,
139+
Files.newOutputStream(Paths.get(String.valueOf(xmlReport))), false));
140+
141+
LogsSummary logsSummary = LogsSummaryImpl.getSummary();
142+
String xmlReportPath = "file://" + xmlReport.toURI().normalize().getPath();
143+
144+
if (summary.getFailedParsingJobs() != 0) {
145+
errorMessage = "An error occurred while parsing current file. See report: " + xmlReportPath;
146+
} else if (summary.getFailedEncryptedJobs() != 0) {
147+
errorMessage =
148+
"VeraPDF execution failed - specified file is encrypted. See report: " + xmlReportPath;
149+
} else if (summary.getValidationSummary().getNonCompliantPdfaCount() != 0) {
150+
errorMessage = "VeraPDF verification failed. See verification results: " + xmlReportPath;
151+
} else {
152+
if (logToConsole) {
153+
System.out.println("VeraPDF verification finished. See verification report: " + xmlReportPath);
154+
}
155+
156+
if (logsSummary.getLogsCount() != 0) {
157+
errorMessage = "The following warnings and errors were logged during validation:";
158+
errorMessage += logsSummary.getLogs().stream()
159+
.map(log -> "\n" + log.getLevel() + ": " + log.getMessage())
160+
.sorted()
161+
.collect(Collectors.joining());
162+
}
160163
}
164+
} catch (IOException | VeraPDFException exc) {
165+
errorMessage = "VeraPDF execution failed:\n" + exc.getMessage();
161166
}
162-
} catch (IOException | VeraPDFException exc) {
163-
errorMessage = "VeraPDF execution failed:\n" + exc.getMessage();
164-
}
165167

166-
if (errorMessage != null) {
167-
if (logToConsole) {
168-
System.out.println(errorMessage);
168+
if (errorMessage != null) {
169+
if (logToConsole) {
170+
System.out.println(errorMessage);
171+
}
169172
}
173+
return errorMessage;
170174
}
171-
return errorMessage;
172175
}
173176
}

pdfua/src/test/java/com/itextpdf/pdfua/PdfUAAnnotationsTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ public void printerMAnnotNoDirectChildOfAnnotTest(PdfUAConformance pdfUAConforma
222222

223223
framework.assertBothValid("printerMAnnotNoDirectChildOfAnnotTest", pdfUAConformance);
224224
String layoutPdf =
225-
"layout_printerMAnnotNoDirectChildOfAnnotTest" + "_UA_" + pdfUAConformance.getPart() + ".pdf";
225+
"itext_printerMAnnotNoDirectChildOfAnnotTest" + "_UA_" + pdfUAConformance.getPart() + ".pdf";
226226
try (PdfDocument pdfDoc = new PdfDocument(new PdfReader(DESTINATION_FOLDER + layoutPdf))) {
227227
final IStructureNode docNode = pdfDoc.getStructTreeRoot().getKids().get(0);
228228
Assertions.assertEquals(PdfName.Document, docNode.getRole());

pdfua/src/test/java/com/itextpdf/pdfua/UaValidationTestFramework.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public void assertBothFail(String filename, String expectedMsg, PdfUAConformance
8787

8888
public void assertBothFail(String filename, String expectedMsg, boolean checkDocClosing, PdfUAConformance pdfUAConformance)
8989
throws IOException {
90-
checkError(checkErrorLayout("layout_" + filename + getUAConformance(pdfUAConformance) + ".pdf", pdfUAConformance), expectedMsg);
90+
checkError(checkErrorLayout("itext_" + filename + getUAConformance(pdfUAConformance) + ".pdf", pdfUAConformance), expectedMsg);
9191

9292
final String createdFileName = "vera_" + filename + getUAConformance(pdfUAConformance) + ".pdf";
9393
veraPdfResult(createdFileName, true, pdfUAConformance);
@@ -99,7 +99,7 @@ public void assertBothFail(String filename, String expectedMsg, boolean checkDoc
9999
}
100100

101101
public void assertITextValid(String fileName, PdfUAConformance pdfUAConformance) {
102-
Exception e = checkErrorLayout("layout_" + fileName + getUAConformance(pdfUAConformance) + ".pdf",
102+
Exception e = checkErrorLayout("itext_" + fileName + getUAConformance(pdfUAConformance) + ".pdf",
103103
pdfUAConformance);
104104
if (e == null) {
105105
return;
@@ -114,7 +114,7 @@ public void assertITextValid(String fileName, PdfUAConformance pdfUAConformance)
114114
}
115115

116116
public void assertBothValid(String fileName, PdfUAConformance pdfUAConformance) throws IOException {
117-
Exception e = checkErrorLayout("layout_" + fileName + getUAConformance(pdfUAConformance) + ".pdf", pdfUAConformance);
117+
Exception e = checkErrorLayout("itext_" + fileName + getUAConformance(pdfUAConformance) + ".pdf", pdfUAConformance);
118118
String veraPdf = veraPdfResult("vera_" + fileName + getUAConformance(pdfUAConformance) + ".pdf", false, pdfUAConformance);
119119
Exception eClosing = checkErrorOnClosing("vera_" + fileName + getUAConformance(pdfUAConformance) + ".pdf", pdfUAConformance);
120120
if (e == null && veraPdf == null && eClosing == null) {
@@ -154,25 +154,25 @@ public void addAfterGenerationHook(Consumer<PdfDocument> action) {
154154
}
155155

156156
public void assertVeraPdfFail(String filename, PdfUAConformance pdfUAConformance) throws IOException {
157-
veraPdfResult(filename + getUAConformance(pdfUAConformance) + ".pdf", true, pdfUAConformance);
157+
veraPdfResult("vera_" + filename + getUAConformance(pdfUAConformance) + ".pdf", true, pdfUAConformance);
158158
}
159159

160160
public void assertOnlyVeraPdfFail(String filename, PdfUAConformance pdfUAConformance) throws IOException {
161-
veraPdfResult(filename + getUAConformance(pdfUAConformance) + ".pdf", true, pdfUAConformance);
162-
Exception e = checkErrorLayout("layout_" + filename + getUAConformance(pdfUAConformance) + ".pdf", pdfUAConformance);
161+
veraPdfResult("vera_" + filename + getUAConformance(pdfUAConformance) + ".pdf", true, pdfUAConformance);
162+
Exception e = checkErrorLayout("itext_" + filename + getUAConformance(pdfUAConformance) + ".pdf", pdfUAConformance);
163163
Assertions.assertNull(e);
164164
}
165165

166166
public void assertVeraPdfValid(String filename, PdfUAConformance pdfUAConformance) throws IOException {
167-
String veraPdf = veraPdfResult(filename + getUAConformance(pdfUAConformance) + ".pdf", false, pdfUAConformance);
167+
String veraPdf = veraPdfResult("vera_" + filename + getUAConformance(pdfUAConformance) + ".pdf", false, pdfUAConformance);
168168
if (veraPdf == null) {
169169
return;
170170
}
171171
Assertions.fail("Expected no vera pdf message but was: \n" + veraPdf + "\n");
172172
}
173173

174174
public void assertITextFail(String filename, String expectedMsg, PdfUAConformance pdfUAConformance) {
175-
checkError(checkErrorLayout("layout_" + filename + getUAConformance(pdfUAConformance) + ".pdf", pdfUAConformance), expectedMsg);
175+
checkError(checkErrorLayout("itext_" + filename + getUAConformance(pdfUAConformance) + ".pdf", pdfUAConformance), expectedMsg);
176176
}
177177

178178
private String veraPdfResult(String filename, boolean failureExpected, PdfUAConformance pdfUAConformance)

pdfua/src/test/java/com/itextpdf/pdfua/checkers/PdfUA2AnnotationTypesTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ This file is part of the iText (R) project.
6969

7070
@Tag("IntegrationTest")
7171
public class PdfUA2AnnotationTypesTest extends ExtendedITextTest {
72-
private static final String DESTINATION_FOLDER = TestUtil.getOutputPath() + "/pdfua/PdfUA2LinkAnnotationTest/";
72+
private static final String DESTINATION_FOLDER = TestUtil.getOutputPath() + "/pdfua/PdfUA2AnnotationTypesTest/";
7373

7474
private UaValidationTestFramework framework;
7575

pdfua/src/test/java/com/itextpdf/pdfua/checkers/PdfUACanvasTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ public void checkPoint_01_005_RectangleClip(PdfUAConformance pdfUAConformance) t
481481
canvas.rectangle(new Rectangle(200, 200, 100, 100));
482482
canvas.clip();
483483
});
484-
framework.assertBothValid("checkPoint_01_005_RectangleNoContent", pdfUAConformance);
484+
framework.assertBothValid("checkPoint_01_005_RectangleClip", pdfUAConformance);
485485
}
486486

487487
@ParameterizedTest

pdfua/src/test/java/com/itextpdf/pdfua/checkers/PdfUAFormFieldsTest.java

+7-10
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ This file is part of the iText (R) project.
2222
*/
2323
package com.itextpdf.pdfua.checkers;
2424

25-
import com.itextpdf.commons.utils.MessageFormatUtil;
2625
import com.itextpdf.forms.PdfAcroForm;
2726
import com.itextpdf.forms.fields.ChoiceFormFieldBuilder;
2827
import com.itextpdf.forms.fields.PdfButtonFormField;
@@ -49,7 +48,6 @@ This file is part of the iText (R) project.
4948
import com.itextpdf.io.font.PdfEncodings;
5049
import com.itextpdf.io.image.ImageDataFactory;
5150
import com.itextpdf.kernel.colors.ColorConstants;
52-
import com.itextpdf.kernel.exceptions.KernelExceptionMessageConstant;
5351
import com.itextpdf.kernel.font.PdfFont;
5452
import com.itextpdf.kernel.font.PdfFontFactory;
5553
import com.itextpdf.kernel.geom.Rectangle;
@@ -87,18 +85,17 @@ This file is part of the iText (R) project.
8785
import com.itextpdf.test.ExtendedITextTest;
8886
import com.itextpdf.test.TestUtil;
8987

88+
import java.io.IOException;
9089
import java.net.MalformedURLException;
90+
import java.nio.charset.StandardCharsets;
91+
import java.util.Arrays;
92+
import java.util.List;
9193
import org.junit.jupiter.api.BeforeAll;
9294
import org.junit.jupiter.api.BeforeEach;
9395
import org.junit.jupiter.api.Tag;
9496
import org.junit.jupiter.params.ParameterizedTest;
9597
import org.junit.jupiter.params.provider.MethodSource;
9698

97-
import java.io.IOException;
98-
import java.nio.charset.StandardCharsets;
99-
import java.util.Arrays;
100-
import java.util.List;
101-
10299
@Tag("IntegrationTest")
103100
public class PdfUAFormFieldsTest extends ExtendedITextTest {
104101

@@ -604,7 +601,7 @@ public IBlockElement generate() {
604601
return b;
605602
}
606603
});
607-
framework.assertBothValid("testButtonSingleLine", pdfUAConformance);
604+
framework.assertBothValid("testButtonCustomContent", pdfUAConformance);
608605
}
609606

610607
@ParameterizedTest
@@ -695,7 +692,7 @@ public IBlockElement generate() {
695692
return b;
696693
}
697694
});
698-
framework.assertBothValid("testButtonSingleLineInteractive", pdfUAConformance);
695+
framework.assertBothValid("testButtonCustomContentInteractive", pdfUAConformance);
699696
}
700697

701698
@ParameterizedTest
@@ -716,7 +713,7 @@ public IBlockElement generate() {
716713
return b;
717714
}
718715
});
719-
framework.assertBothValid("testButtonSingleLineInteractive", pdfUAConformance);
716+
framework.assertBothValid("testButtonCustomContentIsAlsoFormInteractive", pdfUAConformance);
720717
}
721718

722719
@ParameterizedTest

pdfua/src/test/java/com/itextpdf/pdfua/checkers/PdfUALayoutTest.java

-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ This file is part of the iText (R) project.
5656
@Tag("IntegrationTest")
5757
public class PdfUALayoutTest extends ExtendedITextTest {
5858
private static final String DESTINATION_FOLDER = TestUtil.getOutputPath() + "/pdfua/PdfUALayoutTest/";
59-
private static final String SOURCE_FOLDER = "./src/test/resources/com/itextpdf/pdfua/PdfUALayoutTest/";
6059
private static final String FONT = "./src/test/resources/com/itextpdf/pdfua/font/FreeSans.ttf";
6160

6261
private UaValidationTestFramework framework;

0 commit comments

Comments
 (0)