Skip to content

Commit 1156fe6

Browse files
author
Eugene Bochilo
committed
Support linearized PDF files in DocumentsRevisionsValidator
DEVSIX-8415
1 parent 6595c3a commit 1156fe6

File tree

2 files changed

+27
-14
lines changed

2 files changed

+27
-14
lines changed

sign/src/main/java/com/itextpdf/signatures/validation/DocumentRevisionsValidator.java

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,6 @@ public class DocumentRevisionsValidator {
9797
static final String FIELD_NOT_DICTIONARY =
9898
"Form field \"{0}\" or one of its widgets is not a dictionary. It will not be validated.";
9999
static final String FIELD_REMOVED = "Form field {0} was removed or unexpectedly modified.";
100-
static final String LINEARIZED_NOT_SUPPORTED =
101-
"Linearized PDF documents are not supported by DocumentRevisionsValidator.";
102100
static final String LOCKED_FIELD_KIDS_ADDED =
103101
"Kids were added to locked form field \"{0}\".";
104102
static final String LOCKED_FIELD_KIDS_REMOVED =
@@ -251,6 +249,7 @@ ValidationReport validateAllDocumentRevisions(ValidationContext context, PdfDocu
251249
ReportItemStatus.INDETERMINATE));
252250
return report;
253251
}
252+
mergeRevisionsInLinearizedDocument(document, documentRevisions);
254253
SignatureUtil signatureUtil = new SignatureUtil(document);
255254
List<String> signatures = new ArrayList<>(signatureUtil.getSignatureNames());
256255
if (signatures.isEmpty()) {
@@ -326,6 +325,28 @@ void validateRevision(DocumentRevision previousRevision, DocumentRevision curren
326325
documentWithoutRevision, documentWithRevision, currentRevision)));
327326
}
328327

328+
private void mergeRevisionsInLinearizedDocument(PdfDocument document, List<DocumentRevision> documentRevisions) {
329+
if (documentRevisions.size() > 1) {
330+
// We need to check if document is linearized in first revision
331+
// We don't need to populate validation report in case of exceptions, it will happen later
332+
createDocumentAndPerformOperation(documentRevisions.get(0), document, new ValidationReport(),
333+
firstRevisionDocument -> {
334+
if (isLinearizedPdf(document)) {
335+
Set<PdfIndirectReference> mergedModifiedReferences =
336+
new HashSet<>(documentRevisions.get(0).getModifiedObjects());
337+
mergedModifiedReferences.addAll(documentRevisions.get(1).getModifiedObjects());
338+
DocumentRevision mergedRevision = new DocumentRevision(
339+
documentRevisions.get(0).getEofOffset(),
340+
mergedModifiedReferences);
341+
documentRevisions.add(0, mergedRevision);
342+
documentRevisions.remove(1);
343+
documentRevisions.remove(1);
344+
}
345+
return true;
346+
});
347+
}
348+
}
349+
329350
private boolean validateRevision(ValidationReport validationReport, ValidationContext context,
330351
PdfDocument documentWithoutRevision, PdfDocument documentWithRevision, DocumentRevision currentRevision) {
331352
usuallyModifiedObjects = new Pair<>(createUsuallyModifiedObjectsSet(documentWithoutRevision),
@@ -559,13 +580,8 @@ private boolean createDocumentAndPerformOperation(DocumentRevision revision, Pdf
559580
new DocumentProperties().setEventCountingMetaInfo(metaInfo))) {
560581
return (boolean) operation.apply(documentWithRevision);
561582
} catch (IOException | RuntimeException exception) {
562-
if (isLinearizedPdf(originalDocument)) {
563-
report.addReportItem(new ReportItem(DOC_MDP_CHECK, LINEARIZED_NOT_SUPPORTED, exception,
564-
ReportItemStatus.INDETERMINATE));
565-
} else {
566-
report.addReportItem(new ReportItem(DOC_MDP_CHECK, REVISIONS_READING_EXCEPTION, exception,
567-
ReportItemStatus.INDETERMINATE));
568-
}
583+
report.addReportItem(new ReportItem(DOC_MDP_CHECK, REVISIONS_READING_EXCEPTION, exception,
584+
ReportItemStatus.INDETERMINATE));
569585
return false;
570586
}
571587
}

sign/src/test/java/com/itextpdf/signatures/validation/DocumentRevisionsValidatorIntegrationTest.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,8 @@ public void linearizedDocTest(boolean continueValidationAfterFail) throws IOExce
9898
DocumentRevisionsValidator validator = builder.buildDocumentRevisionsValidator();
9999
ValidationReport report = validator.validateAllDocumentRevisions(validationContext, document);
100100

101-
AssertValidationReport.assertThat(report, a -> a.hasStatus(ValidationResult.INDETERMINATE)
102-
.hasNumberOfFailures(1).hasNumberOfLogs(1)
103-
.hasLogItem(l -> l.withCheckName(DocumentRevisionsValidator.DOC_MDP_CHECK)
104-
.withMessage(DocumentRevisionsValidator.LINEARIZED_NOT_SUPPORTED)
105-
.withStatus(ReportItemStatus.INDETERMINATE)));
101+
AssertValidationReport.assertThat(report, a -> a.hasStatus(ValidationResult.VALID)
102+
.hasNumberOfFailures(0).hasNumberOfLogs(0));
106103

107104
Assertions.assertEquals(AccessPermissions.ANNOTATION_MODIFICATION, validator.getAccessPermissions());
108105
}

0 commit comments

Comments
 (0)