diff --git a/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts b/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts index dd4d3c25..ef31bf1f 100644 --- a/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts @@ -1,24 +1,16 @@ plugins { - java + `java-library` + `maven-publish` pmd checkstyle jacoco } group = "com.iqser.red" -version = "4.0-SNAPSHOT" java.sourceCompatibility = JavaVersion.VERSION_17 java.targetCompatibility = JavaVersion.VERSION_17 -tasks.jacocoTestReport { - reports { - xml.required.set(false) - csv.required.set(false) - html.outputLocation.set(layout.buildDirectory.dir("jacocoHtml")) - } -} - tasks.pmdMain { pmd.ruleSetFiles = files("${rootDir}/config/pmd/pmd.xml") } @@ -29,6 +21,9 @@ tasks.pmdTest { tasks.named("test") { useJUnitPlatform() + reports { + junitXml.outputLocation.set(layout.buildDirectory.dir("reports/junit")) + } } tasks.test { @@ -40,6 +35,26 @@ tasks.jacocoTestReport { reports { xml.required.set(true) csv.required.set(false) + html.outputLocation.set(layout.buildDirectory.dir("jacocoHtml")) + } +} + +allprojects { + publishing { + publications { + create(name) { + from(components["java"]) + } + } + repositories { + maven { + url = uri("https://nexus.knecon.com/repository/red-platform-releases/") + credentials { + username = providers.gradleProperty("mavenUser").getOrNull(); + password = providers.gradleProperty("mavenPassword").getOrNull(); + } + } + } } } diff --git a/config/pmd/pmd.xml b/config/pmd/pmd.xml index e75174cb..22d6d4cd 100644 --- a/config/pmd/pmd.xml +++ b/config/pmd/pmd.xml @@ -12,7 +12,6 @@ - diff --git a/config/pmd/test_pmd.xml b/config/pmd/test_pmd.xml index f06feab0..56d37d9e 100644 --- a/config/pmd/test_pmd.xml +++ b/config/pmd/test_pmd.xml @@ -13,12 +13,12 @@ - + \ No newline at end of file diff --git a/gradle.properties.kts b/gradle.properties.kts new file mode 100644 index 00000000..15092839 --- /dev/null +++ b/gradle.properties.kts @@ -0,0 +1 @@ +version = 4.0-SNAPSHOT diff --git a/redaction-service-v1/redaction-service-api-v1/build.gradle.kts b/redaction-service-v1/redaction-service-api-v1/build.gradle.kts index c99b916f..570167b1 100644 --- a/redaction-service-v1/redaction-service-api-v1/build.gradle.kts +++ b/redaction-service-v1/redaction-service-api-v1/build.gradle.kts @@ -1,13 +1,14 @@ plugins { id("com.iqser.red.service.java-conventions") - id("io.freefair.lombok") version "8.0.1" -} - -dependencies { - implementation("org.springframework:spring-web:6.0.6") - implementation("com.iqser.red.service:persistence-service-internal-api-v1:2.79.0") + id("io.freefair.lombok") version "8.1.0" } description = "redaction-service-api-v1" +dependencies { + implementation("org.springframework:spring-web:6.0.6") + implementation("com.iqser.red.service:persistence-service-internal-api-v1:RED-6725") +} + + diff --git a/redaction-service-v1/redaction-service-server-v1/build.gradle.kts b/redaction-service-v1/redaction-service-server-v1/build.gradle.kts index 847b0fb7..3104b436 100644 --- a/redaction-service-v1/redaction-service-server-v1/build.gradle.kts +++ b/redaction-service-v1/redaction-service-server-v1/build.gradle.kts @@ -6,15 +6,21 @@ plugins { id("org.springframework.boot") version "3.0.6" id("io.spring.dependency-management") version "1.1.0" id("org.sonarqube") version "4.2.1.3168" - id("io.freefair.lombok") version "8.0.1" + id("io.freefair.lombok") version "8.1.0" } +description = "redaction-service-server-v1" + +extra["layoutparserVersion"] = "0.8.0" + dependencies { implementation(project(":redaction-service-api-v1")) - implementation("com.iqser.red.service:persistence-service-internal-api-v1:2.79.0") + implementation("com.iqser.red.service:persistence-service-internal-api-v1:RED-6725") + implementation("com.knecon.fforesight:layoutparser-service-internal-api:0.12.0") implementation("com.iqser.red.commons:spring-commons:2.1.0") { exclude(group = "org.springframework.boot", module = "spring-boot-starter-log4j2") } implementation("com.iqser.red.commons:metric-commons:2.1.0") { exclude(group = "org.springframework.boot", module = "spring-boot-starter-log4j2") } + implementation("com.iqser.red.commons:dictionary-merge-commons:1.3.0") implementation("com.iqser.red.commons:storage-commons:2.1.0") implementation("com.knecon.fforesight:tenant-commons:0.10.0") @@ -31,15 +37,15 @@ dependencies { implementation("org.locationtech.jts:jts-core:1.19.0") - implementation("org.apache.pdfbox:pdfbox:2.0.24") - implementation("org.apache.pdfbox:pdfbox-tools:2.0.24") + testImplementation("org.apache.pdfbox:pdfbox:3.0.0-alpha2") + testImplementation("org.apache.pdfbox:pdfbox-tools:3.0.0-alpha2") implementation("org.springframework.cloud:spring-cloud-starter-openfeign:4.0.1") implementation("org.springframework.boot:spring-boot-starter-amqp:3.0.4") testImplementation("org.springframework.boot:spring-boot-starter-test:3.0.4") + testImplementation("com.knecon.fforesight:layoutparser-service-processor:0.12.0") { exclude(group = "com.iqser.red.service", module = "persistence-service-shared-api-v1") } } -description = "redaction-service-server-v1" tasks.named("bootBuildImage") { diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/AtomicPositionBlockData.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/AtomicPositionBlockData.java deleted file mode 100644 index 7191252e..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/AtomicPositionBlockData.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.document.data; - -import java.awt.geom.Rectangle2D; -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.document.graph.textblock.AtomicTextBlock; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.experimental.FieldDefaults; - -@Data -@Builder -@AllArgsConstructor -@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class AtomicPositionBlockData { - - Long id; - int[] stringIdxToPositionIdx; - float[][] positions; - - - public static AtomicPositionBlockData fromAtomicTextBlock(AtomicTextBlock atomicTextBlock) { - - return AtomicPositionBlockData.builder() - .id(atomicTextBlock.getId()) - .positions(toPrimitiveFloatMatrix(atomicTextBlock.getPositions())) - .stringIdxToPositionIdx(atomicTextBlock.getStringIdxToPositionIdx().stream().mapToInt(Integer::intValue).toArray()) - .build(); - } - - - private static float[][] toPrimitiveFloatMatrix(List positions) { - - float[][] positionMatrix = new float[positions.size()][]; - for (int i = 0; i < positions.size(); i++) { - positionMatrix[i] = toArray(positions.get(i)); - } - return positionMatrix; - } - - - private static float[] toArray(Rectangle2D positions) { - - return new float[]{(float) positions.getMinX(), (float) positions.getMinY(), (float) positions.getWidth(), (float) positions.getHeight()}; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/AtomicTextBlockData.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/AtomicTextBlockData.java deleted file mode 100644 index 935c0edf..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/AtomicTextBlockData.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.document.data; - -import com.iqser.red.service.redaction.v1.server.document.graph.textblock.AtomicTextBlock; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.experimental.FieldDefaults; - -@Data -@Builder -@AllArgsConstructor -@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class AtomicTextBlockData { - - Long id; - Long page; - String searchText; - int numberOnPage; - int start; - int end; - int[] lineBreaks; - - - public static AtomicTextBlockData fromAtomicTextBlock(AtomicTextBlock atomicTextBlock) { - - return AtomicTextBlockData.builder() - .id(atomicTextBlock.getId()) - .page(atomicTextBlock.getPage().getNumber().longValue()) - .searchText(atomicTextBlock.getSearchText()) - .numberOnPage(atomicTextBlock.getNumberOnPage()) - .start(atomicTextBlock.getBoundary().start()) - .end(atomicTextBlock.getBoundary().end()) - .lineBreaks(atomicTextBlock.getLineBreaks().stream().mapToInt(Integer::intValue).toArray()) - .build(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/DocumentData.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/DocumentData.java index 36c981db..11933064 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/DocumentData.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/DocumentData.java @@ -1,6 +1,9 @@ package com.iqser.red.service.redaction.v1.server.document.data; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPage; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPositionData; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentStructure; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentTextData; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -14,30 +17,9 @@ import lombok.experimental.FieldDefaults; @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class DocumentData { - PageData[] pages; - AtomicTextBlockData[] atomicTextBlocks; - AtomicPositionBlockData[] atomicPositionBlocks; - DocumentTreeData documentTreeData; - - - public static DocumentData fromDocument(Document document) { - - var atomicPositionBlocks = document.streamTerminalTextBlocksInOrder() - .flatMap(textBlock -> textBlock.getAtomicTextBlocks().stream()) - .distinct() - .map(AtomicPositionBlockData::fromAtomicTextBlock) - .toArray(AtomicPositionBlockData[]::new); - - var atomicTextBlocks = document.streamTerminalTextBlocksInOrder() - .flatMap(textBlock -> textBlock.getAtomicTextBlocks().stream()) - .distinct() - .map(AtomicTextBlockData::fromAtomicTextBlock) - .toArray(AtomicTextBlockData[]::new); - - var pages = document.getPages().stream().map(PageData::fromPage).toArray(PageData[]::new); - - var documentTreeData = new DocumentTreeData(DocumentTreeData.EntryData.fromEntry(document.getDocumentTree().getRoot())); - return new DocumentData(pages, atomicTextBlocks, atomicPositionBlocks, documentTreeData); - } + DocumentPage[] documentPages; + DocumentTextData[] documentTextData; + DocumentPositionData[] documentPositionData; + DocumentStructure documentStructure; } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/DocumentTreeData.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/DocumentTreeData.java deleted file mode 100644 index 9ce59c50..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/DocumentTreeData.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.document.data; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Stream; - -import com.iqser.red.service.redaction.v1.server.document.data.mapper.PropertiesMapper; -import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.NodeType; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.TableCell; -import com.iqser.red.service.redaction.v1.server.document.graph.textblock.AtomicTextBlock; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.FieldDefaults; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@FieldDefaults(level = AccessLevel.PRIVATE) -public class DocumentTreeData { - - EntryData root; - - - public EntryData get(List tocId) { - - if (tocId.isEmpty()) { - return root; - } - EntryData entry = root.children.get(tocId.get(0)); - for (int id : tocId.subList(1, tocId.size())) { - entry = entry.children.get(id); - } - return entry; - } - - - public Stream streamAllEntries() { - - return Stream.concat(Stream.of(root), root.children.stream()).flatMap(DocumentTreeData::flatten); - } - - - public String toString() { - - return String.join("\n", streamAllEntries().map(EntryData::toString).toList()); - } - - - private static Stream flatten(EntryData entry) { - - return Stream.concat(Stream.of(entry), entry.children.stream().flatMap(DocumentTreeData::flatten)); - } - - - @Builder - @Getter - @AllArgsConstructor - @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) - public static class EntryData { - - NodeType type; - int[] treeId; - Long[] atomicBlockIds; - Long[] pageNumbers; - Map properties; - List children; - - - public static EntryData fromEntry(DocumentTree.Entry entry) { - - Long[] atomicBlockIds = toAtomicTextBlockIds(entry); - - Map properties = switch (entry.getType()) { - case TABLE -> PropertiesMapper.buildTableProperties((Table) entry.getNode()); - case TABLE_CELL -> PropertiesMapper.buildTableCellProperties((TableCell) entry.getNode()); - case IMAGE -> PropertiesMapper.buildImageProperties((Image) entry.getNode()); - default -> new HashMap<>(); - }; - var treeId = entry.getTreeId().stream().mapToInt(Integer::intValue).toArray(); - var pageNumbers = entry.getNode().getPages().stream().map(Page::getNumber).map(Integer::longValue).toArray(Long[]::new); - var subEntries = entry.getChildren().stream().map(EntryData::fromEntry).toList(); - return new EntryData(entry.getType(), treeId, atomicBlockIds, pageNumbers, properties, subEntries); - } - - - private static Long[] toAtomicTextBlockIds(DocumentTree.Entry entry) { - - if (entry.getNode().isLeaf()) { - return entry.getNode().getLeafTextBlock().getAtomicTextBlocks().stream().map(AtomicTextBlock::getId).toArray(Long[]::new); - } else { - return new Long[]{}; - } - } - - - @Override - public String toString() { - - StringBuilder sb = new StringBuilder(); - sb.append("["); - for (int i : treeId) { - sb.append(i); - sb.append(","); - } - sb.delete(sb.length() - 1, sb.length()); - sb.append("]: "); - - sb.append(type); - sb.append(" atbs = "); - sb.append(atomicBlockIds.length); - - return sb.toString(); - } - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/PageData.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/PageData.java deleted file mode 100644 index 01741e5d..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/PageData.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.document.data; - -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.experimental.FieldDefaults; - -@Data -@Builder -@AllArgsConstructor -@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class PageData { - - int number; - int height; - int width; - int rotation; - - - public static PageData fromPage(Page page) { - - return new PageData(page.getNumber(), page.getHeight(), page.getWidth(), page.getRotation()); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/mapper/DocumentGraphMapper.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/mapper/DocumentGraphMapper.java index 93cdf347..5f3444d4 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/mapper/DocumentGraphMapper.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/data/mapper/DocumentGraphMapper.java @@ -19,14 +19,14 @@ import com.iqser.red.service.redaction.v1.server.document.graph.nodes.TableCell; import com.iqser.red.service.redaction.v1.server.document.graph.textblock.AtomicTextBlock; import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlockCollector; -import com.iqser.red.service.redaction.v1.server.document.data.AtomicPositionBlockData; -import com.iqser.red.service.redaction.v1.server.document.data.AtomicTextBlockData; import com.iqser.red.service.redaction.v1.server.document.data.DocumentData; -import com.iqser.red.service.redaction.v1.server.document.data.DocumentTreeData; -import com.iqser.red.service.redaction.v1.server.document.data.PageData; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Headline; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPage; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPositionData; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentStructure; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentTextData; import lombok.experimental.UtilityClass; @@ -39,23 +39,23 @@ public class DocumentGraphMapper { DocumentTree documentTree = new DocumentTree(document); Context context = new Context(documentData, documentTree); - context.pages.addAll(Arrays.stream(documentData.getPages()).map(DocumentGraphMapper::buildPage).toList()); + context.pageData.addAll(Arrays.stream(documentData.getDocumentPages()).map(DocumentGraphMapper::buildPage).toList()); - context.documentTree.getRoot().getChildren().addAll(buildEntries(documentData.getDocumentTreeData().getRoot().getChildren(), context)); + context.documentTree.getRoot().getChildren().addAll(buildEntries(documentData.getDocumentStructure().getRoot().getChildren(), context)); document.setDocumentTree(context.documentTree); - document.setPages(new HashSet<>(context.pages)); - document.setNumberOfPages(documentData.getPages().length); + document.setPages(new HashSet<>(context.pageData)); + document.setNumberOfPages(documentData.getDocumentPages().length); document.setTextBlock(document.getTextBlock()); return document; } - private List buildEntries(List entries, Context context) { + private List buildEntries(List entries, Context context) { List newEntries = new LinkedList<>(); - for (DocumentTreeData.EntryData entryData : entries) { + for (DocumentStructure.EntryData entryData : entries) { List pages = Arrays.stream(entryData.getPageNumbers()).map(pageNumber -> getPage(pageNumber, context)).toList(); @@ -154,14 +154,14 @@ public class DocumentGraphMapper { private AtomicTextBlock getAtomicTextBlock(Context context, SemanticNode parent, Long atomicTextBlockId) { - return AtomicTextBlock.fromAtomicTextBlockData(context.atomicTextBlockData.get(Math.toIntExact(atomicTextBlockId)), - context.atomicPositionBlockData.get(Math.toIntExact(atomicTextBlockId)), + return AtomicTextBlock.fromAtomicTextBlockData(context.documentTextData.get(Math.toIntExact(atomicTextBlockId)), + context.documentPositionData.get(Math.toIntExact(atomicTextBlockId)), parent, - getPage(context.atomicTextBlockData.get(Math.toIntExact(atomicTextBlockId)).getPage(), context)); + getPage(context.documentTextData.get(Math.toIntExact(atomicTextBlockId)).getPage(), context)); } - private Page buildPage(PageData p) { + private Page buildPage(DocumentPage p) { return Page.builder().rotation(p.getRotation()).height(p.getHeight()).width(p.getWidth()).number(p.getNumber()).mainBody(new LinkedList<>()).build(); } @@ -169,7 +169,7 @@ public class DocumentGraphMapper { private Page getPage(Long pageIndex, Context context) { - return context.pages.stream() + return context.pageData.stream() .filter(page -> page.getNumber() == Math.toIntExact(pageIndex)) .findFirst() .orElseThrow(() -> new NoSuchElementException(String.format("ClassificationPage with number %d not found", pageIndex))); @@ -179,17 +179,17 @@ public class DocumentGraphMapper { static final class Context { private final DocumentTree documentTree; - private final List pages; - private final List atomicTextBlockData; - private final List atomicPositionBlockData; + private final List pageData; + private final List documentTextData; + private final List documentPositionData; Context(DocumentData documentData, DocumentTree documentTree) { this.documentTree = documentTree; - this.pages = new LinkedList<>(); - this.atomicTextBlockData = Arrays.stream(documentData.getAtomicTextBlocks()).toList(); - this.atomicPositionBlockData = Arrays.stream(documentData.getAtomicPositionBlocks()).toList(); + this.pageData = new LinkedList<>(); + this.documentTextData = Arrays.stream(documentData.getDocumentTextData()).toList(); + this.documentPositionData = Arrays.stream(documentData.getDocumentPositionData()).toList(); } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/DocumentGraphFactory.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/DocumentGraphFactory.java deleted file mode 100644 index e1f42c1e..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/DocumentGraphFactory.java +++ /dev/null @@ -1,242 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.document.factory; - -import static java.lang.String.format; -import static java.util.stream.Collectors.groupingBy; -import static java.util.stream.Collectors.toList; - -import java.awt.geom.Rectangle2D; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Footer; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.GenericSemanticNode; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationFooter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationHeader; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Header; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Headline; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.document.graph.textblock.AtomicTextBlock; -import com.iqser.red.service.redaction.v1.server.document.utils.TextPositionOperations; -import com.iqser.red.service.redaction.v1.server.redaction.utils.IdBuilder; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.experimental.FieldDefaults; -import lombok.experimental.UtilityClass; - -@UtilityClass -public class DocumentGraphFactory { - - public Document buildDocumentGraph(ClassificationDocument document) { - - Document documentGraph = new Document(); - Context context = new Context(documentGraph); - - document.getPages().forEach(context::buildAndAddPageWithCounter); - document.getSections().stream().flatMap(section -> section.getImages().stream()).forEach(image -> context.getImages().add(image)); - addSections(document, context); - addHeaderAndFooterToEachPage(document, context); - - documentGraph.setNumberOfPages(context.pages.size()); - documentGraph.setPages(context.pages.keySet()); - documentGraph.setDocumentTree(context.documentTree); - documentGraph.setTextBlock(documentGraph.getTextBlock()); - return documentGraph; - } - - - private void addSections(ClassificationDocument document, Context context) { - - document.getSections().forEach(section -> SectionNodeFactory.addSection(null, section.getPageBlocks(), section.getImages(), context)); - } - - - public void addParagraphOrHeadline(GenericSemanticNode parentNode, TextPageBlock originalTextBlock, Context context, List textBlocksToMerge) { - - Page page = context.getPage(originalTextBlock.getPage()); - - GenericSemanticNode node; - if (originalTextBlock.isHeadline()) { - node = Headline.builder().documentTree(context.getDocumentTree()).build(); - } else { - node = Paragraph.builder().documentTree(context.getDocumentTree()).build(); - } - - page.getMainBody().add(node); - - List textBlocks = new ArrayList<>(textBlocksToMerge); - AtomicTextBlock textBlock = context.textBlockFactory.fromContext(TextPositionOperations.mergeAndSortTextPositionSequenceByYThenX(textBlocks), node, context, page); - List treeId = context.documentTree.createNewChildEntryAndReturnId(parentNode, node); - node.setLeafTextBlock(textBlock); - node.setTreeId(treeId); - } - - - public void addImage(Section section, ClassifiedImage image, Context context) { - - Rectangle2D position = image.getPosition(); - Page page = context.getPage(image.getPage()); - Image imageNode = Image.builder() - .id(IdBuilder.buildId(Set.of(page), List.of(position), image.getImageType().name(), "image")) - .imageType(image.getImageType()) - .position(position) - .transparent(image.isHasTransparency()) - .page(page) - .documentTree(context.getDocumentTree()) - .build(); - page.getMainBody().add(imageNode); - - List tocId = context.getDocumentTree().createNewChildEntryAndReturnId(section, imageNode); - imageNode.setTreeId(tocId); - } - - - private void addHeaderAndFooterToEachPage(ClassificationDocument document, Context context) { - - Map> headers = document.getHeaders() - .stream() - .map(ClassificationHeader::getTextBlocks) - .flatMap(List::stream) - .collect(groupingBy(AbstractPageBlock::getPage, toList())); - - Map> footers = document.getFooters() - .stream() - .map(ClassificationFooter::getTextBlocks) - .flatMap(List::stream) - .collect(groupingBy(AbstractPageBlock::getPage, toList())); - - for (int pageIndex = 1; pageIndex <= document.getPages().size(); pageIndex++) { - if (headers.containsKey(pageIndex)) { - addHeader(headers.get(pageIndex), context); - } else { - addEmptyHeader(pageIndex, context); - } - } - - for (int pageIndex = 1; pageIndex <= document.getPages().size(); pageIndex++) { - if (footers.containsKey(pageIndex)) { - addFooter(footers.get(pageIndex), context); - } else { - addEmptyFooter(pageIndex, context); - } - } - } - - - private void addFooter(List textBlocks, Context context) { - - Page page = context.getPage(textBlocks.get(0).getPage()); - Footer footer = Footer.builder().documentTree(context.getDocumentTree()).build(); - AtomicTextBlock textBlock = context.textBlockFactory.fromContext(TextPositionOperations.mergeAndSortTextPositionSequenceByYThenX(textBlocks), footer, context, page); - List tocId = context.getDocumentTree().createNewMainEntryAndReturnId(footer); - footer.setTreeId(tocId); - footer.setLeafTextBlock(textBlock); - page.setFooter(footer); - } - - - public void addHeader(List textBlocks, Context context) { - - Page page = context.getPage(textBlocks.get(0).getPage()); - Header header = Header.builder().documentTree(context.getDocumentTree()).build(); - AtomicTextBlock textBlock = context.textBlockFactory.fromNumberOnPage(TextPositionOperations.mergeAndSortTextPositionSequenceByYThenX(textBlocks), header, 0, page); - List tocId = context.getDocumentTree().createNewMainEntryAndReturnId(header); - header.setTreeId(tocId); - header.setLeafTextBlock(textBlock); - page.setHeader(header); - } - - - private void addEmptyFooter(int pageIndex, Context context) { - - Page page = context.getPage(pageIndex); - Footer footer = Footer.builder().documentTree(context.getDocumentTree()).build(); - AtomicTextBlock textBlock = context.textBlockFactory.emptyTextBlock(footer, context, page); - List tocId = context.getDocumentTree().createNewMainEntryAndReturnId(footer); - footer.setTreeId(tocId); - footer.setLeafTextBlock(textBlock); - page.setFooter(footer); - } - - - private void addEmptyHeader(int pageIndex, Context context) { - - Page page = context.getPage(pageIndex); - Header header = Header.builder().documentTree(context.getDocumentTree()).build(); - AtomicTextBlock textBlock = context.textBlockFactory.emptyTextBlockFromInteger(header, 0, page); - List tocId = context.getDocumentTree().createNewMainEntryAndReturnId(header); - header.setTreeId(tocId); - header.setLeafTextBlock(textBlock); - page.setHeader(header); - } - - - @Getter - @Builder - @AllArgsConstructor - @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) - public final class Context { - - DocumentTree documentTree; - Map pages; - List
sections; - List images; - TextBlockFactory textBlockFactory; - - - public Context(Document document) { - - documentTree = new DocumentTree(document); - pages = new HashMap<>(); - sections = new LinkedList<>(); - images = new LinkedList<>(); - textBlockFactory = new TextBlockFactory(); - } - - - public void buildAndAddPageWithCounter(ClassificationPage classificationPage) { - - Page page = Page.fromClassificationPage(classificationPage); - //this counter counts the TextBlocks per page - //initial value is set to 1, because 0 is reserved for Header - pages.put(page, 1); - } - - - public int getAndIncrementTextBlockNumberOnPage(Page page) { - - Integer textBlockNumberOnPage = pages.get(page); - pages.merge(page, 1, Integer::sum); - return textBlockNumberOnPage; - } - - - public Page getPage(int pageIndex) { - - return pages.keySet() - .stream() - .filter(page -> page.getNumber() == pageIndex) - .findFirst() - .orElseThrow(() -> new NoSuchElementException(format("ClassificationPage with number %d not found", pageIndex))); - } - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/SearchTextWithTextPositionDto.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/SearchTextWithTextPositionDto.java deleted file mode 100644 index 22766b68..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/SearchTextWithTextPositionDto.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.document.factory; - -import java.awt.geom.Rectangle2D; -import java.util.Collections; -import java.util.List; - -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.experimental.FieldDefaults; - -@Builder -@Getter -@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class SearchTextWithTextPositionDto { - - String searchText; - List lineBreaks; - List stringCoordsToPositionCoords; - List positions; - - - public static SearchTextWithTextPositionDto empty() { - - return SearchTextWithTextPositionDto.builder() - .searchText("") - .lineBreaks(Collections.emptyList()) - .positions(Collections.emptyList()) - .stringCoordsToPositionCoords(Collections.emptyList()) - .build(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/SearchTextWithTextPositionFactory.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/SearchTextWithTextPositionFactory.java deleted file mode 100644 index 27b36e85..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/SearchTextWithTextPositionFactory.java +++ /dev/null @@ -1,185 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.document.factory; - -import java.awt.geom.AffineTransform; -import java.awt.geom.Rectangle2D; -import java.util.LinkedList; -import java.util.List; -import java.util.Objects; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.RedTextPosition; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextDirection; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class SearchTextWithTextPositionFactory { - - public final int HEIGHT_PADDING = 2; - // when checking for a hyphen linebreak, we need to check after a linebreak if the last hyphen was less than three symbols away. - // We detect a linebreak as either a "\n" character or if two adjacent symbol's position differ in y-coordinates by at least one character height. - // If there is a hyphen linebreak, the hyphen will be 1 position in front of a "\n" or 2 positions in front of the character which has a lower y-coordinate - // This is why, we need to initialize this to < -2, otherwise, if the very first symbol is a \n we would detect a hyphen linebreak that isn't there. - // Also, Integer.MIN_VALUE is a bad idea due to potential overflow during arithmetic operations. This is why the default should be -3. - public final int MAX_HYPHEN_LINEBREAK_DISTANCE = 3; - - - public SearchTextWithTextPositionDto buildSearchTextToTextPositionModel(List sequences) { - - if (sequences.isEmpty() || sequences.stream().allMatch(sequence -> sequence.getTextPositions().isEmpty())) { - return SearchTextWithTextPositionDto.empty(); - } - - Context context = new Context(); - - RedTextPosition currentTextPosition = sequences.get(0).getTextPositions().get(0); - RedTextPosition previousTextPosition = RedTextPosition.builder().unicode(" ").position(currentTextPosition.getPosition()).build(); - - for (TextPositionSequence word : sequences) { - for (int i = 0; i < word.getTextPositions().size(); ++i) { - - currentTextPosition = word.getTextPositions().get(i); - if (isLineBreak(currentTextPosition, previousTextPosition)) { - removeHyphenLinebreaks(context); - context.lineBreaksStringIdx.add(context.stringIdx); - } - if (!isRepeatedWhitespace(currentTextPosition.getUnicode(), previousTextPosition.getUnicode())) { - if (isHyphen(currentTextPosition.getUnicode())) { - context.lastHyphenIdx = context.stringIdx; - } - appendCurrentTextPosition(context, currentTextPosition); - } - - previousTextPosition = currentTextPosition; - ++context.positionIdx; - } - - previousTextPosition = RedTextPosition.builder().unicode(" ").position(previousTextPosition.getPosition()).build(); - context.stringBuilder.append(" "); - context.stringIdxToPositionIdx.add(context.positionIdx); - ++context.stringIdx; - } - - assert context.stringBuilder.length() == context.stringIdxToPositionIdx.size(); - - List positions = sequences.stream() - .flatMap(sequence -> sequence.getTextPositions().stream().map(textPosition -> mapRedTextPositionToInitialUserSpace(textPosition, sequence))) - .toList(); - - return SearchTextWithTextPositionDto.builder() - .searchText(context.stringBuilder.toString()) - .lineBreaks(context.lineBreaksStringIdx) - .stringCoordsToPositionCoords(context.stringIdxToPositionIdx) - .positions(positions) - .build(); - } - - - private void appendCurrentTextPosition(Context context, RedTextPosition currentTextPosition) { - - context.stringBuilder.append(currentTextPosition.getUnicode()); - - // unicode characters with more than 16-bit encoding have a length > 1 in java strings - for (int j = 0; j < currentTextPosition.getUnicode().length(); j++) { - context.stringIdxToPositionIdx.add(context.positionIdx); - } - context.stringIdx += currentTextPosition.getUnicode().length(); - } - - - private void removeHyphenLinebreaks(Context context) { - - if (lastHyphenDirectlyBeforeLineBreak(context)) { - context.stringBuilder.delete(context.lastHyphenIdx, context.stringBuilder.length()); - context.stringIdxToPositionIdx = context.stringIdxToPositionIdx.subList(0, context.lastHyphenIdx); - context.stringIdx = context.lastHyphenIdx; - context.lastHyphenIdx = -MAX_HYPHEN_LINEBREAK_DISTANCE; - } - } - - - private boolean lastHyphenDirectlyBeforeLineBreak(Context context) { - - return context.stringIdx - context.lastHyphenIdx < MAX_HYPHEN_LINEBREAK_DISTANCE; - } - - - private boolean isLineBreak(RedTextPosition currentTextPosition, RedTextPosition previousTextPosition) { - - return Objects.equals(currentTextPosition.getUnicode(), "\n") || isDeltaYLargerThanTextHeight(currentTextPosition, previousTextPosition); - } - - - private boolean isDeltaYLargerThanTextHeight(RedTextPosition currentPosition, RedTextPosition previousPosition) { - - if (previousPosition == null) { - return false; - } - - float deltaY = Math.abs(currentPosition.getYDirAdj() - previousPosition.getYDirAdj()); - return deltaY >= currentPosition.getHeightDir(); - } - - - private boolean isRepeatedWhitespace(String currentUnicode, String previousUnicode) { - - return Objects.equals(previousUnicode, " ") && Objects.equals(currentUnicode, " "); - } - - - private boolean isHyphen(String unicodeCharacter) { - - return Objects.equals(unicodeCharacter, "-") || // - Objects.equals(unicodeCharacter, "~") || // - Objects.equals(unicodeCharacter, "‐") || // - Objects.equals(unicodeCharacter, "‒") || // - Objects.equals(unicodeCharacter, "⁻") || // - Objects.equals(unicodeCharacter, "−") || // - Objects.equals(unicodeCharacter, "﹣") || // - Objects.equals(unicodeCharacter, "゠") || // - Objects.equals(unicodeCharacter, "⁓") || // - Objects.equals(unicodeCharacter, "‑") || // - Objects.equals(unicodeCharacter, "\u00AD"); - } - - - private Rectangle2D mapRedTextPositionToInitialUserSpace(RedTextPosition textPosition, TextPositionSequence sequence) { - - float textHeight = sequence.getTextHeight() + HEIGHT_PADDING; - Rectangle2D rectangle2D = new Rectangle2D.Double(textPosition.getXDirAdj(), - textPosition.getYDirAdj() - textHeight, - textPosition.getWidthDirAdj(), - textHeight + HEIGHT_PADDING); - - AffineTransform transform = new AffineTransform(); - - if (sequence.getDir() == TextDirection.ZERO || sequence.getDir() == TextDirection.HALF_CIRCLE) { - transform.rotate(sequence.getDir().getRadians(), sequence.getPageWidth() / 2f, sequence.getPageHeight() / 2f); - transform.translate(0f, sequence.getPageHeight()); - } else if (sequence.getDir() == TextDirection.QUARTER_CIRCLE) { - transform.rotate(sequence.getDir().getRadians(), sequence.getPageWidth() / 2f, sequence.getPageWidth() / 2f); - transform.translate(0f, sequence.getPageWidth()); - } else { - transform.rotate(sequence.getDir().getRadians(), sequence.getPageHeight() / 2f, sequence.getPageHeight() / 2f); - transform.translate(0f, sequence.getPageWidth()); - } - transform.scale(1., -1.); - - return transform.createTransformedShape(rectangle2D).getBounds2D(); - } - - - private class Context { - - List stringIdxToPositionIdx = new LinkedList<>(); - List lineBreaksStringIdx = new LinkedList<>(); - StringBuilder stringBuilder = new StringBuilder(); - - int stringIdx; - int positionIdx; - - int lastHyphenIdx = -MAX_HYPHEN_LINEBREAK_DISTANCE; - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/SectionNodeFactory.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/SectionNodeFactory.java deleted file mode 100644 index e8d06ea0..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/SectionNodeFactory.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.document.factory; - -import static java.lang.String.format; -import static java.util.Collections.emptyList; -import static java.util.stream.Collectors.groupingBy; - -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Stream; - -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.GenericSemanticNode; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.TablePageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.document.utils.TableMergingUtility; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class SectionNodeFactory { - - public void addSection(GenericSemanticNode parentNode, List pageBlocks, List images, DocumentGraphFactory.Context context) { - - if (pageBlocks.isEmpty()) { - return; - } - Map> blocksPerPage = pageBlocks.stream().collect(groupingBy(AbstractPageBlock::getPage)); - Section section = Section.builder().documentTree(context.getDocumentTree()).build(); - - context.getSections().add(section); - blocksPerPage.keySet().forEach(pageNumber -> addSectionNodeToPageNode(context, section, pageNumber)); - - section.setTreeId(getTreeId(parentNode, context, section)); - - addFirstHeadlineDirectlyToSection(pageBlocks, context, section); - if (containsTablesAndTextBlocks(pageBlocks)) { - splitPageBlocksIntoSubSections(pageBlocks).forEach(subSectionPageBlocks -> addSection(section, subSectionPageBlocks, emptyList(), context)); - } else { - addTablesAndParagraphsAndHeadlinesToSection(pageBlocks, context, section); - } - - images.stream().distinct().forEach(image -> DocumentGraphFactory.addImage(section, image, context)); - } - - - private List getTreeId(GenericSemanticNode parentNode, DocumentGraphFactory.Context context, Section section) { - - if (parentNode == null) { - return context.getDocumentTree().createNewMainEntryAndReturnId(section); - } else { - return context.getDocumentTree().createNewChildEntryAndReturnId(parentNode, section); - } - } - - - private void addFirstHeadlineDirectlyToSection(List pageBlocks, DocumentGraphFactory.Context context, Section section) { - - if (pageBlocks.get(0).isHeadline()) { - addTablesAndParagraphsAndHeadlinesToSection(List.of(pageBlocks.get(0)), context, section); - pageBlocks.remove(0); - } - } - - - private void addTablesAndParagraphsAndHeadlinesToSection(List pageBlocks, DocumentGraphFactory.Context context, Section section) { - - Set alreadyMerged = new HashSet<>(); - List remainingBlocks = new LinkedList<>(pageBlocks); - for (AbstractPageBlock abstractPageBlock : pageBlocks) { - - if (alreadyMerged.contains(abstractPageBlock)) { - continue; - } - - remainingBlocks.removeAll(alreadyMerged); - - if (abstractPageBlock instanceof TextPageBlock) { -// List textBlocksToMerge = findTextBlocksWithSameClassificationAndAlignsYAndSameOrientationUntilConvergence((TextPageBlock) abstractPageBlock, remainingBlocks); - List textBlocksToMerge = findTextBlocksWithSameClassificationAndAlignsYAndSameOrientation(List.of((TextPageBlock) abstractPageBlock), - remainingBlocks); - alreadyMerged.addAll(textBlocksToMerge); - DocumentGraphFactory.addParagraphOrHeadline(section, (TextPageBlock) abstractPageBlock, context, textBlocksToMerge); - } else if (abstractPageBlock instanceof TablePageBlock tablePageBlock) { - List tablesToMerge = TableMergingUtility.findConsecutiveTablesWithSameColCountAndSameHeaders(tablePageBlock, remainingBlocks); - alreadyMerged.addAll(tablesToMerge); - TableNodeFactory.addTable(section, tablesToMerge, context); - } else { - throw new RuntimeException(format("Unhandled AbstractPageBlockType %s!", abstractPageBlock.getClass())); - } - } - } - - - private boolean containsTablesAndTextBlocks(List pageBlocks) { - - return pageBlocks.stream().anyMatch(pageBlock -> pageBlock instanceof TablePageBlock) && pageBlocks.stream().anyMatch(pageBlock -> pageBlock instanceof TextPageBlock); - } - - - /** - * This function splits the list of PageBlocks around TablePageBlocks, such that SubSections can be created, that don't include tables. - * This is needed so we can execute rules on sections, that do not contain tables. - * See: document structure wiki - * - * @param pageBlocks a List of AbstractPageBlocks, which have at least one TablePageBlock and one ClassificationTextBlock - * @return List of Lists of AbstractPageBlocks, which include either a single Headline ClassificationTextBlock and a TablePageBlock or only ClassificationTextBlocks. - */ - private List> splitPageBlocksIntoSubSections(List pageBlocks) { - - List> splitList = splitIntoCoherentList(pageBlocks); - movePrecedingHeadlineToTableList(splitList); - return splitList.stream().filter(list -> !list.isEmpty()).toList(); - } - - - private void movePrecedingHeadlineToTableList(List> splitList) { - - for (int i = 0; i < splitList.size(); i++) { - if (listIsTablesOnly(splitList.get(i)) && i > 0) { - List previousList = splitList.get(i - 1); - AbstractPageBlock lastPageBlockInPreviousList = previousList.get(previousList.size() - 1); - if (lastPageBlockInPreviousList.isHeadline()) { - previousList.remove(previousList.size() - 1); - splitList.get(i).add(0, lastPageBlockInPreviousList); - } - } - } - } - - - private boolean listIsTablesOnly(List abstractPageBlocks) { - - return abstractPageBlocks.stream().allMatch(abstractPageBlock -> abstractPageBlock instanceof TablePageBlock); - } - - - /** - * @param pageBlocks a List of AbstractPageBlocks, which have at least one TablePageBlock and one ClassificationTextBlock - * @return List of Lists of AbstractPageBlocks, which are exclusively of type ClassificationTextBlock or TablePageBlock - */ - private List> splitIntoCoherentList(List pageBlocks) { - - List> splitList = new LinkedList<>(); - List currentList = new LinkedList<>(); - splitList.add(currentList); - - Class lastPageBlockClass = pageBlocks.get(0).getClass(); - for (AbstractPageBlock pageBlock : pageBlocks) { - if (lastPageBlockClass.isInstance(pageBlock)) { - currentList.add(pageBlock); - } else { - currentList = new LinkedList<>(); - currentList.add(pageBlock); - splitList.add(currentList); - lastPageBlockClass = pageBlock.getClass(); - } - } - return splitList; - } - - - @SuppressWarnings("PMD") - // experimental feature to be used later - private List findTextBlocksWithSameClassificationAndAlignsYAndSameOrientationUntilConvergence(TextPageBlock originalTextBlocks, - List pageBlocks) { - - int previousCount = 1; - List alignedBlocks = findTextBlocksWithSameClassificationAndAlignsYAndSameOrientation(List.of(originalTextBlocks), pageBlocks); - while (previousCount < alignedBlocks.size()) { - alignedBlocks = findTextBlocksWithSameClassificationAndAlignsYAndSameOrientation(alignedBlocks, pageBlocks); - previousCount = alignedBlocks.size(); - } - return alignedBlocks; - } - - - private static List findTextBlocksWithSameClassificationAndAlignsYAndSameOrientation(List textBlocksToMerge, List pageBlocks) { - - return Stream.concat(pageBlocks.stream() - .filter(abstractPageBlock -> !textBlocksToMerge.contains(abstractPageBlock)) - .filter(abstractPageBlock -> textBlocksToMerge.stream().allMatch(textBlockToMerge -> abstractPageBlock.getPage() == textBlockToMerge.getPage())) - .filter(abstractPageBlock -> textBlocksToMerge.stream().allMatch(textBlockToMerge -> abstractPageBlock.getOrientation().equals(textBlockToMerge.getOrientation()))) - .filter(abstractPageBlock -> textBlocksToMerge.stream().anyMatch(abstractPageBlock::intersectsY)) - //.filter(abstractPageBlock -> textBlocksToMerge.stream().anyMatch(abstractPageBlock::intersectsX)) - .filter(abstractPageBlock -> abstractPageBlock instanceof TextPageBlock) - .map(abstractPageBlock -> (TextPageBlock) abstractPageBlock), // - textBlocksToMerge.stream())// - .toList(); - } - - - private void addSectionNodeToPageNode(DocumentGraphFactory.Context context, Section section, Integer pageNumber) { - - Page page = context.getPage(pageNumber); - page.getMainBody().add(section); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/TableNodeFactory.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/TableNodeFactory.java deleted file mode 100644 index c29d572e..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/TableNodeFactory.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.document.factory; - -import static java.util.Collections.emptyList; - -import java.util.Collection; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.GenericSemanticNode; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Cell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.TablePageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.TableCell; -import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.document.utils.TextPositionOperations; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class TableNodeFactory { - - public final double TABLE_CELL_MERGE_CONTENTS_SIZE_THRESHOLD = 0.05; - - - public void addTable(GenericSemanticNode parentNode, List tablesToMerge, DocumentGraphFactory.Context context) { - - setPageNumberInCells(tablesToMerge); - Set pages = tablesToMerge.stream().map(AbstractPageBlock::getPage).map(context::getPage).collect(Collectors.toSet()); - List> mergedRows = tablesToMerge.stream().map(TablePageBlock::getRows).flatMap(Collection::stream).toList(); - - Table table = Table.builder() - .documentTree(context.getDocumentTree()) - .numberOfCols(mergedRows.isEmpty() ? 0 : mergedRows.get(0).size()) - .numberOfRows(mergedRows.size()) - .build(); - - pages.forEach(page -> addTableToPage(page, parentNode, table)); - - List treeId = context.getDocumentTree().createNewChildEntryAndReturnId(parentNode, table); - table.setTreeId(treeId); - addTableCells(mergedRows, table, context); - - ifTableHasNoHeadersSetFirstRowAsHeaders(table); - } - - - private void setPageNumberInCells(List tablesToMerge) { - - // For some reason I can't figure out, in some table cells, the ClassificationTextBlocks have 0 as page number - // So I am fixing this here, but this should actually be fixed upstream. - tablesToMerge.forEach(table -> table.getRows() - .stream() - .flatMap(Collection::stream) - .peek(cell -> cell.setPageNumber(table.getPage())) - .forEach(cell -> setPageNumberInTextBlocksWithPageNumberSetTo0(table, cell))); - } - - - private void setPageNumberInTextBlocksWithPageNumberSetTo0(TablePageBlock table, Cell cell) { - - cell.getTextBlocks().stream()// - .filter(tb -> tb.getPage() == 0)// - .forEach(tb -> tb.setPage(table.getPage())); - } - - - @SuppressWarnings("PMD.UnusedPrivateMethod") // PMD actually flags this wrong - private void addTableToPage(Page page, SemanticNode parentNode, Table table) { - - if (!page.getMainBody().contains(parentNode)) { - parentNode.getPages().add(page); - } - - page.getMainBody().add(table); - } - - - private void ifTableHasNoHeadersSetFirstRowAsHeaders(Table table) { - - if (table.streamHeaders().findAny().isEmpty()) { - table.streamRow(0).forEach(tableCellNode -> tableCellNode.setHeader(true)); - } - } - - - private void addTableCells(List> rows, Table table, DocumentGraphFactory.Context context) { - - for (int rowIndex = 0; rowIndex < rows.size(); rowIndex++) { - for (int colIndex = 0; colIndex < rows.get(rowIndex).size(); colIndex++) { - addTableCell(rows.get(rowIndex).get(colIndex), rowIndex, colIndex, table, context); - } - } - } - - - @SuppressWarnings("PMD.UnusedPrivateMethod") // PMD actually flags this wrong - private void addTableCell(Cell cell, int rowIndex, int colIndex, Table tableNode, DocumentGraphFactory.Context context) { - - Page page = context.getPage(cell.getPageNumber()); - - TableCell tableCell = TableCell.builder().documentTree(context.getDocumentTree()).row(rowIndex).col(colIndex).header(cell.isHeaderCell()).bBox(cell.getBounds2D()).build(); - page.getMainBody().add(tableCell); - - List treeId = context.getDocumentTree().createNewTableChildEntryAndReturnId(tableNode, tableCell); - tableCell.setTreeId(treeId); - - TextBlock textBlock; - if (cell.getTextBlocks().isEmpty()) { - tableCell.setLeafTextBlock(context.getTextBlockFactory().emptyTextBlock(tableNode, context, page)); - } else if (cell.getTextBlocks().size() == 1) { - textBlock = context.getTextBlockFactory().fromContext(cell.getTextBlocks().get(0).getSequences(), tableCell, context, page); - tableCell.setLeafTextBlock(textBlock); - } else if (firstTextBlockIsHeadline(cell)) { - SectionNodeFactory.addSection(tableCell, cell.getTextBlocks().stream().map(tb -> (AbstractPageBlock) tb).toList(), emptyList(), context); - } else if (cellAreaIsSmallerThanPageAreaTimesThreshold(cell, page)) { - List sequences = TextPositionOperations.mergeAndSortTextPositionSequenceByYThenX(cell.getTextBlocks()); - textBlock = context.getTextBlockFactory().fromContext(sequences, tableCell, context, page); - tableCell.setLeafTextBlock(textBlock); - } else { - cell.getTextBlocks().forEach(tb -> DocumentGraphFactory.addParagraphOrHeadline(tableCell, tb, context, List.of(tb))); - } - } - - - private boolean cellAreaIsSmallerThanPageAreaTimesThreshold(Cell cell, Page page) { - - return cell.getArea() < TABLE_CELL_MERGE_CONTENTS_SIZE_THRESHOLD * page.getHeight() * page.getWidth(); - } - - - private boolean firstTextBlockIsHeadline(Cell cell) { - - return cell.getTextBlocks().get(0).isHeadline(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/TextBlockFactory.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/TextBlockFactory.java deleted file mode 100644 index efb3b383..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/factory/TextBlockFactory.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.document.factory; - -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.document.graph.textblock.AtomicTextBlock; - -import lombok.AccessLevel; -import lombok.experimental.FieldDefaults; - -@FieldDefaults(level = AccessLevel.PRIVATE) -public class TextBlockFactory { - - int stringOffset; - long textBlockIdx; - - - public AtomicTextBlock fromContext(List sequences, SemanticNode parent, DocumentGraphFactory.Context context, Page page) { - - Integer numberOnPage = context.getAndIncrementTextBlockNumberOnPage(page); - return fromNumberOnPage(sequences, parent, numberOnPage, page); - } - - - public AtomicTextBlock fromNumberOnPage(List sequences, SemanticNode parent, Integer numberOnPage, Page page) { - - SearchTextWithTextPositionDto searchTextWithTextPositionDto = SearchTextWithTextPositionFactory.buildSearchTextToTextPositionModel(sequences); - int offset = stringOffset; - stringOffset += searchTextWithTextPositionDto.getSearchText().length(); - long idx = textBlockIdx; - textBlockIdx++; - return AtomicTextBlock.fromSearchTextWithTextPositionDto(searchTextWithTextPositionDto, parent, offset, idx, numberOnPage, page); - } - - - public AtomicTextBlock emptyTextBlock(SemanticNode parent, DocumentGraphFactory.Context context, Page page) { - - long idx = textBlockIdx; - textBlockIdx++; - return AtomicTextBlock.empty(idx, stringOffset, page, context.getAndIncrementTextBlockNumberOnPage(page), parent); - } - - - public AtomicTextBlock emptyTextBlockFromInteger(SemanticNode parent, Integer numberOnPage, Page page) { - - long idx = textBlockIdx; - textBlockIdx++; - return AtomicTextBlock.empty(idx, stringOffset, page, numberOnPage, parent); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Page.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Page.java index c7fefb81..a0abb47f 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Page.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/nodes/Page.java @@ -6,7 +6,6 @@ import java.util.List; import java.util.Set; import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlockCollector; @@ -48,18 +47,6 @@ public class Page { Set images = new HashSet<>(); - public static Page fromClassificationPage(ClassificationPage classificationPage) { - - return Page.builder() - .height((int) classificationPage.getPageHeight()) - .width((int) classificationPage.getPageWidth()) - .number(classificationPage.getPageNumber()) - .rotation(classificationPage.getRotation()) - .mainBody(new LinkedList<>()) - .build(); - } - - public TextBlock getMainBodyTextBlock() { return mainBody.stream().filter(SemanticNode::isLeaf).map(SemanticNode::getLeafTextBlock).collect(new TextBlockCollector()); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/AtomicTextBlock.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/AtomicTextBlock.java index fa1fa23d..83bd426b 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/AtomicTextBlock.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/graph/textblock/AtomicTextBlock.java @@ -12,13 +12,12 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import com.iqser.red.service.redaction.v1.server.document.factory.SearchTextWithTextPositionDto; import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; import com.iqser.red.service.redaction.v1.server.document.utils.RectangleTransformations; -import com.iqser.red.service.redaction.v1.server.document.data.AtomicPositionBlockData; -import com.iqser.red.service.redaction.v1.server.document.data.AtomicTextBlockData; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPositionData; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentTextData; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -58,28 +57,6 @@ public class AtomicTextBlock implements TextBlock { return lineBreaks.size() + 1; } - - public static AtomicTextBlock fromSearchTextWithTextPositionDto(SearchTextWithTextPositionDto searchTextWithTextPositionDto, - SemanticNode parent, - int stringOffset, - Long textBlockIdx, - Integer numberOnPage, - Page page) { - - return AtomicTextBlock.builder() - .id(textBlockIdx) - .parent(parent) - .searchText(searchTextWithTextPositionDto.getSearchText()) - .numberOnPage(numberOnPage) - .page(page) - .lineBreaks(searchTextWithTextPositionDto.getLineBreaks()) - .positions(searchTextWithTextPositionDto.getPositions()) - .stringIdxToPositionIdx(searchTextWithTextPositionDto.getStringCoordsToPositionCoords()) - .boundary(new Boundary(stringOffset, stringOffset + searchTextWithTextPositionDto.getSearchText().length())) - .build(); - } - - public static AtomicTextBlock empty(Long textBlockIdx, int stringOffset, Page page, int numberOnPage, SemanticNode parent) { return AtomicTextBlock.builder() @@ -96,8 +73,8 @@ public class AtomicTextBlock implements TextBlock { } - public static AtomicTextBlock fromAtomicTextBlockData(AtomicTextBlockData atomicTextBlockData, - AtomicPositionBlockData atomicPositionBlockData, + public static AtomicTextBlock fromAtomicTextBlockData(DocumentTextData atomicTextBlockData, + DocumentPositionData atomicPositionBlockData, SemanticNode parent, Page page) { diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/RectangleTransformations.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/RectangleTransformations.java index 745e1f87..28d036ab 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/RectangleTransformations.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/RectangleTransformations.java @@ -12,11 +12,9 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collector; -import org.apache.pdfbox.pdmodel.common.PDRectangle; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; import com.iqser.red.service.redaction.v1.server.document.graph.textblock.AtomicTextBlock; import lombok.AllArgsConstructor; @@ -24,27 +22,6 @@ import lombok.NoArgsConstructor; public class RectangleTransformations { - public static PDRectangle toPDRectangleBBox(List rectangles) { - - Rectangle2D rectangle2D = RectangleTransformations.rectangleBBox(rectangles); - - PDRectangle annotationPosition = new PDRectangle(); - annotationPosition.setLowerLeftX((float) rectangle2D.getMinX()); - annotationPosition.setLowerLeftY((float) rectangle2D.getMinY()); - annotationPosition.setUpperRightX((float) rectangle2D.getMaxX()); - annotationPosition.setUpperRightY((float) rectangle2D.getMaxY()); - return annotationPosition; - } - - public static Rectangle2D abstractPageBlockBBox(List abstractPageBlocks) { - - return abstractPageBlocks.stream() - .map(abstractPageBlock -> new Rectangle2D.Double(abstractPageBlock.getMinX(), - abstractPageBlock.getMinY(), - abstractPageBlock.getWidth(), - abstractPageBlock.getHeight())).collect(new Rectangle2DBBoxCollector()); - } - public static Rectangle2D atomicTextBlockBBox(List atomicTextBlocks) { @@ -114,12 +91,6 @@ public class RectangleTransformations { } - public static Rectangle2D toRectangle2D(PDRectangle cropBox) { - - return new Rectangle2D.Double(cropBox.getLowerLeftX(), cropBox.getLowerLeftY(), cropBox.getWidth(), cropBox.getHeight()); - } - - private static class Rectangle2DBBoxCollector implements Collector { @Override diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/TableMergingUtility.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/TableMergingUtility.java deleted file mode 100644 index 918ab52d..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/TableMergingUtility.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.document.utils; - -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; -import java.util.stream.Stream; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Cell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.TablePageBlock; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class TableMergingUtility { - - private static final double TABLE_ALIGNMENT_THRESHOLD = 2d; - - - public List findConsecutiveTablesWithSameColCountAndSameHeaders(TablePageBlock originalTablePageBlock, List pageBlocks) { - - List consecutiveTables = pageBlocks.stream() - .map(abstractPageBlock -> (TablePageBlock) abstractPageBlock) - .filter(tablePageBlock -> !tablePageBlock.equals(originalTablePageBlock)) - .toList(); - assert consecutiveTables.size() == pageBlocks.size() - 1; - - List consecutiveTablesWithSameColCountAndHeaders = new LinkedList<>(); - for (TablePageBlock consecutiveTable : consecutiveTables) { - if (consecutiveTable.getColCount() == originalTablePageBlock.getColCount() && !hasTableHeader(consecutiveTable) && outerBoundaryAlignsX(originalTablePageBlock, - consecutiveTable)) { - consecutiveTablesWithSameColCountAndHeaders.add(consecutiveTable); - } else { - break; - } - } - return Stream.concat(Stream.of(originalTablePageBlock), consecutiveTablesWithSameColCountAndHeaders.stream()).toList(); - } - - - private static boolean outerBoundaryAlignsX(TablePageBlock originalTablePageBlock, TablePageBlock consecutiveTable) { - - return Math.abs(consecutiveTable.getMinX() - originalTablePageBlock.getMinX()) < TABLE_ALIGNMENT_THRESHOLD && Math.abs(consecutiveTable.getMaxX() - originalTablePageBlock.getMaxX()) < TABLE_ALIGNMENT_THRESHOLD; - } - - - private boolean hasTableHeader(TablePageBlock table) { - - return table.getRows().stream().flatMap(Collection::stream).anyMatch(Cell::isHeaderCell); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/TextPositionOperations.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/TextPositionOperations.java deleted file mode 100644 index e57abb58..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/TextPositionOperations.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.document.utils; - -import java.util.List; -import java.util.stream.Collectors; - -import org.apache.pdfbox.util.QuickSort; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; - -public class TextPositionOperations { - - private static final TextPositionSequenceComparator comparator = new TextPositionSequenceComparator(); - - - public static List mergeAndSortTextPositionSequenceByYThenX(List textBlocks) { - - var sequence = textBlocks.stream().flatMap(tb -> tb.getSequences().stream()).collect(Collectors.toList()); - - // because the TextPositionSequenceComparator is not transitive, but - // JDK7+ enforces transitivity on comparators, we need to use - // a custom quicksort implementation (which is slower, unfortunately). - QuickSort.sort(sequence, comparator); - return sequence; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/TextPositionSequenceComparator.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/TextPositionSequenceComparator.java deleted file mode 100644 index 3cddb638..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/TextPositionSequenceComparator.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.iqser.red.service.redaction.v1.server.document.utils; - -import java.util.Comparator; - -import org.apache.pdfbox.text.TextPosition; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; - -/** - * This class is a comparator for TextPosition operators. It handles - * pages with text in different directions by grouping the text based - * on direction and sorting in that direction. This allows continuous text - * in a given direction to be more easily grouped together. - * - * @author Ben Litchfield - */ -public class TextPositionSequenceComparator implements Comparator -{ - @Override - public int compare(TextPositionSequence pos1, TextPositionSequence pos2) - { - // only compare text that is in the same direction - int cmp1 = Float.compare(pos1.getDir().getDegrees(), pos2.getDir().getDegrees()); - if (cmp1 != 0) - { - return cmp1; - } - - // get the text direction adjusted coordinates - float x1 = pos1.getMinXDirAdj(); - float x2 = pos2.getMinXDirAdj(); - - float pos1YBottom = pos1.getMaxYDirAdj(); - float pos2YBottom = pos2.getMaxYDirAdj(); - - // note that the coordinates have been adjusted so 0,0 is in upper left - float pos1YTop = pos1YBottom - pos1.getTextHeight(); - float pos2YTop = pos2YBottom - pos2.getTextHeight(); - - float yDifference = Math.abs(pos1YBottom - pos2YBottom); - - // we will do a simple tolerance comparison - if (yDifference < .1 || - pos2YBottom >= pos1YTop && pos2YBottom <= pos1YBottom || - pos1YBottom >= pos2YTop && pos1YBottom <= pos2YBottom) - { - return Float.compare(x1, x2); - } - else if (pos1YBottom < pos2YBottom) - { - return -1; - } - else - { - return 1; - } - } -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/ImageServiceResponseAdapter.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/ImageServiceResponseAdapter.java deleted file mode 100644 index 72b3e104..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/ImageServiceResponseAdapter.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter; - -import java.awt.geom.Rectangle2D; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; - -import org.springframework.stereotype.Service; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image.ImageServiceResponse; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; -import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; - -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; - -@Service -@RequiredArgsConstructor -public class ImageServiceResponseAdapter { - - private final ObjectMapper objectMapper; - private final RedactionStorageService redactionStorageService; - - - @SneakyThrows - public Map> convertImages(String dossierId, String fileId) { - - var imageClassificationStream = redactionStorageService.getStoredObject(RedactionStorageService.StorageIdUtils.getStorageId(dossierId, fileId, FileType.IMAGE_INFO)); - - ImageServiceResponse imageServiceResponse = objectMapper.readValue(imageClassificationStream, ImageServiceResponse.class); - - Map> images = new HashMap<>(); - imageServiceResponse.getData().forEach(imageMetadata -> { - var classification = imageMetadata.getFilters().isAllPassed() ? ImageType.valueOf(imageMetadata.getClassification() - .getLabel() - .toUpperCase(Locale.ROOT)) : ImageType.OTHER; - images.computeIfAbsent(imageMetadata.getPosition().getPageNumber(), x -> new ArrayList<>()) - .add(new ClassifiedImage(new Rectangle2D.Double(imageMetadata.getPosition().getX1(), - imageMetadata.getPosition().getY1(), - imageMetadata.getGeometry().getWidth(), - imageMetadata.getGeometry().getHeight()), classification, imageMetadata.isAlpha(), imageMetadata.getPosition().getPageNumber())); - }); - - // Currently This is a copy but, it will be changed later because i don' t think that we should unclassified images. - imageServiceResponse.getDataCV().forEach(imageMetadata -> { - var classification = imageMetadata.getFilters().isAllPassed() ? ImageType.valueOf(imageMetadata.getClassification() - .getLabel() - .toUpperCase(Locale.ROOT)) : ImageType.OTHER; - images.computeIfAbsent(imageMetadata.getPosition().getPageNumber(), x -> new ArrayList<>()) - .add(new ClassifiedImage(new Rectangle2D.Double(imageMetadata.getPosition().getX1(), - imageMetadata.getPosition().getY1(), - imageMetadata.getGeometry().getWidth(), - imageMetadata.getGeometry().getHeight()), classification, imageMetadata.isAlpha(), imageMetadata.getPosition().getPageNumber())); - }); - - return images; - } - - - public void findOcr(ClassificationPage page) { - - page.getImages().forEach(image -> { - if (image.getImageType().equals(ImageType.OTHER)) { - page.getTextBlocks().forEach(textblock -> { - if (image.getPosition().contains(textblock.getMinX(), textblock.getMinY(), textblock.getWidth(), textblock.getHeight())) { - image.setImageType(ImageType.OCR); - } - }); - } - }); - } - - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/TableServiceResponseAdapter.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/TableServiceResponseAdapter.java deleted file mode 100644 index 779414f5..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/TableServiceResponseAdapter.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.stereotype.Service; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table.PdfTableCell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table.TableCells; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table.TableServiceResponse; -import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; - -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -public class TableServiceResponseAdapter { - - private final ObjectMapper objectMapper; - private final RedactionStorageService redactionStorageService; - - - @SneakyThrows - public Map> convertTables(String dossierId, String fileId) { - - var tableClassificationStream = redactionStorageService.getStoredObject(RedactionStorageService.StorageIdUtils.getStorageId(dossierId, fileId, FileType.TABLES)); - - TableServiceResponse tableServiceResponse = objectMapper.readValue(tableClassificationStream, TableServiceResponse.class); - - Map> tableCells = new HashMap<>(); - tableServiceResponse.getData() - .forEach(tableData -> tableCells.computeIfAbsent(tableData.getPageInfo().getNumber(), tableCell -> new ArrayList<>()) - .addAll(convertTableCells(tableData.getTableCells()))); - - return tableCells; - } - - - private Collection convertTableCells(List tableCells) { - - List pdfTableCells = new ArrayList<>(); - - tableCells.forEach(t -> pdfTableCells.add(PdfTableCell.builder() - .y0(t.getY0()) - .x1(t.getX1()) - .y1(t.getY1()) - .x0(t.getX0()) - .width(t.getWidth()) - .height(t.getHeight()) - .build())); - - return pdfTableCells; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Classification.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Classification.java deleted file mode 100644 index 9de8a10d..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Classification.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import java.util.HashMap; -import java.util.Map; - -import lombok.Data; - -@Data -public class Classification { - - private Map probabilities = new HashMap<>(); - private String label; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/FilterGeometry.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/FilterGeometry.java deleted file mode 100644 index ed8fead8..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/FilterGeometry.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class FilterGeometry { - - private ImageSize imageSize; - private ImageFormat imageFormat; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Filters.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Filters.java deleted file mode 100644 index ee0e7723..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Filters.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class Filters { - - private FilterGeometry geometry; - private Probability probability; - private boolean allPassed; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Geometry.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Geometry.java deleted file mode 100644 index ddebcdf8..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Geometry.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class Geometry { - - private float width; - private float height; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageFormat.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageFormat.java deleted file mode 100644 index 7cea1acb..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageFormat.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class ImageFormat { - - private float quotient; - private boolean tooTall; - private boolean tooWide; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageMetadata.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageMetadata.java deleted file mode 100644 index 1efe46dd..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageMetadata.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class ImageMetadata { - - private Classification classification; - private Position position; - private Geometry geometry; - private Filters filters; - private boolean alpha; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageServiceResponse.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageServiceResponse.java deleted file mode 100644 index 8a23e734..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageServiceResponse.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import java.util.ArrayList; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonAlias; -import com.fasterxml.jackson.annotation.JsonProperty; - -import lombok.Data; - -@Data -public class ImageServiceResponse { - - private String dossierId; - private String fileId; - - @JsonProperty(value = "imageMetadata") - @JsonAlias("data") - private List data = new ArrayList<>(); - - private List dataCV = new ArrayList<>(); - - - @JsonProperty(value = "imageMetadata") - @JsonAlias("data") - public void setData(List data) {this.data = data;} - - - public List getData() { - - if (this.data == null) { - this.data = new ArrayList<>(); - } - return data; - } - - - public List getDataCV() { - - if (this.dataCV == null) { - this.dataCV = new ArrayList<>(); - } - return dataCV; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageSize.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageSize.java deleted file mode 100644 index 226f6ca1..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/ImageSize.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class ImageSize { - - private float quotient; - private boolean tooLarge; - private boolean tooSmall; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Position.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Position.java deleted file mode 100644 index 911f5aed..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Position.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class Position { - - private float x1; - private float x2; - private float y1; - private float y2; - private int pageNumber; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Probability.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Probability.java deleted file mode 100644 index db286e40..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/image/Probability.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.image; - -import lombok.Data; - -@Data -public class Probability { - - private boolean unconfident; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/PageInfo.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/PageInfo.java deleted file mode 100644 index f13a5a72..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/PageInfo.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table; - -import lombok.Data; - -@Data -public class PageInfo { - - private int number; - private int rotation; - private float width; - private float height; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/PdfTableCell.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/PdfTableCell.java deleted file mode 100644 index 313778bc..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/PdfTableCell.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.RequiredArgsConstructor; - -@Data -@Builder -@AllArgsConstructor -@RequiredArgsConstructor -public class PdfTableCell { - - private float x0; - private float y0; - private float x1; - private float y1; - private float width; - private float height; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableCells.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableCells.java deleted file mode 100644 index 1771b794..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableCells.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table; - -import lombok.Data; - -@Data -public class TableCells { - - private float x0; - private float y0; - private float x1; - private float y1; - private float width; - private float height; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableData.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableData.java deleted file mode 100644 index 5426e952..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableData.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table; - -import java.util.ArrayList; -import java.util.List; - -import lombok.Data; - -@Data -public class TableData { - - private PageInfo pageInfo; - private List tableCells = new ArrayList<>(); - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableServiceResponse.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableServiceResponse.java deleted file mode 100644 index 2afc4a80..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/adapter/table/TableServiceResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table; - -import java.util.ArrayList; -import java.util.List; - -import lombok.Data; - -@Data -public class TableServiceResponse { - - private String dossierId; - private String fileId; - private String operation; - private String targetFileExtension; - private String responseFileExtension; - - private List data = new ArrayList<>(); - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/AbstractPageBlock.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/AbstractPageBlock.java deleted file mode 100644 index d4a49133..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/AbstractPageBlock.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public abstract class AbstractPageBlock { - - @JsonIgnore - protected float minX; - @JsonIgnore - protected float maxX; - @JsonIgnore - protected float minY; - @JsonIgnore - protected float maxY; - @JsonIgnore - protected PageBlockType classification; - @JsonIgnore - protected int page; - - int columnIndex; - - @JsonIgnore - private Orientation orientation = Orientation.NONE; - - - public abstract String getText(); - - - public boolean isHeadline() { - - return this instanceof TextPageBlock && this.getClassification() != null && this.getClassification().isHeadline(); - } - - - public boolean containsBlock(TextPageBlock other) { - - return this.minX <= other.getPdfMinX() && this.maxX >= other.getPdfMaxX() && this.minY >= other.getPdfMinY() && this.maxY <= other.getPdfMaxY(); - } - - - public boolean contains(AbstractPageBlock other) { - - return this.minX <= other.minX && this.maxX >= other.maxX && this.minY >= other.minY && this.maxY <= other.maxY; - } - - - public boolean contains(Rectangle other) { - - return page == other.getPage() && this.minX <= other.getTopLeft().getX() && this.maxX >= other.getTopLeft().getX() + other.getWidth() && this.minY <= other.getTopLeft() - .getY() && this.maxY >= other.getTopLeft().getY() + other.getHeight(); - } - - - @JsonIgnore - public float getHeight() { - - return maxY - minY; - } - - - @JsonIgnore - public float getWidth() { - - return maxX - minX; - } - - - public boolean intersectsY(AbstractPageBlock atc) { - - return this.minY <= atc.getMaxY() && this.maxY >= atc.getMinY(); - } - - - public boolean intersectsX(AbstractPageBlock atc) { - - return this.minX <= atc.getMaxX() && this.maxX >= atc.getMinX(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationDocument.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationDocument.java deleted file mode 100644 index e27faf0e..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationDocument.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import java.util.ArrayList; -import java.util.List; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.StringFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.UnclassifiedText; -import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryVersion; - -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public class ClassificationDocument { - - private List pages = new ArrayList<>(); - private List sections = new ArrayList<>(); - private List headers = new ArrayList<>(); - private List footers = new ArrayList<>(); - private List unclassifiedTexts = new ArrayList<>(); - private FloatFrequencyCounter textHeightCounter = new FloatFrequencyCounter(); - private FloatFrequencyCounter fontSizeCounter = new FloatFrequencyCounter(); - private StringFrequencyCounter fontCounter = new StringFrequencyCounter(); - private StringFrequencyCounter fontStyleCounter = new StringFrequencyCounter(); - private boolean headlines; - - private SectionGrid sectionGrid = new SectionGrid(); - private DictionaryVersion dictionaryVersion; - private long rulesVersion; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationFooter.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationFooter.java deleted file mode 100644 index 221bda7f..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationFooter.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class ClassificationFooter { - - private List textBlocks; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationHeader.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationHeader.java deleted file mode 100644 index 53f1972a..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationHeader.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class ClassificationHeader { - - private List textBlocks; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationPage.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationPage.java deleted file mode 100644 index d9b38623..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationPage.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import java.util.ArrayList; -import java.util.List; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.StringFrequencyCounter; - -import lombok.Data; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; - -@Data -@RequiredArgsConstructor -public class ClassificationPage { - - @NonNull - private List textBlocks; - - private List images = new ArrayList<>(); - - private Rectangle bodyTextFrame; - - private boolean landscape; - private int rotation; - - private int pageNumber; - - private FloatFrequencyCounter textHeightCounter = new FloatFrequencyCounter(); - private FloatFrequencyCounter fontSizeCounter = new FloatFrequencyCounter(); - private StringFrequencyCounter fontCounter = new StringFrequencyCounter(); - private StringFrequencyCounter fontStyleCounter = new StringFrequencyCounter(); - - private float pageWidth; - private float pageHeight; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationSection.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationSection.java deleted file mode 100644 index 5ee7a0a4..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ClassificationSection.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import java.util.ArrayList; -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.TablePageBlock; - -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public class ClassificationSection { - - private List pageBlocks = new ArrayList<>(); - private List images = new ArrayList<>(); - private String headline; - - - public List getTables() { - - List tables = new ArrayList<>(); - pageBlocks.forEach(block -> { - if (block instanceof TablePageBlock) { - tables.add((TablePageBlock) block); - } - }); - return tables; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/Column.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/Column.java deleted file mode 100644 index ffd4a37d..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/Column.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import java.awt.geom.Rectangle2D; - -import lombok.AllArgsConstructor; - -@AllArgsConstructor -public class Column { - - int index; - ColumnType columnType; - Rectangle2D bBox; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ColumnType.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ColumnType.java deleted file mode 100644 index d2212c42..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/ColumnType.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -public enum ColumnType { - RULING, - DISTANCE -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/FloatFrequencyCounter.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/FloatFrequencyCounter.java deleted file mode 100755 index f656a839..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/FloatFrequencyCounter.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import lombok.Getter; - -public class FloatFrequencyCounter { - - @Getter - Map countPerValue = new HashMap<>(); - - - public void add(float value) { - - if (!countPerValue.containsKey(value)) { - countPerValue.put(value, 1); - } else { - countPerValue.put(value, countPerValue.get(value) + 1); - } - } - - - public void addAll(Map otherCounter) { - - for (Map.Entry entry : otherCounter.entrySet()) { - if (countPerValue.containsKey(entry.getKey())) { - countPerValue.put(entry.getKey(), countPerValue.get(entry.getKey()) + entry.getValue()); - } else { - countPerValue.put(entry.getKey(), entry.getValue()); - } - } - } - - - public Float getMostPopular() { - - Map.Entry mostPopular = null; - for (Map.Entry entry : countPerValue.entrySet()) { - if (mostPopular == null || entry.getValue() >= mostPopular.getValue()) { - mostPopular = entry; - } - } - return mostPopular != null ? mostPopular.getKey() : null; - } - - - public List getHighterThanMostPopular() { - - Float mostPopular = getMostPopular(); - List higher = new ArrayList<>(); - for (Float value : countPerValue.keySet()) { - if (value > mostPopular) { - higher.add(value); - } - } - - return higher.stream().sorted(Collections.reverseOrder()).collect(Collectors.toList()); - } - - - public Float getHighest() { - - Float highest = null; - for (Float value : countPerValue.keySet()) { - if (highest == null || value > highest) { - highest = value; - } - } - return highest; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/Orientation.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/Orientation.java deleted file mode 100644 index 5cd6a10f..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/Orientation.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -public enum Orientation { - - NONE, - LEFT, - RIGHT -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/PageBlockType.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/PageBlockType.java deleted file mode 100644 index d2991efd..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/PageBlockType.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model; - -public enum PageBlockType { - H1, - H2, - H3, - H4, - H5, - H6, - HEADER, - FOOTER, - TITLE, - PARAGRAPH, - PARAGRAPH_BOLD, - PARAGRAPH_ITALIC, - PARAGRAPH_UNKNOWN, - OTHER, - TABLE; - - - public static PageBlockType getHeadlineType(int i) { - - return switch (i) { - case 1 -> PageBlockType.H1; - case 2 -> PageBlockType.H2; - case 3 -> PageBlockType.H3; - case 4 -> PageBlockType.H4; - case 5 -> PageBlockType.H5; - default -> PageBlockType.H6; - }; - } - - - public boolean isHeadline() { - - return this.equals(H1) || this.equals(H2) || this.equals(H3) || this.equals(H4) || this.equals(H5) || this.equals(H6); - } -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/image/ClassifiedImage.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/image/ClassifiedImage.java deleted file mode 100644 index 268d05b7..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/image/ClassifiedImage.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image; - -import java.awt.geom.Rectangle2D; - -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; - -import lombok.Data; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; - -@Data -@RequiredArgsConstructor -public class ClassifiedImage { - - @NonNull - private Rectangle2D position; - @NonNull - private ImageType imageType; - private boolean isAppendedToSection; - @NonNull - private boolean hasTransparency; - @NonNull - private int page; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Cell.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Cell.java deleted file mode 100644 index 19b64a6a..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Cell.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table; - -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.redaction.utils.TextNormalizationUtilities; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@SuppressWarnings("serial") -@Data -@EqualsAndHashCode(callSuper = true) -@NoArgsConstructor -public class Cell extends Rectangle { - - private List textBlocks = new ArrayList<>(); - - private List headerCells = new ArrayList<>(); - - private boolean isHeaderCell; - - private static final int MIN_SIZE = 1; - - private int pageNumber; - - - public Cell(Point2D topLeft, Point2D bottomRight) { - - super((float) topLeft.getY(), (float) topLeft.getX(), (float) (bottomRight.getX() - topLeft.getX()), (float) (bottomRight.getY() - topLeft.getY())); - } - - - public void addTextBlock(TextPageBlock textBlock) { - - textBlocks.add(textBlock); - } - - - @Override - public String toString() { - - StringBuilder sb = new StringBuilder(); - - Iterator itty = textBlocks.iterator(); - TextPositionSequence previous = null; - while (itty.hasNext()) { - - TextPageBlock textBlock = itty.next(); - - for (TextPositionSequence word : textBlock.getSequences()) { - if (previous != null) { - if (Math.abs(previous.getMaxYDirAdj() - word.getMaxYDirAdj()) > word.getTextHeight()) { - sb.append('\n'); - } else { - sb.append(' '); - } - } - sb.append(word.toString()); - previous = word; - } - - } - - return TextNormalizationUtilities.removeHyphenLineBreaks(sb.toString()).replaceAll("\n", " ").replaceAll(" {2}", " "); - } - - - public boolean hasMinimumSize() { - - return this.getHeight() >= MIN_SIZE && this.getWidth() >= MIN_SIZE; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/CellPosition.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/CellPosition.java deleted file mode 100644 index bec2f274..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/CellPosition.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table; - -import lombok.RequiredArgsConstructor; -import lombok.Value; - -@Value -@RequiredArgsConstructor -public class CellPosition implements Comparable { - - int row; - - int col; - - - @Override - public int compareTo(CellPosition other) { - - int rowDiff = row - other.row; - return rowDiff != 0 ? rowDiff : col - other.col; - } - -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/CleanRulings.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/CleanRulings.java deleted file mode 100644 index 8e41b20a..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/CleanRulings.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table; - -import java.util.List; - -import lombok.Builder; -import lombok.Data; - -@Data -@Builder -public class CleanRulings { - - List horizontal; - List vertical; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Rectangle.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Rectangle.java deleted file mode 100644 index c20f2368..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Rectangle.java +++ /dev/null @@ -1,218 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table; - -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.util.Comparator; -import java.util.List; - -@SuppressWarnings("all") -public class Rectangle extends Rectangle2D.Float { - - protected static final float VERTICAL_COMPARISON_THRESHOLD = 0.4f; - /** - * Ill-defined comparator, from when Rectangle was Comparable. - *

- * see https://github.com/tabulapdf/tabula-java/issues/116 - * - * @deprecated with no replacement - */ - @Deprecated - public static final Comparator ILL_DEFINED_ORDER = new Comparator() { - @Override - public int compare(Rectangle o1, Rectangle o2) { - - if (o1.equals(o2)) { - return 0; - } - if (o1.verticalOverlap(o2) > VERTICAL_COMPARISON_THRESHOLD) { - return o1.isLtrDominant() == -1 && o2.isLtrDominant() == -1 ? -java.lang.Double.compare(o1.getX(), o2.getX()) : java.lang.Double.compare(o1.getX(), o2.getX()); - } else { - return java.lang.Float.compare(o1.getBottom(), o2.getBottom()); - } - } - }; - - - public Rectangle() { - - super(); - } - - - public Rectangle(float top, float left, float width, float height) { - - super(); - this.setRect(left, top, width, height); - } - - - /** - * @param rectangles - * @return minimum bounding box that contains all the rectangles - */ - public static Rectangle boundingBoxOf(List rectangles) { - - float minx = java.lang.Float.MAX_VALUE; - float miny = java.lang.Float.MAX_VALUE; - float maxx = java.lang.Float.MIN_VALUE; - float maxy = java.lang.Float.MIN_VALUE; - - for (Rectangle r : rectangles) { - minx = (float) Math.min(r.getMinX(), minx); - miny = (float) Math.min(r.getMinY(), miny); - maxx = (float) Math.max(r.getMaxX(), maxx); - maxy = (float) Math.max(r.getMaxY(), maxy); - } - return new Rectangle(miny, minx, maxx - minx, maxy - miny); - } - - - public int compareTo(Rectangle other) { - - return ILL_DEFINED_ORDER.compare(this, other); - } - - - // I'm bad at Java and need this for fancy sorting in - // technology.tabula.TextChunk. - public int isLtrDominant() { - - return 0; - } - - - public float getArea() { - - return this.width * this.height; - } - - - public float verticalOverlap(Rectangle other) { - - return Math.max(0, Math.min(this.getBottom(), other.getBottom()) - Math.max(this.getTop(), other.getTop())); - } - - - public boolean verticallyOverlaps(Rectangle other) { - - return verticalOverlap(other) > 0; - } - - - public float horizontalOverlap(Rectangle other) { - - return Math.max(0, Math.min(this.getRight(), other.getRight()) - Math.max(this.getLeft(), other.getLeft())); - } - - - public boolean horizontallyOverlaps(Rectangle other) { - - return horizontalOverlap(other) > 0; - } - - - public float verticalOverlapRatio(Rectangle other) { - - float rv = 0, delta = Math.min(this.getBottom() - this.getTop(), other.getBottom() - other.getTop()); - - if (other.getTop() <= this.getTop() && this.getTop() <= other.getBottom() && other.getBottom() <= this.getBottom()) { - rv = (other.getBottom() - this.getTop()) / delta; - } else if (this.getTop() <= other.getTop() && other.getTop() <= this.getBottom() && this.getBottom() <= other.getBottom()) { - rv = (this.getBottom() - other.getTop()) / delta; - } else if (this.getTop() <= other.getTop() && other.getTop() <= other.getBottom() && other.getBottom() <= this.getBottom()) { - rv = (other.getBottom() - other.getTop()) / delta; - } else if (other.getTop() <= this.getTop() && this.getTop() <= this.getBottom() && this.getBottom() <= other.getBottom()) { - rv = (this.getBottom() - this.getTop()) / delta; - } - - return rv; - - } - - - public float overlapRatio(Rectangle other) { - - double intersectionWidth = Math.max(0, Math.min(this.getRight(), other.getRight()) - Math.max(this.getLeft(), other.getLeft())); - double intersectionHeight = Math.max(0, Math.min(this.getBottom(), other.getBottom()) - Math.max(this.getTop(), other.getTop())); - double intersectionArea = Math.max(0, intersectionWidth * intersectionHeight); - double unionArea = this.getArea() + other.getArea() - intersectionArea; - - return (float) (intersectionArea / unionArea); - } - - - public Rectangle merge(Rectangle other) { - - this.setRect(this.createUnion(other)); - return this; - } - - - public float getTop() { - - return (float) this.getMinY(); - } - - - public void setTop(float top) { - - float deltaHeight = top - this.y; - this.setRect(this.x, top, this.width, this.height - deltaHeight); - } - - - public float getRight() { - - return (float) this.getMaxX(); - } - - - public void setRight(float right) { - - this.setRect(this.x, this.y, right - this.x, this.height); - } - - - public float getLeft() { - - return (float) this.getMinX(); - } - - - public void setLeft(float left) { - - float deltaWidth = left - this.x; - this.setRect(left, this.y, this.width - deltaWidth, this.height); - } - - - public float getBottom() { - - return (float) this.getMaxY(); - } - - - public void setBottom(float bottom) { - - this.setRect(this.x, this.y, this.width, bottom - this.y); - } - - - public Point2D[] getPoints() { - - return new Point2D[]{new Point2D.Float(this.getLeft(), this.getTop()), new Point2D.Float(this.getRight(), this.getTop()), new Point2D.Float(this.getRight(), - this.getBottom()), new Point2D.Float(this.getLeft(), this.getBottom())}; - } - - - @Override - public String toString() { - - StringBuilder sb = new StringBuilder(); - String s = super.toString(); - sb.append(s.substring(0, s.length() - 1)); - sb.append(String.format(",bottom=%f,right=%f]", this.getBottom(), this.getRight())); - return sb.toString(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Ruling.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Ruling.java deleted file mode 100644 index 9988b61e..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/Ruling.java +++ /dev/null @@ -1,437 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table; - -import java.awt.geom.Line2D; -import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Formatter; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.CohenSutherlandClipping; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.Utils; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@SuppressWarnings("all") -public class Ruling extends Line2D.Float { - - private static int PERPENDICULAR_PIXEL_EXPAND_AMOUNT = 2; - - - public Ruling(Point2D p1, Point2D p2) { - - super(p1, p2); - } - - - public static List cropRulingsToArea(List rulings, Rectangle2D area) { - - ArrayList rv = new ArrayList<>(); - for (Ruling r : rulings) { - if (r.intersects(area)) { - rv.add(r.intersect(area)); - } - } - return rv; - } - - - // log(n) implementation of find_intersections - // based on http://people.csail.mit.edu/indyk/6.838-old/handouts/lec2.pdf - public static Map findIntersections(List horizontals, List verticals) { - - class SortObject { - - protected SOType type; - protected float position; - protected Ruling ruling; - - - public SortObject(SOType type, float position, Ruling ruling) { - - this.type = type; - this.position = position; - this.ruling = ruling; - } - - } - - List sos = new ArrayList<>(); - - TreeMap tree = new TreeMap<>(new Comparator() { - @Override - public int compare(Ruling o1, Ruling o2) { - - return java.lang.Double.compare(o1.getTop(), o2.getTop()); - } - }); - - TreeMap rv = new TreeMap<>(new Comparator() { - @Override - public int compare(Point2D o1, Point2D o2) { - - if (o1.getY() > o2.getY()) { - return 1; - } - if (o1.getY() < o2.getY()) { - return -1; - } - if (o1.getX() > o2.getX()) { - return 1; - } - if (o1.getX() < o2.getX()) { - return -1; - } - return 0; - } - }); - - for (Ruling h : horizontals) { - sos.add(new SortObject(SOType.HLEFT, h.getLeft() - PERPENDICULAR_PIXEL_EXPAND_AMOUNT, h)); - sos.add(new SortObject(SOType.HRIGHT, h.getRight() + PERPENDICULAR_PIXEL_EXPAND_AMOUNT, h)); - } - - for (Ruling v : verticals) { - sos.add(new SortObject(SOType.VERTICAL, v.getLeft(), v)); - } - - Collections.sort(sos, new Comparator() { - @Override - public int compare(SortObject a, SortObject b) { - - int rv; - if (Utils.feq(a.position, b.position)) { - if (a.type == SOType.VERTICAL && b.type == SOType.HLEFT) { - rv = 1; - } else if (a.type == SOType.VERTICAL && b.type == SOType.HRIGHT) { - rv = -1; - } else if (a.type == SOType.HLEFT && b.type == SOType.VERTICAL) { - rv = -1; - } else if (a.type == SOType.HRIGHT && b.type == SOType.VERTICAL) { - rv = 1; - } else { - rv = java.lang.Double.compare(a.position, b.position); - } - } else { - return java.lang.Double.compare(a.position, b.position); - } - return rv; - } - }); - - for (SortObject so : sos) { - switch (so.type) { - case VERTICAL: - for (Map.Entry h : tree.entrySet()) { - try { - Point2D i = h.getKey().intersectionPoint(so.ruling); - if (i == null) { - continue; - } - rv.put(i, new Ruling[]{h.getKey().expand(PERPENDICULAR_PIXEL_EXPAND_AMOUNT), so.ruling.expand(PERPENDICULAR_PIXEL_EXPAND_AMOUNT)}); - } catch (UnsupportedOperationException e) { - log.info("Some line are oblique, ignoring..."); - continue; - } - } - break; - case HRIGHT: - tree.remove(so.ruling); - break; - case HLEFT: - tree.put(so.ruling, true); - break; - } - } - - return rv; - - } - - - public boolean vertical() { - - return this.length() > 0 && Utils.feq(this.x1, this.x2); //diff < ORIENTATION_CHECK_THRESHOLD; - } - - - public boolean horizontal() { - - return this.length() > 0 && Utils.feq(this.y1, this.y2); //diff < ORIENTATION_CHECK_THRESHOLD; - } - - // attributes that make sense only for non-oblique lines - // these are used to have a single collapse method (in page, currently) - - - public boolean oblique() { - - return !(this.vertical() || this.horizontal()); - } - - - public float getPosition() { - - if (this.oblique()) { - throw new UnsupportedOperationException(); - } - return this.vertical() ? this.getLeft() : this.getTop(); - } - - - public float getStart() { - - if (this.oblique()) { - throw new UnsupportedOperationException(); - } - return this.vertical() ? this.getTop() : this.getLeft(); - } - - - public void setStart(float v) { - - if (this.oblique()) { - throw new UnsupportedOperationException(); - } - if (this.vertical()) { - this.setTop(v); - } else { - this.setLeft(v); - } - } - - - public float getEnd() { - - if (this.oblique()) { - throw new UnsupportedOperationException(); - } - return this.vertical() ? this.getBottom() : this.getRight(); - } - - - public void setEnd(float v) { - - if (this.oblique()) { - throw new UnsupportedOperationException(); - } - if (this.vertical()) { - this.setBottom(v); - } else { - this.setRight(v); - } - } - - - public void setStartEnd(float start, float end) { - - if (this.oblique()) { - throw new UnsupportedOperationException(); - } - if (this.vertical()) { - this.setTop(start); - this.setBottom(end); - } else { - this.setLeft(start); - this.setRight(end); - } - } - - - public boolean perpendicularTo(Ruling other) { - - return this.vertical() == other.horizontal(); - } - - - public boolean nearlyIntersects(Ruling another, int colinearOrParallelExpandAmount) { - - if (this.intersectsLine(another)) { - return true; - } - - boolean rv = false; - - if (this.perpendicularTo(another)) { - rv = this.expand(PERPENDICULAR_PIXEL_EXPAND_AMOUNT).intersectsLine(another); - } else { - rv = this.expand(colinearOrParallelExpandAmount).intersectsLine(another.expand(colinearOrParallelExpandAmount)); - } - - return rv; - } - - - public double length() { - - return Math.sqrt(Math.pow(this.x1 - this.x2, 2) + Math.pow(this.y1 - this.y2, 2)); - } - - - public Ruling intersect(Rectangle2D clip) { - - Float clipee = (Float) this.clone(); - boolean clipped = new CohenSutherlandClipping(clip).clip(clipee); - - if (clipped) { - return new Ruling(clipee.getP1(), clipee.getP2()); - } else { - return this; - } - } - - - public Ruling expand(float amount) { - - Ruling r = (Ruling) this.clone(); - try { - r.setStart(this.getStart() - amount); - r.setEnd(this.getEnd() + amount); - } catch (UnsupportedOperationException e) { - log.warn("Could not expand ruling!"); - } - return r; - } - - - public Point2D intersectionPoint(Ruling other) { - - Ruling this_l = this.expand(PERPENDICULAR_PIXEL_EXPAND_AMOUNT); - Ruling other_l = other.expand(PERPENDICULAR_PIXEL_EXPAND_AMOUNT); - Ruling horizontal, vertical; - - if (!this_l.intersectsLine(other_l)) { - return null; - } - - if (this_l.horizontal() && other_l.vertical()) { - horizontal = this_l; - vertical = other_l; - } else if (this_l.vertical() && other_l.horizontal()) { - vertical = this_l; - horizontal = other_l; - } else { - log.warn("lines must be orthogonal, vertical and horizontal"); - return null; - } - return new Point2D.Float(vertical.getLeft(), horizontal.getTop()); - } - - - @Override - public boolean equals(Object other) { - - if (this == other) { - return true; - } - - if (!(other instanceof Ruling)) { - return false; - } - - Ruling o = (Ruling) other; - return this.getP1().equals(o.getP1()) && this.getP2().equals(o.getP2()); - } - - - @Override - public int hashCode() { - - return super.hashCode(); - } - - - public float getTop() { - - return this.y1; - } - - - public void setTop(float v) { - - setLine(this.getLeft(), v, this.getRight(), this.getBottom()); - } - - - public float getLeft() { - - return this.x1; - } - - - public void setLeft(float v) { - - setLine(v, this.getTop(), this.getRight(), this.getBottom()); - } - - - public float getBottom() { - - return this.y2; - } - - - public void setBottom(float v) { - - setLine(this.getLeft(), this.getTop(), this.getRight(), v); - } - - - public float getRight() { - - return this.x2; - } - - - public void setRight(float v) { - - setLine(this.getLeft(), this.getTop(), v, this.getBottom()); - } - - - public float getWidth() { - - return this.getRight() - this.getLeft(); - } - - - public float getHeight() { - - return this.getBottom() - this.getTop(); - } - - - public double getAngle() { - - double angle = Math.toDegrees(Math.atan2(this.getP2().getY() - this.getP1().getY(), this.getP2().getX() - this.getP1().getX())); - - if (angle < 0) { - angle += 360; - } - return angle; - } - - - @Override - public String toString() { - - StringBuilder sb = new StringBuilder(); - Formatter formatter = new Formatter(sb); - String rv = formatter.format("%s[minX=%f minY=%f maxX=%f maxY=%f]", this.getClass().toString(), this.x1, this.y1, this.x2, this.y2).toString(); - formatter.close(); - return rv; - } - - - private enum SOType { - VERTICAL, - HRIGHT, - HLEFT - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/TablePageBlock.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/TablePageBlock.java deleted file mode 100644 index 8d8684ef..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/table/TablePageBlock.java +++ /dev/null @@ -1,342 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table; - -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.TreeMap; - -import org.apache.commons.collections4.CollectionUtils; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.PageBlockType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; - -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class TablePageBlock extends AbstractPageBlock { - - private final TreeMap cells = new TreeMap<>(); - - private final int rotation; - @Getter - @Setter - private String headline; - private int unrotatedRowCount; - private int unrotatedColCount; - private List> rows; - - - public TablePageBlock(List cells, Rectangle area, int rotation) { - - addCells(cells); - minX = area.getLeft(); - minY = area.getBottom(); - maxX = area.getRight(); - maxY = area.getTop(); - classification = PageBlockType.TABLE; - this.rotation = rotation; - } - - - public List> getRows() { - - if (rows == null) { - rows = computeRows(); - - // Ignore rows that does not contain any cells and values. - List> rowsToRemove = new ArrayList<>(); - for (List row : rows) { - if (row.size() == 1 && row.get(0).getTextBlocks().isEmpty()) { - rowsToRemove.add(row); - } - } - rows.removeAll(rowsToRemove); - - computeHeaders(); - } - - return rows; - - } - - - public int getRowCount() { - - return getRows().size(); - } - - - public int getColCount() { - - return getRows().stream().mapToInt(List::size).max().orElse(0); - - } - - - /** - * Detect header cells (either first row or first column): - * Column is marked as header if cell text is bold and row cell text is not bold. - * Defaults to row. - */ - private void computeHeaders() { - - if (rows == null) { - rows = computeRows(); - } - // A bold cell is a header cell as long as every cell to the left/top is bold, too - // we move from left to right and top to bottom - for (int rowIndex = 0; rowIndex < rows.size(); rowIndex++) { - List rowCells = rows.get(rowIndex); - if (rowCells.size() == 1) { - continue; - } - - for (int colIndex = 0; colIndex < rowCells.size(); colIndex++) { - Cell cell = rowCells.get(colIndex); - List cellsToTheLeft = rowCells.subList(0, colIndex); - Cell lastHeaderCell = null; - for (Cell leftCell : cellsToTheLeft) { - if (leftCell.isHeaderCell()) { - lastHeaderCell = leftCell; - } else { - break; - } - } - if (lastHeaderCell != null) { - cell.getHeaderCells().add(lastHeaderCell); - } - List cellsToTheTop = new ArrayList<>(); - for (int i = 0; i < rowIndex; i++) { - try { - cellsToTheTop.add(rows.get(i).get(colIndex)); - } catch (IndexOutOfBoundsException e) { - log.debug("No cell {} in row {}, ignoring.", colIndex, rowIndex); - } - } - for (Cell topCell : cellsToTheTop) { - if (topCell.isHeaderCell()) { - lastHeaderCell = topCell; - } else { - break; - } - } - if (lastHeaderCell != null) { - cell.getHeaderCells().add(lastHeaderCell); - } - if (CollectionUtils.isNotEmpty(cell.getTextBlocks()) && cell.getTextBlocks().get(0).getMostPopularWordStyle().equals("bold")) { - cell.setHeaderCell(true); - } - } - } - - } - - - private List> computeRows() { - - List> rows = new ArrayList<>(); - if (rotation == 90) { - for (int i = 0; i < unrotatedColCount; i++) { // rows - List lastRow = new ArrayList<>(); - for (int j = unrotatedRowCount - 1; j >= 0; j--) { // cols - Cell cell = cells.get(new CellPosition(j, i)); - if (cell != null) { - lastRow.add(cell); - } - } - rows.add(lastRow); - } - } else if (rotation == 270) { - for (int i = unrotatedColCount - 1; i >= 0; i--) { // rows - List lastRow = new ArrayList<>(); - for (int j = 0; j < unrotatedRowCount; j++) { // cols - Cell cell = cells.get(new CellPosition(j, i)); - if (cell != null) { - lastRow.add(cell); - } - } - rows.add(lastRow); - } - } else { - for (int i = 0; i < unrotatedRowCount; i++) { - List lastRow = new ArrayList<>(); - for (int j = 0; j < unrotatedColCount; j++) { - Cell cell = cells.get(new CellPosition(i, j)); // JAVA_8 use getOrDefault() - if (cell != null) { - lastRow.add(cell); - } - } - rows.add(lastRow); - } - } - - return rows; - - } - - - private void add(Cell chunk, int row, int col) { - - unrotatedRowCount = Math.max(unrotatedRowCount, row + 1); - unrotatedColCount = Math.max(unrotatedColCount, col + 1); - - CellPosition cp = new CellPosition(row, col); - cells.put(cp, chunk); - - } - - - private void addCells(List cells) { - - if (cells.isEmpty()) { - return; - } - - cells.removeIf(cell -> cell.getWidth() < 1.1 || cell.getHeight() < 1.1); - - List> rowsOfCells = calculateStructure(cells); - - for (int i = 0; i < rowsOfCells.size(); i++) { - for (int j = 0; j < rowsOfCells.get(i).size(); j++) { - add(rowsOfCells.get(i).get(j), i, j); - } - } - - } - - - /** - * Calculates the structure of the table. For spanning rows and columns multiple cells with the same values will be inserted. - * - * @param cells The found cells - * @return TablePageBlock Structure - */ - private List> calculateStructure(List cells) { - - List> matrix = new ArrayList<>(); - - if (cells.isEmpty()) { - return matrix; - } - - Set uniqueX = new HashSet<>(); - Set uniqueY = new HashSet<>(); - cells.stream().filter(c -> !c.getTextBlocks().isEmpty() || c.getHeight() > 3 && c.getWidth() > 3).forEach(c -> { - uniqueX.add(c.getLeft()); - uniqueX.add(c.getRight()); - uniqueY.add(c.getBottom()); - uniqueY.add(c.getTop()); - }); - - var sortedUniqueX = uniqueX.stream().sorted().toList(); - var sortedUniqueY = uniqueY.stream().sorted().toList(); - - Float prevY = null; - for (Float y : sortedUniqueY) { - - List row = new ArrayList<>(); - - Float prevX = null; - for (Float x : sortedUniqueX) { - - if (prevY != null && prevX != null) { - var cell = new Cell(new Point2D.Float(prevX, prevY), new Point2D.Float(x, y)); - - var intersectionCell = cells.stream().filter(c -> cell.intersects(c) && cell.overlapRatio(c) > 0.1f).findFirst(); - intersectionCell.ifPresent(value -> cell.getTextBlocks().addAll(value.getTextBlocks())); - if (cell.hasMinimumSize()) { - row.add(cell); - } - } - prevX = x; - } - - if (prevY != null && prevX != null && !row.isEmpty()) { - matrix.add(row); - } - prevY = y; - } - - Collections.reverse(matrix); - - return matrix; - } - - - @Override - public String getText() { - - StringBuilder sb = new StringBuilder(); - List> rows = getRows(); - - int i = 0; - for (List row : rows) { - if (i != 0) { - sb.append("\n"); - } - if (!row.isEmpty()) { - boolean firstColumn = true; - for (Cell column : row) { - if (!firstColumn) { - sb.append(","); - } - if (column != null && column.getTextBlocks() != null) { - boolean first = true; - for (TextPageBlock textBlock : column.getTextBlocks()) { - if (!first) { - sb.append("\n"); - } - sb.append('\"').append(textBlock.getText().replaceAll("\"", "\\\"")).append('\"'); - first = false; - } - } - firstColumn = false; - } - } - i++; - } - - return sb.toString(); - } - - - public String getTextAsHtml() { - - StringBuilder sb = new StringBuilder(); - List> rows = getRows(); - - sb.append(""); - int i = 0; - for (List row : rows) { - sb.append("\n"); - if (!row.isEmpty()) { - for (Cell column : row) { - sb.append(i == 0 ? "\n"); - } - } - sb.append(""); - i++; - } - sb.append("
" : "\n"); - if (column != null && column.getTextBlocks() != null) { - boolean first = true; - for (TextPageBlock textBlock : column.getTextBlocks()) { - if (!first) { - sb.append("
"); - } - sb.append(textBlock.getText().replaceAll("\\n", "
")); - first = false; - } - } - sb.append(i == 0 ? "" : "
"); - - return sb.toString(); - } - -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/RedTextPosition.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/RedTextPosition.java deleted file mode 100644 index 392b1eb0..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/RedTextPosition.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import org.apache.pdfbox.text.TextPosition; -import org.springframework.beans.BeanUtils; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.SneakyThrows; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class RedTextPosition { - - private String textMatrix; - private float[] position; - - @JsonIgnore - private int rotation; - - @JsonIgnore - private float pageHeight; - - @JsonIgnore - private float pageWidth; - - private String unicode; - - @JsonIgnore - private float dir; - - // not used in reanalysis - @JsonIgnore - private float widthOfSpace; - - // not used in reanalysis - @JsonIgnore - private float fontSizeInPt; - - // not used in reanalysis - @JsonIgnore - private String fontName; - - - @SneakyThrows - public static RedTextPosition fromTextPosition(TextPosition textPosition) { - - var pos = new RedTextPosition(); - BeanUtils.copyProperties(textPosition, pos); - pos.setFontName(textPosition.getFont().getName()); - - pos.setFontSizeInPt(textPosition.getFontSizeInPt()); - - pos.setTextMatrix(textPosition.getTextMatrix().toString()); - - var position = new float[4]; - - position[0] = textPosition.getXDirAdj(); - position[1] = textPosition.getYDirAdj(); - position[2] = textPosition.getWidthDirAdj(); - position[3] = textPosition.getHeightDir(); - - pos.setPosition(position); - return pos; - } - - - @JsonIgnore - public float getXDirAdj() { - - return position[0]; - } - - - @JsonIgnore - public float getYDirAdj() { - - return position[1]; - } - - - @JsonIgnore - public float getWidthDirAdj() { - - return position[2]; - } - - - @JsonIgnore - public float getHeightDir() { - - return position[3]; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SearchableText.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SearchableText.java deleted file mode 100644 index 36677e1f..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SearchableText.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import java.util.ArrayList; -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.redaction.utils.TextNormalizationUtilities; - -import lombok.Getter; - -public class SearchableText { - - @Getter - private final List sequences = new ArrayList<>(); - - - public void add(TextPositionSequence textPositionSequence) { - - sequences.add(textPositionSequence); - } - - - public void addAll(List textPositionSequences) { - - sequences.addAll(textPositionSequences); - } - - - @Override - public String toString() { - - return buildString(sequences); - } - - - public static String buildString(List sequences) { - - StringBuilder sb = new StringBuilder(); - for (TextPositionSequence word : sequences) { - sb.append(word); - sb.append(' '); - } - String text = sb.toString(); - text = TextNormalizationUtilities.removeHyphenLineBreaks(text); - text = TextNormalizationUtilities.removeLineBreaks(text); - text = TextNormalizationUtilities.removeRepeatingWhitespaces(text); - return text; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SimplifiedSectionText.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SimplifiedSectionText.java deleted file mode 100644 index 5c1ba630..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SimplifiedSectionText.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class SimplifiedSectionText { - - private int sectionNumber; - private String text; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SimplifiedText.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SimplifiedText.java deleted file mode 100644 index 2d4eabf4..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/SimplifiedText.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import java.util.ArrayList; -import java.util.List; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class SimplifiedText { - - private int numberOfPages; - private List sectionTexts = new ArrayList<>(); - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/StringFrequencyCounter.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/StringFrequencyCounter.java deleted file mode 100644 index 2186cc25..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/StringFrequencyCounter.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import java.util.HashMap; -import java.util.Map; - -import lombok.Getter; - -public class StringFrequencyCounter { - - @Getter - private final Map countPerValue = new HashMap<>(); - - - public void add(String value) { - - if (!countPerValue.containsKey(value)) { - countPerValue.put(value, 1); - } else { - countPerValue.put(value, countPerValue.get(value) + 1); - } - } - - - public void addAll(Map otherCounter) { - - for (Map.Entry entry : otherCounter.entrySet()) { - if (countPerValue.containsKey(entry.getKey())) { - countPerValue.put(entry.getKey(), countPerValue.get(entry.getKey()) + entry.getValue()); - } else { - countPerValue.put(entry.getKey(), entry.getValue()); - } - } - } - - - public String getMostPopular() { - - Map.Entry mostPopular = null; - for (Map.Entry entry : countPerValue.entrySet()) { - if (mostPopular == null || entry.getValue() > mostPopular.getValue()) { - mostPopular = entry; - } - } - return mostPopular != null ? mostPopular.getKey() : null; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextDirection.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextDirection.java deleted file mode 100644 index aceb3751..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextDirection.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; - -import lombok.Getter; - -@Getter -public enum TextDirection { - ZERO(0f), - QUARTER_CIRCLE(90f), - HALF_CIRCLE(180f), - THREE_QUARTER_CIRCLE(270f); - - public static final String VALUE_STRING_SUFFIX = "°"; - - @JsonValue - private final float degrees; - private final float radians; - - - TextDirection(float degreeValue) { - - degrees = degreeValue; - radians = (float) Math.toRadians(degreeValue); - } - - - @Override - public String toString() { - - return degrees + VALUE_STRING_SUFFIX; - } - - - @JsonCreator(mode = JsonCreator.Mode.DELEGATING) - public static TextDirection fromDegrees(float degrees) { - - for (var dir : TextDirection.values()) { - if (degrees == dir.degrees) { - return dir; - } - } - - throw new IllegalArgumentException(String.format("A value of %f is not supported by TextDirection", degrees)); - } -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextPageBlock.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextPageBlock.java deleted file mode 100644 index ca8cc8e2..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextPageBlock.java +++ /dev/null @@ -1,302 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import java.util.ArrayList; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.PageBlockType; -import com.iqser.red.service.redaction.v1.server.redaction.utils.TextNormalizationUtilities; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@AllArgsConstructor -@Builder -@Data -@NoArgsConstructor -public class TextPageBlock extends AbstractPageBlock { - - @Builder.Default - private List sequences = new ArrayList<>(); - - @JsonIgnore - private int rotation; - - @JsonIgnore - private String mostPopularWordFont; - - @JsonIgnore - private String mostPopularWordStyle; - - @JsonIgnore - private float mostPopularWordFontSize; - - @JsonIgnore - private float mostPopularWordHeight; - - @JsonIgnore - private float mostPopularWordSpaceWidth; - - @JsonIgnore - private float highestFontSize; - - @JsonIgnore - private PageBlockType classification; - - - @JsonIgnore - public TextDirection getDir() { - - return sequences.get(0).getDir(); - } - - - @JsonIgnore - private float getPageHeight() { - - return sequences.get(0).getPageHeight(); - } - - - @JsonIgnore - private float getPageWidth() { - - return sequences.get(0).getPageWidth(); - } - - - /** - * Returns the minX value in pdf coordinate system. - * Note: This needs to use Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - * - * @return the minX value in pdf coordinate system - */ - @JsonIgnore - public float getPdfMinX() { - - if (getDir().getDegrees() == 90) { - return minY; - } else if (getDir().getDegrees() == 180) { - return getPageWidth() - maxX; - - } else if (getDir().getDegrees() == 270) { - - return getPageWidth() - maxY; - } else { - return minX; - } - } - - - /** - * Returns the maxX value in pdf coordinate system. - * Note: This needs to use Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - * - * @return the maxX value in pdf coordinate system - */ - @JsonIgnore - public float getPdfMaxX() { - - if (getDir().getDegrees() == 90) { - return maxY; - } else if (getDir().getDegrees() == 180) { - return getPageWidth() - minX; - } else if (getDir().getDegrees() == 270) { - return getPageWidth() - minY; - - } else { - return maxX; - } - } - - - /** - * Returns the minY value in pdf coordinate system. - * Note: This needs to use Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - * - * @return the minY value in pdf coordinate system - */ - @JsonIgnore - public float getPdfMinY() { - - if (getDir().getDegrees() == 90) { - return minX; - } else if (getDir().getDegrees() == 180) { - return maxY; - - } else if (getDir().getDegrees() == 270) { - return getPageHeight() - maxX; - - } else { - return getPageHeight() - maxY; - } - } - - - /** - * Returns the maxY value in pdf coordinate system. - * Note: This needs to use Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - * - * @return the maxY value in pdf coordinate system - */ - @JsonIgnore - public float getPdfMaxY() { - - if (getDir().getDegrees() == 90) { - return maxX; - } else if (getDir().getDegrees() == 180) { - - return minY; - } else if (getDir().getDegrees() == 270) { - return getPageHeight() - minX; - } else { - return getPageHeight() - minY; - } - } - - - public TextPageBlock(float minX, float maxX, float minY, float maxY, List sequences, int rotation) { - - this.minX = minX; - this.maxX = maxX; - this.minY = minY; - this.maxY = maxY; - this.sequences = sequences; - this.rotation = rotation; - } - - - public TextPageBlock union(TextPositionSequence r) { - - TextPageBlock union = this.copy(); - union.add(r); - return union; - } - - - public TextPageBlock union(TextPageBlock r) { - - TextPageBlock union = this.copy(); - union.add(r); - return union; - } - - - public void add(TextPageBlock r) { - - if (r.getMinX() < minX) { - minX = r.getMinX(); - } - if (r.getMaxX() > maxX) { - maxX = r.getMaxX(); - } - if (r.getMinY() < minY) { - minY = r.getMinY(); - } - if (r.getMaxY() > maxY) { - maxY = r.getMaxY(); - } - sequences.addAll(r.getSequences()); - } - - - public void add(TextPositionSequence r) { - - if (r.getMinXDirAdj() < minX) { - minX = r.getMinXDirAdj(); - } - if (r.getMaxXDirAdj() > maxX) { - maxX = r.getMaxXDirAdj(); - } - if (r.getMinYDirAdj() < minY) { - minY = r.getMinYDirAdj(); - } - if (r.getMaxYDirAdj() > maxY) { - maxY = r.getMaxYDirAdj(); - } - } - - - public TextPageBlock copy() { - - return new TextPageBlock(minX, maxX, minY, maxY, sequences, rotation); - } - - - public void resize(float x1, float y1, float width, float height) { - - set(x1, y1, x1 + width, y1 + height); - } - - - public void set(float x1, float y1, float x2, float y2) { - - this.minX = Math.min(x1, x2); - this.maxX = Math.max(x1, x2); - this.minY = Math.min(y1, y2); - this.maxY = Math.max(y1, y2); - } - - - @Override - public String toString() { - - StringBuilder builder = new StringBuilder(); - - for (int i = 0; i < sequences.size(); i++) { - String sequenceAsString = sequences.get(i).toString(); - // Fix for missing Whitespace. This is recognized in getSequences method. See PDFTextStripper Line 1730. - if (i != 0 && sequences.get(i - 1).charAt(sequences.get(i - 1).length() - 1) != ' ' && sequenceAsString.charAt(0) != ' ') { - builder.append(' '); - } - builder.append(sequenceAsString); - } - - return builder.toString(); - - } - - - @Override - @JsonIgnore - public String getText() { - - StringBuilder sb = new StringBuilder(); - - TextPositionSequence previous = null; - for (TextPositionSequence word : sequences) { - if (previous != null) { - if (Math.abs(previous.getMaxYDirAdj() - word.getMaxYDirAdj()) > word.getTextHeight()) { - sb.append('\n'); - } else { - sb.append(' '); - } - } - sb.append(word.toString()); - previous = word; - } - - return TextNormalizationUtilities.removeHyphenLineBreaks(sb.toString()); - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextPositionSequence.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextPositionSequence.java deleted file mode 100644 index fd56ba71..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/TextPositionSequence.java +++ /dev/null @@ -1,302 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import java.awt.geom.AffineTransform; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.stream.Collectors; - -import org.apache.pdfbox.text.TextPosition; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@JsonIgnoreProperties({"empty"}) -public class TextPositionSequence implements CharSequence { - - public static final int HEIGHT_PADDING = 2; - private int page; - private List textPositions = new ArrayList<>(); - - private TextDirection dir; - private int rotation; - private float pageHeight; - private float pageWidth; - - - public TextPositionSequence(int page) { - - this.page = page; - } - - - public TextPositionSequence(List textPositions, int page) { - - this.textPositions = textPositions.stream().map(RedTextPosition::fromTextPosition).collect(Collectors.toList()); - this.page = page; - this.dir = TextDirection.fromDegrees(textPositions.get(0).getDir()); - this.rotation = textPositions.get(0).getRotation(); - this.pageHeight = textPositions.get(0).getPageHeight(); - this.pageWidth = textPositions.get(0).getPageWidth(); - } - - - @Override - public int length() { - - return textPositions.size(); - } - - - @Override - public char charAt(int index) { - - RedTextPosition textPosition = textPositionAt(index); - String text = textPosition.getUnicode(); - return text.charAt(0); - } - - - public char charAt(int index, boolean caseInSensitive) { - - RedTextPosition textPosition = textPositionAt(index); - String text = textPosition.getUnicode(); - return caseInSensitive ? text.toLowerCase(Locale.ROOT).charAt(0) : text.charAt(0); - } - - - @Override - public TextPositionSequence subSequence(int start, int end) { - - var textPositionSequence = new TextPositionSequence(); - textPositionSequence.textPositions = textPositions.subList(start, end); - textPositionSequence.page = page; - textPositionSequence.dir = dir; - textPositionSequence.rotation = rotation; - textPositionSequence.pageHeight = pageHeight; - textPositionSequence.pageWidth = pageWidth; - - return textPositionSequence; - } - - - @Override - public String toString() { - - StringBuilder builder = new StringBuilder(length()); - for (int i = 0; i < length(); i++) { - builder.append(charAt(i)); - } - return builder.toString(); - } - - - public RedTextPosition textPositionAt(int index) { - - return textPositions.get(index); - } - - - public void add(TextPositionSequence textPositionSequence, RedTextPosition textPosition) { - - this.textPositions.add(textPosition); - this.page = textPositionSequence.getPage(); - this.dir = textPositionSequence.getDir(); - this.rotation = textPositionSequence.getRotation(); - this.pageHeight = textPositionSequence.getPageHeight(); - this.pageWidth = textPositionSequence.getPageWidth(); - } - - - public void add(TextPosition textPosition) { - - this.textPositions.add(RedTextPosition.fromTextPosition(textPosition)); - - this.dir = TextDirection.fromDegrees(textPositions.get(0).getDir()); - this.rotation = textPositions.get(0).getRotation(); - this.pageHeight = textPositions.get(0).getPageHeight(); - this.pageWidth = textPositions.get(0).getPageWidth(); - - } - - - /** - * This value is adjusted so that 0,0 is upper left and it is adjusted based on the text direction. - * This method ignores the page rotation but takes the text rotation and adjusts the coordinates to awt. - * - * @return the text direction adjusted minX value - */ - @JsonIgnore - public float getMinXDirAdj() { - - return textPositions.get(0).getXDirAdj(); - - } - - - /** - * This value is adjusted so that 0,0 is upper left and it is adjusted based on the text direction. - * This method ignores the page rotation but takes the text rotation and adjusts the coordinates to awt. - * - * @return the text direction adjusted maxX value - */ - @JsonIgnore - public float getMaxXDirAdj() { - - return textPositions.get(textPositions.size() - 1).getXDirAdj() + textPositions.get(textPositions.size() - 1).getWidthDirAdj() + HEIGHT_PADDING; - - } - - - /** - * This value is adjusted so that 0,0 is upper left and it is adjusted based on the text direction. - * This method ignores the page rotation but takes the text rotation and adjusts the coordinates to awt. - * - * @return the text direction adjusted minY value. The upper border of the bounding box of the word. - */ - @JsonIgnore - public float getMinYDirAdj() { - - return textPositions.get(0).getYDirAdj() - getTextHeight(); - - } - - - /** - * This value is adjusted so that 0,0 is upper left and it is adjusted based on the text direction. - * This method ignores the page rotation but takes the text rotation and adjusts the coordinates to awt. - * - * @return the text direction adjusted maxY value. The lower border of the bounding box of the word. - */ - @JsonIgnore - public float getMaxYDirAdj() { - - return textPositions.get(0).getYDirAdj(); - - } - - - @JsonIgnore - public float getTextHeight() { - - return textPositions.get(0).getHeightDir() + HEIGHT_PADDING; - } - - - @JsonIgnore - public float getHeight() { - - return getMaxYDirAdj() - getMinYDirAdj(); - } - - - @JsonIgnore - public float getWidth() { - - return getMaxXDirAdj() - getMinXDirAdj(); - } - - - @JsonIgnore - public String getFont() { - - return textPositions.get(0).getFontName().toLowerCase(Locale.ROOT).replaceAll(",bold", "").replaceAll(",italic", ""); - } - - - @JsonIgnore - public String getFontStyle() { - - String lowercaseFontName = textPositions.get(0).getFontName().toLowerCase(Locale.ROOT); - - if (lowercaseFontName.contains("bold") && lowercaseFontName.contains("italic")) { - return "bold, italic"; - } else if (lowercaseFontName.contains("bold")) { - return "bold"; - } else if (lowercaseFontName.contains("italic")) { - return "italic"; - } else { - return "standard"; - } - - } - - - @JsonIgnore - public float getFontSize() { - - return textPositions.get(0).getFontSizeInPt(); - } - - - @JsonIgnore - public float getSpaceWidth() { - - return textPositions.get(0).getWidthOfSpace(); - } - - - /** - * This returns the bounding box of the word in Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - * - * @return bounding box of the word in Pdf Coordinate System - */ - @JsonIgnore - @SneakyThrows - public Rectangle getRectangle() { - - log.debug("Page: '{}', Word: '{}', Rotation: '{}', textRotation {}", page, this, rotation, dir); - - float textHeight = getTextHeight(); - - RedTextPosition firstTextPos = textPositions.get(0); - RedTextPosition lastTextPos = textPositions.get(textPositions.size() - 1); - - Point2D bottomLeft = new Point2D.Double(firstTextPos.getXDirAdj(), firstTextPos.getYDirAdj() - HEIGHT_PADDING); - Point2D topRight = new Point2D.Double(lastTextPos.getXDirAdj() + lastTextPos.getWidthDirAdj(), lastTextPos.getYDirAdj() + textHeight + HEIGHT_PADDING); - - AffineTransform transform = new AffineTransform(); - if (dir == TextDirection.ZERO || dir == TextDirection.HALF_CIRCLE) { - transform.rotate(dir.getRadians(), pageWidth / 2f, pageHeight / 2f); - transform.translate(0f, pageHeight + textHeight); - transform.scale(1., -1.); - } else if (dir == TextDirection.QUARTER_CIRCLE) { - transform.rotate(dir.getRadians(), pageWidth / 2f, pageWidth / 2f); - transform.translate(0f, pageWidth + textHeight); - transform.scale(1., -1.); - } else { - transform.rotate(dir.getRadians(), pageHeight / 2f, pageHeight / 2f); - transform.translate(0f, pageWidth + textHeight); - transform.scale(1., -1.); - } - - bottomLeft = transform.transform(bottomLeft, null); - topRight = transform.transform(topRight, null); - - return new Rectangle( // - new Point((float) bottomLeft.getX(), (float) bottomLeft.getY()), - (float) (topRight.getX() - bottomLeft.getX()), - (float) (topRight.getY() - bottomLeft.getY()), - page); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/UnclassifiedText.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/UnclassifiedText.java deleted file mode 100644 index 50925713..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/model/text/UnclassifiedText.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text; - -import java.util.List; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class UnclassifiedText { - - private List textBlocks; - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/LegacyPDFStreamEngine.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/LegacyPDFStreamEngine.java deleted file mode 100644 index 5d96ca09..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/LegacyPDFStreamEngine.java +++ /dev/null @@ -1,384 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.parsing; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; -import java.util.WeakHashMap; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.fontbox.ttf.TrueTypeFont; -import org.apache.fontbox.util.BoundingBox; -import org.apache.pdfbox.contentstream.PDFStreamEngine; -import org.apache.pdfbox.contentstream.operator.DrawObject; -import org.apache.pdfbox.contentstream.operator.state.Concatenate; -import org.apache.pdfbox.contentstream.operator.state.Restore; -import org.apache.pdfbox.contentstream.operator.state.Save; -import org.apache.pdfbox.contentstream.operator.state.SetGraphicsStateParameters; -import org.apache.pdfbox.contentstream.operator.state.SetMatrix; -import org.apache.pdfbox.contentstream.operator.text.BeginText; -import org.apache.pdfbox.contentstream.operator.text.EndText; -import org.apache.pdfbox.contentstream.operator.text.MoveText; -import org.apache.pdfbox.contentstream.operator.text.MoveTextSetLeading; -import org.apache.pdfbox.contentstream.operator.text.NextLine; -import org.apache.pdfbox.contentstream.operator.text.SetCharSpacing; -import org.apache.pdfbox.contentstream.operator.text.SetFontAndSize; -import org.apache.pdfbox.contentstream.operator.text.SetTextHorizontalScaling; -import org.apache.pdfbox.contentstream.operator.text.SetTextLeading; -import org.apache.pdfbox.contentstream.operator.text.SetTextRenderingMode; -import org.apache.pdfbox.contentstream.operator.text.SetTextRise; -import org.apache.pdfbox.contentstream.operator.text.SetWordSpacing; -import org.apache.pdfbox.contentstream.operator.text.ShowText; -import org.apache.pdfbox.contentstream.operator.text.ShowTextAdjusted; -import org.apache.pdfbox.contentstream.operator.text.ShowTextLine; -import org.apache.pdfbox.contentstream.operator.text.ShowTextLineAndSpace; -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.font.PDCIDFont; -import org.apache.pdfbox.pdmodel.font.PDCIDFontType2; -import org.apache.pdfbox.pdmodel.font.PDFont; -import org.apache.pdfbox.pdmodel.font.PDFontDescriptor; -import org.apache.pdfbox.pdmodel.font.PDSimpleFont; -import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont; -import org.apache.pdfbox.pdmodel.font.PDType0Font; -import org.apache.pdfbox.pdmodel.font.PDType3Font; -import org.apache.pdfbox.pdmodel.font.encoding.GlyphList; -import org.apache.pdfbox.pdmodel.graphics.state.PDGraphicsState; -import org.apache.pdfbox.text.TextPosition; -import org.apache.pdfbox.util.Matrix; -import org.apache.pdfbox.util.Vector; - -/** - * LEGACY text calculations which are known to be incorrect but are depended on by PDFTextStripper. - *

- * This class exists only so that we don't break the code of users who have their own subclasses of - * PDFTextStripper. It replaces the mostly empty implementation of showGlyph() in PDFStreamEngine - * with a heuristic implementation which is backwards compatible. - *

- * DO NOT USE THIS CODE UNLESS YOU ARE WORKING WITH PDFTextStripper. - * THIS CODE IS DELIBERATELY INCORRECT, USE PDFStreamEngine INSTEAD. - */ -@SuppressWarnings({"PMD", "checkstyle:all"}) -class LegacyPDFStreamEngine extends PDFStreamEngine { - - private static final Log LOG = LogFactory.getLog(LegacyPDFStreamEngine.class); - - private int pageRotation; - private PDRectangle pageSize; - private Matrix translateMatrix; - private final GlyphList glyphList; - private final Map fontHeightMap = new WeakHashMap(); - - - /** - * Constructor. - */ - LegacyPDFStreamEngine() throws IOException { - - addOperator(new BeginText()); - addOperator(new Concatenate()); - addOperator(new DrawObject()); // special text version - addOperator(new EndText()); - addOperator(new SetGraphicsStateParameters()); - addOperator(new Save()); - addOperator(new Restore()); - addOperator(new NextLine()); - addOperator(new SetCharSpacing()); - addOperator(new MoveText()); - addOperator(new MoveTextSetLeading()); - addOperator(new SetFontAndSize()); - addOperator(new ShowText()); - addOperator(new ShowTextAdjusted()); - addOperator(new SetTextLeading()); - addOperator(new SetMatrix()); - addOperator(new SetTextRenderingMode()); - addOperator(new SetTextRise()); - addOperator(new SetWordSpacing()); - addOperator(new SetTextHorizontalScaling()); - addOperator(new ShowTextLine()); - addOperator(new ShowTextLineAndSpace()); - - // load additional glyph list for Unicode mapping - String path = "/org/apache/pdfbox/resources/glyphlist/additional.txt"; - InputStream input = GlyphList.class.getResourceAsStream(path); - glyphList = new GlyphList(GlyphList.getAdobeGlyphList(), input); - } - - - /** - * This will initialize and process the contents of the stream. - * - * @param page the page to process - * @throws java.io.IOException if there is an error accessing the stream. - */ - @Override - public void processPage(PDPage page) throws IOException { - - this.pageRotation = page.getRotation(); - this.pageSize = page.getCropBox(); - - if (pageSize.getLowerLeftX() == 0 && pageSize.getLowerLeftY() == 0) { - translateMatrix = null; - } else { - // translation matrix for cropbox - translateMatrix = Matrix.getTranslateInstance(-pageSize.getLowerLeftX(), -pageSize.getLowerLeftY()); - } - super.processPage(page); - } - - - /** - * Called when a glyph is to be processed. The heuristic calculations here were originally - * written by Ben Litchfield for PDFStreamEngine. - */ - @Override - protected void showGlyph(Matrix textRenderingMatrix, PDFont font, int code, String unicode, Vector displacement) throws IOException { - // - // legacy calculations which were previously in PDFStreamEngine - // - // DO NOT USE THIS CODE UNLESS YOU ARE WORKING WITH PDFTextStripper. - // THIS CODE IS DELIBERATELY INCORRECT - // - - PDGraphicsState state = getGraphicsState(); - Matrix ctm = state.getCurrentTransformationMatrix(); - float fontSize = state.getTextState().getFontSize(); - float horizontalScaling = state.getTextState().getHorizontalScaling() / 100f; - Matrix textMatrix = getTextMatrix(); - - float displacementX = displacement.getX(); - // the sorting algorithm is based on the width of the character. As the displacement - // for vertical characters doesn't provide any suitable value for it, we have to - // calculate our own - if (font.isVertical()) { - displacementX = font.getWidth(code) / 1000; - // there may be an additional scaling factor for true type fonts - TrueTypeFont ttf = null; - if (font instanceof PDTrueTypeFont) { - ttf = ((PDTrueTypeFont) font).getTrueTypeFont(); - } else if (font instanceof PDType0Font) { - PDCIDFont cidFont = ((PDType0Font) font).getDescendantFont(); - if (cidFont instanceof PDCIDFontType2) { - ttf = ((PDCIDFontType2) cidFont).getTrueTypeFont(); - } - } - if (ttf != null && ttf.getUnitsPerEm() != 1000) { - displacementX *= 1000f / ttf.getUnitsPerEm(); - } - } - - // - // legacy calculations which were previously in PDFStreamEngine - // - // DO NOT USE THIS CODE UNLESS YOU ARE WORKING WITH PDFTextStripper. - // THIS CODE IS DELIBERATELY INCORRECT - // - - // (modified) combined displacement, this is calculated *without* taking the character - // spacing and word spacing into account, due to legacy code in TextStripper - float tx = displacementX * fontSize * horizontalScaling; - float ty = displacement.getY() * fontSize; - - // (modified) combined displacement matrix - Matrix td = Matrix.getTranslateInstance(tx, ty); - - // (modified) text rendering matrix - Matrix nextTextRenderingMatrix = td.multiply(textMatrix).multiply(ctm); // text space -> device space - float nextX = nextTextRenderingMatrix.getTranslateX(); - float nextY = nextTextRenderingMatrix.getTranslateY(); - - // (modified) width and height calculations - float dxDisplay = nextX - textRenderingMatrix.getTranslateX(); - Float fontHeight = fontHeightMap.get(font.getCOSObject()); - if (fontHeight == null) { - fontHeight = computeFontHeight(font); - fontHeightMap.put(font.getCOSObject(), fontHeight); - } - float dyDisplay = fontHeight * textRenderingMatrix.getScalingFactorY(); - - // - // start of the original method - // - - // Note on variable names. There are three different units being used in this code. - // Character sizes are given in glyph units, text locations are initially given in text - // units, and we want to save the data in display units. The variable names should end with - // Text or Disp to represent if the values are in text or disp units (no glyph units are - // saved). - - float glyphSpaceToTextSpaceFactor = 1 / 1000f; - if (font instanceof PDType3Font) { - glyphSpaceToTextSpaceFactor = font.getFontMatrix().getScaleX(); - } - - float spaceWidthText = 0; - try { - // to avoid crash as described in PDFBOX-614, see what the space displacement should be - spaceWidthText = font.getSpaceWidth() * glyphSpaceToTextSpaceFactor; - } catch (Throwable exception) { - LOG.warn(exception, exception); - } - - if (spaceWidthText == 0) { - spaceWidthText = font.getAverageFontWidth() * glyphSpaceToTextSpaceFactor; - // the average space width appears to be higher than necessary so make it smaller - spaceWidthText *= .80f; - } - if (spaceWidthText == 0) { - spaceWidthText = 1.0f; // if could not find font, use a generic value - } - - // the space width has to be transformed into display units - float spaceWidthDisplay = spaceWidthText * textRenderingMatrix.getScalingFactorX(); - - // use our additional glyph list for Unicode mapping - String unicodeMapping = font.toUnicode(code, glyphList); - - // when there is no Unicode mapping available, Acrobat simply coerces the character code - // into Unicode, so we do the same. Subclasses of PDFStreamEngine don't necessarily want - // this, which is why we leave it until this point in PDFTextStreamEngine. - if (unicodeMapping == null) { - if (font instanceof PDSimpleFont) { - char c = (char) code; - unicodeMapping = new String(new char[]{c}); - } else { - // Acrobat doesn't seem to coerce composite font's character codes, instead it - // skips them. See the "allah2.pdf" TestTextStripper file. - return; - } - } - - // adjust for cropbox if needed - Matrix translatedTextRenderingMatrix; - if (translateMatrix == null) { - translatedTextRenderingMatrix = textRenderingMatrix; - } else { - translatedTextRenderingMatrix = Matrix.concatenate(translateMatrix, textRenderingMatrix); - nextX -= pageSize.getLowerLeftX(); - nextY -= pageSize.getLowerLeftY(); - } - - // This is a hack for unicode letter with 2 chars e.g. RA see unicodeProblem.pdf - if (unicodeMapping.length() == 2) { - processTextPosition(new TextPosition(pageRotation, - pageSize.getWidth(), - pageSize.getHeight(), - translatedTextRenderingMatrix, - nextX, - nextY, - Math.abs(dyDisplay), - dxDisplay, - Math.abs(spaceWidthDisplay), - Character.toString(unicodeMapping.charAt(0)), - new int[]{code}, - font, - fontSize, - (int) (fontSize * textMatrix.getScalingFactorX()))); - processTextPosition(new TextPosition(pageRotation, - pageSize.getWidth(), - pageSize.getHeight(), - translatedTextRenderingMatrix, - nextX, - nextY, - Math.abs(dyDisplay), - dxDisplay, - Math.abs(spaceWidthDisplay), - Character.toString(unicodeMapping.charAt(1)), - new int[]{code}, - font, - fontSize, - (int) (fontSize * textMatrix.getScalingFactorX()))); - } else { - - processTextPosition(new TextPosition(pageRotation, - pageSize.getWidth(), - pageSize.getHeight(), - translatedTextRenderingMatrix, - nextX, - nextY, - Math.abs(dyDisplay), - dxDisplay, - Math.abs(spaceWidthDisplay), - unicodeMapping, - new int[]{code}, - font, - fontSize, - (int) (fontSize * textMatrix.getScalingFactorX()))); - } - } - - - /** - * Compute the font height. Override this if you want to use own calculations. - * - * @param font the font. - * @return the font height. - * @throws IOException if there is an error while getting the font bounding box. - */ - protected float computeFontHeight(PDFont font) throws IOException { - - BoundingBox bbox = font.getBoundingBox(); - if (bbox.getLowerLeftY() < Short.MIN_VALUE) { - // PDFBOX-2158 and PDFBOX-3130 - // files by Salmat eSolutions / ClibPDF Library - bbox.setLowerLeftY(-(bbox.getLowerLeftY() + 65536)); - } - // 1/2 the bbox is used as the height todo: why? - float glyphHeight = bbox.getHeight() / 2; - - // sometimes the bbox has very high values, but CapHeight is OK - PDFontDescriptor fontDescriptor = font.getFontDescriptor(); - if (fontDescriptor != null) { - float capHeight = fontDescriptor.getCapHeight(); - if (Float.compare(capHeight, 0) != 0 && (capHeight < glyphHeight || Float.compare(glyphHeight, 0) == 0)) { - glyphHeight = capHeight; - } - // PDFBOX-3464, PDFBOX-4480, PDFBOX-4553: - // sometimes even CapHeight has very high value, but Ascent and Descent are ok - float ascent = fontDescriptor.getAscent(); - float descent = fontDescriptor.getDescent(); - if (capHeight > ascent && ascent > 0 && descent < 0 && ((ascent - descent) / 2 < glyphHeight || Float.compare(glyphHeight, 0) == 0)) { - glyphHeight = (ascent - descent) / 2; - } - } - - // transformPoint from glyph space -> text space - float height; - if (font instanceof PDType3Font) { - height = font.getFontMatrix().transformPoint(0, glyphHeight).y; - } else { - height = glyphHeight / 1000; - } - - return height; - } - - - /** - * A method provided as an event interface to allow a subclass to perform some specific - * functionality when text needs to be processed. - * - * @param text The text to be processed. - */ - protected void processTextPosition(TextPosition text) { - // subclasses can override to provide specific functionality - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/PDFLinesTextStripper.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/PDFLinesTextStripper.java deleted file mode 100644 index fda2c3cb..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/PDFLinesTextStripper.java +++ /dev/null @@ -1,335 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.parsing; - -import java.awt.geom.Point2D; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - -import org.apache.pdfbox.contentstream.operator.Operator; -import org.apache.pdfbox.contentstream.operator.OperatorName; -import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColor; -import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColorN; -import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColorSpace; -import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingDeviceCMYKColor; -import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingDeviceGrayColor; -import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingDeviceRGBColor; -import org.apache.pdfbox.contentstream.operator.color.SetStrokingColor; -import org.apache.pdfbox.contentstream.operator.color.SetStrokingColorN; -import org.apache.pdfbox.contentstream.operator.color.SetStrokingColorSpace; -import org.apache.pdfbox.contentstream.operator.color.SetStrokingDeviceCMYKColor; -import org.apache.pdfbox.contentstream.operator.color.SetStrokingDeviceGrayColor; -import org.apache.pdfbox.contentstream.operator.color.SetStrokingDeviceRGBColor; -import org.apache.pdfbox.contentstream.operator.state.SetFlatness; -import org.apache.pdfbox.contentstream.operator.state.SetLineCapStyle; -import org.apache.pdfbox.contentstream.operator.state.SetLineDashPattern; -import org.apache.pdfbox.contentstream.operator.state.SetLineJoinStyle; -import org.apache.pdfbox.contentstream.operator.state.SetLineMiterLimit; -import org.apache.pdfbox.contentstream.operator.state.SetLineWidth; -import org.apache.pdfbox.contentstream.operator.state.SetRenderingIntent; -import org.apache.pdfbox.contentstream.operator.text.SetFontAndSize; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSNumber; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.text.TextPosition; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Ruling; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.RedTextPosition; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; - -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class PDFLinesTextStripper extends PDFTextStripper { - - @Getter - private final List textPositionSequences = new ArrayList<>(); - @Getter - private final List rulings = new ArrayList<>(); - private final List graphicsPath = new ArrayList<>(); - @Setter - protected PDPage pdpage; - @Getter - private int minCharWidth; - @Getter - private int maxCharWidth; - @Getter - private int minCharHeight; - @Getter - private int maxCharHeight; - - private float path_x; - private float path_y; - - @Setter - private int pageNumber; - - - public PDFLinesTextStripper() throws IOException { - - super(); - this.addOperator(new SetStrokingColorSpace()); - this.addOperator(new SetNonStrokingColorSpace()); - this.addOperator(new SetLineDashPattern()); - this.addOperator(new SetStrokingDeviceGrayColor()); - this.addOperator(new SetNonStrokingDeviceGrayColor()); - this.addOperator(new SetFlatness()); - this.addOperator(new SetLineJoinStyle()); - this.addOperator(new SetLineCapStyle()); - this.addOperator(new SetStrokingDeviceCMYKColor()); - this.addOperator(new SetNonStrokingDeviceCMYKColor()); - this.addOperator(new SetLineMiterLimit()); - this.addOperator(new SetStrokingDeviceRGBColor()); - this.addOperator(new SetNonStrokingDeviceRGBColor()); - this.addOperator(new SetRenderingIntent()); - this.addOperator(new SetStrokingColor()); - this.addOperator(new SetNonStrokingColor()); - this.addOperator(new SetStrokingColorN()); - this.addOperator(new SetNonStrokingColorN()); - this.addOperator(new SetFontAndSize()); - this.addOperator(new SetLineWidth()); - } - - - @Override - protected void processOperator(Operator operator, List arguments) throws IOException { - - String operation = operator.getName(); - - //move - switch (operation) { - case OperatorName.MOVE_TO: - if (arguments.size() == 2) { - Point2D.Float pos = transformPosition(floatValue(arguments.get(0)), floatValue(arguments.get(1))); - path_x = (float) pos.getX(); - path_y = (float) pos.getY(); - } - break; - - //line - case OperatorName.LINE_TO: - if (arguments.size() == 2) { - Point2D.Float pos = transformPosition(floatValue(arguments.get(0)), floatValue(arguments.get(1))); - - // The direction of vertical lines must always be from bottom to top for the table extraction algorithm. - if (pos.getY() > path_y) { - graphicsPath.add(new Ruling(new Point2D.Float(path_x, path_y), new Point2D.Float((float) pos.getX(), (float) pos.getY()))); - } else { - graphicsPath.add(new Ruling(new Point2D.Float(path_x, (float) pos.getY()), new Point2D.Float((float) pos.getX(), path_y))); - } - - path_x = (float) pos.getX(); - path_y = (float) pos.getY(); - } - break; - - //rectangle - case OperatorName.APPEND_RECT: - - if (arguments.size() == 4) { - float x = floatValue(arguments.get(0)); - float y = floatValue(arguments.get(1)); - float width = floatValue(arguments.get(2)); - float height = floatValue(arguments.get(3)); - - Point2D p1 = transformPosition(x, y); - Point2D p2 = transformPosition(x + width, y + height); - - // Horizontal lines - graphicsPath.add(new Ruling(new Point2D.Float((float) p1.getX(), (float) p1.getY()), new Point2D.Float((float) p2.getX(), (float) p1.getY()))); - graphicsPath.add(new Ruling(new Point2D.Float((float) p1.getX(), (float) p2.getY()), new Point2D.Float((float) p2.getX(), (float) p2.getY()))); - - // Vertical lines, direction must always be from bottom to top for the table extraction algorithm. - if (p2.getY() > p1.getY()) { - graphicsPath.add(new Ruling(new Point2D.Float((float) p2.getX(), (float) p1.getY()), new Point2D.Float((float) p2.getX(), (float) p2.getY()))); - } else { - graphicsPath.add(new Ruling(new Point2D.Float((float) p2.getX(), (float) p2.getY()), new Point2D.Float((float) p2.getX(), (float) p1.getY()))); - } - if (p2.getY() > p1.getY()) { - graphicsPath.add(new Ruling(new Point2D.Float((float) p1.getX(), (float) p1.getY()), new Point2D.Float((float) p1.getX(), (float) p2.getY()))); - } else { - graphicsPath.add(new Ruling(new Point2D.Float((float) p1.getX(), (float) p2.getY()), new Point2D.Float((float) p1.getX(), (float) p1.getY()))); - } - } - break; - - //fill - case OperatorName.FILL_NON_ZERO: - case OperatorName.LEGACY_FILL_NON_ZERO: - case OperatorName.FILL_EVEN_ODD: - addVisibleRulings(graphicsPath, false); - graphicsPath.clear(); - break; - - //stroke - case OperatorName.STROKE_PATH: - addVisibleRulings(graphicsPath, true); - graphicsPath.clear(); - break; - - //cancel path - case OperatorName.ENDPATH: - graphicsPath.clear(); - break; - - } - - super.processOperator(operator, arguments); - } - - - private float floatValue(COSBase value) { - - if (value instanceof COSNumber) { - return ((COSNumber) value).floatValue(); - } else { - return 0; - } - } - - - private Point2D.Float transformPosition(float x, float y) { - - return super.transformedPoint(x, y); - } - - - private void addVisibleRulings(List path, boolean stroke) throws IOException { - - try { - if (stroke && !getGraphicsState().getStrokingColor().isPattern() && getGraphicsState().getStrokingColor() - .toRGB() == 0 || !stroke && !getGraphicsState().getNonStrokingColor().isPattern() && getGraphicsState().getNonStrokingColor().toRGB() == 0) { - rulings.addAll(path); - } - } catch (UnsupportedOperationException e) { - log.debug("UnsupportedOperationException: " + getGraphicsState().getStrokingColor().getColorSpace().getName() + " or " + getGraphicsState().getNonStrokingColor() - .getColorSpace() - .getName() + " does not support toRGB"); - } - } - - - @Override - public void writeString(String text, List textPositions) throws IOException { - - int startIndex = 0; - RedTextPosition previous = null; - - textPositions.sort(Comparator.comparing(TextPosition::getXDirAdj)); - - for (int i = 0; i <= textPositions.size() - 1; i++) { - - if (!textPositionSequences.isEmpty()) { - previous = textPositionSequences.get(textPositionSequences.size() - 1) - .getTextPositions() - .get(textPositionSequences.get(textPositionSequences.size() - 1).getTextPositions().size() - 1); - } - - int charWidth = (int) textPositions.get(i).getWidthDirAdj(); - if (charWidth < minCharWidth) { - minCharWidth = charWidth; - } - if (charWidth > maxCharWidth) { - maxCharWidth = charWidth; - } - - int charHeight = (int) textPositions.get(i).getHeightDir(); - if (charHeight < minCharHeight) { - minCharHeight = charHeight; - } - if (charWidth > maxCharHeight) { - maxCharHeight = charHeight; - } - - if (i == 0 && (textPositions.get(i).getUnicode().equals(" ") || textPositions.get(i).getUnicode().equals("\u00A0") || textPositions.get(i).getUnicode().equals("\t"))) { - startIndex++; - continue; - } - - // Strange but sometimes this is happening, for example: Metolachlor2.pdf - if (i > 0 && textPositions.get(i).getXDirAdj() < textPositions.get(i - 1).getXDirAdj()) { - List sublist = textPositions.subList(startIndex, i); - if (!(sublist.isEmpty() || sublist.size() == 1 && (sublist.get(0).getUnicode().equals(" ") || sublist.get(0).getUnicode().equals("\u00A0") || sublist.get(0) - .getUnicode() - .equals("\t")))) { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); - } - startIndex = i; - } - - if (textPositions.get(i).getRotation() == 0 && i > 0 && textPositions.get(i).getX() > textPositions.get(i - 1).getEndX() + 1) { - List sublist = textPositions.subList(startIndex, i); - if (!(sublist.isEmpty() || sublist.size() == 1 && (sublist.get(0).getUnicode().equals(" ") || sublist.get(0).getUnicode().equals("\u00A0") || sublist.get(0) - .getUnicode() - .equals("\t")))) { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); - } - startIndex = i; - } - - if (i > 0 && (textPositions.get(i).getUnicode().equals(" ") || textPositions.get(i).getUnicode().equals("\u00A0") || textPositions.get(i) - .getUnicode() - .equals("\t")) && i <= textPositions.size() - 2) { - List sublist = textPositions.subList(startIndex, i); - if (!(sublist.isEmpty() || sublist.size() == 1 && (sublist.get(0).getUnicode().equals(" ") || sublist.get(0).getUnicode().equals("\u00A0") || sublist.get(0) - .getUnicode() - .equals("\t")))) { - - // Remove false sequence ends (whitespaces) - if (previous != null && sublist.get(0).getYDirAdj() == previous.getYDirAdj() && sublist.get(0) - .getXDirAdj() - (previous.getXDirAdj() + previous.getWidthDirAdj()) < 0.01) { - for (TextPosition textPosition : sublist) { - textPositionSequences.get(textPositionSequences.size() - 1).add(textPosition); - } - } else { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); - } - } - startIndex = i + 1; - } - } - - List sublist = textPositions.subList(startIndex, textPositions.size()); - if (!sublist.isEmpty() && (sublist.get(sublist.size() - 1).getUnicode().equals(" ") || sublist.get(sublist.size() - 1) - .getUnicode() - .equals("\u00A0") || sublist.get(sublist.size() - 1).getUnicode().equals("\t"))) { - sublist = sublist.subList(0, sublist.size() - 1); - } - - if (!(sublist.isEmpty() || sublist.size() == 1 && (sublist.get(0).getUnicode().equals(" ") || sublist.get(0).getUnicode().equals("\u00A0") || sublist.get(0) - .getUnicode() - .equals("\t")))) { - if (previous != null && sublist.get(0).getYDirAdj() == previous.getYDirAdj() && sublist.get(0) - .getXDirAdj() - (previous.getXDirAdj() + previous.getWidthDirAdj()) < 0.01) { - for (TextPosition t : sublist) { - textPositionSequences.get(textPositionSequences.size() - 1).add(t); - } - } else { - textPositionSequences.add(new TextPositionSequence(sublist, pageNumber)); - } - } - super.writeString(text); - } - - - @Override - public String getText(PDDocument doc) throws IOException { - - minCharWidth = Integer.MAX_VALUE; - maxCharWidth = 0; - minCharHeight = Integer.MAX_VALUE; - maxCharHeight = 0; - textPositionSequences.clear(); - rulings.clear(); - graphicsPath.clear(); - path_x = 0.0f; - path_y = 0.0f; - - return super.getText(doc); - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/PDFTextStripper.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/PDFTextStripper.java deleted file mode 100644 index 48dc580a..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/parsing/PDFTextStripper.java +++ /dev/null @@ -1,2070 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.parsing; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.LineNumberReader; -import java.io.StringWriter; -import java.io.Writer; -import java.text.Bidi; -import java.text.Normalizer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.SortedMap; -import java.util.SortedSet; -import java.util.StringTokenizer; -import java.util.TreeMap; -import java.util.TreeSet; -import java.util.regex.Pattern; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageTree; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem; -import org.apache.pdfbox.pdmodel.interactive.pagenavigation.PDThreadBead; -import org.apache.pdfbox.text.TextPosition; -import org.apache.pdfbox.text.TextPositionComparator; -import org.apache.pdfbox.util.QuickSort; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.utils.SuppressFBWarnings; - -/** - * This is just a copy except i only adjusted lines 594-607 cause this is a bug in Pdfbox. - * see S416.pdf - */ -@SuppressWarnings({"PMD", "checkstyle:all"}) -public class PDFTextStripper extends LegacyPDFStreamEngine { - - private static float defaultIndentThreshold = 2.0f; - private static float defaultDropThreshold = 2.5f; - private static final boolean useCustomQuickSort; - - private static final Log LOG = LogFactory.getLog(PDFTextStripper.class); - - // enable the ability to set the default indent/drop thresholds - // with -D system properties: - // pdftextstripper.indent - // pdftextstripper.drop - static { - String strDrop = null, strIndent = null; - try { - String className = PDFTextStripper.class.getSimpleName().toLowerCase(); - String prop = className + ".indent"; - strIndent = System.getProperty(prop); - prop = className + ".drop"; - strDrop = System.getProperty(prop); - } catch (SecurityException e) { - // PDFBOX-1946 when run in an applet - // ignore and use default - } - if (strIndent != null && strIndent.length() > 0) { - try { - defaultIndentThreshold = Float.parseFloat(strIndent); - } catch (NumberFormatException nfe) { - // ignore and use default - } - } - if (strDrop != null && strDrop.length() > 0) { - try { - defaultDropThreshold = Float.parseFloat(strDrop); - } catch (NumberFormatException nfe) { - // ignore and use default - } - } - } - - - static { - // check if we need to use the custom quicksort algorithm as a - // workaround to the PDFBOX-1512 transitivity issue of TextPositionComparator: - boolean is16orLess = false; - try { - String version = System.getProperty("java.specification.version"); - StringTokenizer st = new StringTokenizer(version, "."); - int majorVersion = Integer.parseInt(st.nextToken()); - int minorVersion = 0; - if (st.hasMoreTokens()) { - minorVersion = Integer.parseInt(st.nextToken()); - } - is16orLess = majorVersion == 1 && minorVersion <= 6; - } catch (SecurityException x) { - // when run in an applet ignore and use default - // assume 1.7 or higher so that quicksort is used - } catch (NumberFormatException nfe) { - // should never happen, but if it does, - // assume 1.7 or higher so that quicksort is used - } - useCustomQuickSort = !is16orLess; - } - - /** - * The platform's line separator. - */ - protected final String LINE_SEPARATOR = System.getProperty("line.separator"); - - private String lineSeparator = LINE_SEPARATOR; - private String wordSeparator = " "; - private String paragraphStart = ""; - private String paragraphEnd = ""; - private String pageStart = ""; - private String pageEnd = LINE_SEPARATOR; - private String articleStart = ""; - private String articleEnd = ""; - - private int currentPageNo = 0; - private int startPage = 1; - private int endPage = Integer.MAX_VALUE; - private PDOutlineItem startBookmark = null; - - // 1-based bookmark pages - private int startBookmarkPageNumber = -1; - private int endBookmarkPageNumber = -1; - - private PDOutlineItem endBookmark = null; - private boolean suppressDuplicateOverlappingText = true; - private boolean shouldSeparateByBeads = true; - private boolean sortByPosition = false; - private boolean addMoreFormatting = false; - - private float indentThreshold = defaultIndentThreshold; - private float dropThreshold = defaultDropThreshold; - - // we will need to estimate where to add spaces, these are used to help guess - private float spacingTolerance = .5f; - private float averageCharTolerance = .3f; - - private List beadRectangles = null; - - /** - * The charactersByArticle is used to extract text by article divisions. For example a PDF that has two columns like - * a newspaper, we want to extract the first column and then the second column. In this example the PDF would have 2 - * beads(or articles), one for each column. The size of the charactersByArticle would be 5, because not all text on - * the screen will fall into one of the articles. The five divisions are shown below - *

- * Text before first article - * first article text - * text between first article and second article - * second article text - * text after second article - *

- * Most PDFs won't have any beads, so charactersByArticle will contain a single entry. - */ - protected ArrayList> charactersByArticle = new ArrayList<>(); - - private Map>> characterListMapping = new HashMap<>(); - - protected PDDocument document; - protected Writer output; - - /** - * True if we started a paragraph but haven't ended it yet. - */ - private boolean inParagraph; - - - /** - * Instantiate a new PDFTextStripper object. - * - * @throws IOException If there is an error loading the properties. - */ - public PDFTextStripper() throws IOException { - - } - - - /** - * This will return the text of a document. See writeText.
- * NOTE: The document must not be encrypted when coming into this method. - * - *

IMPORTANT: By default, text extraction is done in the same sequence as the text in the PDF page content stream. - * PDF is a graphic format, not a text format, and unlike HTML, it has no requirements that text one on page - * be rendered in a certain order. The order is the one that was determined by the software that created the - * PDF. To get text sorted from left to right and top to botton, use {@link #setSortByPosition(boolean)}. - * - * @param doc The document to get the text from. - * @return The text of the PDF document. - * @throws IOException if the doc state is invalid or it is encrypted. - */ - public String getText(PDDocument doc) throws IOException { - - StringWriter outputStream = new StringWriter(); - writeText(doc, outputStream); - return outputStream.toString(); - } - - - private void resetEngine() { - - currentPageNo = 0; - document = null; - if (charactersByArticle != null) { - charactersByArticle.clear(); - } - characterListMapping.clear(); - } - - - /** - * This will take a PDDocument and write the text of that document to the print writer. - * - * @param doc The document to get the data from. - * @param outputStream The location to put the text. - * @throws IOException If the doc is in an invalid state. - */ - public void writeText(PDDocument doc, Writer outputStream) throws IOException { - - resetEngine(); - document = doc; - output = outputStream; - if (getAddMoreFormatting()) { - paragraphEnd = lineSeparator; - pageStart = lineSeparator; - articleStart = lineSeparator; - articleEnd = lineSeparator; - } - startDocument(document); - processPages(document.getPages()); - endDocument(document); - } - - - /** - * This will process all of the pages and the text that is in them. - * - * @param pages The pages object in the document. - * @throws IOException If there is an error parsing the text. - */ - protected void processPages(PDPageTree pages) throws IOException { - - PDPage startBookmarkPage = startBookmark == null ? null : startBookmark.findDestinationPage(document); - if (startBookmarkPage != null) { - startBookmarkPageNumber = pages.indexOf(startBookmarkPage) + 1; - } else { - // -1 = undefined - startBookmarkPageNumber = -1; - } - - PDPage endBookmarkPage = endBookmark == null ? null : endBookmark.findDestinationPage(document); - if (endBookmarkPage != null) { - endBookmarkPageNumber = pages.indexOf(endBookmarkPage) + 1; - } else { - // -1 = undefined - endBookmarkPageNumber = -1; - } - - if (startBookmarkPageNumber == -1 && startBookmark != null && endBookmarkPageNumber == -1 && endBookmark != null && startBookmark.getCOSObject() == endBookmark.getCOSObject()) { - // this is a special case where both the start and end bookmark - // are the same but point to nothing. In this case - // we will not extract any text. - startBookmarkPageNumber = 0; - endBookmarkPageNumber = 0; - } - - for (PDPage page : pages) { - currentPageNo++; - if (page.hasContents()) { - processPage(page); - } - } - } - - - /** - * This method is available for subclasses of this class. It will be called before processing of the document start. - * - * @param document The PDF document that is being processed. - */ - protected void startDocument(PDDocument document) { - // no default implementation, but available for subclasses - } - - - /** - * This method is available for subclasses of this class. It will be called after processing of the document - * finishes. - * - * @param document The PDF document that is being processed. - */ - protected void endDocument(PDDocument document) { - // no default implementation, but available for subclasses - } - - - /** - * This will process the contents of a page. - * - * @param page The page to process. - * @throws IOException If there is an error processing the page. - */ - @Override - public void processPage(PDPage page) throws IOException { - - if (currentPageNo >= startPage && currentPageNo <= endPage && (startBookmarkPageNumber == -1 || currentPageNo >= startBookmarkPageNumber) && (endBookmarkPageNumber == -1 || currentPageNo <= endBookmarkPageNumber)) { - startPage(page); - - int numberOfArticleSections = 1; - if (shouldSeparateByBeads) { - fillBeadRectangles(page); - numberOfArticleSections += beadRectangles.size() * 2; - } - int originalSize = charactersByArticle.size(); - charactersByArticle.ensureCapacity(numberOfArticleSections); - int lastIndex = Math.max(numberOfArticleSections, originalSize); - for (int i = 0; i < lastIndex; i++) { - if (i < originalSize) { - charactersByArticle.get(i).clear(); - } else { - if (numberOfArticleSections < originalSize) { - charactersByArticle.remove(i); - } else { - charactersByArticle.add(new ArrayList<>()); - } - } - } - characterListMapping.clear(); - super.processPage(page); - writePage(); - endPage(page); - } - } - - - private void fillBeadRectangles(PDPage page) { - - beadRectangles = new ArrayList<>(); - for (PDThreadBead bead : page.getThreadBeads()) { - if (bead == null || bead.getRectangle() == null) { - // can't skip, because of null entry handling in processTextPosition() - beadRectangles.add(null); - continue; - } - - PDRectangle rect = bead.getRectangle(); - - // bead rectangle is in PDF coordinates (y=0 is bottom), - // glyphs are in image coordinates (y=0 is top), - // so we must flip - PDRectangle mediaBox = page.getMediaBox(); - float upperRightY = mediaBox.getUpperRightY() - rect.getLowerLeftY(); - float lowerLeftY = mediaBox.getUpperRightY() - rect.getUpperRightY(); - rect.setLowerLeftY(lowerLeftY); - rect.setUpperRightY(upperRightY); - - // adjust for cropbox - PDRectangle cropBox = page.getCropBox(); - if (cropBox.getLowerLeftX() != 0 || cropBox.getLowerLeftY() != 0) { - rect.setLowerLeftX(rect.getLowerLeftX() - cropBox.getLowerLeftX()); - rect.setLowerLeftY(rect.getLowerLeftY() - cropBox.getLowerLeftY()); - rect.setUpperRightX(rect.getUpperRightX() - cropBox.getLowerLeftX()); - rect.setUpperRightY(rect.getUpperRightY() - cropBox.getLowerLeftY()); - } - - beadRectangles.add(rect); - } - } - - - /** - * Start a new article, which is typically defined as a column on a single page (also referred to as a bead). This - * assumes that the primary direction of text is left to right. Default implementation is to do nothing. Subclasses - * may provide additional information. - * - * @throws IOException If there is any error writing to the stream. - */ - protected void startArticle() throws IOException { - - startArticle(true); - } - - - /** - * Start a new article, which is typically defined as a column on a single page (also referred to as a bead). - * Default implementation is to do nothing. Subclasses may provide additional information. - * - * @param isLTR true if primary direction of text is left to right. - * @throws IOException If there is any error writing to the stream. - */ - protected void startArticle(boolean isLTR) throws IOException { - - output.write(getArticleStart()); - } - - - /** - * End an article. Default implementation is to do nothing. Subclasses may provide additional information. - * - * @throws IOException If there is any error writing to the stream. - */ - protected void endArticle() throws IOException { - - output.write(getArticleEnd()); - } - - - /** - * Start a new page. Default implementation is to do nothing. Subclasses may provide additional information. - * - * @param page The page we are about to process. - */ - protected void startPage(PDPage page) { - // default is to do nothing - } - - - /** - * End a page. Default implementation is to do nothing. Subclasses may provide additional information. - * - * @param page The page we are about to process. - */ - protected void endPage(PDPage page) { - // default is to do nothing - } - - - private static final float END_OF_LAST_TEXT_X_RESET_VALUE = -1; - private static final float MAX_Y_FOR_LINE_RESET_VALUE = -Float.MAX_VALUE; - private static final float EXPECTED_START_OF_NEXT_WORD_X_RESET_VALUE = -Float.MAX_VALUE; - private static final float MAX_HEIGHT_FOR_LINE_RESET_VALUE = -1; - private static final float MIN_Y_TOP_FOR_LINE_RESET_VALUE = Float.MAX_VALUE; - private static final float LAST_WORD_SPACING_RESET_VALUE = -1; - - - /** - * This will print the text of the processed page to "output". It will estimate, based on the coordinates of the - * text, where newlines and word spacings should be placed. The text will be sorted only if that feature was - * enabled. - * - * @throws IOException If there is an error writing the text. - */ - protected void writePage() throws IOException { - - float maxYForLine = MAX_Y_FOR_LINE_RESET_VALUE; - float minYTopForLine = MIN_Y_TOP_FOR_LINE_RESET_VALUE; - float endOfLastTextX = END_OF_LAST_TEXT_X_RESET_VALUE; - float lastWordSpacing = LAST_WORD_SPACING_RESET_VALUE; - float maxHeightForLine = MAX_HEIGHT_FOR_LINE_RESET_VALUE; - PositionWrapper lastPosition = null; - PositionWrapper lastLineStartPosition = null; - - boolean startOfPage = true; // flag to indicate start of page - boolean startOfArticle; - if (!charactersByArticle.isEmpty()) { - writePageStart(); - } - - for (List textList : charactersByArticle) { - if (getSortByPosition()) { - TextPositionComparator comparator = new TextPositionComparator(); - - // because the TextPositionComparator is not transitive, but - // JDK7+ enforces transitivity on comparators, we need to use - // a custom quicksort implementation (which is slower, unfortunately). - if (useCustomQuickSort) { - QuickSort.sort(textList, comparator); - } else { - Collections.sort(textList, comparator); - } - } - - startArticle(); - startOfArticle = true; - - // Now cycle through to print the text. - // We queue up a line at a time before we print so that we can convert - // the line from presentation form to logical form (if needed). - List line = new ArrayList<>(); - - Iterator textIter = textList.iterator(); - // PDF files don't always store spaces. We will need to guess where we should add - // spaces based on the distances between TextPositions. Historically, this was done - // based on the size of the space character provided by the font. In general, this - // worked but there were cases where it did not work. Calculating the average character - // width and using that as a metric works better in some cases but fails in some cases - // where the spacing worked. So we use both. NOTE: Adobe reader also fails on some of - // these examples. - - // Keeps track of the previous average character width - float previousAveCharWidth = -1; - while (textIter.hasNext()) { - TextPosition position = textIter.next(); - PositionWrapper current = new PositionWrapper(position); - String characterValue = position.getUnicode(); - - // Resets the average character width when we see a change in font - // or a change in the font size - if (lastPosition != null && (position.getFont() != lastPosition.getTextPosition().getFont() || position.getFontSize() != lastPosition.getTextPosition() - .getFontSize())) { - previousAveCharWidth = -1; - } - - float positionX; - float positionY; - float positionWidth; - float positionHeight; - - // If we are sorting, then we need to use the text direction - // adjusted coordinates, because they were used in the sorting. -// if (getSortByPosition()) -// { - positionX = position.getXDirAdj(); - positionY = position.getYDirAdj(); - positionWidth = position.getWidthDirAdj(); - positionHeight = position.getHeightDir(); -// } -// else -// { -// positionX = position.getX(); -// positionY = position.getY(); -// positionWidth = position.getWidth(); -// positionHeight = position.getHeight(); -// } - - // The current amount of characters in a word - int wordCharCount = position.getIndividualWidths().length; - - // Estimate the expected width of the space based on the - // space character with some margin. - float wordSpacing = position.getWidthOfSpace(); - float deltaSpace; - if (wordSpacing == 0 || Float.isNaN(wordSpacing)) { - deltaSpace = Float.MAX_VALUE; - } else { - if (lastWordSpacing < 0) { - deltaSpace = wordSpacing * getSpacingTolerance(); - } else { - deltaSpace = (wordSpacing + lastWordSpacing) / 2f * getSpacingTolerance(); - } - } - - // Estimate the expected width of the space based on the average character width - // with some margin. This calculation does not make a true average (average of - // averages) but we found that it gave the best results after numerous experiments. - // Based on experiments we also found that .3 worked well. - float averageCharWidth; - if (previousAveCharWidth < 0) { - averageCharWidth = positionWidth / wordCharCount; - } else { - averageCharWidth = (previousAveCharWidth + positionWidth / wordCharCount) / 2f; - } - float deltaCharWidth = averageCharWidth * getAverageCharTolerance(); - - // Compares the values obtained by the average method and the wordSpacing method - // and picks the smaller number. - float expectedStartOfNextWordX = EXPECTED_START_OF_NEXT_WORD_X_RESET_VALUE; - if (endOfLastTextX != END_OF_LAST_TEXT_X_RESET_VALUE) { - expectedStartOfNextWordX = endOfLastTextX + Math.min(deltaSpace, deltaCharWidth); - } - - if (lastPosition != null) { - if (startOfArticle) { - lastPosition.setArticleStart(); - startOfArticle = false; - } - // RDD - Here we determine whether this text object is on the current - // line. We use the lastBaselineFontSize to handle the superscript - // case, and the size of the current font to handle the subscript case. - // Text must overlap with the last rendered baseline text by at least - // a small amount in order to be considered as being on the same line. - - // XXX BC: In theory, this check should really check if the next char is in - // full range seen in this line. This is what I tried to do with minYTopForLine, - // but this caused a lot of regression test failures. So, I'm leaving it be for - // now - if (!overlap(positionY, positionHeight, maxYForLine, maxHeightForLine)) { - writeLine(normalize(line)); - line.clear(); - lastLineStartPosition = handleLineSeparation(current, lastPosition, lastLineStartPosition, maxHeightForLine); - expectedStartOfNextWordX = EXPECTED_START_OF_NEXT_WORD_X_RESET_VALUE; - maxYForLine = MAX_Y_FOR_LINE_RESET_VALUE; - maxHeightForLine = MAX_HEIGHT_FOR_LINE_RESET_VALUE; - minYTopForLine = MIN_Y_TOP_FOR_LINE_RESET_VALUE; - } - // test if our TextPosition starts after a new word would be expected to start - if (expectedStartOfNextWordX != EXPECTED_START_OF_NEXT_WORD_X_RESET_VALUE && expectedStartOfNextWordX < positionX - // only bother adding a word separator if the last character was not a word separator - && (wordSeparator.isEmpty() || // - (lastPosition.getTextPosition().getUnicode() != null && !lastPosition.getTextPosition().getUnicode().endsWith(wordSeparator)))) { - line.add(LineItem.getWordSeparator()); - } - // if there is at least the equivalent of one space - // between the last character and the current one, - // reset the max line height as the font size may have completely changed - if (Math.abs(position.getX() - lastPosition.getTextPosition().getX()) > (wordSpacing + deltaSpace)) { - maxYForLine = MAX_Y_FOR_LINE_RESET_VALUE; - maxHeightForLine = MAX_HEIGHT_FOR_LINE_RESET_VALUE; - minYTopForLine = MIN_Y_TOP_FOR_LINE_RESET_VALUE; - } - } - if (positionY >= maxYForLine) { - maxYForLine = positionY; - } - // RDD - endX is what PDF considers to be the x coordinate of the - // end position of the text. We use it in computing our metrics below. - endOfLastTextX = positionX + positionWidth; - - // add it to the list - if (characterValue != null) { - if (startOfPage && lastPosition == null) { - writeParagraphStart();// not sure this is correct for RTL? - } - line.add(new LineItem(position)); - } - maxHeightForLine = Math.max(maxHeightForLine, positionHeight); - minYTopForLine = Math.min(minYTopForLine, positionY - positionHeight); - lastPosition = current; - if (startOfPage) { - lastPosition.setParagraphStart(); - lastPosition.setLineStart(); - lastLineStartPosition = lastPosition; - startOfPage = false; - } - lastWordSpacing = wordSpacing; - previousAveCharWidth = averageCharWidth; - } - // print the final line - if (line.size() > 0) { - writeLine(normalize(line)); - writeParagraphEnd(); - } - endArticle(); - } - writePageEnd(); - } - - - private boolean overlap(float y1, float height1, float y2, float height2) { - - return within(y1, y2, .1f) || y2 <= y1 && y2 >= y1 - height1 || y1 <= y2 && y1 >= y2 - height2; - } - - - /** - * Write the line separator value to the output stream. - * - * @throws IOException If there is a problem writing out the line separator to the document. - */ - protected void writeLineSeparator() throws IOException { - - output.write(getLineSeparator()); - } - - - /** - * Write the word separator value to the output stream. - * - * @throws IOException If there is a problem writing out the word separator to the document. - */ - protected void writeWordSeparator() throws IOException { - - output.write(getWordSeparator()); - } - - - /** - * Write the string in TextPosition to the output stream. - * - * @param text The text to write to the stream. - * @throws IOException If there is an error when writing the text. - */ - protected void writeCharacters(TextPosition text) throws IOException { - - output.write(text.getUnicode()); - } - - - /** - * Write a Java string to the output stream. The default implementation will ignore the textPositions - * and just calls {@link #writeString(String)}. - * - * @param text The text to write to the stream. - * @param textPositions The TextPositions belonging to the text. - * @throws IOException If there is an error when writing the text. - */ - protected void writeString(String text, List textPositions) throws IOException { - - writeString(text); - } - - - /** - * Write a Java string to the output stream. - * - * @param text The text to write to the stream. - * @throws IOException If there is an error when writing the text. - */ - protected void writeString(String text) throws IOException { - - output.write(text); - } - - - /** - * This will determine of two floating point numbers are within a specified variance. - * - * @param first The first number to compare to. - * @param second The second number to compare to. - * @param variance The allowed variance. - */ - private boolean within(float first, float second, float variance) { - - return second < first + variance && second > first - variance; - } - - - /** - * This will process a TextPosition object and add the text to the list of characters on a page. It takes care of - * overlapping text. - * - * @param text The text to process. - */ - @Override - protected void processTextPosition(TextPosition text) { - - boolean showCharacter = true; - if (suppressDuplicateOverlappingText) { - showCharacter = false; - String textCharacter = text.getUnicode(); - float textX = text.getX(); - float textY = text.getY(); - TreeMap> sameTextCharacters = characterListMapping.get(textCharacter); - if (sameTextCharacters == null) { - sameTextCharacters = new TreeMap>(); - characterListMapping.put(textCharacter, sameTextCharacters); - } - // RDD - Here we compute the value that represents the end of the rendered - // text. This value is used to determine whether subsequent text rendered - // on the same line overwrites the current text. - // - // We subtract any positive padding to handle cases where extreme amounts - // of padding are applied, then backed off (not sure why this is done, but there - // are cases where the padding is on the order of 10x the character width, and - // the TJ just backs up to compensate after each character). Also, we subtract - // an amount to allow for kerning (a percentage of the width of the last - // character). - boolean suppressCharacter = false; - float tolerance = text.getWidth() / textCharacter.length() / 3.0f; - - SortedMap> xMatches = sameTextCharacters.subMap(textX - tolerance, textX + tolerance); - for (TreeSet xMatch : xMatches.values()) { - SortedSet yMatches = xMatch.subSet(textY - tolerance, textY + tolerance); - if (!yMatches.isEmpty()) { - suppressCharacter = true; - break; - } - } - if (!suppressCharacter) { - TreeSet ySet = sameTextCharacters.get(textX); - if (ySet == null) { - ySet = new TreeSet(); - sameTextCharacters.put(textX, ySet); - } - ySet.add(textY); - showCharacter = true; - } - } - if (showCharacter) { - // if we are showing the character then we need to determine which article it belongs to - int foundArticleDivisionIndex = -1; - int notFoundButFirstLeftAndAboveArticleDivisionIndex = -1; - int notFoundButFirstLeftArticleDivisionIndex = -1; - int notFoundButFirstAboveArticleDivisionIndex = -1; - float x = text.getX(); - float y = text.getY(); - if (shouldSeparateByBeads) { - for (int i = 0; i < beadRectangles.size() && foundArticleDivisionIndex == -1; i++) { - PDRectangle rect = beadRectangles.get(i); - if (rect != null) { - if (rect.contains(x, y)) { - foundArticleDivisionIndex = i * 2 + 1; - } else if ((x < rect.getLowerLeftX() || y < rect.getUpperRightY()) && notFoundButFirstLeftAndAboveArticleDivisionIndex == -1) { - notFoundButFirstLeftAndAboveArticleDivisionIndex = i * 2; - } else if (x < rect.getLowerLeftX() && notFoundButFirstLeftArticleDivisionIndex == -1) { - notFoundButFirstLeftArticleDivisionIndex = i * 2; - } else if (y < rect.getUpperRightY() && notFoundButFirstAboveArticleDivisionIndex == -1) { - notFoundButFirstAboveArticleDivisionIndex = i * 2; - } - } else { - foundArticleDivisionIndex = 0; - } - } - } else { - foundArticleDivisionIndex = 0; - } - int articleDivisionIndex; - if (foundArticleDivisionIndex != -1) { - articleDivisionIndex = foundArticleDivisionIndex; - } else if (notFoundButFirstLeftAndAboveArticleDivisionIndex != -1) { - articleDivisionIndex = notFoundButFirstLeftAndAboveArticleDivisionIndex; - } else if (notFoundButFirstLeftArticleDivisionIndex != -1) { - articleDivisionIndex = notFoundButFirstLeftArticleDivisionIndex; - } else if (notFoundButFirstAboveArticleDivisionIndex != -1) { - articleDivisionIndex = notFoundButFirstAboveArticleDivisionIndex; - } else { - articleDivisionIndex = charactersByArticle.size() - 1; - } - - List textList = charactersByArticle.get(articleDivisionIndex); - - // In the wild, some PDF encoded documents put diacritics (accents on - // top of characters) into a separate Tj element. When displaying them - // graphically, the two chunks get overlaid. With text output though, - // we need to do the overlay. This code recombines the diacritic with - // its associated character if the two are consecutive. - if (textList.isEmpty()) { - textList.add(text); - } else { - // test if we overlap the previous entry. - // Note that we are making an assumption that we need to only look back - // one TextPosition to find what we are overlapping. - // This may not always be true. */ - TextPosition previousTextPosition = textList.get(textList.size() - 1); - if (text.isDiacritic() && previousTextPosition.contains(text)) { - previousTextPosition.mergeDiacritic(text); - } - // If the previous TextPosition was the diacritic, merge it into this - // one and remove it from the list. - else if (previousTextPosition.isDiacritic() && text.contains(previousTextPosition)) { - text.mergeDiacritic(previousTextPosition); - textList.remove(textList.size() - 1); - textList.add(text); - } else { - textList.add(text); - } - } - } - } - - - /** - * This is the page that the text extraction will start on. The pages start at page 1. For example in a 5 page PDF - * document, if the start page is 1 then all pages will be extracted. If the start page is 4 then pages 4 and 5 will - * be extracted. The default value is 1. - * - * @return Value of property startPage. - */ - public int getStartPage() { - - return startPage; - } - - - /** - * This will set the first page to be extracted by this class. - * - * @param startPageValue New value of 1-based startPage property. - */ - public void setStartPage(int startPageValue) { - - startPage = startPageValue; - } - - - /** - * This will get the last page that will be extracted. This is inclusive, for example if a 5 page PDF an endPage - * value of 5 would extract the entire document, an end page of 2 would extract pages 1 and 2. This defaults to - * Integer.MAX_VALUE such that all pages of the pdf will be extracted. - * - * @return Value of property endPage. - */ - public int getEndPage() { - - return endPage; - } - - - /** - * This will set the last page to be extracted by this class. - * - * @param endPageValue New value of 1-based endPage property. - */ - public void setEndPage(int endPageValue) { - - endPage = endPageValue; - } - - - /** - * Set the desired line separator for output text. The line.separator system property is used if the line separator - * preference is not set explicitly using this method. - * - * @param separator The desired line separator string. - */ - public void setLineSeparator(String separator) { - - lineSeparator = separator; - } - - - /** - * This will get the line separator. - * - * @return The desired line separator string. - */ - public String getLineSeparator() { - - return lineSeparator; - } - - - /** - * This will get the word separator. - * - * @return The desired word separator string. - */ - public String getWordSeparator() { - - return wordSeparator; - } - - - /** - * Set the desired word separator for output text. The PDFBox text extraction algorithm will output a space - * character if there is enough space between two words. By default a space character is used. If you need and - * accurate count of characters that are found in a PDF document then you might want to set the word separator to - * the empty string. - * - * @param separator The desired page separator string. - */ - public void setWordSeparator(String separator) { - - wordSeparator = separator; - } - - - /** - * @return Returns the suppressDuplicateOverlappingText. - */ - public boolean getSuppressDuplicateOverlappingText() { - - return suppressDuplicateOverlappingText; - } - - - /** - * Get the current page number that is being processed. - * - * @return A 1 based number representing the current page. - */ - protected int getCurrentPageNo() { - - return currentPageNo; - } - - - /** - * The output stream that is being written to. - * - * @return The stream that output is being written to. - */ - protected Writer getOutput() { - - return output; - } - - - /** - * Character strings are grouped by articles. It is quite common that there will only be a single article. This - * returns a List that contains List objects, the inner lists will contain TextPosition objects. - * - * @return A double List of TextPositions for all text strings on the page. - */ - protected List> getCharactersByArticle() { - - return charactersByArticle; - } - - - /** - * By default the text stripper will attempt to remove text that overlapps each other. Word paints the same - * character several times in order to make it look bold. By setting this to false all text will be extracted, which - * means that certain sections will be duplicated, but better performance will be noticed. - * - * @param suppressDuplicateOverlappingTextValue The suppressDuplicateOverlappingText to set. - */ - public void setSuppressDuplicateOverlappingText(boolean suppressDuplicateOverlappingTextValue) { - - suppressDuplicateOverlappingText = suppressDuplicateOverlappingTextValue; - } - - - /** - * This will tell if the text stripper should separate by beads. - * - * @return If the text will be grouped by beads. - */ - public boolean getSeparateByBeads() { - - return shouldSeparateByBeads; - } - - - /** - * Set if the text stripper should group the text output by a list of beads. The default value is true! - * - * @param aShouldSeparateByBeads The new grouping of beads. - */ - public void setShouldSeparateByBeads(boolean aShouldSeparateByBeads) { - - shouldSeparateByBeads = aShouldSeparateByBeads; - } - - - /** - * Get the bookmark where text extraction should end, inclusive. Default is null. - * - * @return The ending bookmark. - */ - public PDOutlineItem getEndBookmark() { - - return endBookmark; - } - - - /** - * Set the bookmark where the text extraction should stop. - * - * @param aEndBookmark The ending bookmark. - */ - public void setEndBookmark(PDOutlineItem aEndBookmark) { - - endBookmark = aEndBookmark; - } - - - /** - * Get the bookmark where text extraction should start, inclusive. Default is null. - * - * @return The starting bookmark. - */ - public PDOutlineItem getStartBookmark() { - - return startBookmark; - } - - - /** - * Set the bookmark where text extraction should start, inclusive. - * - * @param aStartBookmark The starting bookmark. - */ - public void setStartBookmark(PDOutlineItem aStartBookmark) { - - startBookmark = aStartBookmark; - } - - - /** - * This will tell if the text stripper should add some more text formatting. - * - * @return true if some more text formatting will be added - */ - public boolean getAddMoreFormatting() { - - return addMoreFormatting; - } - - - /** - * There will some additional text formatting be added if addMoreFormatting is set to true. Default is false. - * - * @param newAddMoreFormatting Tell PDFBox to add some more text formatting - */ - public void setAddMoreFormatting(boolean newAddMoreFormatting) { - - addMoreFormatting = newAddMoreFormatting; - } - - - /** - * This will tell if the text stripper should sort the text tokens before writing to the stream. - * - * @return true If the text tokens will be sorted before being written. - */ - public boolean getSortByPosition() { - - return sortByPosition; - } - - - /** - * The order of the text tokens in a PDF file may not be in the same as they appear visually on the screen. For - * example, a PDF writer may write out all text by font, so all bold or larger text, then make a second pass and - * write out the normal text.
- * The default is to not sort by position.
- *
- * A PDF writer could choose to write each character in a different order. By default PDFBox does not sort - * the text tokens before processing them due to performance reasons. - * - * @param newSortByPosition Tell PDFBox to sort the text positions. - */ - public void setSortByPosition(boolean newSortByPosition) { - - sortByPosition = newSortByPosition; - } - - - /** - * Get the current space width-based tolerance value that is being used to estimate where spaces in text should be - * added. Note that the default value for this has been determined from trial and error. - * - * @return The current tolerance / scaling factor - */ - public float getSpacingTolerance() { - - return spacingTolerance; - } - - - /** - * Set the space width-based tolerance value that is used to estimate where spaces in text should be added. Note - * that the default value for this has been determined from trial and error. Setting this value larger will reduce - * the number of spaces added. - * - * @param spacingToleranceValue tolerance / scaling factor to use - */ - public void setSpacingTolerance(float spacingToleranceValue) { - - spacingTolerance = spacingToleranceValue; - } - - - /** - * Get the current character width-based tolerance value that is being used to estimate where spaces in text should - * be added. Note that the default value for this has been determined from trial and error. - * - * @return The current tolerance / scaling factor - */ - public float getAverageCharTolerance() { - - return averageCharTolerance; - } - - - /** - * Set the character width-based tolerance value that is used to estimate where spaces in text should be added. Note - * that the default value for this has been determined from trial and error. Setting this value larger will reduce - * the number of spaces added. - * - * @param averageCharToleranceValue average tolerance / scaling factor to use - */ - public void setAverageCharTolerance(float averageCharToleranceValue) { - - averageCharTolerance = averageCharToleranceValue; - } - - - /** - * returns the multiple of whitespace character widths for the current text which the current line start can be - * indented from the previous line start beyond which the current line start is considered to be a paragraph start. - * - * @return the number of whitespace character widths to use when detecting paragraph indents. - */ - public float getIndentThreshold() { - - return indentThreshold; - } - - - /** - * sets the multiple of whitespace character widths for the current text which the current line start can be - * indented from the previous line start beyond which the current line start is considered to be a paragraph start. - * The default value is 2.0. - * - * @param indentThresholdValue the number of whitespace character widths to use when detecting paragraph indents. - */ - public void setIndentThreshold(float indentThresholdValue) { - - indentThreshold = indentThresholdValue; - } - - - /** - * the minimum whitespace, as a multiple of the max height of the current characters beyond which the current line - * start is considered to be a paragraph start. - * - * @return the character height multiple for max allowed whitespace between lines in the same paragraph. - */ - public float getDropThreshold() { - - return dropThreshold; - } - - - /** - * sets the minimum whitespace, as a multiple of the max height of the current characters beyond which the current - * line start is considered to be a paragraph start. The default value is 2.5. - * - * @param dropThresholdValue the character height multiple for max allowed whitespace between lines in the same - * paragraph. - */ - public void setDropThreshold(float dropThresholdValue) { - - dropThreshold = dropThresholdValue; - } - - - /** - * Returns the string which will be used at the beginning of a paragraph. - * - * @return the paragraph start string - */ - public String getParagraphStart() { - - return paragraphStart; - } - - - /** - * Sets the string which will be used at the beginning of a paragraph. - * - * @param s the paragraph start string - */ - public void setParagraphStart(String s) { - - paragraphStart = s; - } - - - /** - * Returns the string which will be used at the end of a paragraph. - * - * @return the paragraph end string - */ - public String getParagraphEnd() { - - return paragraphEnd; - } - - - /** - * Sets the string which will be used at the end of a paragraph. - * - * @param s the paragraph end string - */ - public void setParagraphEnd(String s) { - - paragraphEnd = s; - } - - - /** - * Returns the string which will be used at the beginning of a page. - * - * @return the page start string - */ - public String getPageStart() { - - return pageStart; - } - - - /** - * Sets the string which will be used at the beginning of a page. - * - * @param pageStartValue the page start string - */ - public void setPageStart(String pageStartValue) { - - pageStart = pageStartValue; - } - - - /** - * Returns the string which will be used at the end of a page. - * - * @return the page end string - */ - public String getPageEnd() { - - return pageEnd; - } - - - /** - * Sets the string which will be used at the end of a page. - * - * @param pageEndValue the page end string - */ - public void setPageEnd(String pageEndValue) { - - pageEnd = pageEndValue; - } - - - /** - * Returns the string which will be used at the beginning of an article. - * - * @return the article start string - */ - public String getArticleStart() { - - return articleStart; - } - - - /** - * Sets the string which will be used at the beginning of an article. - * - * @param articleStartValue the article start string - */ - public void setArticleStart(String articleStartValue) { - - articleStart = articleStartValue; - } - - - /** - * Returns the string which will be used at the end of an article. - * - * @return the article end string - */ - public String getArticleEnd() { - - return articleEnd; - } - - - /** - * Sets the string which will be used at the end of an article. - * - * @param articleEndValue the article end string - */ - public void setArticleEnd(String articleEndValue) { - - articleEnd = articleEndValue; - } - - - /** - * handles the line separator for a new line given the specified current and previous TextPositions. - * - * @param current the current text position - * @param lastPosition the previous text position - * @param lastLineStartPosition the last text position that followed a line separator. - * @param maxHeightForLine max height for positions since lastLineStartPosition - * @return start position of the last line - * @throws IOException if something went wrong - */ - private PositionWrapper handleLineSeparation(PositionWrapper current, - PositionWrapper lastPosition, - PositionWrapper lastLineStartPosition, - float maxHeightForLine) throws IOException { - - current.setLineStart(); - isParagraphSeparation(current, lastPosition, lastLineStartPosition, maxHeightForLine); - lastLineStartPosition = current; - if (current.isParagraphStart()) { - if (lastPosition.isArticleStart()) { - if (lastPosition.isLineStart()) { - writeLineSeparator(); - } - writeParagraphStart(); - } else { - writeLineSeparator(); - writeParagraphSeparator(); - } - } else { - writeLineSeparator(); - } - return lastLineStartPosition; - } - - - /** - * tests the relationship between the last text position, the current text position and the last text position that - * followed a line separator to decide if the gap represents a paragraph separation. This should only be - * called for consecutive text positions that first pass the line separation test. - *

- * This base implementation tests to see if the lastLineStartPosition is null OR if the current vertical position - * has dropped below the last text vertical position by at least 2.5 times the current text height OR if the current - * horizontal position is indented by at least 2 times the current width of a space character. - *

- *

- * This also attempts to identify text that is indented under a hanging indent. - *

- *

- * This method sets the isParagraphStart and isHangingIndent flags on the current position object. - *

- * - * @param position the current text position. This may have its isParagraphStart or isHangingIndent flags set upon - * return. - * @param lastPosition the previous text position (should not be null). - * @param lastLineStartPosition the last text position that followed a line separator, or null. - * @param maxHeightForLine max height for text positions since lasLineStartPosition. - */ - private void isParagraphSeparation(PositionWrapper position, PositionWrapper lastPosition, PositionWrapper lastLineStartPosition, float maxHeightForLine) { - - boolean result = false; - if (lastLineStartPosition == null) { - result = true; - } else { - float yGap = Math.abs(position.getTextPosition().getYDirAdj() - lastPosition.getTextPosition().getYDirAdj()); - float newYVal = multiplyFloat(getDropThreshold(), maxHeightForLine); - // do we need to flip this for rtl? - float xGap = position.getTextPosition().getXDirAdj() - lastLineStartPosition.getTextPosition().getXDirAdj(); - float newXVal = multiplyFloat(getIndentThreshold(), position.getTextPosition().getWidthOfSpace()); - float positionWidth = multiplyFloat(0.25f, position.getTextPosition().getWidth()); - - if (yGap > newYVal) { - result = true; - } else if (xGap > newXVal) { - // text is indented, but try to screen for hanging indent - if (!lastLineStartPosition.isParagraphStart()) { - result = true; - } else { - position.setHangingIndent(); - } - } else if (xGap < -position.getTextPosition().getWidthOfSpace()) { - // text is left of previous line. Was it a hanging indent? - if (!lastLineStartPosition.isParagraphStart()) { - result = true; - } - } else if (Math.abs(xGap) < positionWidth) { - // current horizontal position is within 1/4 a char of the last - // linestart. We'll treat them as lined up. - if (lastLineStartPosition.isHangingIndent()) { - position.setHangingIndent(); - } else if (lastLineStartPosition.isParagraphStart()) { - // check to see if the previous line looks like - // any of a number of standard list item formats - Pattern liPattern = matchListItemPattern(lastLineStartPosition); - if (liPattern != null) { - Pattern currentPattern = matchListItemPattern(position); - if (liPattern == currentPattern) { - result = true; - } - } - } - } - } - if (result) { - position.setParagraphStart(); - } - } - - - private float multiplyFloat(float value1, float value2) { - // multiply 2 floats and truncate the resulting value to 3 decimal places - // to avoid wrong results when comparing with another float - return Math.round(value1 * value2 * 1000) / 1000f; - } - - - /** - * writes the paragraph separator string to the output. - * - * @throws IOException if something went wrong - */ - protected void writeParagraphSeparator() throws IOException { - - writeParagraphEnd(); - writeParagraphStart(); - } - - - /** - * Write something (if defined) at the start of a paragraph. - * - * @throws IOException if something went wrong - */ - protected void writeParagraphStart() throws IOException { - - if (inParagraph) { - writeParagraphEnd(); - inParagraph = false; - } - output.write(getParagraphStart()); - inParagraph = true; - } - - - /** - * Write something (if defined) at the end of a paragraph. - * - * @throws IOException if something went wrong - */ - protected void writeParagraphEnd() throws IOException { - - if (!inParagraph) { - writeParagraphStart(); - } - output.write(getParagraphEnd()); - inParagraph = false; - } - - - /** - * Write something (if defined) at the start of a page. - * - * @throws IOException if something went wrong - */ - protected void writePageStart() throws IOException { - - output.write(getPageStart()); - } - - - /** - * Write something (if defined) at the end of a page. - * - * @throws IOException if something went wrong - */ - protected void writePageEnd() throws IOException { - - output.write(getPageEnd()); - } - - - /** - * returns the list item Pattern object that matches the text at the specified PositionWrapper or null if the text - * does not match such a pattern. The list of Patterns tested against is given by the {@link #getListItemPatterns()} - * method. To add to the list, simply override that method (if sub-classing) or explicitly supply your own list - * using {@link #setListItemPatterns(List)}. - * - * @param pw position - * @return the matching pattern - */ - private Pattern matchListItemPattern(PositionWrapper pw) { - - TextPosition tp = pw.getTextPosition(); - String txt = tp.getUnicode(); - return matchPattern(txt, getListItemPatterns()); - } - - - /** - * a list of regular expressions that match commonly used list item formats, i.e. bullets, numbers, letters, Roman - * numerals, etc. Not meant to be comprehensive. - */ - private static final String[] LIST_ITEM_EXPRESSIONS = {"\\.", "\\d+\\.", "\\[\\d+\\]", "\\d+\\)", "[A-Z]\\.", "[a-z]\\.", "[A-Z]\\)", "[a-z]\\)", "[IVXL]+\\.", "[ivxl]+\\.",}; - - private List listOfPatterns = null; - - - /** - * use to supply a different set of regular expression patterns for matching list item starts. - * - * @param patterns list of patterns - */ - protected void setListItemPatterns(List patterns) { - - listOfPatterns = patterns; - } - - - /** - * returns a list of regular expression Patterns representing different common list item formats. For example - * numbered items of form: - *
    - *
  1. some text
  2. - *
  3. more text
  4. - *
- * or - *
    - *
  • some text
  • - *
  • more text
  • - *
- * etc., all begin with some character pattern. The pattern "\\d+\." (matches "1.", "2.", ...) or "\[\\d+\]" - * (matches "[1]", "[2]", ...). - *

- * This method returns a list of such regular expression Patterns. - * - * @return a list of Pattern objects. - */ - protected List getListItemPatterns() { - - if (listOfPatterns == null) { - listOfPatterns = new ArrayList(); - for (String expression : LIST_ITEM_EXPRESSIONS) { - Pattern p = Pattern.compile(expression); - listOfPatterns.add(p); - } - } - return listOfPatterns; - } - - - /** - * iterates over the specified list of Patterns until it finds one that matches the specified string. Then returns - * the Pattern. - *

- * Order of the supplied list of patterns is important as most common patterns should come first. Patterns should be - * strict in general, and all will be used with case sensitivity on. - *

- * - * @param string the string to be searched - * @param patterns list of patterns - * @return matching pattern - */ - protected static Pattern matchPattern(String string, List patterns) { - - for (Pattern p : patterns) { - if (p.matcher(string).matches()) { - return p; - } - } - return null; - } - - - /** - * Write a list of string containing a whole line of a document. - * - * @param line a list with the words of the given line - * @throws IOException if something went wrong - */ - private void writeLine(List line) throws IOException { - - int numberOfStrings = line.size(); - for (int i = 0; i < numberOfStrings; i++) { - WordWithTextPositions word = line.get(i); - writeString(word.getText(), word.getTextPositions()); - if (i < numberOfStrings - 1) { - writeWordSeparator(); - } - } - } - - - /** - * Normalize the given list of TextPositions. - * - * @param line list of TextPositions - * @return a list of strings, one string for every word - */ - private List normalize(List line) { - - List normalized = new LinkedList(); - StringBuilder lineBuilder = new StringBuilder(); - List wordPositions = new ArrayList(); - - for (LineItem item : line) { - lineBuilder = normalizeAdd(normalized, lineBuilder, wordPositions, item); - } - - if (lineBuilder.length() > 0) { - normalized.add(createWord(lineBuilder.toString(), wordPositions)); - } - return normalized; - } - - - /** - * Handles the LTR and RTL direction of the given words. The whole implementation stands and falls with the given - * word. If the word is a full line, the results will be the best. If the word contains of single words or - * characters, the order of the characters in a word or words in a line may wrong, due to RTL and LTR marks and - * characters! - *

- * Based on http://www.nesterovsky-bros.com/weblog/2013/07/28/VisualToLogicalConversionInJava.aspx - * - * @param word The word that shall be processed - * @return new word with the correct direction of the containing characters - */ - private String handleDirection(String word) { - - Bidi bidi = new Bidi(word, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT); - - // if there is pure LTR text no need to process further - if (!bidi.isMixed() && bidi.getBaseLevel() == Bidi.DIRECTION_LEFT_TO_RIGHT) { - return word; - } - - // collect individual bidi information - int runCount = bidi.getRunCount(); - byte[] levels = new byte[runCount]; - Integer[] runs = new Integer[runCount]; - - for (int i = 0; i < runCount; i++) { - levels[i] = (byte) bidi.getRunLevel(i); - runs[i] = i; - } - - // reorder individual parts based on their levels - Bidi.reorderVisually(levels, 0, runs, 0, runCount); - - // collect the parts based on the direction within the run - StringBuilder result = new StringBuilder(); - - for (int i = 0; i < runCount; i++) { - int index = runs[i]; - int start = bidi.getRunStart(index); - int end = bidi.getRunLimit(index); - - int level = levels[index]; - - if ((level & 1) != 0) { - while (--end >= start) { - char character = word.charAt(end); - if (Character.isMirrored(word.codePointAt(end))) { - if (MIRRORING_CHAR_MAP.containsKey(character)) { - result.append(MIRRORING_CHAR_MAP.get(character)); - } else { - result.append(character); - } - } else { - result.append(character); - } - } - } else { - result.append(word, start, end); - } - } - - return result.toString(); - } - - - @SuppressFBWarnings - private static Map MIRRORING_CHAR_MAP = new HashMap<>(); - - static { - String path = "/org/apache/pdfbox/resources/text/BidiMirroring.txt"; - InputStream input = new BufferedInputStream(PDFTextStripper.class.getResourceAsStream(path)); - try { - parseBidiFile(input); - } catch (IOException e) { - LOG.warn("Could not parse BidiMirroring.txt, mirroring char map will be empty: " + e.getMessage()); - } finally { - try { - input.close(); - } catch (IOException e) { - LOG.debug("Could not close BidiMirroring.txt ", e); - } - } - } - - /** - * This method parses the bidi file provided as inputstream. - * - * @param inputStream - The bidi file as inputstream - * @throws IOException if any line could not be read by the LineNumberReader - */ - private static void parseBidiFile(InputStream inputStream) throws IOException { - - LineNumberReader rd = new LineNumberReader(new InputStreamReader(inputStream)); - - do { - String s = rd.readLine(); - if (s == null) { - break; - } - - int comment = s.indexOf('#'); // ignore comments - if (comment != -1) { - s = s.substring(0, comment); - } - - if (s.length() < 2) { - continue; - } - - StringTokenizer st = new StringTokenizer(s, ";"); - int nFields = st.countTokens(); - Character[] fields = new Character[nFields]; - for (int i = 0; i < nFields; i++) { - fields[i] = (char) Integer.parseInt(st.nextToken().trim(), 16); - } - - if (fields.length == 2) { - // initialize the MIRRORING_CHAR_MAP - MIRRORING_CHAR_MAP.put(fields[0], fields[1]); - } - - } while (true); - } - - - /** - * Used within {@link #normalize(List)} to create a single {@link WordWithTextPositions} entry. - */ - private WordWithTextPositions createWord(String word, List wordPositions) { - - return new WordWithTextPositions(normalizeWord(word), wordPositions); - } - - - /** - * Normalize certain Unicode characters. For example, convert the single "fi" ligature to "f" and "i". Also - * normalises Arabic and Hebrew presentation forms. - * - * @param word Word to normalize - * @return Normalized word - */ - private String normalizeWord(String word) { - - StringBuilder builder = null; - int p = 0; - int q = 0; - int strLength = word.length(); - for (; q < strLength; q++) { - // We only normalize if the codepoint is in a given range. - // Otherwise, NFKC converts too many things that would cause - // confusion. For example, it converts the micro symbol in - // extended Latin to the value in the Greek script. We normalize - // the Unicode Alphabetic and Arabic A&B Presentation forms. - char c = word.charAt(q); - if (0xFB00 <= c && c <= 0xFDFF || 0xFE70 <= c && c <= 0xFEFF) { - if (builder == null) { - builder = new StringBuilder(strLength * 2); - } - builder.append(word, p, q); - // Some fonts map U+FDF2 differently than the Unicode spec. - // They add an extra U+0627 character to compensate. - // This removes the extra character for those fonts. - if (c == 0xFDF2 && q > 0 && (word.charAt(q - 1) == 0x0627 || word.charAt(q - 1) == 0xFE8D)) { - builder.append("\u0644\u0644\u0647"); - } else { - // Trim because some decompositions have an extra space, such as U+FC5E - builder.append(Normalizer.normalize(word.substring(q, q + 1), Normalizer.Form.NFKC).trim()); - } - p = q + 1; - } - } - if (builder == null) { - return handleDirection(word); - } else { - builder.append(word, p, q); - return handleDirection(builder.toString()); - } - } - - - /** - * Used within {@link #normalize(List)} to handle a {@link TextPosition}. - * - * @return The StringBuilder that must be used when calling this method. - */ - private StringBuilder normalizeAdd(List normalized, StringBuilder lineBuilder, List wordPositions, LineItem item) { - - if (item.isWordSeparator()) { - normalized.add(createWord(lineBuilder.toString(), new ArrayList(wordPositions))); - lineBuilder = new StringBuilder(); - wordPositions.clear(); - } else { - TextPosition text = item.getTextPosition(); - lineBuilder.append(text.getUnicode()); - wordPositions.add(text); - } - return lineBuilder; - } - - - /** - * internal marker class. Used as a place holder in a line of TextPositions. - */ - private static final class LineItem { - - public static LineItem WORD_SEPARATOR = new LineItem(); - - - public static LineItem getWordSeparator() { - - return WORD_SEPARATOR; - } - - - private final TextPosition textPosition; - - - private LineItem() { - - textPosition = null; - } - - - LineItem(TextPosition textPosition) { - - this.textPosition = textPosition; - } - - - public TextPosition getTextPosition() { - - return textPosition; - } - - - public boolean isWordSeparator() { - - return textPosition == null; - } - - } - - /** - * Internal class that maps strings to lists of {@link TextPosition} arrays. Note that the number of entries in that - * list may differ from the number of characters in the string due to normalization. - * - * @author Axel Dörfler - */ - private static final class WordWithTextPositions { - - String text; - List textPositions; - - - WordWithTextPositions(String word, List positions) { - - text = word; - textPositions = positions; - } - - - public String getText() { - - return text; - } - - - public List getTextPositions() { - - return textPositions; - } - - } - - /** - * wrapper of TextPosition that adds flags to track status as linestart and paragraph start positions. - *

- * This is implemented as a wrapper since the TextPosition class doesn't provide complete access to its state fields - * to subclasses. Also, conceptually TextPosition is immutable while these flags need to be set post-creation so it - * makes sense to put these flags in this separate class. - *

- * - * @author m.martinez@ll.mit.edu - */ - private static final class PositionWrapper { - - private boolean isLineStart = false; - private boolean isParagraphStart = false; - private boolean isPageBreak = false; - private boolean isHangingIndent = false; - private boolean isArticleStart = false; - - private TextPosition position = null; - - - /** - * Constructs a PositionWrapper around the specified TextPosition object. - * - * @param position the text position. - */ - PositionWrapper(TextPosition position) { - - this.position = position; - } - - - /** - * Returns the underlying TextPosition object. - * - * @return the text position - */ - public TextPosition getTextPosition() { - - return position; - } - - - public boolean isLineStart() { - - return isLineStart; - } - - - /** - * Sets the isLineStart() flag to true. - */ - public void setLineStart() { - - this.isLineStart = true; - } - - - public boolean isParagraphStart() { - - return isParagraphStart; - } - - - /** - * sets the isParagraphStart() flag to true. - */ - public void setParagraphStart() { - - this.isParagraphStart = true; - } - - - public boolean isArticleStart() { - - return isArticleStart; - } - - - /** - * Sets the isArticleStart() flag to true. - */ - public void setArticleStart() { - - this.isArticleStart = true; - } - - - public boolean isPageBreak() { - - return isPageBreak; - } - - - /** - * Sets the isPageBreak() flag to true. - */ - public void setPageBreak() { - - this.isPageBreak = true; - } - - - public boolean isHangingIndent() { - - return isHangingIndent; - } - - - /** - * Sets the isHangingIndent() flag to true. - */ - public void setHangingIndent() { - - this.isHangingIndent = true; - } - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/BlockificationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/BlockificationService.java deleted file mode 100644 index d7a96673..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/BlockificationService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import static java.util.stream.Collectors.toSet; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; - -import org.springframework.stereotype.Service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.FloatFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.Orientation; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Ruling; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.StringFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.RulingTextDirAdjustUtil; - -public interface BlockificationService { - - ClassificationPage blockify(List textPositions, List horizontalRulingLines, List verticalRulingLines); -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/BodyTextFrameService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/BodyTextFrameService.java deleted file mode 100644 index 278218bb..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/BodyTextFrameService.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.FloatFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Cell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.TablePageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.PositionUtils; - -@Service -public class BodyTextFrameService { - - @Value("${application.type:RedactManager}") - private String applicationType; - - private static final float APPROXIMATE_HEADER_LINE_COUNT = 2.9f; - - - /** - * Adjusts and sets the body text frame to a page. - * Note: This needs to use Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - * The aspect ratio of the page is also regarded. - * - * @param page The page - * @param bodyTextFrame frame that contains the main text on portrait pages - * @param landscapeBodyTextFrame frame that contains the main text on landscape pages - */ - public void setBodyTextFrameAdjustedToPage(ClassificationPage page, Rectangle bodyTextFrame, Rectangle landscapeBodyTextFrame) { - - Rectangle textFrame = page.isLandscape() ? landscapeBodyTextFrame : bodyTextFrame; - - if (page.getPageWidth() > page.getPageHeight() && page.getRotation() == 270) { - textFrame = new Rectangle(new Point(textFrame.getTopLeft().getY(), page.getPageHeight() - textFrame.getTopLeft().getX() - textFrame.getWidth()), - textFrame.getHeight(), - textFrame.getWidth(), - 0); - } else if (page.getPageWidth() > page.getPageHeight() && page.getRotation() != 0) { - textFrame = new Rectangle(new Point(textFrame.getTopLeft().getY(), textFrame.getTopLeft().getX()), textFrame.getHeight(), textFrame.getWidth(), page.getPageNumber()); - } else if (page.getRotation() == 180) { - textFrame = new Rectangle(new Point(textFrame.getTopLeft().getX(), page.getPageHeight() - textFrame.getTopLeft().getY() - textFrame.getHeight()), - textFrame.getWidth(), - textFrame.getHeight(), - 0); - } - page.setBodyTextFrame(textFrame); - } - - - /** - * Calculates the frame that contains the main text, text outside the frame will be e.g. headers or footers. - * Note: This needs to use Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - * The aspect ratio of the page is also regarded. - * - * @param pages List of all pages - * @param documentFontSizeCounter Statistics of the document - * @param landscape Calculate for landscape or portrait - * @return Rectangle of the text frame - */ - public Rectangle calculateBodyTextFrame(List pages, FloatFrequencyCounter documentFontSizeCounter, boolean landscape) { - - BodyTextFrameExpansionsRectangle expansionsRectangle = new BodyTextFrameExpansionsRectangle(); - - for (ClassificationPage page : pages) { - - if (page.getTextBlocks().isEmpty() || landscape != page.isLandscape()) { - continue; - } - - for (AbstractPageBlock container : page.getTextBlocks()) { - - if (container instanceof TextPageBlock) { - TextPageBlock textBlock = (TextPageBlock) container; - if (textBlock.getMostPopularWordFont() == null || textBlock.getMostPopularWordStyle() == null) { - continue; - } - - float approxLineCount = PositionUtils.getApproxLineCount(textBlock); - if (applicationType.equals("DocuMine") && approxLineCount < APPROXIMATE_HEADER_LINE_COUNT && textBlock.getMaxY() >= page.getPageHeight() - (page.getPageHeight() / 10) - || applicationType.equals("RedactManager") && approxLineCount < APPROXIMATE_HEADER_LINE_COUNT){ - continue; - } - - if (documentFontSizeCounter.getMostPopular() != null && textBlock.getMostPopularWordFontSize() >= documentFontSizeCounter.getMostPopular()) { - - expandRectangle(textBlock, page, expansionsRectangle); - } - } - - if (container instanceof TablePageBlock) { - TablePageBlock table = (TablePageBlock) container; - for (List row : table.getRows()) { - for (Cell cell : row) { - - if (cell == null || cell.getTextBlocks() == null) { - continue; - } - for (TextPageBlock textBlock : cell.getTextBlocks()) { - expandRectangle(textBlock, page, expansionsRectangle); - } - } - } - } - } - } - return new Rectangle(new Point(expansionsRectangle.minX, expansionsRectangle.minY), - expansionsRectangle.maxX - expansionsRectangle.minX, - expansionsRectangle.maxY - expansionsRectangle.minY, - 0); - } - - - private void expandRectangle(TextPageBlock textBlock, ClassificationPage page, BodyTextFrameExpansionsRectangle expansionsRectangle) { - - if (page.getPageWidth() > page.getPageHeight() && page.getRotation() != 0) { - if (textBlock.getPdfMinY() < expansionsRectangle.minX) { - expansionsRectangle.minX = textBlock.getPdfMinY(); - } - if (textBlock.getPdfMaxY() > expansionsRectangle.maxX) { - expansionsRectangle.maxX = textBlock.getPdfMaxY(); - } - if (textBlock.getPdfMinX() < expansionsRectangle.minY) { - expansionsRectangle.minY = textBlock.getPdfMinX(); - } - if (textBlock.getPdfMaxX() > expansionsRectangle.maxY) { - expansionsRectangle.maxY = textBlock.getPdfMaxX(); - } - } else { - if (textBlock.getPdfMinX() < expansionsRectangle.minX) { - expansionsRectangle.minX = textBlock.getPdfMinX(); - } - if (textBlock.getPdfMaxX() > expansionsRectangle.maxX) { - expansionsRectangle.maxX = textBlock.getPdfMaxX(); - } - if (textBlock.getPdfMinY() < expansionsRectangle.minY) { - expansionsRectangle.minY = textBlock.getPdfMinY(); - } - if (textBlock.getPdfMaxY() > expansionsRectangle.maxY) { - expansionsRectangle.maxY = textBlock.getPdfMaxY(); - } - } - } - - - private class BodyTextFrameExpansionsRectangle { - - float minX = 10000; - float maxX = -100; - float minY = 10000; - float maxY = -100; - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/ClassificationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/ClassificationService.java deleted file mode 100644 index 1e37929b..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/ClassificationService.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; - -public interface ClassificationService { - void classifyDocument(ClassificationDocument document); -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/ColumnDetectionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/ColumnDetectionService.java deleted file mode 100644 index 27a15912..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/ColumnDetectionService.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.awt.geom.Rectangle2D; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.stream.IntStream; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class ColumnDetectionService { - - private static final double SPLITTABLE_LINE_PERCENTAGE_THRESHOLD = 0.6; - private static final int MAX_NUMBER_OF_COLUMNS = 4; - - - public List detectColumns(List textPositionSequences, Rectangle2D mainBodyTextFrame) { - - if (textPositionSequences.size() < 2) { - return List.of(mainBodyTextFrame); - } - - List> linesWithGaps = LineDetectionService.findLinesWithGaps(textPositionSequences); - - Map> linesWithMatchingGapIndices = new HashMap<>(); - for (int numberOfColumns = 2; numberOfColumns <= MAX_NUMBER_OF_COLUMNS; numberOfColumns++) { - linesWithMatchingGapIndices.put(numberOfColumns, findConsecutiveLinesWithMatchingGaps(linesWithGaps, mainBodyTextFrame.getWidth(), numberOfColumns)); - } - - int optimalNumberOfColumns = findOptimalNumberOfColumns(linesWithMatchingGapIndices, linesWithGaps.size()); - if (optimalNumberOfColumns == 1) { - return List.of(mainBodyTextFrame); - } - return buildColumns(mainBodyTextFrame, getLinesWithMatchingGaps(linesWithMatchingGapIndices.get(optimalNumberOfColumns), linesWithGaps), optimalNumberOfColumns); - } - - - private static List findConsecutiveLinesWithMatchingGaps(List> linesWithGaps, double width, int numberOfColumns) { - - List booleans = lineHasMatchingGap(linesWithGaps, width, numberOfColumns); - return findConsecutiveTrueIndicesWithMaxLengthRun(booleans); - } - - - private List lineHasMatchingGap(List> linesWithGaps, double width, int numberOfColumns) { - - return linesWithGaps.stream() - .map(blocksWithGaps -> IntStream.range(1, numberOfColumns) - .allMatch(columnIndex -> noBlocksIntersectX(blocksWithGaps, calculateGapLocation(width, numberOfColumns, columnIndex)))) - .toList(); - } - - - private List findConsecutiveTrueIndicesWithMaxLengthRun(List booleans) { - - List maxConsecutiveTrueIndices = new LinkedList<>(); - List currentConsecutiveTrueIndices = new LinkedList<>(); - for (int i = 0; i < booleans.size(); i++) { - if (!booleans.get(i)) { - if (currentConsecutiveTrueIndices.isEmpty()) { - continue; - } - if (currentConsecutiveTrueIndices.size() > maxConsecutiveTrueIndices.size()) { - maxConsecutiveTrueIndices = currentConsecutiveTrueIndices; - } - currentConsecutiveTrueIndices = new LinkedList<>(); - continue; - } - currentConsecutiveTrueIndices.add(i); - } - if (currentConsecutiveTrueIndices.size() > maxConsecutiveTrueIndices.size()) { - return currentConsecutiveTrueIndices; - } - return maxConsecutiveTrueIndices; - } - - - private static int findOptimalNumberOfColumns(Map> linesWithMatchingGapIndices, Integer numberOfLines) { - - return linesWithMatchingGapIndices.entrySet() - .stream() - .max(comparePercentages(numberOfLines)) - .filter(entry -> percentageIsAboveThreshold(entry, numberOfLines)) - .map(Map.Entry::getKey) - .orElse(1); - } - - - private List buildColumns(Rectangle2D mainBodyTextFrame, List rectanglesToMerge, int optimalColumnCount) { - - if (optimalColumnCount == 1 || rectanglesToMerge.isEmpty()) { - return List.of(mainBodyTextFrame); - } - - double maxY = rectanglesToMerge.get(0).getMaxY(); - double minY = rectanglesToMerge.get(rectanglesToMerge.size() - 1).getMinY(); - - List columns = new LinkedList<>(); - double width = mainBodyTextFrame.getWidth() / optimalColumnCount; - double height = maxY - minY; - for (int i = 0; i < optimalColumnCount; i++) { - columns.add(new Rectangle2D.Double(mainBodyTextFrame.getMinY() + i * width, minY, width, height)); - } - return columns; - } - - - private Comparator>> comparePercentages(Integer numberOfLines) { - - return Comparator.comparingDouble(entry -> calculatePercentage(entry.getValue().size(), numberOfLines)); - } - - - private List getLinesWithMatchingGaps(List linesWithMatchingGapIndices, List> linesWithGaps) { - - return linesWithMatchingGapIndices.stream().map(linesWithGaps::get).flatMap(Collection::stream).toList(); - } - - - private boolean percentageIsAboveThreshold(Map.Entry> entry, Integer numberOfLines) { - - return calculatePercentage(entry.getValue().size(), numberOfLines) > SPLITTABLE_LINE_PERCENTAGE_THRESHOLD; - } - - - private double calculatePercentage(Integer numberOfMatchingLines, Integer numberOfLines) { - - return ((double) numberOfMatchingLines) / ((double) numberOfLines); - } - - - private double calculateGapLocation(double pageWidth, int numberOfColumns, int columnIndex) { - - return (pageWidth / numberOfColumns) * columnIndex; - } - - - private Boolean noBlocksIntersectX(List blocksWithGaps, double x) { - - return blocksWithGaps.stream().noneMatch(rect -> rect.getMaxX() > x && rect.getMinX() < x); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/DocuMineBlockificationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/DocuMineBlockificationService.java deleted file mode 100644 index 10bc2a28..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/DocuMineBlockificationService.java +++ /dev/null @@ -1,207 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import static java.util.stream.Collectors.toSet; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.FloatFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.Orientation; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Ruling; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.StringFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.RulingTextDirAdjustUtil; -import com.iqser.red.service.redaction.v1.server.redaction.utils.Patterns; - -@Service -@ConditionalOnProperty(prefix = "application", name = "type", havingValue = "DocuMine") -@SuppressWarnings("all") -public class DocuMineBlockificationService implements BlockificationService{ - - static final float THRESHOLD = 1f; - - Pattern pattern = Patterns.getCompiledPattern("^(\\d{1,2}\\.){1,3}\\d{1,2}\\.?\\s[0-9A-Za-z ()-]{2,50}", true); - - - /** - * This method is building blocks by expanding the minX/maxX and minY/maxY value on each word that is not split by the conditions. - * This method must use text direction adjusted postions (DirAdj). Where {0,0} is on the upper left. Never try to change this! - * Rulings (Table lines) must be adjusted to the text directions as well, when checking if a block is split by a ruling. - * @param textPositions The words of a page. - * @param horizontalRulingLines Horizontal table lines. - * @param verticalRulingLines Vertical table lines. - * @return Page object that contains the Textblock and text statistics. - */ - public ClassificationPage blockify(List textPositions, List horizontalRulingLines, List verticalRulingLines) { - - List chunkWords = new ArrayList<>(); - List chunkBlockList1 = new ArrayList<>(); - - float minX = 1000, maxX = 0, minY = 1000, maxY = 0; - TextPositionSequence prev = null; - - boolean wasSplitted = false; - Float splitX1 = null; - for (TextPositionSequence word : textPositions) { - - boolean lineSeparation = prev != null && word.getMinYDirAdj() - maxY > Math.min(word.getHeight(), prev.getHeight()) * 1.25; - boolean startFromTop = prev != null && word.getMinYDirAdj() < prev.getMinYDirAdj() - prev.getTextHeight(); - boolean splitByX = prev != null && maxX + 50 < word.getMinXDirAdj() && prev.getMinYDirAdj() == word.getMinYDirAdj(); - boolean negativeXGap = prev != null && word.getMinXDirAdj() - minX < -5; - boolean newLineAfterSplit = prev != null && word.getMinYDirAdj() != prev.getMinYDirAdj() && wasSplitted && splitX1 != word.getMinXDirAdj(); - boolean isSplitByRuling = isSplitByRuling(minX, minY, maxX, maxY, word, horizontalRulingLines, verticalRulingLines); - boolean splitByDir = prev != null && !prev.getDir().equals(word.getDir()); - boolean splitByOtherFontAndOtherY = prev != null && prev.getMaxYDirAdj() != word.getMaxYDirAdj() && (word.getFontStyle().contains("bold") && !prev.getFontStyle().contains("bold") || prev.getFontStyle().contains("bold") && !word.getFontStyle().contains("bold")); - - Matcher matcher = pattern.matcher(chunkWords.stream().collect(Collectors.joining(" ")).toString()); - boolean startsOnSameX = Math.abs(minX - word.getMinXDirAdj()) < 5 && matcher.matches(); - - if (prev != null && (lineSeparation || startFromTop || splitByDir || isSplitByRuling || splitByOtherFontAndOtherY || negativeXGap || startsOnSameX)) { - - Orientation prevOrientation = null; - if (!chunkBlockList1.isEmpty()) { - prevOrientation = chunkBlockList1.get(chunkBlockList1.size() - 1).getOrientation(); - } - - TextPageBlock cb1 = buildTextBlock(chunkWords); - chunkBlockList1.add(cb1); - chunkWords = new ArrayList<>(); - - if (splitByX && !isSplitByRuling) { - wasSplitted = true; - cb1.setOrientation(Orientation.LEFT); - splitX1 = word.getMinXDirAdj(); - } else if (newLineAfterSplit && !isSplitByRuling) { - wasSplitted = false; - cb1.setOrientation(Orientation.RIGHT); - splitX1 = null; - } else if (prevOrientation != null && prevOrientation.equals(Orientation.RIGHT) && (lineSeparation || !startFromTop || !splitByX || !newLineAfterSplit || !isSplitByRuling)) { - cb1.setOrientation(Orientation.LEFT); - } - - minX = 1000; - maxX = 0; - minY = 1000; - maxY = 0; - prev = null; - } - - chunkWords.add(word); - - prev = word; - if (word.getMinXDirAdj() < minX) { - minX = word.getMinXDirAdj(); - } - if (word.getMaxXDirAdj() > maxX) { - maxX = word.getMaxXDirAdj(); - } - if (word.getMinYDirAdj() < minY) { - minY = word.getMinYDirAdj(); - } - if (word.getMaxYDirAdj() > maxY) { - maxY = word.getMaxYDirAdj(); - } - } - - TextPageBlock cb1 = buildTextBlock(chunkWords); - if (cb1 != null) { - chunkBlockList1.add(cb1); - } - - return new ClassificationPage(chunkBlockList1); - } - - - private boolean equalsWithThreshold(float f1, float f2) { - - return Math.abs(f1 - f2) < THRESHOLD; - } - - - private TextPageBlock buildTextBlock(List wordBlockList) { - - TextPageBlock textBlock = null; - - FloatFrequencyCounter lineHeightFrequencyCounter = new FloatFrequencyCounter(); - FloatFrequencyCounter fontSizeFrequencyCounter = new FloatFrequencyCounter(); - FloatFrequencyCounter spaceFrequencyCounter = new FloatFrequencyCounter(); - StringFrequencyCounter fontFrequencyCounter = new StringFrequencyCounter(); - StringFrequencyCounter styleFrequencyCounter = new StringFrequencyCounter(); - - for (TextPositionSequence wordBlock : wordBlockList) { - - lineHeightFrequencyCounter.add(wordBlock.getTextHeight()); - fontSizeFrequencyCounter.add(wordBlock.getFontSize()); - spaceFrequencyCounter.add(wordBlock.getSpaceWidth()); - fontFrequencyCounter.add(wordBlock.getFont()); - styleFrequencyCounter.add(wordBlock.getFontStyle()); - - if (textBlock == null) { - textBlock = new TextPageBlock(wordBlock.getMinXDirAdj(), wordBlock.getMaxXDirAdj(), wordBlock.getMinYDirAdj(), wordBlock.getMaxYDirAdj(), wordBlockList, wordBlock.getRotation()); - } else { - TextPageBlock spatialEntity = textBlock.union(wordBlock); - textBlock.resize(spatialEntity.getMinX(), spatialEntity.getMinY(), spatialEntity.getWidth(), spatialEntity.getHeight()); - } - } - - if (textBlock != null) { - textBlock.setMostPopularWordFont(fontFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordStyle(styleFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordFontSize(fontSizeFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordHeight(lineHeightFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordSpaceWidth(spaceFrequencyCounter.getMostPopular()); - textBlock.setHighestFontSize(fontSizeFrequencyCounter.getHighest()); - } - - if (textBlock != null && textBlock.getSequences() != null && textBlock.getSequences().stream().map(t -> round(t.getMinYDirAdj(), 3)).collect(toSet()).size() == 1) { - textBlock.getSequences().sort(Comparator.comparing(TextPositionSequence::getMinXDirAdj)); - } - return textBlock; - } - - - private boolean isSplitByRuling(float minX, - float minY, - float maxX, - float maxY, - TextPositionSequence word, - List horizontalRulingLines, - List verticalRulingLines) { - - return isSplitByRuling(maxX, minY, word.getMinXDirAdj(), word.getMinYDirAdj(), verticalRulingLines, word.getDir().getDegrees(), word.getPageWidth(), word.getPageHeight()) // - || isSplitByRuling(minX, minY, word.getMinXDirAdj(), word.getMaxYDirAdj(), horizontalRulingLines, word.getDir().getDegrees(), word.getPageWidth(), word.getPageHeight()) // - || isSplitByRuling(maxX, minY, word.getMinXDirAdj(), word.getMinYDirAdj(), horizontalRulingLines, word.getDir().getDegrees(), word.getPageWidth(), word.getPageHeight()) // - || isSplitByRuling(minX, minY, word.getMinXDirAdj(), word.getMaxYDirAdj(), verticalRulingLines, word.getDir().getDegrees(), word.getPageWidth(), word.getPageHeight()); // - } - - - private boolean isSplitByRuling(float previousX2, float previousY1, float currentX1, float currentY1, List rulingLines, float dir, float pageWidth, float pageHeight) { - - for (Ruling ruling : rulingLines) { - var line = RulingTextDirAdjustUtil.convertToDirAdj(ruling, dir, pageWidth, pageHeight); - if (line.intersectsLine(previousX2, previousY1, currentX1, currentY1)) { - return true; - } - } - return false; - } - - - private double round(float value, int decimalPoints) { - - var d = Math.pow(10, decimalPoints); - return Math.round(value * d) / d; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/DocuMineClassificationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/DocuMineClassificationService.java deleted file mode 100644 index b91d01fa..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/DocuMineClassificationService.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.util.List; -import java.util.Locale; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.PageBlockType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.PositionUtils; -import com.iqser.red.service.redaction.v1.server.redaction.utils.Patterns; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -@ConditionalOnProperty(prefix = "application", name = "type", havingValue = "DocuMine") -public class DocuMineClassificationService implements ClassificationService { - - private final BodyTextFrameService bodyTextFrameService; - - - public void classifyDocument(ClassificationDocument document) { - - Rectangle bodyTextFrame = bodyTextFrameService.calculateBodyTextFrame(document.getPages(), document.getFontSizeCounter(), false); - Rectangle landscapeBodyTextFrame = bodyTextFrameService.calculateBodyTextFrame(document.getPages(), document.getFontSizeCounter(), true); - - log.debug("Document FontSize counters are: {}", document.getFontSizeCounter().getCountPerValue()); - - for (ClassificationPage page : document.getPages()) { - bodyTextFrameService.setBodyTextFrameAdjustedToPage(page, bodyTextFrame, landscapeBodyTextFrame); - classifyPage(page, document); - } - } - - - private void classifyPage(ClassificationPage page, ClassificationDocument document) { - - for (AbstractPageBlock textBlock : page.getTextBlocks()) { - if (textBlock instanceof TextPageBlock) { - classifyBlock((TextPageBlock) textBlock, page, document); - } - } - } - - - private void classifyBlock(TextPageBlock textBlock, ClassificationPage page, ClassificationDocument document) { - - var bodyTextFrame = page.getBodyTextFrame(); - - var pattern = Patterns.getCompiledPattern("^(\\d{1,2}\\.){1,3}\\d{1,2}\\.?\\s[0-9A-Za-z \\[\\]]{2,50}", true); - var pattern2 = Patterns.getCompiledPattern("\\p{L}{3,}", true); - var pattern3 = Patterns.getCompiledPattern("^(\\d{1,1}\\.){1,3}\\d{1,2}\\.?\\s[a-z]{1,2}\\/[a-z]{1,2}.*", false); - - Matcher matcher = pattern.matcher(textBlock.toString()); - Matcher matcher2 = pattern2.matcher(textBlock.toString()); - Matcher matcher3 = pattern3.matcher(textBlock.toString()); - - if (document.getFontSizeCounter().getMostPopular() == null) { - textBlock.setClassification(PageBlockType.OTHER); - return; - } - if (PositionUtils.isOverBodyTextFrame(bodyTextFrame, textBlock, page.getRotation()) && (document.getFontSizeCounter() - .getMostPopular() == null || textBlock.getHighestFontSize() <= document.getFontSizeCounter().getMostPopular())) { - textBlock.setClassification(PageBlockType.HEADER); - - } else if (PositionUtils.isUnderBodyTextFrame(bodyTextFrame, textBlock, page.getRotation()) && (document.getFontSizeCounter() - .getMostPopular() == null || textBlock.getHighestFontSize() <= document.getFontSizeCounter().getMostPopular())) { - textBlock.setClassification(PageBlockType.FOOTER); - } else if (page.getPageNumber() == 1 && (PositionUtils.getHeightDifferenceBetweenChunkWordAndDocumentWord(textBlock, - document.getTextHeightCounter().getMostPopular()) > 2.5 && textBlock.getHighestFontSize() > document.getFontSizeCounter().getMostPopular() || page.getTextBlocks() - .size() == 1)) { - if (!Pattern.matches("[0-9]+", textBlock.toString())) { - textBlock.setClassification(PageBlockType.TITLE); - } - } else if (textBlock.getText().length() > 5 && (textBlock.getMostPopularWordHeight() > document.getTextHeightCounter() - .getMostPopular() || textBlock.getMostPopularWordFontSize() > document.getFontSizeCounter().getMostPopular()) && PositionUtils.getApproxLineCount(textBlock) < 5.9 - - && (textBlock.getMostPopularWordStyle().contains("bold") && Character.isDigit(textBlock.toString().charAt(0)) && !matcher2.matches() && !textBlock.toString() - .contains(":") || textBlock.toString().equals(textBlock.toString().toUpperCase(Locale.ROOT)) && !matcher2.matches() && !textBlock.toString() - .contains(":") || textBlock.toString().startsWith("APPENDIX") || textBlock.toString().startsWith("FIGURE") || textBlock.toString() - .startsWith("TABLE")) && !textBlock.toString().endsWith(":") && matcher2.find()) { - textBlock.setClassification(PageBlockType.getHeadlineType(1)); - document.setHeadlines(true); - - } else if (matcher.find() && PositionUtils.getApproxLineCount(textBlock) < 2.9 && matcher2.find() && !matcher3.matches()) { - textBlock.setClassification(PageBlockType.getHeadlineType(2)); - document.setHeadlines(true); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter() - .getMostPopular() && textBlock.getMostPopularWordStyle().equals("bold") && !document.getFontStyleCounter().getMostPopular().equals("bold")) { - textBlock.setClassification(PageBlockType.PARAGRAPH_BOLD); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFont() - .equals(document.getFontCounter().getMostPopular()) && textBlock.getMostPopularWordStyle() - .equals(document.getFontStyleCounter().getMostPopular()) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter().getMostPopular()) { - textBlock.setClassification(PageBlockType.PARAGRAPH); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter() - .getMostPopular() && textBlock.getMostPopularWordStyle().equals("italic") && !document.getFontStyleCounter() - .getMostPopular() - .equals("italic") && PositionUtils.getApproxLineCount(textBlock) < 2.9) { - textBlock.setClassification(PageBlockType.PARAGRAPH_ITALIC); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock)) { - textBlock.setClassification(PageBlockType.PARAGRAPH_UNKNOWN); - } else { - textBlock.setClassification(PageBlockType.OTHER); - } - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/LineDetectionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/LineDetectionService.java deleted file mode 100644 index e7acdf75..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/LineDetectionService.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.awt.geom.Rectangle2D; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.document.utils.RectangleTransformations; -import com.iqser.red.service.redaction.v1.server.document.utils.TextPositionSequenceComparator; - -import lombok.AllArgsConstructor; -import lombok.experimental.UtilityClass; - -@UtilityClass -public class LineDetectionService { - - private static final double X_GAP_FACTOR = 1; // multiplied with average text height, determines the minimum distance of gaps in lines - - - public static List> findLinesWithGaps(List textPositionSequences) { - - if (textPositionSequences.isEmpty()) { - return Collections.emptyList(); - } - - final double avgTextPositionHeight = textPositionSequences.stream().mapToDouble(TextPositionSequence::getHeight).average().orElseThrow(); - - Context context = Context.init(); - - List sortedTextPositionSequence = textPositionSequences.stream().sorted(new TextPositionSequenceComparator()).toList(); - - var previousTextPosition = sortedTextPositionSequence.get(0); - context.textPositionsToMerge.add(previousTextPosition); - for (TextPositionSequence currentTextPosition : sortedTextPositionSequence.subList(1, sortedTextPositionSequence.size())) { - if (isNewLine(currentTextPosition, previousTextPosition, avgTextPositionHeight) || isSplitByOrientation(currentTextPosition, previousTextPosition)) { - addBlockToLine(context); - startNewLine(currentTextPosition, context); - } else if (isXGap(currentTextPosition, previousTextPosition, avgTextPositionHeight)) { - addBlockToLine(context); - startNewBlock(currentTextPosition, context); - } else { - context.textPositionsToMerge.add(currentTextPosition); - } - previousTextPosition = currentTextPosition; - } - addBlockToLine(context); - return context.linesWithGaps; - } - - - private static boolean isXGap(TextPositionSequence currentTextPosition, TextPositionSequence previousTextPosition, double avgTextPositionHeight) { - - return Math.abs(previousTextPosition.getMaxXDirAdj() - currentTextPosition.getMinXDirAdj()) > (avgTextPositionHeight * X_GAP_FACTOR); - } - - - private static boolean isSplitByOrientation(TextPositionSequence currentTextPosition, TextPositionSequence previousTextPosition) { - - return !previousTextPosition.getDir().equals(currentTextPosition.getDir()); - } - - - private static boolean isNewLine(TextPositionSequence currentTextPosition, TextPositionSequence previousTextPosition, double avgTextPositionHeight) { - - return Math.abs(previousTextPosition.getMinYDirAdj() - currentTextPosition.getMinYDirAdj()) > avgTextPositionHeight; - } - - - private static void startNewBlock(TextPositionSequence currentTextPosition, Context context) { - - context.textPositionsToMerge = new LinkedList<>(); - context.textPositionsToMerge.add(currentTextPosition); - } - - - private static void addBlockToLine(Context context) { - - context.blocksInLine.add(textPositionBBox(context.textPositionsToMerge)); - } - - - private static void startNewLine(TextPositionSequence current, Context context) { - - context.blocksInLine = new LinkedList<>(); - startNewBlock(current, context); - context.linesWithGaps.add(context.blocksInLine); - } - - - private Rectangle2D textPositionBBox(List textPositionSequences) { - - return RectangleTransformations.rectangleBBox(textPositionSequences.stream().map(TextPositionSequence::getRectangle).toList()); - } - - - @AllArgsConstructor - private class Context { - - List> linesWithGaps; - List blocksInLine; - List textPositionsToMerge; - - - public static Context init() { - - List> initialLinesWithGaps = new LinkedList<>(); - List initialBlocksInLine = new LinkedList<>(); - initialLinesWithGaps.add(initialBlocksInLine); - return new Context(initialLinesWithGaps, initialBlocksInLine, new LinkedList<>()); - } - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/PdfSegmentationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/PdfSegmentationService.java deleted file mode 100644 index 77e0bc82..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/PdfSegmentationService.java +++ /dev/null @@ -1,185 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.io.IOUtils; -import org.apache.pdfbox.io.MemoryUsageSetting; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.ImageServiceResponseAdapter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.TableServiceResponseAdapter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table.PdfTableCell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.CleanRulings; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.parsing.PDFLinesTextStripper; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.FileUtils; -import com.iqser.red.service.redaction.v1.server.settings.RedactionServiceSettings; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -public class PdfSegmentationService { - - private final RedactionServiceSettings redactionServiceSettings; - private final RulingCleaningService rulingCleaningService; - private final TableExtractionService tableExtractionService; - private final BlockificationService blockificationService; - private final ClassificationService classificationService; - private final SectionsBuilderService sectionsBuilderService; - private final ImageServiceResponseAdapter imageServiceResponseAdapter; - private final TableServiceResponseAdapter tableServiceResponseAdapter; - - @Value("${application.type:RedactManager}") - private String applicationType; - - - public ClassificationDocument parseDocument(String dossierId, - String fileId, - InputStream documentInputStream, - Map> pdfImages) throws IOException { - - PDDocument pdDocument = null; - File tempFile = null; - try { - Map> pdfTableCells = new HashMap<>(); - if (redactionServiceSettings.isCvTableParsingEnabled()) { - pdfTableCells = tableServiceResponseAdapter.convertTables(dossierId, fileId); - } - - tempFile = FileUtils.createTempFile("document", ".pdf"); - try (var fos = new FileOutputStream(tempFile)) { - IOUtils.copy(documentInputStream, fos); - - // initialize required variables - ClassificationDocument document = new ClassificationDocument(); - List pages = new ArrayList<>(); - - pdDocument = PDDocument.load(tempFile, MemoryUsageSetting.setupMixed(67108864L)); - pdDocument.setAllSecurityToBeRemoved(true); - long pageCount = pdDocument.getNumberOfPages(); - - for (int pageNumber = 1; pageNumber <= pageCount; pageNumber++) { - processPage(pdfImages, pdDocument, pdfTableCells, document, pages, pageNumber); - } - - document.setPages(pages); - - classificationService.classifyDocument(document); - sectionsBuilderService.buildSections(document); - sectionsBuilderService.addImagesToSections(document); - - return document; - } - } finally { - if (pdDocument != null) { - pdDocument.close(); - } - - FileUtils.deleteFile(tempFile); - } - } - - - private void processPage(Map> pdfImages, - PDDocument pdDocument, - Map> pdfTableCells, - ClassificationDocument document, - List pages, - int pageNumber) throws IOException { - - PDFLinesTextStripper stripper = new PDFLinesTextStripper(); - PDPage pdPage = pdDocument.getPage(pageNumber - 1); - stripper.setPageNumber(pageNumber); - stripper.setStartPage(pageNumber); - stripper.setEndPage(pageNumber); - stripper.setPdpage(pdPage); - - if(applicationType.equals("DocuMine")){ - stripper.setSortByPosition(true); - } - - stripper.getText(pdDocument); - - PDRectangle pdr = pdPage.getMediaBox(); - - int rotation = pdPage.getRotation(); - boolean isLandscape = pdr.getWidth() > pdr.getHeight() && (rotation == 0 || rotation == 180) || pdr.getHeight() > pdr.getWidth() && (rotation == 90 || rotation == 270); - - PDRectangle cropbox = pdPage.getCropBox(); - CleanRulings cleanRulings = rulingCleaningService.getCleanRulings(pdfTableCells.get(pageNumber), - stripper.getRulings(), - stripper.getMinCharWidth(), - stripper.getMaxCharHeight()); - // var columns = ColumnDetectionService.detectColumns(stripper.getTextPositionSequences(), RectangleTransformations.toRectangle2D(pdPage.getCropBox())); - ClassificationPage page = blockificationService.blockify(stripper.getTextPositionSequences(), cleanRulings.getHorizontal(), cleanRulings.getVertical()); - - page.setRotation(rotation); - page.setLandscape(isLandscape); - page.setPageNumber(pageNumber); - page.setPageWidth(cropbox.getWidth()); - page.setPageHeight(cropbox.getHeight()); - - // If images is ocr needs to be calculated before textBlocks are moved into tables, otherwise findOcr algorithm needs to be adopted. - if (pdfImages != null && pdfImages.containsKey(pageNumber)) { - page.setImages(pdfImages.get(pageNumber)); - imageServiceResponseAdapter.findOcr(page); - } - - tableExtractionService.extractTables(cleanRulings, page); - buildPageStatistics(page); - increaseDocumentStatistics(page, document); - - pages.add(page); - } - - - private void increaseDocumentStatistics(ClassificationPage page, ClassificationDocument document) { - - if (!page.isLandscape()) { - document.getFontSizeCounter().addAll(page.getFontSizeCounter().getCountPerValue()); - } - document.getFontCounter().addAll(page.getFontCounter().getCountPerValue()); - document.getTextHeightCounter().addAll(page.getTextHeightCounter().getCountPerValue()); - document.getFontStyleCounter().addAll(page.getFontStyleCounter().getCountPerValue()); - } - - - private void buildPageStatistics(ClassificationPage page) { - - // Collect all statistics for the page, except from blocks inside tables, as tables will always be added to BodyTextFrame. - for (AbstractPageBlock textBlock : page.getTextBlocks()) { - if (textBlock instanceof TextPageBlock) { - if (((TextPageBlock) textBlock).getSequences() == null) { - continue; - } - for (TextPositionSequence word : ((TextPageBlock) textBlock).getSequences()) { - page.getTextHeightCounter().add(word.getTextHeight()); - page.getFontCounter().add(word.getFont()); - page.getFontSizeCounter().add(word.getFontSize()); - page.getFontStyleCounter().add(word.getFontStyle()); - } - } - } - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RedactManagerBlockificationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RedactManagerBlockificationService.java deleted file mode 100644 index 5c4fcf1c..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RedactManagerBlockificationService.java +++ /dev/null @@ -1,280 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import static java.util.stream.Collectors.toSet; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.FloatFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.Orientation; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Ruling; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.StringFrequencyCounter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPositionSequence; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.RulingTextDirAdjustUtil; - -@Service -@SuppressWarnings("all") -@ConditionalOnProperty(prefix = "application", name = "type", havingValue = "RedactManager") -public class RedactManagerBlockificationService implements BlockificationService { - - static final float THRESHOLD = 1f; - - - /** - * This method is building blocks by expanding the minX/maxX and minY/maxY value on each word that is not split by the conditions. - * This method must use text direction adjusted postions (DirAdj). Where {0,0} is on the upper left. Never try to change this! - * Rulings (TablePageBlock lines) must be adjusted to the text directions as well, when checking if a block is split by a ruling. - * - * @param textPositions The words of a page. - * @param horizontalRulingLines Horizontal table lines. - * @param verticalRulingLines Vertical table lines. - * @return Page object that contains the Textblock and text statistics. - */ - public ClassificationPage blockify(List textPositions, List horizontalRulingLines, List verticalRulingLines) { - - int indexOnPage = 0; - List chunkWords = new ArrayList<>(); - List chunkBlockList = new ArrayList<>(); - - float minX = 1000, maxX = 0, minY = 1000, maxY = 0; - TextPositionSequence prev = null; - - boolean wasSplitted = false; - Float splitX1 = null; - for (TextPositionSequence word : textPositions) { - - boolean lineSeparation = word.getMinYDirAdj() - maxY > word.getHeight() * 1.25; - boolean startFromTop = prev != null && word.getMinYDirAdj() < prev.getMinYDirAdj() - prev.getTextHeight(); - boolean splitByX = prev != null && maxX + 50 < word.getMinXDirAdj() && prev.getMinYDirAdj() == word.getMinYDirAdj(); - boolean xIsBeforeFirstX = prev != null && word.getMinXDirAdj() < minX; - boolean newLineAfterSplit = prev != null && word.getMinYDirAdj() != prev.getMinYDirAdj() && wasSplitted && splitX1 != word.getMinXDirAdj(); - boolean isSplitByRuling = isSplitByRuling(minX, minY, maxX, maxY, word, horizontalRulingLines, verticalRulingLines); - boolean splitByDir = prev != null && !prev.getDir().equals(word.getDir()); - - if (prev != null && (lineSeparation || startFromTop || splitByX || splitByDir || isSplitByRuling)) { - - Orientation prevOrientation = null; - if (!chunkBlockList.isEmpty()) { - prevOrientation = chunkBlockList.get(chunkBlockList.size() - 1).getOrientation(); - } - - TextPageBlock cb1 = buildTextBlock(chunkWords, indexOnPage); - indexOnPage++; - - chunkBlockList.add(cb1); - chunkWords = new ArrayList<>(); - - if (splitByX && !isSplitByRuling) { - wasSplitted = true; - cb1.setOrientation(Orientation.LEFT); - splitX1 = word.getMinXDirAdj(); - } else if (newLineAfterSplit && !isSplitByRuling) { - wasSplitted = false; - cb1.setOrientation(Orientation.RIGHT); - splitX1 = null; - } else if (prevOrientation != null && prevOrientation.equals(Orientation.RIGHT) && (lineSeparation || !startFromTop || !splitByX || !newLineAfterSplit || !isSplitByRuling)) { - cb1.setOrientation(Orientation.LEFT); - } - - minX = 1000; - maxX = 0; - minY = 1000; - maxY = 0; - prev = null; - } - - chunkWords.add(word); - - prev = word; - if (word.getMinXDirAdj() < minX) { - minX = word.getMinXDirAdj(); - } - if (word.getMaxXDirAdj() > maxX) { - maxX = word.getMaxXDirAdj(); - } - if (word.getMinYDirAdj() < minY) { - minY = word.getMinYDirAdj(); - } - if (word.getMaxYDirAdj() > maxY) { - maxY = word.getMaxYDirAdj(); - } - } - - TextPageBlock cb1 = buildTextBlock(chunkWords, indexOnPage); - if (cb1 != null) { - chunkBlockList.add(cb1); - } - - Iterator itty = chunkBlockList.iterator(); - - TextPageBlock previousLeft = null; - TextPageBlock previousRight = null; - while (itty.hasNext()) { - TextPageBlock block = (TextPageBlock) itty.next(); - - if (previousLeft != null && block.getOrientation().equals(Orientation.LEFT)) { - if (previousLeft.getMinY() > block.getMinY() && block.getMaxY() + block.getMostPopularWordHeight() > previousLeft.getMinY()) { - previousLeft.add(block); - itty.remove(); - continue; - } - } - - if (previousRight != null && block.getOrientation().equals(Orientation.RIGHT)) { - if (previousRight.getMinY() > block.getMinY() && block.getMaxY() + block.getMostPopularWordHeight() > previousRight.getMinY()) { - previousRight.add(block); - itty.remove(); - continue; - } - } - - if (block.getOrientation().equals(Orientation.LEFT)) { - previousLeft = block; - } else if (block.getOrientation().equals(Orientation.RIGHT)) { - previousRight = block; - } - } - - itty = chunkBlockList.iterator(); - TextPageBlock previous = null; - while (itty.hasNext()) { - TextPageBlock block = (TextPageBlock) itty.next(); - - if (previous != null && previous.getOrientation().equals(Orientation.LEFT) && block.getOrientation().equals(Orientation.LEFT) && equalsWithThreshold(block.getMaxY(), - previous.getMaxY()) || previous != null && previous.getOrientation().equals(Orientation.LEFT) && block.getOrientation() - .equals(Orientation.RIGHT) && equalsWithThreshold(block.getMaxY(), previous.getMaxY())) { - previous.add(block); - itty.remove(); - continue; - } - - previous = block; - } - - return new ClassificationPage(chunkBlockList); - } - - - private boolean equalsWithThreshold(float f1, float f2) { - - return Math.abs(f1 - f2) < THRESHOLD; - } - - - private TextPageBlock buildTextBlock(List wordBlockList, int indexOnPage) { - - TextPageBlock textBlock = null; - - FloatFrequencyCounter lineHeightFrequencyCounter = new FloatFrequencyCounter(); - FloatFrequencyCounter fontSizeFrequencyCounter = new FloatFrequencyCounter(); - FloatFrequencyCounter spaceFrequencyCounter = new FloatFrequencyCounter(); - StringFrequencyCounter fontFrequencyCounter = new StringFrequencyCounter(); - StringFrequencyCounter styleFrequencyCounter = new StringFrequencyCounter(); - - for (TextPositionSequence wordBlock : wordBlockList) { - - lineHeightFrequencyCounter.add(wordBlock.getTextHeight()); - fontSizeFrequencyCounter.add(wordBlock.getFontSize()); - spaceFrequencyCounter.add(wordBlock.getSpaceWidth()); - fontFrequencyCounter.add(wordBlock.getFont()); - styleFrequencyCounter.add(wordBlock.getFontStyle()); - - if (textBlock == null) { - textBlock = new TextPageBlock(wordBlock.getMinXDirAdj(), - wordBlock.getMaxXDirAdj(), - wordBlock.getMinYDirAdj(), - wordBlock.getMaxYDirAdj(), - wordBlockList, - wordBlock.getRotation()); - } else { - TextPageBlock spatialEntity = textBlock.union(wordBlock); - textBlock.resize(spatialEntity.getMinX(), spatialEntity.getMinY(), spatialEntity.getWidth(), spatialEntity.getHeight()); - } - } - - if (textBlock != null) { - textBlock.setMostPopularWordFont(fontFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordStyle(styleFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordFontSize(fontSizeFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordHeight(lineHeightFrequencyCounter.getMostPopular()); - textBlock.setMostPopularWordSpaceWidth(spaceFrequencyCounter.getMostPopular()); - textBlock.setHighestFontSize(fontSizeFrequencyCounter.getHighest()); - } - - if (textBlock != null && textBlock.getSequences() != null && textBlock.getSequences().stream().map(t -> round(t.getMinYDirAdj(), 3)).collect(toSet()).size() == 1) { - textBlock.getSequences().sort(Comparator.comparing(TextPositionSequence::getMinXDirAdj)); - } - return textBlock; - } - - - private boolean isSplitByRuling(float minX, - float minY, - float maxX, - float maxY, - TextPositionSequence word, - List horizontalRulingLines, - List verticalRulingLines) { - - return isSplitByRuling(maxX, - minY, - word.getMinXDirAdj(), - word.getMinYDirAdj(), - verticalRulingLines, - word.getDir().getDegrees(), - word.getPageWidth(), - word.getPageHeight()) // - || isSplitByRuling(minX, - minY, - word.getMinXDirAdj(), - word.getMaxYDirAdj(), - horizontalRulingLines, - word.getDir().getDegrees(), - word.getPageWidth(), - word.getPageHeight()) // - || isSplitByRuling(maxX, - minY, - word.getMinXDirAdj(), - word.getMinYDirAdj(), - horizontalRulingLines, - word.getDir().getDegrees(), - word.getPageWidth(), - word.getPageHeight()) // - || isSplitByRuling(minX, - minY, - word.getMinXDirAdj(), - word.getMaxYDirAdj(), - verticalRulingLines, - word.getDir().getDegrees(), - word.getPageWidth(), - word.getPageHeight()); - } - - - private boolean isSplitByRuling(float previousX2, float previousY1, float currentX1, float currentY1, List rulingLines, float dir, float pageWidth, float pageHeight) { - - for (Ruling ruling : rulingLines) { - var line = RulingTextDirAdjustUtil.convertToDirAdj(ruling, dir, pageWidth, pageHeight); - if (line.intersectsLine(previousX2, previousY1, currentX1, currentY1)) { - return true; - } - } - return false; - } - - - private double round(float value, int decimalPoints) { - - var d = Math.pow(10, decimalPoints); - return Math.round(value * d) / d; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RedactManagerClassificationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RedactManagerClassificationService.java deleted file mode 100644 index 6cb84e36..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RedactManagerClassificationService.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.util.List; -import java.util.regex.Pattern; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.PageBlockType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.PositionUtils; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -@ConditionalOnProperty(prefix = "application", name = "type", havingValue = "RedactManager") -public class RedactManagerClassificationService implements ClassificationService { - - private final BodyTextFrameService bodyTextFrameService; - - - public void classifyDocument(ClassificationDocument document) { - - Rectangle bodyTextFrame = bodyTextFrameService.calculateBodyTextFrame(document.getPages(), document.getFontSizeCounter(), false); - Rectangle landscapeBodyTextFrame = bodyTextFrameService.calculateBodyTextFrame(document.getPages(), document.getFontSizeCounter(), true); - List headlineFontSizes = document.getFontSizeCounter().getHighterThanMostPopular(); - - log.debug("Document FontSize counters are: {}", document.getFontSizeCounter().getCountPerValue()); - - for (ClassificationPage page : document.getPages()) { - bodyTextFrameService.setBodyTextFrameAdjustedToPage(page, bodyTextFrame, landscapeBodyTextFrame); - classifyPage(page, document, headlineFontSizes); - } - } - - - private void classifyPage(ClassificationPage page, ClassificationDocument document, List headlineFontSizes) { - - for (AbstractPageBlock textBlock : page.getTextBlocks()) { - if (textBlock instanceof TextPageBlock) { - classifyBlock((TextPageBlock) textBlock, page, document, headlineFontSizes); - } - } - } - - - private void classifyBlock(TextPageBlock textBlock, ClassificationPage page, ClassificationDocument document, List headlineFontSizes) { - - var bodyTextFrame = page.getBodyTextFrame(); - - if (document.getFontSizeCounter().getMostPopular() == null) { - textBlock.setClassification(PageBlockType.OTHER); - return; - } - if (PositionUtils.isOverBodyTextFrame(bodyTextFrame, textBlock, page.getRotation()) && (document.getFontSizeCounter() - .getMostPopular() == null || textBlock.getHighestFontSize() <= document.getFontSizeCounter().getMostPopular())) { - textBlock.setClassification(PageBlockType.HEADER); - - } else if (PositionUtils.isUnderBodyTextFrame(bodyTextFrame, textBlock, page.getRotation()) && (document.getFontSizeCounter() - .getMostPopular() == null || textBlock.getHighestFontSize() <= document.getFontSizeCounter().getMostPopular())) { - textBlock.setClassification(PageBlockType.FOOTER); - } else if (page.getPageNumber() == 1 && (PositionUtils.getHeightDifferenceBetweenChunkWordAndDocumentWord(textBlock, - document.getTextHeightCounter().getMostPopular()) > 2.5 && textBlock.getHighestFontSize() > document.getFontSizeCounter().getMostPopular() || page.getTextBlocks() - .size() == 1)) { - if (!Pattern.matches("[0-9]+", textBlock.toString())) { - textBlock.setClassification(PageBlockType.TITLE); - } - } else if (textBlock.getMostPopularWordFontSize() > document.getFontSizeCounter() - .getMostPopular() && PositionUtils.getApproxLineCount(textBlock) < 4.9 && (textBlock.getMostPopularWordStyle().equals("bold") || !document.getFontStyleCounter() - .getCountPerValue() - .containsKey("bold") && textBlock.getMostPopularWordFontSize() > document.getFontSizeCounter().getMostPopular() + 1) && textBlock.getSequences() - .get(0) - .getTextPositions() - .get(0) - .getFontSizeInPt() >= textBlock.getMostPopularWordFontSize()) { - - for (int i = 1; i <= headlineFontSizes.size(); i++) { - if (textBlock.getMostPopularWordFontSize() == headlineFontSizes.get(i - 1)) { - textBlock.setClassification(PageBlockType.getHeadlineType(i)); - document.setHeadlines(true); - } - } - } else if (!textBlock.getText().startsWith("Figure ") && PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordStyle() - .equals("bold") && !document.getFontStyleCounter().getMostPopular().equals("bold") && PositionUtils.getApproxLineCount(textBlock) < 2.9 && textBlock.getSequences() - .get(0) - .getTextPositions() - .get(0) - .getFontSizeInPt() >= textBlock.getMostPopularWordFontSize()) { - textBlock.setClassification(PageBlockType.getHeadlineType(headlineFontSizes.size() + 1)); - document.setHeadlines(true); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter() - .getMostPopular() && textBlock.getMostPopularWordStyle().equals("bold") && !document.getFontStyleCounter().getMostPopular().equals("bold")) { - textBlock.setClassification(PageBlockType.PARAGRAPH_BOLD); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFont() - .equals(document.getFontCounter().getMostPopular()) && textBlock.getMostPopularWordStyle() - .equals(document.getFontStyleCounter().getMostPopular()) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter().getMostPopular()) { - textBlock.setClassification(PageBlockType.PARAGRAPH); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock) && textBlock.getMostPopularWordFontSize() == document.getFontSizeCounter() - .getMostPopular() && textBlock.getMostPopularWordStyle().equals("italic") && !document.getFontStyleCounter() - .getMostPopular() - .equals("italic") && PositionUtils.getApproxLineCount(textBlock) < 2.9) { - textBlock.setClassification(PageBlockType.PARAGRAPH_ITALIC); - } else if (PositionUtils.isWithinBodyTextFrame(bodyTextFrame, textBlock)) { - textBlock.setClassification(PageBlockType.PARAGRAPH_UNKNOWN); - } else { - textBlock.setClassification(PageBlockType.OTHER); - } - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RulingCleaningService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RulingCleaningService.java deleted file mode 100644 index 25f88849..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/RulingCleaningService.java +++ /dev/null @@ -1,235 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.awt.geom.Line2D; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.stereotype.Service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.table.PdfTableCell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.CleanRulings; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Ruling; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.Utils; -import com.iqser.red.service.redaction.v1.server.settings.RedactionServiceSettings; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -@RequiredArgsConstructor -public class RulingCleaningService { - - private final RedactionServiceSettings redactionServiceSettings; - - - public CleanRulings getCleanRulings(List pdfTableCells, List rulings, float minCharWidth, float maxCharHeight) { - - if (!rulings.isEmpty()) { - snapPoints(rulings, minCharWidth, maxCharHeight); - } - - List vrs = new ArrayList<>(); - for (Ruling vr : rulings) { - if (vr.vertical()) { - vrs.add(vr); - } - } - if (vrs.isEmpty() && redactionServiceSettings.isCvTableParsingEnabled()) { - vrs.addAll(extractVerticalRulings(pdfTableCells)); - } - List verticalRulingLines = collapseOrientedRulings(vrs); - - List hrs = new ArrayList<>(); - for (Ruling hr : rulings) { - if (hr.horizontal()) { - hrs.add(hr); - } - } - if (hrs.isEmpty() && redactionServiceSettings.isCvTableParsingEnabled()) { - hrs.addAll(extractHorizontalRulings(pdfTableCells)); - } - List horizontalRulingLines = collapseOrientedRulings(hrs); - - return CleanRulings.builder().vertical(verticalRulingLines).horizontal(horizontalRulingLines).build(); - } - - - public void snapPoints(List rulings, float xThreshold, float yThreshold) { - - // collect points and keep a Line -> p1,p2 map - Map linesToPoints = new HashMap<>(); - List points = new ArrayList<>(); - for (Line2D.Float r : rulings) { - Point2D p1 = r.getP1(); - Point2D p2 = r.getP2(); - linesToPoints.put(r, new Point2D[]{p1, p2}); - points.add(p1); - points.add(p2); - } - - // snap by X - points.sort(Comparator.comparingDouble(Point2D::getX)); - - List> groupedPoints = new ArrayList<>(); - groupedPoints.add(new ArrayList<>(Collections.singletonList(points.get(0)))); - - for (Point2D p : points.subList(1, points.size() - 1)) { - List last = groupedPoints.get(groupedPoints.size() - 1); - if (Math.abs(p.getX() - last.get(0).getX()) < xThreshold) { - groupedPoints.get(groupedPoints.size() - 1).add(p); - } else { - groupedPoints.add(new ArrayList<>(Collections.singletonList(p))); - } - } - - for (List group : groupedPoints) { - float avgLoc = 0; - for (Point2D p : group) { - avgLoc += p.getX(); - } - avgLoc /= group.size(); - for (Point2D p : group) { - p.setLocation(avgLoc, p.getY()); - } - } - // --- - - // snap by Y - points.sort(Comparator.comparingDouble(Point2D::getY)); - - groupedPoints = new ArrayList<>(); - groupedPoints.add(new ArrayList<>(Collections.singletonList(points.get(0)))); - - for (Point2D p : points.subList(1, points.size() - 1)) { - List last = groupedPoints.get(groupedPoints.size() - 1); - if (Math.abs(p.getY() - last.get(0).getY()) < yThreshold) { - groupedPoints.get(groupedPoints.size() - 1).add(p); - } else { - groupedPoints.add(new ArrayList<>(Collections.singletonList(p))); - } - } - - for (List group : groupedPoints) { - float avgLoc = 0; - for (Point2D p : group) { - avgLoc += p.getY(); - } - avgLoc /= group.size(); - for (Point2D p : group) { - p.setLocation(p.getX(), avgLoc); - } - } - // --- - - // finally, modify lines - for (Map.Entry ltp : linesToPoints.entrySet()) { - Point2D[] p = ltp.getValue(); - ltp.getKey().setLine(p[0], p[1]); - } - } - - - private Collection extractVerticalRulings(List pdfTableCells) { - - List vrs = new ArrayList<>(); - - if (pdfTableCells != null) { - for (PdfTableCell pdfTableCell : pdfTableCells) { - Ruling leftLine = createRuling(pdfTableCell.getX0(), pdfTableCell.getX0(), pdfTableCell.getY0(), pdfTableCell.getY1()); - Ruling rightLine = createRuling(pdfTableCell.getX1(), pdfTableCell.getX1(), pdfTableCell.getY0(), pdfTableCell.getY1()); - vrs.add(leftLine); - vrs.add(rightLine); - } - } - return vrs; - } - - - private Collection extractHorizontalRulings(List pdfTableCells) { - - List hrs = new ArrayList<>(); - - if (pdfTableCells != null) { - for (PdfTableCell pdfTableCell : pdfTableCells) { - Ruling topLine = createRuling(pdfTableCell.getX0(), pdfTableCell.getX1(), pdfTableCell.getY1(), pdfTableCell.getY1()); - Ruling baseLine = createRuling(pdfTableCell.getX0(), pdfTableCell.getX1(), pdfTableCell.getY0(), pdfTableCell.getY0()); - hrs.add(topLine); - hrs.add(baseLine); - } - } - - return hrs; - } - - - private Ruling createRuling(float tableCellX0, float tableCellX1, float tableCellY0, float tableCellY1) { - - float x0 = tableCellX0; - float x1 = tableCellX1; - float y0 = tableCellY0; - float y1 = tableCellY1; - - if (x1 < x0) { - x0 = tableCellX1; - x1 = tableCellX0; - } - - if (y1 < y0) { - y0 = tableCellY1; - y1 = tableCellY0; - } - - return new Ruling(new Point2D.Float(x0, y0), new Point2D.Float(x1, y1)); - } - - - private List collapseOrientedRulings(List lines) { - - int COLINEAR_OR_PARALLEL_PIXEL_EXPAND_AMOUNT = 1; - return collapseOrientedRulings(lines, COLINEAR_OR_PARALLEL_PIXEL_EXPAND_AMOUNT); - } - - - private List collapseOrientedRulings(List lines, int expandAmount) { - - ArrayList rv = new ArrayList<>(); - lines.sort((a, b) -> { - final float diff = a.getPosition() - b.getPosition(); - return Float.compare(diff == 0 ? a.getStart() - b.getStart() : diff, 0f); - }); - - for (Ruling next_line : lines) { - Ruling last = rv.isEmpty() ? null : rv.get(rv.size() - 1); - // if current line colinear with next, and are "close enough": expand current line - if (last != null && Utils.feq(next_line.getPosition(), last.getPosition()) && last.nearlyIntersects(next_line, expandAmount)) { - final float lastStart = last.getStart(); - final float lastEnd = last.getEnd(); - - final boolean lastFlipped = lastStart > lastEnd; - final boolean nextFlipped = next_line.getStart() > next_line.getEnd(); - - boolean differentDirections = nextFlipped != lastFlipped; - float nextS = differentDirections ? next_line.getEnd() : next_line.getStart(); - float nextE = differentDirections ? next_line.getStart() : next_line.getEnd(); - - final float newStart = lastFlipped ? Math.max(nextS, lastStart) : Math.min(nextS, lastStart); - final float newEnd = lastFlipped ? Math.min(nextE, lastEnd) : Math.max(nextE, lastEnd); - last.setStartEnd(newStart, newEnd); - assert !last.oblique(); - } else if (next_line.length() == 0) { - continue; - } else { - rv.add(next_line); - } - } - return rv; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/SectionsBuilderService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/SectionsBuilderService.java deleted file mode 100644 index 48b7ccbf..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/SectionsBuilderService.java +++ /dev/null @@ -1,304 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import org.apache.commons.collections4.CollectionUtils; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationFooter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationHeader; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationSection; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.PageBlockType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Cell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.TablePageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.UnclassifiedText; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Service -public class SectionsBuilderService { - - public void buildSections(ClassificationDocument document) { - - List chunkWords = new ArrayList<>(); - List chunkBlockList = new ArrayList<>(); - List headers = new ArrayList<>(); - List footers = new ArrayList<>(); - List unclassifiedTexts = new ArrayList<>(); - - AbstractPageBlock prev = null; - - String lastHeadline = ""; - TablePageBlock previousTable = null; - for (ClassificationPage page : document.getPages()) { - List header = new ArrayList<>(); - List footer = new ArrayList<>(); - List unclassifiedText = new ArrayList<>(); - for (AbstractPageBlock current : page.getTextBlocks()) { - - if (current.getClassification() == null) { - continue; - } - - current.setPage(page.getPageNumber()); - - if (current.getClassification().equals(PageBlockType.HEADER)) { - header.add((TextPageBlock) current); - continue; - } - - if (current.getClassification().equals(PageBlockType.FOOTER)) { - footer.add((TextPageBlock) current); - continue; - } - - if (current.getClassification().equals(PageBlockType.OTHER)) { - unclassifiedText.add((TextPageBlock) current); - continue; - } - - if (prev != null && current.getClassification().isHeadline() && !prev.getClassification().isHeadline() || !document.isHeadlines()) { - ClassificationSection chunkBlock = buildTextBlock(chunkWords, lastHeadline); - chunkBlock.setHeadline(lastHeadline); - if (document.isHeadlines()) { - lastHeadline = current.getText(); - } - chunkBlockList.add(chunkBlock); - chunkWords = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(chunkBlock.getTables())) { - previousTable = chunkBlock.getTables().get(chunkBlock.getTables().size() - 1); - } - } - if (current instanceof TablePageBlock table) { - // Distribute header information for subsequent tables - mergeTableMetadata(table, previousTable); - previousTable = table; - } - chunkWords.add(current); - prev = current; - } - - if (!header.isEmpty()) { - headers.add(new ClassificationHeader(header)); - } - if (!footer.isEmpty()) { - footers.add(new ClassificationFooter(footer)); - } - if (!unclassifiedText.isEmpty()) { - unclassifiedTexts.add(new UnclassifiedText(unclassifiedText)); - } - } - - ClassificationSection chunkBlock = buildTextBlock(chunkWords, lastHeadline); - chunkBlock.setHeadline(lastHeadline); - chunkBlockList.add(chunkBlock); - - document.setSections(chunkBlockList); - document.setHeaders(headers); - document.setFooters(footers); - document.setUnclassifiedTexts(unclassifiedTexts); - } - - - public void addImagesToSections(ClassificationDocument document) { - - Map> sectionMap = new HashMap<>(); - for (ClassificationSection section : document.getSections()) { - for (AbstractPageBlock container : section.getPageBlocks()) { - - List sectionsOnPage = sectionMap.computeIfAbsent(container.getPage(), c -> new ArrayList<>()); - if (sectionsOnPage.contains(section)) { - continue; - } - sectionsOnPage.add(section); - } - } - - if (sectionMap.isEmpty()) { - ClassificationSection section = new ClassificationSection(); - document.getSections().add(section); - sectionMap.computeIfAbsent(1, x -> new ArrayList<>()).add(section); - } - - // first page is always a paragraph, else we can't process pages 1..N, - // where N is the first found page with a paragraph - if (sectionMap.get(1) == null) { - ClassificationSection section = new ClassificationSection(); - document.getSections().add(section); - sectionMap.computeIfAbsent(1, x -> new ArrayList<>()).add(section); - } - - for (ClassificationPage page : document.getPages()) { - for (ClassifiedImage image : page.getImages()) { - List sectionsOnPage = sectionMap.get(page.getPageNumber()); - if (sectionsOnPage == null) { - int i = page.getPageNumber(); - while (sectionsOnPage == null) { - sectionsOnPage = sectionMap.get(i); - i--; - } - } - for (ClassificationSection section : sectionsOnPage) { - Float xMin = null; - Float yMin = null; - Float xMax = null; - Float yMax = null; - - for (AbstractPageBlock abs : section.getPageBlocks()) { - if (abs.getPage() != page.getPageNumber()) { - continue; - } - - if (abs.getMinX() < abs.getMaxX()) { - if (xMin == null || abs.getMinX() < xMin) { - xMin = abs.getMinX(); - } - if (xMax == null || abs.getMaxX() > xMax) { - xMax = abs.getMaxX(); - } - } else { - if (xMin == null || abs.getMaxX() < xMin) { - xMin = abs.getMaxX(); - } - if (xMax == null || abs.getMinX() > xMax) { - xMax = abs.getMinX(); - } - } - - if (abs.getMinY() < abs.getMaxY()) { - if (yMin == null || abs.getMinY() < yMin) { - yMin = abs.getMinY(); - } - if (yMax == null || abs.getMaxY() > yMax) { - yMax = abs.getMaxY(); - } - } else { - if (yMin == null || abs.getMaxY() < yMin) { - yMin = abs.getMaxY(); - } - if (yMax == null || abs.getMinY() > yMax) { - yMax = abs.getMinY(); - } - } - - } - - log.debug("Image position x: {}, y: {}", image.getPosition().getX(), image.getPosition().getY()); - log.debug("Paragraph position xMin: {}, xMax: {}, yMin: {}, yMax: {}", xMin, xMax, yMin, yMax); - - if (xMin != null && xMax != null && yMin != null && yMax != null && image.getPosition().getX() >= xMin && image.getPosition() - .getX() <= xMax && image.getPosition().getY() >= yMin && image.getPosition().getY() <= yMax) { - section.getImages().add(image); - image.setAppendedToSection(true); - } - } - if (!image.isAppendedToSection()) { - log.debug("Image uses first paragraph"); - sectionsOnPage.get(0).getImages().add(image); - image.setAppendedToSection(true); - } - } - } - } - - - private void mergeTableMetadata(TablePageBlock currentTable, TablePageBlock previousTable) { - - // Distribute header information for subsequent tables - if (previousTable != null && hasInvalidHeaderInformation(currentTable) && hasValidHeaderInformation(previousTable)) { - List previousTableNonHeaderRow = getRowWithNonHeaderCells(previousTable); - List tableNonHeaderRow = getRowWithNonHeaderCells(currentTable); - // Allow merging of tables if header row is separated from first logical non-header row - if (previousTableNonHeaderRow.isEmpty() && previousTable.getRowCount() == 1 && previousTable.getRows().get(0).size() == tableNonHeaderRow.size()) { - previousTableNonHeaderRow = previousTable.getRows().get(0).stream().map(cell -> { - Cell fakeCell = new Cell(cell.getPoints()[0], cell.getPoints()[2]); - fakeCell.setHeaderCells(Collections.singletonList(cell)); - return fakeCell; - }).collect(Collectors.toList()); - } - if (previousTableNonHeaderRow.size() == tableNonHeaderRow.size()) { - for (int i = currentTable.getRowCount() - 1; i >= 0; i--) { // Non header rows are most likely at bottom of table - List row = currentTable.getRows().get(i); - if (row.size() == tableNonHeaderRow.size() && row.stream().allMatch(cell -> cell.getHeaderCells().isEmpty())) { - for (int j = 0; j < row.size(); j++) { - row.get(j).setHeaderCells(previousTableNonHeaderRow.get(j).getHeaderCells()); - } - } - } - } - } - } - - - private ClassificationSection buildTextBlock(List wordBlockList, String lastHeadline) { - - ClassificationSection section = new ClassificationSection(); - - for (AbstractPageBlock container : wordBlockList) { - if (container instanceof TablePageBlock table) { - - if (lastHeadline == null || lastHeadline.isEmpty()) { - table.setHeadline("Text in table"); - } else { - table.setHeadline("TablePageBlock in: " + lastHeadline); - } - - section.getPageBlocks().add(table); - continue; - } - - TextPageBlock wordBlock = (TextPageBlock) container; - section.getPageBlocks().add(wordBlock); - } - return section; - } - - - private boolean hasValidHeaderInformation(TablePageBlock table) { - - return !hasInvalidHeaderInformation(table); - } - - - private boolean hasInvalidHeaderInformation(TablePageBlock table) { - - return table.getRows().stream().flatMap(row -> row.stream().filter(cell -> CollectionUtils.isNotEmpty(cell.getHeaderCells()))).findAny().isEmpty(); - - } - - - private List getRowWithNonHeaderCells(TablePageBlock table) { - - for (int i = table.getRowCount() - 1; i >= 0; i--) { // Non header rows are most likely at bottom of table - List row = table.getRows().get(i); - if (row.size() == 1) { - continue; - } - boolean allNonHeader = true; - for (Cell cell : row) { - if (cell.isHeaderCell()) { - allNonHeader = false; - break; - } - } - if (allNonHeader) { - return row; - } - } - - return Collections.emptyList(); - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/TableExtractionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/TableExtractionService.java deleted file mode 100644 index 7ab5e4dc..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/service/TableExtractionService.java +++ /dev/null @@ -1,337 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service; - -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import org.springframework.stereotype.Service; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.AbstractPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationPage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Cell; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.CleanRulings; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Ruling; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.TablePageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.Utils; - -@Service -public class TableExtractionService { - - private static final Comparator X_FIRST_POINT_COMPARATOR = (arg0, arg1) -> { - - int rv = 0; - float arg0X = Utils.round(arg0.getX(), 2); - float arg0Y = Utils.round(arg0.getY(), 2); - float arg1X = Utils.round(arg1.getX(), 2); - float arg1Y = Utils.round(arg1.getY(), 2); - - if (arg0X > arg1X) { - rv = 1; - } else if (arg0X < arg1X) { - rv = -1; - } else if (arg0Y > arg1Y) { - rv = 1; - } else if (arg0Y < arg1Y) { - rv = -1; - } - return rv; - }; - private static final Comparator POINT_COMPARATOR = (arg0, arg1) -> { - - int rv = 0; - float arg0X = Utils.round(arg0.getX(), 2); - float arg0Y = Utils.round(arg0.getY(), 2); - float arg1X = Utils.round(arg1.getX(), 2); - float arg1Y = Utils.round(arg1.getY(), 2); - - if (arg0Y > arg1Y) { - rv = 1; - } else if (arg0Y < arg1Y) { - rv = -1; - } else if (arg0X > arg1X) { - rv = 1; - } else if (arg0X < arg1X) { - rv = -1; - } - return rv; - }; - - - /** - * Finds tables on a page and moves textblocks into cells of the found tables. - * Note: This algorithm uses Pdf Coordinate System where {0,0} rotated with the page rotation. - * 0 -> LowerLeft - * 90 -> UpperLeft - * 180 -> UpperRight - * 270 -> LowerRight - *

- * DirAdj (Text direction adjusted) values can not be used here. - * - * @param cleanRulings The lines used to build the table. - * @param page Page object that contains textblocks and statistics. - */ - public void extractTables(CleanRulings cleanRulings, ClassificationPage page) { - - List cells = findCells(cleanRulings.getHorizontal(), cleanRulings.getVertical()); - - List toBeRemoved = new ArrayList<>(); - - for (AbstractPageBlock abstractPageBlock : page.getTextBlocks()) { - TextPageBlock textBlock = (TextPageBlock) abstractPageBlock; - for (Cell cell : cells) { - if (cell.hasMinimumSize() && cell.intersects(textBlock.getPdfMinX(), - textBlock.getPdfMinY(), - textBlock.getPdfMaxX() - textBlock.getPdfMinX(), - textBlock.getPdfMaxY() - textBlock.getPdfMinY())) { - cell.addTextBlock(textBlock); - toBeRemoved.add(textBlock); - break; - } - } - } - - cells = new ArrayList<>(new HashSet<>(cells)); - Utils.sort(cells, Rectangle.ILL_DEFINED_ORDER); - - List spreadsheetAreas = findSpreadsheetsFromCells(cells).stream().filter(r -> r.getWidth() > 0f && r.getHeight() > 0f).collect(Collectors.toList()); - - List tables = new ArrayList<>(); - for (Rectangle area : spreadsheetAreas) { - - List overlappingCells = new ArrayList<>(); - for (Cell c : cells) { - if (c.hasMinimumSize() && c.intersects(area)) { - overlappingCells.add(c); - } - } - tables.add(new TablePageBlock(overlappingCells, area, page.getRotation())); - } - - for (TablePageBlock table : tables) { - int position = -1; - - Iterator itty = page.getTextBlocks().iterator(); - while (itty.hasNext()) { - AbstractPageBlock textBlock = itty.next(); - if (textBlock instanceof TextPageBlock ? table.containsBlock((TextPageBlock) textBlock) : table.contains(textBlock) && position == -1) { - position = page.getTextBlocks().indexOf(textBlock); - } - } - if (position != -1) { - page.getTextBlocks().add(position, table); - } - } - - page.getTextBlocks().removeAll(toBeRemoved); - } - - - public List findCells(List horizontalRulingLines, List verticalRulingLines) { - - List cellsFound = new ArrayList<>(); - Map intersectionPoints = Ruling.findIntersections(horizontalRulingLines, verticalRulingLines); - List intersectionPointsList = new ArrayList<>(intersectionPoints.keySet()); - intersectionPointsList.sort(POINT_COMPARATOR); - - for (int i = 0; i < intersectionPointsList.size(); i++) { - Point2D topLeft = intersectionPointsList.get(i); - Ruling[] hv = intersectionPoints.get(topLeft); - - // CrossingPointsDirectlyBelow( topLeft ); - List xPoints = new ArrayList<>(); - // CrossingPointsDirectlyToTheRight( topLeft ); - List yPoints = new ArrayList<>(); - - for (Point2D p : intersectionPointsList.subList(i, intersectionPointsList.size())) { - if (p.getX() == topLeft.getX() && p.getY() > topLeft.getY()) { - xPoints.add(p); - } - if (p.getY() == topLeft.getY() && p.getX() > topLeft.getX()) { - yPoints.add(p); - } - } - outer: - for (Point2D xPoint : xPoints) { - // is there a vertical edge b/w topLeft and xPoint? - if (!hv[1].equals(intersectionPoints.get(xPoint)[1])) { - continue; - } - for (Point2D yPoint : yPoints) { - // is there an horizontal edge b/w topLeft and yPoint ? - if (!hv[0].equals(intersectionPoints.get(yPoint)[0])) { - continue; - } - Point2D btmRight = new Point2D.Float((float) yPoint.getX(), (float) xPoint.getY()); - if (intersectionPoints.containsKey(btmRight) && intersectionPoints.get(btmRight)[0].equals(intersectionPoints.get(xPoint)[0]) && intersectionPoints.get(btmRight)[1].equals( - intersectionPoints.get(yPoint)[1])) { - cellsFound.add(new Cell(topLeft, btmRight)); - break outer; - } - } - } - } - - // TODO create cells for vertical ruling lines with aligned endpoints at the top/bottom of a grid - // that aren't connected with an horizontal ruler? - // see: https://github.com/jazzido/tabula-extractor/issues/78#issuecomment-41481207 - - return cellsFound; - } - - - private List findSpreadsheetsFromCells(List cells) { - // via: http://stackoverflow.com/questions/13746284/merging-multiple-adjacent-rectangles-into-one-polygon - List rectangles = new ArrayList<>(); - Set pointSet = new HashSet<>(); - Map edgesH = new HashMap<>(); - Map edgesV = new HashMap<>(); - int i = 0; - - for (Rectangle cell : cells) { - for (Point2D pt : cell.getPoints()) { - if (pointSet.contains(pt)) { // shared vertex, remove it - pointSet.remove(pt); - } else { - pointSet.add(pt); - } - } - } - - // X first sort - List pointsSortX = new ArrayList<>(pointSet); - pointsSortX.sort(X_FIRST_POINT_COMPARATOR); - // Y first sort - List pointsSortY = new ArrayList<>(pointSet); - pointsSortY.sort(POINT_COMPARATOR); - - while (i < pointSet.size()) { - float currY = (float) pointsSortY.get(i).getY(); - while (i < pointSet.size() && Utils.feq(pointsSortY.get(i).getY(), currY)) { - edgesH.put(pointsSortY.get(i), pointsSortY.get(i + 1)); - edgesH.put(pointsSortY.get(i + 1), pointsSortY.get(i)); - i += 2; - } - } - - i = 0; - while (i < pointSet.size()) { - float currX = (float) pointsSortX.get(i).getX(); - while (i < pointSet.size() && Utils.feq(pointsSortX.get(i).getX(), currX)) { - edgesV.put(pointsSortX.get(i), pointsSortX.get(i + 1)); - edgesV.put(pointsSortX.get(i + 1), pointsSortX.get(i)); - i += 2; - } - } - - // Get all the polygons - List> polygons = new ArrayList<>(); - Point2D nextVertex; - while (!edgesH.isEmpty()) { - ArrayList polygon = new ArrayList<>(); - Point2D first = edgesH.keySet().iterator().next(); - polygon.add(new PolygonVertex(first, Direction.HORIZONTAL)); - edgesH.remove(first); - - while (true) { - PolygonVertex curr = polygon.get(polygon.size() - 1); - PolygonVertex lastAddedVertex; - if (curr.direction == Direction.HORIZONTAL) { - nextVertex = edgesV.get(curr.point); - edgesV.remove(curr.point); - lastAddedVertex = new PolygonVertex(nextVertex, Direction.VERTICAL); - } else { - nextVertex = edgesH.get(curr.point); - edgesH.remove(curr.point); - lastAddedVertex = new PolygonVertex(nextVertex, Direction.HORIZONTAL); - } - polygon.add(lastAddedVertex); - - if (lastAddedVertex.equals(polygon.get(0))) { - // closed polygon - polygon.remove(polygon.size() - 1); - break; - } - } - - for (PolygonVertex vertex : polygon) { - edgesH.remove(vertex.point); - edgesV.remove(vertex.point); - } - polygons.add(polygon); - } - - // calculate grid-aligned minimum area rectangles for each found polygon - for (List poly : polygons) { - float top = Float.MAX_VALUE; - float left = Float.MAX_VALUE; - float bottom = Float.MIN_VALUE; - float right = Float.MIN_VALUE; - for (PolygonVertex pt : poly) { - top = (float) Math.min(top, pt.point.getY()); - left = (float) Math.min(left, pt.point.getX()); - bottom = (float) Math.max(bottom, pt.point.getY()); - right = (float) Math.max(right, pt.point.getX()); - } - rectangles.add(new Rectangle(top, left, right - left, bottom - top)); - } - - return rectangles; - } - - - private enum Direction { - HORIZONTAL, - VERTICAL - } - - static class PolygonVertex { - - Point2D point; - Direction direction; - - - PolygonVertex(Point2D point, Direction direction) { - - this.direction = direction; - this.point = point; - } - - - @Override - public boolean equals(Object other) { - - if (this == other) { - return true; - } - if (!(other instanceof PolygonVertex)) { - return false; - } - return this.point.equals(((PolygonVertex) other).point); - } - - - @Override - public int hashCode() { - - return this.point.hashCode(); - } - - - @Override - public String toString() { - - return String.format("%s[point=%s,direction=%s]", this.getClass().getName(), this.point.toString(), this.direction.toString()); - } - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/CohenSutherlandClipping.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/CohenSutherlandClipping.java deleted file mode 100644 index c39c6d6d..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/CohenSutherlandClipping.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * CohenSutherland.java - * -------------------- - * (c) 2007 by Intevation GmbH - * - * @author Sascha L. Teichmann (teichmann@intevation.de) - * @author Ludwig Reiter (ludwig@intevation.de) - * - * This program is free software under the LGPL (>=v2.1) - * Read the file LICENSE.txt coming with the sources for details. - */ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils; - -import java.awt.geom.Line2D; -import java.awt.geom.Rectangle2D; - -/** - * Implements the well known Cohen Sutherland line - * clipping algorithm (line against clip rectangle). - */ -@SuppressWarnings("all") -public final class CohenSutherlandClipping { - - private static final int INSIDE = 0; - private static final int LEFT = 1; - private static final int RIGHT = 2; - private static final int BOTTOM = 4; - private static final int TOP = 8; - private double xMin; - private double yMin; - private double xMax; - private double yMax; - - - /** - * Creates a Cohen Sutherland clipper with clip rect (0, 0, 0, 0). - */ - public CohenSutherlandClipping() { - - } - - - /** - * Creates a Cohen Sutherland clipper with the given clip rectangle. - * - * @param clip the clip rectangle to use - */ - public CohenSutherlandClipping(Rectangle2D clip) { - - setClip(clip); - } - - - /** - * Sets the clip rectangle. - * - * @param clip the clip rectangle - */ - public void setClip(Rectangle2D clip) { - - xMin = clip.getX(); - xMax = xMin + clip.getWidth(); - yMin = clip.getY(); - yMax = yMin + clip.getHeight(); - } - - - private final int regionCode(double x, double y) { - - int code = x < xMin ? LEFT : x > xMax ? RIGHT : INSIDE; - if (y < yMin) { - code |= BOTTOM; - } else if (y > yMax) { - code |= TOP; - } - return code; - } - - - /** - * Clips a given line against the clip rectangle. - * The modification (if needed) is done in place. - * - * @param line the line to clip - * @return true if line is clipped, false if line is - * totally outside the clip rect. - */ - public boolean clip(Line2D.Float line) { - - double p1x = line.getX1(); - double p1y = line.getY1(); - double p2x = line.getX2(); - double p2y = line.getY2(); - - double qx = 0d; - double qy = 0d; - - boolean vertical = p1x == p2x; - - double slope = vertical ? 0d : (p2y - p1y) / (p2x - p1x); - - int c1 = regionCode(p1x, p1y); - int c2 = regionCode(p2x, p2y); - - while (c1 != INSIDE || c2 != INSIDE) { - - if ((c1 & c2) != INSIDE) { - return false; - } - - int c = c1 == INSIDE ? c2 : c1; - - if ((c & LEFT) != INSIDE) { - qx = xMin; - qy = (Utils.feq(qx, p1x) ? 0 : qx - p1x) * slope + p1y; - } else if ((c & RIGHT) != INSIDE) { - qx = xMax; - qy = (Utils.feq(qx, p1x) ? 0 : qx - p1x) * slope + p1y; - } else if ((c & BOTTOM) != INSIDE) { - qy = yMin; - qx = vertical ? p1x : (Utils.feq(qy, p1y) ? 0 : qy - p1y) / slope + p1x; - } else if ((c & TOP) != INSIDE) { - qy = yMax; - qx = vertical ? p1x : (Utils.feq(qy, p1y) ? 0 : qy - p1y) / slope + p1x; - } - - if (c == c1) { - p1x = qx; - p1y = qy; - c1 = regionCode(p1x, p1y); - } else { - p2x = qx; - p2y = qy; - c2 = regionCode(p2x, p2y); - } - } - line.setLine(p1x, p1y, p2x, p2y); - return true; - } - -} -// end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/FileUtils.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/FileUtils.java deleted file mode 100644 index b8da0292..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/FileUtils.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; - -import lombok.experimental.UtilityClass; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@UtilityClass -public class FileUtils { - - public File createTempFile(String filenamePrefix, String filenameSuffix) throws IOException { - - File tempFile = Files.createTempFile(filenamePrefix, filenameSuffix).toFile(); - setRWPermissionsOnlyForOwner(tempFile); - - return tempFile; - } - - - /** - * Deletes a file; logs a message with the reason if the deletion fails. - * This method is null-safe. - * - * @param file The file to delete. Can be null. - */ - public void deleteFile(File file) { - - if (file != null) { - try { - Files.deleteIfExists(file.toPath()); - } catch (IOException ex) { - log.warn("Could not delete file!", ex); - } - } - } - - - // We don't need to check the results of the permission setters below, - // since we're manipulating a file we created ourselves. - @SuppressWarnings({"ResultOfMethodCallIgnored", "squid:S899"}) - private void setRWPermissionsOnlyForOwner(File tempFile) { - - try { - tempFile.setReadable(true, true); - tempFile.setWritable(true, true); - tempFile.setExecutable(false); - } catch (SecurityException ex) { - // This should never happen since we're creating a temp file ourselves. - log.warn("Caught an exception during temp file creation. This should not happend. Check the code.", ex); - } - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/PositionUtils.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/PositionUtils.java deleted file mode 100644 index 028b7e6c..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/PositionUtils.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Rectangle; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.TextPageBlock; - -import lombok.experimental.UtilityClass; - -@UtilityClass -@SuppressWarnings("all") -public final class PositionUtils { - - // TODO This currently uses pdf coord system. In the futher this should use java coord system. - // Note: DirAdj (TextDirection Adjusted) can not be user for this. - public boolean isWithinBodyTextFrame(Rectangle btf, TextPageBlock textBlock) { - - if (btf == null || textBlock == null) { - return false; - } - - double threshold = textBlock.getMostPopularWordHeight() * 3; - - if (textBlock.getPdfMinX() + threshold > btf.getTopLeft().getX() && textBlock.getPdfMaxX() - threshold < btf.getTopLeft() - .getX() + btf.getWidth() && textBlock.getPdfMinY() + threshold > btf.getTopLeft().getY() && textBlock.getPdfMaxY() - threshold < btf.getTopLeft() - .getY() + btf.getHeight()) { - return true; - } else { - return false; - } - - } - - - // TODO This currently uses pdf coord system. In the futher this should use java coord system. - // Note: DirAdj (TextDirection Adjusted) can not be user for this. - public boolean isOverBodyTextFrame(Rectangle btf, TextPageBlock textBlock, int rotation) { - - if (btf == null || textBlock == null) { - return false; - } - - if (rotation == 90 && textBlock.getPdfMaxX() < btf.getTopLeft().getX()) { - return true; - } - - if (rotation == 180 && textBlock.getPdfMaxY() < btf.getTopLeft().getY()) { - return true; - } - - if (rotation == 270 && textBlock.getPdfMinX() > btf.getTopLeft().getX() + btf.getWidth()) { - return true; - } - - if (rotation == 0 && textBlock.getPdfMinY() > btf.getTopLeft().getY() + btf.getHeight()) { - return true; - } else { - return false; - } - - } - - - // TODO This currently uses pdf coord system. In the futher this should use java coord system. - // Note: DirAdj (TextDirection Adjusted) can not be user for this. - public boolean isUnderBodyTextFrame(Rectangle btf, TextPageBlock textBlock, int rotation) { - - if (btf == null || textBlock == null) { - return false; - } - - if (rotation == 90 && textBlock.getPdfMinX() > btf.getTopLeft().getX() + btf.getWidth()) { - return true; - } - - if (rotation == 180 && textBlock.getPdfMinY() > btf.getTopLeft().getY() + btf.getHeight()) { - return true; - } - - if (rotation == 270 && textBlock.getPdfMaxX() < btf.getTopLeft().getX()) { - return true; - } - - if (rotation == 0 && textBlock.getPdfMaxY() < btf.getTopLeft().getY()) { - return true; - } else { - return false; - } - - } - - - // TODO This currently uses pdf coord system. In the futher this should use java coord system. - // Note: DirAdj (TextDirection Adjusted) can not be user for this. - public boolean isTouchingUnderBodyTextFrame(Rectangle btf, TextPageBlock textBlock) { - - //TODO Currently this is not working for rotated pages. - - if (btf == null || textBlock == null) { - return false; - } - - if (textBlock.getMinY() < btf.getTopLeft().getY()) { - return true; - } else { - return false; - } - - } - - - public float getHeightDifferenceBetweenChunkWordAndDocumentWord(TextPageBlock textBlock, Float documentMostPopularWordHeight) { - - return textBlock.getMostPopularWordHeight() - documentMostPopularWordHeight; - } - - - public Float getApproxLineCount(TextPageBlock textBlock) { - - return textBlock.getHeight() / textBlock.getMostPopularWordHeight(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/QuickSort.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/QuickSort.java deleted file mode 100644 index 55b8e861..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/QuickSort.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils; - -import java.util.ArrayDeque; -import java.util.Comparator; -import java.util.Deque; -import java.util.List; - -import lombok.experimental.UtilityClass; - -/** - * Copied and minimal modified from PDFBox. - */ -@UtilityClass -public final class QuickSort { - - private static final Comparator OBJCOMP = new Comparator() { - @Override - public int compare(Comparable object1, Comparable object2) { - - return object1.compareTo(object2); - } - }; - - - /** - * Sorts the given list using the given comparator. - * - * @param type of the objects to be sorted. - * @param list list to be sorted - * @param cmp comparator used to compare the objects within the list - */ - public static void sort(List list, Comparator cmp) { - - int size = list.size(); - if (size < 2) { - return; - } - quicksort(list, cmp); - } - - - /** - * Sorts the given list using compareTo as comparator. - * - * @param type of the objects to be sorted. - * @param list list to be sorted - */ - public static void sort(List list) { - - sort(list, (Comparator) OBJCOMP); - } - - - private static void quicksort(List list, Comparator cmp) { - - Deque stack = new ArrayDeque(); - stack.push(0); - stack.push(list.size()); - while (!stack.isEmpty()) { - int right = stack.pop(); - int left = stack.pop(); - if (right - left < 2) { - continue; - } - int p = left + ((right - left) / 2); - p = partition(list, cmp, p, left, right); - - stack.push(p + 1); - stack.push(right); - - stack.push(left); - stack.push(p); - } - } - - - private static int partition(List list, Comparator cmp, int p, int start, int end) { - - int l = start; - int h = end - 2; - T piv = list.get(p); - swap(list, p, end - 1); - - while (l < h) { - if (cmp.compare(list.get(l), piv) <= 0) { - l++; - } else if (cmp.compare(piv, list.get(h)) <= 0) { - h--; - } else { - swap(list, l, h); - } - } - int idx = h; - if (cmp.compare(list.get(h), piv) < 0) { - idx++; - } - swap(list, end - 1, idx); - return idx; - } - - - private static void swap(List list, int i, int j) { - - T tmp = list.get(i); - list.set(i, list.get(j)); - list.set(j, tmp); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/RulingTextDirAdjustUtil.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/RulingTextDirAdjustUtil.java deleted file mode 100644 index 0e9b047e..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/RulingTextDirAdjustUtil.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils; - -import java.awt.geom.Line2D; -import java.awt.geom.Point2D; - -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.table.Ruling; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public final class RulingTextDirAdjustUtil { - - /** - * Converts a ruling (line of a table) the same way TextPositions are converted in PDFBox. - * This will get the y position of the text, adjusted so that 0,0 is upper left and it is adjusted based on the text direction. - *

- * See org.apache.pdfbox.text.TextPosition - */ - public Line2D.Float convertToDirAdj(Ruling ruling, float dir, float pageWidth, float pageHeight) { - - return new Line2D.Float(convertPoint(ruling.x1, ruling.y1, dir, pageWidth, pageHeight), convertPoint(ruling.x2, ruling.y2, dir, pageWidth, pageHeight)); - } - - - private Point2D convertPoint(float x, float y, float dir, float pageWidth, float pageHeight) { - - var xAdj = getXRot(x, y, dir, pageWidth, pageHeight); - var yLowerLeftRot = getYLowerLeftRot(x, y, dir, pageWidth, pageHeight); - var yAdj = dir == 0 || dir == 180 ? pageHeight - yLowerLeftRot : pageWidth - yLowerLeftRot; - return new Point2D.Float(xAdj, yAdj); - } - - - @SuppressWarnings("SuspiciousNameCombination") - private float getXRot(float x, float y, float dir, float pageWidth, float pageHeight) { - - if (dir == 0) { - return x; - } else if (dir == 90) { - return y; - } else if (dir == 180) { - return pageWidth - x; - } else if (dir == 270) { - return pageHeight - y; - } - return 0; - } - - - private float getYLowerLeftRot(float x, float y, float dir, float pageWidth, float pageHeight) { - - if (dir == 0) { - return y; - } else if (dir == 90) { - return pageWidth - x; - } else if (dir == 180) { - return pageHeight - y; - } else if (dir == 270) { - return x; - } - return 0; - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/Utils.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/Utils.java deleted file mode 100644 index c5489e0f..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/layoutparsing/classification/utils/Utils.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils; - -import java.math.BigDecimal; -import java.util.Comparator; -import java.util.List; - -import lombok.experimental.UtilityClass; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@UtilityClass -@SuppressWarnings("all") -public final class Utils { - - private final static float EPSILON = 0.1f; - - - public static boolean feq(double f1, double f2) { - - return (Math.abs(f1 - f2) < EPSILON); - } - - - public static float round(double d, int decimalPlace) { - - BigDecimal bd = BigDecimal.valueOf(d); - bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP); - return bd.floatValue(); - } - - - public static void sort(List list, Comparator comparator) { - - try { - QuickSort.sort(list, comparator); - } catch (IllegalArgumentException e) { - // This should not happen since we use QuickSort from PDFBox - log.warn(e.getMessage()); - } - } - -} - diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java index 7685c4f5..69fba0a3 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/AnalyzeService.java @@ -14,7 +14,6 @@ import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestBody; import com.iqser.gin4.commons.metrics.meters.FunctionTimerValues; -import com.iqser.red.service.dictionarymerge.commons.DictionaryEntryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; @@ -24,29 +23,15 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlo import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogChanges; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogLegalBasis; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; import com.iqser.red.service.redaction.v1.server.client.LegalBasisClient; import com.iqser.red.service.redaction.v1.server.client.model.NerEntitiesModel; -import com.iqser.red.service.redaction.v1.server.document.data.DocumentData; import com.iqser.red.service.redaction.v1.server.document.data.mapper.DocumentGraphMapper; -import com.iqser.red.service.redaction.v1.server.document.factory.DocumentGraphFactory; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.exception.RedactionException; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.ImageServiceResponseAdapter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.SimplifiedSectionText; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.text.SimplifiedText; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service.PdfSegmentationService; - import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntitiesAdapter; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryIncrement; -import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryVersion; import com.iqser.red.service.redaction.v1.server.settings.RedactionServiceSettings; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; @@ -71,63 +56,15 @@ public class AnalyzeService { EntityRedactionService entityRedactionService; RedactionLogCreatorService redactionLogCreatorService; RedactionStorageService redactionStorageService; - PdfSegmentationService pdfSegmentationService; RedactionChangeLogService redactionChangeLogService; LegalBasisClient legalBasisClient; RedactionServiceSettings redactionServiceSettings; - SectionGridCreatorService sectionGridCreatorService; - ImageServiceResponseAdapter imageServiceResponseAdapter; ImportedRedactionService importedRedactionService; SectionFinderService sectionFinderService; FunctionTimerValues redactmanagerAnalyzePagewiseValues; - @Timed("redactmanager_analyzeDocumentStructure") - public AnalyzeResult analyzeDocumentStructure(StructureAnalyzeRequest analyzeRequest) { - - long startTime = System.currentTimeMillis(); - - ClassificationDocument classifiedDoc; - - try { - var storedObjectStream = redactionStorageService.getStoredObject(RedactionStorageService.StorageIdUtils.getStorageId(analyzeRequest.getDossierId(), - analyzeRequest.getFileId(), - FileType.ORIGIN)); - log.info("Loaded PDF for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); - Map> pdfImages = null; - if (redactionServiceSettings.isEnableImageClassification()) { - pdfImages = imageServiceResponseAdapter.convertImages(analyzeRequest.getDossierId(), analyzeRequest.getFileId()); - log.info("Loaded image service response for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); - } - - classifiedDoc = pdfSegmentationService.parseDocument(analyzeRequest.getDossierId(), analyzeRequest.getFileId(), storedObjectStream, pdfImages); - log.info("Parsed document for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); - } catch (Exception e) { - throw new RedactionException(e); - } - - Document document = DocumentGraphFactory.buildDocumentGraph(classifiedDoc); - log.info("Built Document Graph for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); - - SectionGrid sectionGrid = sectionGridCreatorService.createSectionGrid(document); - log.info("Built section grid for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); - - redactionStorageService.storeObject(analyzeRequest.getDossierId(), analyzeRequest.getFileId(), FileType.TEXT, DocumentData.fromDocument(document)); - redactionStorageService.storeObject(analyzeRequest.getDossierId(), analyzeRequest.getFileId(), FileType.SIMPLIFIED_TEXT, toSimplifiedText(document)); - redactionStorageService.storeObject(analyzeRequest.getDossierId(), analyzeRequest.getFileId(), FileType.SECTION_GRID, sectionGrid); - log.info("Stored document graph, text, simplified text, and section grid for file {} in dossier {}", analyzeRequest.getFileId(), analyzeRequest.getDossierId()); - - return AnalyzeResult.builder() - .dossierId(analyzeRequest.getDossierId()) - .fileId(analyzeRequest.getFileId()) - .duration(System.currentTimeMillis() - startTime) - .numberOfPages(document.getNumberOfPages()) - .analysisVersion(redactionServiceSettings.getAnalysisVersion()) - .build(); - } - - @Timed("redactmanager_analyze") public AnalyzeResult analyze(AnalyzeRequest analyzeRequest) { @@ -367,18 +304,4 @@ public class AnalyzeService { })); } } - - - private SimplifiedText toSimplifiedText(Document document) { - - List simplifiedSectionTexts = document.getMainSections().stream().map(this::toSimplifiedSectionText).toList(); - return SimplifiedText.builder().numberOfPages(document.getNumberOfPages()).sectionTexts(simplifiedSectionTexts).build(); - } - - - private SimplifiedSectionText toSimplifiedSectionText(Section section) { - - return SimplifiedSectionText.builder().sectionNumber(section.getTreeId().get(0)).text(section.getTextBlock().getSearchText()).build(); - } - } diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/SectionGridCreatorService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/SectionGridCreatorService.java deleted file mode 100644 index af9054fb..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/SectionGridCreatorService.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.redaction.service; - -import java.awt.geom.Rectangle2D; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.function.BiConsumer; -import java.util.function.BinaryOperator; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collector; -import java.util.stream.Stream; - -import org.springframework.stereotype.Service; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.CellRectangle; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionRectangle; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.NodeType; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.TableCell; - -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class SectionGridCreatorService { - - public SectionGrid createSectionGrid(Document document) { - - Map> sectionBBox = document.streamAllSubNodesOfType(NodeType.SECTION).map(SemanticNode::getBBox).collect(new SectionGridCollector()); - Map> paragraphBBox = document.streamAllSubNodesOfType(NodeType.PARAGRAPH).map(SemanticNode::getBBox).collect(new SectionGridCollector()); - Map> headlineBBox = document.streamAllSubNodesOfType(NodeType.HEADLINE).map(SemanticNode::getBBox).collect(new SectionGridCollector()); - Map> tableBBox = document.streamAllSubNodesOfType(NodeType.TABLE).map(node -> (Table) node).collect(new TableGridCollector()); - var sectionGrid = new SectionGrid(); - - sectionGrid.setRectanglesPerPage(mergeMapsByConcatenatingLists(// - mergeMapsByConcatenatingLists(paragraphBBox, headlineBBox), // - mergeMapsByConcatenatingLists(sectionBBox, tableBBox))); - return sectionGrid; - } - - - private static abstract class GridCollector implements Collector>, Map>> { - - @Override - public Supplier>> supplier() { - - return HashMap::new; - } - - - @Override - public Function>, Map>> finisher() { - - return Function.identity(); - } - - - @Override - public BinaryOperator>> combiner() { - - return SectionGridCreatorService::mergeMapsByConcatenatingLists; - } - - - @Override - public Set characteristics() { - - return Set.of(Characteristics.IDENTITY_FINISH, Characteristics.CONCURRENT, Characteristics.UNORDERED); - } - - } - - private static class TableGridCollector extends GridCollector { - - @Override - public BiConsumer>, Table> accumulator() { - - return (map, table) -> table.getPages() - .forEach(page -> map.merge(page.getNumber(), List.of(toSectionRectangle(table, page, table.getPages().size())), SectionGridCreatorService::concatLists)); - } - - - private static SectionRectangle toSectionRectangle(Table table, Page page, int numberOfParts) { - - Rectangle2D rect = table.getBBox().get(page); - List tableCellRectangles = table.streamTableCells() - .map(TableCell::getBBox) - .map(map -> map.get(page)) - .filter(Objects::nonNull) - .map(rectangle2D -> new CellRectangle(new Point((float) rectangle2D.getX(), (float) rectangle2D.getY()), - (float) rectangle2D.getWidth(), - (float) rectangle2D.getHeight())) - .toList(); - return new SectionRectangle(new Point((float) rect.getX(), (float) rect.getY()), - (float) rect.getWidth(), - (float) rect.getHeight(), - 1, - numberOfParts, - tableCellRectangles); - } - - } - - private static class SectionGridCollector extends GridCollector> { - - @Override - public BiConsumer>, Map> accumulator() { - - return (mapToKeep, mapToMerge) -> mapToMerge.forEach((page, rectangle) -> mapToKeep.merge(page.getNumber(), - List.of(toSectionRectangle(rectangle, mapToMerge.values().size())), - SectionGridCreatorService::concatLists)); - - } - - - private static SectionRectangle toSectionRectangle(Rectangle2D rect, int numberOfParts) { - - return new SectionRectangle(new Point((float) rect.getX(), (float) rect.getY()), (float) rect.getWidth(), (float) rect.getHeight(), 1, numberOfParts, null); - } - - } - - - private static Map> mergeMapsByConcatenatingLists(Map> mapToKeep, - Map> mapToMerge) { - - mapToMerge.forEach((page, rectangle) -> mapToKeep.merge(page, rectangle, SectionGridCreatorService::concatLists)); - return mapToKeep; - } - - - private static List concatLists(List l1, List l2) { - - return Stream.concat(l1.stream(), l2.stream()).toList(); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/storage/RedactionStorageService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/storage/RedactionStorageService.java index e261ea86..2e9c6c18 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/storage/RedactionStorageService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/storage/RedactionStorageService.java @@ -13,6 +13,10 @@ import com.iqser.red.service.redaction.v1.server.exception.NotFoundException; import com.iqser.red.service.redaction.v1.server.document.data.DocumentData; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPage; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPositionData; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentStructure; +import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentTextData; import com.knecon.fforesight.tenantcommons.TenantContext; import io.micrometer.core.annotation.Timed; @@ -82,7 +86,12 @@ public class RedactionStorageService { public DocumentData getDocumentData(String dossierId, String fileId) { try { - return storageService.readJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.TEXT), DocumentData.class); + return DocumentData.builder() + .documentStructure(storageService.readJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.DOCUMENT_STRUCTURE), DocumentStructure.class)) + .documentTextData(storageService.readJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.DOCUMENT_TEXT), DocumentTextData[].class)) + .documentPositionData(storageService.readJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.DOCUMENT_POSITION), DocumentPositionData[].class)) + .documentPages(storageService.readJSONObject(TenantContext.getTenantId(), StorageIdUtils.getStorageId(dossierId, fileId, FileType.DOCUMENT_PAGES), DocumentPage[].class)) + .build(); } catch (StorageObjectDoesNotExist e) { log.debug("DocumentData not available."); return null; diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/AbstractRedactionIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/AbstractRedactionIntegrationTest.java index 4c34c6a0..912d6ebe 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/AbstractRedactionIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/AbstractRedactionIntegrationTest.java @@ -13,6 +13,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -28,6 +29,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.iqser.red.service.dictionarymerge.commons.DictionaryEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; + import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import com.iqser.red.service.redaction.v1.server.annotate.AnnotationService; @@ -41,6 +43,10 @@ import com.iqser.red.service.redaction.v1.server.redaction.utils.ResourceLoader; import com.iqser.red.service.redaction.v1.server.redaction.utils.TextNormalizationUtilities; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingFinishedEvent; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingRequest; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingPipeline; import com.knecon.fforesight.tenantcommons.TenantContext; import com.knecon.fforesight.tenantcommons.TenantsClient; @@ -112,6 +118,9 @@ public abstract class AbstractRedactionIntegrationTest { @Autowired protected ManualRedactionSurroundingTextService manualRedactionSurroundingTextService; + @Autowired + private LayoutParsingPipeline layoutParsingPipeline; + @MockBean protected AmazonS3 amazonS3; @@ -437,6 +446,32 @@ public abstract class AbstractRedactionIntegrationTest { } + @SneakyThrows + protected LayoutParsingFinishedEvent analyzeDocumentStructure(LayoutParsingType layoutParsingType, AnalyzeRequest request) { + + var originId = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.ORIGIN); + var tableId = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.TABLES); + var imageId = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.IMAGE_INFO); + var sectionGridId = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.SECTION_GRID); + var structureId = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.DOCUMENT_STRUCTURE); + var textId = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.DOCUMENT_TEXT); + var positionID = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.DOCUMENT_POSITION); + var pagesID = RedactionStorageService.StorageIdUtils.getStorageId(request.getDossierId(), request.getFileId(), FileType.DOCUMENT_PAGES); + var layoutParsingRequest = LayoutParsingRequest.builder() + .layoutParsingType(layoutParsingType) + .originFileStorageId(originId) + .tablesFileStorageId(Optional.of(tableId)) + .imagesFileStorageId(Optional.of(imageId)) + .structureFileStorageId(structureId) + .textBlockFileStorageId(textId) + .positionBlockFileStorageId(positionID) + .pageFileStorageId(pagesID) + .sectionGridStorageId(sectionGridId) + .build(); + return layoutParsingPipeline.parseLayoutAndSaveFilesToStorage(layoutParsingRequest); + } + + @SneakyThrows protected AnalyzeRequest prepareStorage(String file, String cvServiceResponseFile) { diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/DocumineFloraTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/DocumineFloraTest.java index 0e5b4516..9a882f88 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/DocumineFloraTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/DocumineFloraTest.java @@ -25,12 +25,13 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequ import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeResult; import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; import com.iqser.red.service.redaction.v1.server.annotate.AnnotateRequest; import com.iqser.red.service.redaction.v1.server.annotate.AnnotateResponse; import com.iqser.red.service.redaction.v1.server.redaction.utils.OsUtils; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingServiceProcessorConfiguration; import com.knecon.fforesight.tenantcommons.TenantContext; @ExtendWith(SpringExtension.class) @@ -51,7 +52,7 @@ public class DocumineFloraTest extends AbstractRedactionIntegrationTest { // "files/Documine/Flora/ProblemDocs/SOLICITA_VICTRATO-GOLD-II_Item 21_Mutacao_Genica (1).TABLES.json"); System.out.println("Start Full integration test"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.DOCUMINE, request); System.out.println("Finished structure analysis"); AnalyzeResult result = analyzeService.analyze(request); System.out.println("Finished analysis"); @@ -77,7 +78,7 @@ public class DocumineFloraTest extends AbstractRedactionIntegrationTest { "files/Documine/Flora/A8591B/2009773e2e05919bb9e46aeedcc8b924.ORIGIN.TABLES.json"); System.out.println("Start Full integration test"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.DOCUMINE, request); System.out.println("Finished structure analysis"); AnalyzeResult result = analyzeService.analyze(request); System.out.println("Finished analysis"); @@ -104,7 +105,7 @@ public class DocumineFloraTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/Documine/Flora/ProblemDocs/SOLICITA_VICTRATO-GOLD-II_Item 15_Toxicidade Oral Aguda.pdf"); System.out.println("Start Full integration test"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.DOCUMINE, request); System.out.println("Finished structure analysis"); AnalyzeResult result = analyzeService.analyze(request); System.out.println("Finished analysis"); @@ -123,6 +124,7 @@ public class DocumineFloraTest extends AbstractRedactionIntegrationTest { @Configuration @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}) + @Import(LayoutParsingServiceProcessorConfiguration.class) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) static class RedactionIntegrationTestConfiguration { diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/HeadlinesGoldStandardIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/HeadlinesGoldStandardIntegrationTest.java deleted file mode 100644 index f8355f87..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/HeadlinesGoldStandardIntegrationTest.java +++ /dev/null @@ -1,217 +0,0 @@ -package com.iqser.red.service.redaction.v1.server; - -import java.io.InputStream; -import java.time.OffsetDateTime; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.ClassPathResource; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.ChangeType; -import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; -import com.iqser.red.service.redaction.v1.server.document.data.mapper.DocumentGraphMapper; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.redaction.service.AnalyzeService; -import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; -import com.iqser.red.storage.commons.StorageAutoConfiguration; -import com.iqser.red.storage.commons.service.StorageService; -import com.knecon.fforesight.tenantcommons.TenantContext; -import com.knecon.fforesight.tenantcommons.TenantsClient; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.SneakyThrows; -import lombok.ToString; - -@ExtendWith(SpringExtension.class) -@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@Import(HeadlinesGoldStandardIntegrationTest.RedactionIntegrationTestConfiguration.class) -public class HeadlinesGoldStandardIntegrationTest { - - @MockBean - private TenantsClient tenantsClient; - - @Autowired - private AnalyzeService analyzeService; - - @Autowired - private ObjectMapper objectMapper; - - @Autowired - private RedactionStorageService redactionStorageService; - - @Autowired - private StorageService storageService; - - private final static String TEST_DOSSIER_TEMPLATE_ID = "123"; - private final static String TEST_DOSSIER_ID = "123"; - private final static String TEST_FILE_ID = "123"; - - - @Test - public void testHeadlineDetection() { - - List metrics = new ArrayList<>(); - metrics.add(getMetrics("files/RSS/01 - CGA100251 - Acute Oral Toxicity (Up and Down Procedure) - Rat (1).pdf", - "files/Headlines/01 - CGA100251 - Acute Oral Toxicity (Up and Down Procedure) - Rat (1)_REDACTION_LOG.json")); - metrics.add(getMetrics("files/Trinexapac/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23.pdf", - "files/Headlines/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23_REDACTION_LOG.json")); - metrics.add(getMetrics("files/Metolachlor/S-Metolachlor_RAR_01_Volume_1_2018-09-06.pdf", "files/Headlines/S-Metolachlor_RAR_01_Volume_1_2018-09-06_REDACTION_LOG.json")); - - double precision = metrics.stream().mapToDouble(Metrics::getPrecision).average().orElse(1.0); - double recall = metrics.stream().mapToDouble(Metrics::getRecall).average().orElse(1.0); - - System.out.println("Precision is: " + precision + " recall is: " + recall); - - Assertions.assertThat(precision).isGreaterThanOrEqualTo(0.44f); - Assertions.assertThat(recall).isGreaterThanOrEqualTo(0.69f); - } - - - @SneakyThrows - private Metrics getMetrics(String fileUrl, String redactionLogUrl) { - - ClassPathResource redactionLogResource = new ClassPathResource(redactionLogUrl); - - Set goldStandardHeadlines = new HashSet<>(); - var goldStandardLog = objectMapper.readValue(redactionLogResource.getInputStream(), RedactionLog.class); - goldStandardLog.getRedactionLogEntry().removeIf(r -> !r.isRedacted() || r.getChanges().get(r.getChanges().size() - 1).getType().equals(ChangeType.REMOVED)); - goldStandardLog.getRedactionLogEntry().forEach(e -> goldStandardHeadlines.add(new Headline(e.getPositions().get(0).getPage(), e.getValue()))); - - AnalyzeRequest request = prepareStorage(fileUrl); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); - - var documentGraph = DocumentGraphMapper.toDocumentGraph(redactionStorageService.getDocumentData(TEST_DOSSIER_ID, TEST_FILE_ID)); - var foundHeadlines = documentGraph.streamAllSubNodes() - .map(SemanticNode::getHeadline) - .distinct() - .map(headlineNode -> new Headline(headlineNode.getPages().stream().findFirst().get().getNumber(), headlineNode.getTextBlock().getSearchText().stripTrailing())) - .toList(); - - Set correct = new HashSet<>(); - Set missing; - Set falsePositive = new HashSet<>(); - for (Headline headline : foundHeadlines) { - if (goldStandardHeadlines.contains(headline)) { - correct.add(headline); - } else { - falsePositive.add(headline); - } - } - - missing = goldStandardHeadlines.stream().filter(h -> !correct.contains(h)).collect(Collectors.toSet()); - - float precision = (float) correct.size() / (float) foundHeadlines.size(); - float recall = (float) correct.size() / ((float) correct.size() + (float) missing.size()); - - return new Metrics(precision, recall); - } - - - @Configuration - @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class/*, StorageAutoConfiguration.class*/}) - @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) - public static class RedactionIntegrationTestConfiguration { - - @Bean - @Primary - public StorageService inmemoryStorage() { - - return new FileSystemBackedStorageService(); - } - - } - - - @AfterEach - public void cleanupStorage() { - - if (this.storageService instanceof FileSystemBackedStorageService) { - ((FileSystemBackedStorageService) this.storageService).clearStorage(); - } - } - - - @SneakyThrows - private AnalyzeRequest prepareStorage(String file) { - - return prepareStorage(file, "files/cv_service_empty_response.json"); - } - - - @SneakyThrows - private AnalyzeRequest prepareStorage(String file, String cvServiceResponseFile) { - - ClassPathResource pdfFileResource = new ClassPathResource(file); - ClassPathResource cvServiceResponseFileResource = new ClassPathResource(cvServiceResponseFile); - - return prepareStorage(pdfFileResource.getInputStream(), cvServiceResponseFileResource.getInputStream()); - } - - - @SneakyThrows - private AnalyzeRequest prepareStorage(InputStream fileStream, InputStream cvServiceResponseFileStream) { - - AnalyzeRequest request = AnalyzeRequest.builder() - .dossierTemplateId(TEST_DOSSIER_TEMPLATE_ID) - .dossierId(TEST_DOSSIER_ID) - .fileId(TEST_FILE_ID) - .lastProcessed(OffsetDateTime.now()) - .build(); - - storageService.storeObject(TenantContext.getTenantId(), - RedactionStorageService.StorageIdUtils.getStorageId(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.TABLES), - cvServiceResponseFileStream); - storageService.storeObject(TenantContext.getTenantId(), RedactionStorageService.StorageIdUtils.getStorageId(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.ORIGIN), fileStream); - - return request; - } - - - @Data - @EqualsAndHashCode - @AllArgsConstructor - @ToString - private class Metrics { - - private float precision; - private float recall; - - } - - @Data - @EqualsAndHashCode - @AllArgsConstructor - @ToString - private class Headline { - - private int page; - private String headline; - - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionAcceptanceTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionAcceptanceTest.java index 8c91f660..fb277871 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionAcceptanceTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionAcceptanceTest.java @@ -1,7 +1,6 @@ package com.iqser.red.service.redaction.v1.server; import static org.mockito.Mockito.when; -import static org.wildfly.common.Assert.assertFalse; import static org.wildfly.common.Assert.assertTrue; import java.io.FileOutputStream; @@ -34,12 +33,13 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSON import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; import com.iqser.red.service.redaction.v1.server.annotate.AnnotateRequest; import com.iqser.red.service.redaction.v1.server.annotate.AnnotateResponse; import com.iqser.red.service.redaction.v1.server.redaction.utils.OsUtils; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingServiceProcessorConfiguration; import com.knecon.fforesight.tenantcommons.TenantContext; @ExtendWith(SpringExtension.class) @@ -51,6 +51,7 @@ public class RedactionAcceptanceTest extends AbstractRedactionIntegrationTest { @Configuration @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}) + @Import(LayoutParsingServiceProcessorConfiguration.class) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) public static class RedactionIntegrationTestConfiguration { @@ -101,7 +102,7 @@ public class RedactionAcceptanceTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/new/SYNGENTA_EFSA_sanitisation_GFL_v1_moreSections.pdf"); System.out.println("Start Full integration test"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); System.out.println("Finished structure analysis"); AnalyzeResult result = analyzeService.analyze(request); System.out.println("Finished analysis"); @@ -158,7 +159,7 @@ public class RedactionAcceptanceTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/new/SYNGENTA_EFSA_sanitisation_GFL_v1_moreSections.pdf"); System.out.println("Start Full integration test"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); System.out.println("Finished structure analysis"); AnalyzeResult result = analyzeService.analyze(request); System.out.println("Finished analysis"); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java index 0276b16c..01ed50b5 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationTest.java @@ -66,7 +66,6 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlo import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Point; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; import com.iqser.red.service.redaction.v1.server.annotate.AnnotateRequest; import com.iqser.red.service.redaction.v1.server.annotate.AnnotateResponse; import com.iqser.red.service.redaction.v1.server.document.data.mapper.DocumentGraphMapper; @@ -81,6 +80,8 @@ import com.iqser.red.service.redaction.v1.server.redaction.utils.OsUtils; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingServiceProcessorConfiguration; import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.SneakyThrows; @@ -94,8 +95,10 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { @Autowired private EntityEnrichmentService entityEnrichmentService; + @Configuration @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}) + @Import({LayoutParsingServiceProcessorConfiguration.class}) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) public static class RedactionIntegrationTestConfiguration { @@ -145,7 +148,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { public void test270Rotated() { AnalyzeRequest request = uploadFileToStorage("files/Minimal Examples/270Rotated.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); assertThat(result).isNotNull(); } @@ -156,7 +159,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { public void testLargeScannedFileOOM() { AnalyzeRequest request = uploadFileToStorage("scanned/VV-377031.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); assertThat(result).isNotNull(); } @@ -168,7 +171,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); AnalyzeRequest request = uploadFileToStorage("files/Minimal Examples/merge_images.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); Map> duplicates = new HashMap<>(); @@ -209,7 +212,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { // Lastname M., Doe J., Mustermann M. AnalyzeRequest request = uploadFileToStorage("files/Minimal Examples/ExpansionTest.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -225,7 +228,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/new/SYNGENTA_EFSA_sanitisation_GFL_v1_moreSections.pdf"); System.out.println("Start Full integration test"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); System.out.println("Finished structure analysis"); AnalyzeResult result = analyzeService.analyze(request); System.out.println("Finished analysis"); @@ -247,7 +250,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/RSS/01 - CGA100251 - Acute Oral Toxicity (Up and Down Procedure) - Rat (1).pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); assertThat(result.getAddedFileAttributes().size()).isEqualTo(1); @@ -264,7 +267,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/new/test-ignore-hint.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -298,8 +301,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); System.out.println("noExceptionShouldBeThrownForAnyFiles"); - ClassLoader loader = getClass().getClassLoader(); - URL url = loader.getResource("files"); + URL url = Thread.currentThread().getContextClassLoader().getResource("files"); Path path = Paths.get(URI.create(url.toString())); when(dictionaryClient.getDictionaryForType(anyString(), anyLong())).thenReturn(new Type()); Files.walk(path)// @@ -308,7 +310,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { .forEach(currentPath -> { AnalyzeRequest request = uploadFileToStorage(currentPath.toString()); System.out.println("Redacting file : " + currentPath.getFileName()); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); long fstart = System.currentTimeMillis(); AnalyzeResult result = analyzeService.analyze(request); @@ -360,7 +362,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { .value("true") .build())); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -414,13 +416,12 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { ManualRedactions manualRedactions = new ManualRedactions(); manualRedactions.setEntriesToAdd(Set.of(ManualRedactionEntry.builder() - .value("Redact") - .addToDictionary(true) - .addToDossierDictionary(true) - .positions(List.of(new Rectangle(new Point(95.96979999999999f, 515.7984f), 19.866899999999987f, 46.953f, 2) - )).type("dossier_redaction").build())); - - + .value("Redact") + .addToDictionary(true) + .addToDossierDictionary(true) + .positions(List.of(new Rectangle(new Point(95.96979999999999f, 515.7984f), 19.866899999999987f, 46.953f, 2))) + .type("dossier_redaction") + .build())); request.setManualRedactions(manualRedactions); @@ -460,7 +461,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage(fileName); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); analyzeService.analyze(request); dictionary.get(DICTIONARY_AUTHOR).add("report"); @@ -516,7 +517,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { .value("true") .build())); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -614,7 +615,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { List types = objectMapper.readValue(typeResource.getInputStream(), typeRefForTypes); AnalyzeRequest request = uploadFileToStorage("files/new/PublishedInformationTest.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); ManualRedactions manualRedactions = new ManualRedactions(); manualRedactions.getIdsToRemove() .add(IdRemoval.builder() @@ -673,7 +674,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); AnalyzeRequest request = uploadFileToStorage("files/Metolachlor/S-Metolachlor_RAR_02_Volume_2_2018-09-06.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -694,7 +695,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { String filePath = "files/new/crafted document.pdf"; AnalyzeRequest request = uploadFileToStorage(filePath); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); String testEntityValue1 = "Desiree"; @@ -766,7 +767,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { String tableServiceResponseFile = "files/cv_table_response_VV-511309.json"; AnalyzeRequest request = prepareStorage(fileName, tableServiceResponseFile); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -790,7 +791,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { String tableServiceResponseFile = "files/cv_table_response_VV-511309.json"; AnalyzeRequest request = prepareStorage(fileName, tableServiceResponseFile); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -811,7 +812,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); AnalyzeRequest request = uploadFileToStorage("files/new/unicodeProblem.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -833,7 +834,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); AnalyzeRequest request = uploadFileToStorage("files/new/RotateTestFile.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -859,7 +860,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); AnalyzeRequest request = uploadFileToStorage("files/new/RotateTestFileSimple.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -881,7 +882,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); AnalyzeRequest request = uploadFileToStorage("files/Minimal Examples/NoHeaderTable.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -934,7 +935,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { request.setManualRedactions(manualRedactions); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -993,7 +994,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage(pdfFile); request.setManualRedactions(manualRedactions); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); manualRedactions.getEntriesToAdd().add(manualRedactionEntry); @@ -1026,7 +1027,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/Minimal Examples/Phantom Cells.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -1046,7 +1047,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage("files/Minimal Examples/sponsor_companies.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -1108,7 +1109,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage(pdfFile); request.setManualRedactions(manualRedactions); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); manualRedactions.getEntriesToAdd().add(manualRedactionEntry); @@ -1163,7 +1164,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { long start = System.currentTimeMillis(); AnalyzeRequest request = uploadFileToStorage("files/Metolachlor/S-Metolachlor_RAR_02_Volume_2_2018-09-06.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); @@ -1219,7 +1220,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage(pdfFile); request.setManualRedactions(manualRedactions); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder() @@ -1252,7 +1253,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { RedactionStorageService.StorageIdUtils.getStorageId(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.IMPORTED_REDACTIONS), importedRedactions.getInputStream()); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -1292,7 +1293,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest { AnalyzeRequest request = uploadFileToStorage(fileName); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); analyzeService.analyze(request); AnnotateResponse annotateResponse = annotationService.annotate(AnnotateRequest.builder().dossierId(TEST_DOSSIER_ID).fileId(TEST_FILE_ID).build()); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationV2Test.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationV2Test.java index 3b656fdf..68f8060a 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationV2Test.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RedactionIntegrationV2Test.java @@ -24,9 +24,10 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSON import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingServiceProcessorConfiguration; import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.SneakyThrows; @@ -40,6 +41,7 @@ public class RedactionIntegrationV2Test extends AbstractRedactionIntegrationTest @Configuration @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}) + @Import(LayoutParsingServiceProcessorConfiguration.class) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) static class RedactionIntegrationTestConfiguration { @@ -112,7 +114,7 @@ public class RedactionIntegrationV2Test extends AbstractRedactionIntegrationTest when(dictionaryClient.getVersion(TEST_DOSSIER_TEMPLATE_ID)).thenReturn(3L); mockDictionaryCalls(0L); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -150,7 +152,7 @@ public class RedactionIntegrationV2Test extends AbstractRedactionIntegrationTest dictionary.put(DICTIONARY_AUTHOR, List.of(entryAuthorDictionary)); falsePositive.put(DICTIONARY_PII, List.of("Dr. Alan Miller COMPLETION DATE:")); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); analyzeService.analyze(request); var redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RulesTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RulesTest.java index 3dd8109d..32cd98b3 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RulesTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/RulesTest.java @@ -24,6 +24,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -72,18 +73,22 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlo import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogComment; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogLegalBasis; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; import com.iqser.red.service.redaction.v1.server.client.DictionaryClient; import com.iqser.red.service.redaction.v1.server.client.LegalBasisClient; import com.iqser.red.service.redaction.v1.server.client.RulesClient; import com.iqser.red.service.redaction.v1.server.controller.RedactionController; -import com.iqser.red.service.redaction.v1.server.redaction.service.ManualRedactionSurroundingTextService; import com.iqser.red.service.redaction.v1.server.redaction.service.AnalyzeService; +import com.iqser.red.service.redaction.v1.server.redaction.service.ManualRedactionSurroundingTextService; import com.iqser.red.service.redaction.v1.server.redaction.utils.ResourceLoader; import com.iqser.red.service.redaction.v1.server.redaction.utils.TextNormalizationUtilities; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingFinishedEvent; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingRequest; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingPipeline; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingServiceProcessorConfiguration; import com.knecon.fforesight.tenantcommons.TenantContext; import com.knecon.fforesight.tenantcommons.TenantsClient; @@ -237,6 +242,8 @@ public class RulesTest { @Autowired private RedactionStorageService redactionStorageService; @Autowired + private LayoutParsingPipeline layoutParsingPipeline; + @Autowired private StorageService storageService; @Autowired private ManualRedactionSurroundingTextService manualRedactionSurroundingTextService; @@ -399,7 +406,7 @@ public class RulesTest { loadNerForTest(); AnalyzeRequest request = prepareStorage(fileName); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeService.analyze(request); RedactionLog redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -422,7 +429,7 @@ public class RulesTest { loadNerForTest(); AnalyzeRequest request = prepareStorage(fileName); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER); analyzeService.analyze(request); RedactionLog redactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); @@ -814,9 +821,35 @@ public class RulesTest { } } + @SneakyThrows + protected LayoutParsingFinishedEvent analyzeDocumentStructure(LayoutParsingType layoutParsingType) { + + var originId = RedactionStorageService.StorageIdUtils.getStorageId(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.ORIGIN); + var tableId = RedactionStorageService.StorageIdUtils.getStorageId(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.TABLES); + var imageId = RedactionStorageService.StorageIdUtils.getStorageId(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.IMAGE_INFO); + var sectionGridId = RedactionStorageService.StorageIdUtils.getStorageId(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.SECTION_GRID); + var structureId = RedactionStorageService.StorageIdUtils.getStorageId(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.DOCUMENT_STRUCTURE); + var textId = RedactionStorageService.StorageIdUtils.getStorageId(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.DOCUMENT_TEXT); + var positionID = RedactionStorageService.StorageIdUtils.getStorageId(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.DOCUMENT_POSITION); + var pagesID = RedactionStorageService.StorageIdUtils.getStorageId(TEST_DOSSIER_ID, TEST_FILE_ID, FileType.DOCUMENT_PAGES); + var layoutParsingRequest = LayoutParsingRequest.builder() + .layoutParsingType(layoutParsingType) + .originFileStorageId(originId) + .tablesFileStorageId(Optional.of(tableId)) + .imagesFileStorageId(Optional.of(imageId)) + .structureFileStorageId(structureId) + .textBlockFileStorageId(textId) + .positionBlockFileStorageId(positionID) + .pageFileStorageId(pagesID) + .sectionGridStorageId(sectionGridId) + .build(); + return layoutParsingPipeline.parseLayoutAndSaveFilesToStorage(layoutParsingRequest); + } + @Configuration @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}) + @Import(LayoutParsingServiceProcessorConfiguration.class) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) public static class RulesTestConfiguration { diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/annotate/AnnotationService.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/annotate/AnnotationService.java index 6b680939..7f3d43d6 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/annotate/AnnotationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/annotate/AnnotationService.java @@ -1,7 +1,5 @@ package com.iqser.red.service.redaction.v1.server.annotate; -import static com.iqser.red.service.redaction.v1.server.document.utils.RectangleTransformations.toPDRectangleBBox; - import java.awt.Color; import java.awt.geom.Rectangle2D; import java.io.ByteArrayOutputStream; @@ -14,17 +12,19 @@ import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.io.MemoryUsageSetting; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.font.PDType1Font; +import org.apache.pdfbox.pdmodel.font.Standard14Fonts; import org.apache.pdfbox.pdmodel.graphics.color.PDColor; import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB; import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationHighlight; import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationText; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationTextMarkup; import org.springframework.stereotype.Service; import com.google.common.primitives.Floats; @@ -36,6 +36,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlo import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.CellRectangle; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionGrid; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.section.SectionRectangle; +import com.iqser.red.service.redaction.v1.server.document.utils.RectangleTransformations; import com.iqser.red.service.redaction.v1.server.exception.RedactionException; import com.iqser.red.service.redaction.v1.server.redaction.service.DictionaryService; import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService; @@ -73,7 +74,7 @@ public class AnnotationService { var redactionLog = redactionStorageService.getRedactionLog(annotateRequest.getDossierId(), annotateRequest.getFileId()); var sectionsGrid = redactionStorageService.getSectionGrid(annotateRequest.getDossierId(), annotateRequest.getFileId()); - try (PDDocument pdDocument = PDDocument.load(storedObjectStream, MemoryUsageSetting.setupTempFileOnly())) { + try (PDDocument pdDocument = Loader.loadPDF(storedObjectStream, MemoryUsageSetting.setupTempFileOnly())) { pdDocument.setAllSecurityToBeRemoved(true); dictionaryService.updateDictionary(annotateRequest.getDossierTemplateId(), annotateRequest.getDossierId()); @@ -123,6 +124,17 @@ public class AnnotationService { } } + public static PDRectangle toPDRectangleBBox(List rectangles) { + + Rectangle2D rectangle2D = RectangleTransformations.rectangleBBox(rectangles); + + PDRectangle annotationPosition = new PDRectangle(); + annotationPosition.setLowerLeftX((float) rectangle2D.getMinX()); + annotationPosition.setLowerLeftY((float) rectangle2D.getMinY()); + annotationPosition.setUpperRightX((float) rectangle2D.getMaxX()); + annotationPosition.setUpperRightY((float) rectangle2D.getMaxY()); + return annotationPosition; + } private List createAnnotation(RedactionLogEntry redactionLogEntry, int page, int rotation, PDRectangle cropBox) { @@ -134,7 +146,7 @@ public class AnnotationService { return annotations; } - PDAnnotationTextMarkup annotation = new PDAnnotationTextMarkup(PDAnnotationTextMarkup.SUB_TYPE_HIGHLIGHT); + PDAnnotationHighlight annotation = new PDAnnotationHighlight(); annotation.constructAppearances(); PDRectangle pdRectangle = toPDRectangleBBox(rectangles); annotation.setRectangle(pdRectangle); @@ -232,7 +244,7 @@ public class AnnotationService { contentStream.beginText(); contentStream.setNonStrokingColor(Color.DARK_GRAY); - contentStream.setFont(PDType1Font.TIMES_ROMAN, 8f); + contentStream.setFont(new PDType1Font(Standard14Fonts.FontName.TIMES_ROMAN), 8f); if (sectionRectangle.getTableCells() == null) { contentStream.newLineAtOffset(sectionRectangle.getTopLeft().getX(), sectionRectangle.getTopLeft().getY() + sectionRectangle.getHeight()); } else { diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/BuildDocumentIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/BuildDocumentIntegrationTest.java index 211038cd..07dea061 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/BuildDocumentIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/BuildDocumentIntegrationTest.java @@ -1,12 +1,6 @@ package com.iqser.red.service.redaction.v1.server.document.graph; -import java.io.InputStream; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; @@ -16,20 +10,18 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Primary; -import org.springframework.core.io.ClassPathResource; import org.springframework.test.context.junit.jupiter.SpringExtension; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AnalyzeRequest; import com.iqser.red.service.redaction.v1.server.AbstractRedactionIntegrationTest; import com.iqser.red.service.redaction.v1.server.Application; import com.iqser.red.service.redaction.v1.server.FileSystemBackedStorageService; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.ImageServiceResponseAdapter; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.ClassificationDocument; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.model.image.ClassifiedImage; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.service.PdfSegmentationService; -import com.iqser.red.service.redaction.v1.server.document.factory.DocumentGraphFactory; +import com.iqser.red.service.redaction.v1.server.document.data.mapper.DocumentGraphMapper; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; +import com.knecon.fforesight.service.layoutparser.processor.LayoutParsingServiceProcessorConfiguration; import lombok.SneakyThrows; @@ -40,6 +32,7 @@ public class BuildDocumentIntegrationTest extends AbstractRedactionIntegrationTe @Configuration @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}) + @Import(LayoutParsingServiceProcessorConfiguration.class) @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) public static class TestConfiguration { @@ -52,13 +45,6 @@ public class BuildDocumentIntegrationTest extends AbstractRedactionIntegrationTe } - @Autowired - private PdfSegmentationService segmentationService; - - @Autowired - private ImageServiceResponseAdapter imageServiceResponseAdapter; - - @SneakyThrows protected Document buildGraph(String filename) { @@ -66,37 +52,29 @@ public class BuildDocumentIntegrationTest extends AbstractRedactionIntegrationTe if (!filename.endsWith(".pdf")) { fileNameWithPdf = filename + ".pdf"; } + AnalyzeRequest request; if (fileNameWithPdf.equals("files/Metolachlor/S-Metolachlor_RAR_01_Volume_1_2018-09-06.pdf")) { - prepareStorage(fileNameWithPdf, "files/cv_service_empty_response.json", fileNameWithPdf.replace(".pdf", ".IMAGE_INFO.json")); + request = prepareStorage(fileNameWithPdf, "files/cv_service_empty_response.json", fileNameWithPdf.replace(".pdf", ".IMAGE_INFO.json")); } else { - uploadFileToStorage(fileNameWithPdf); + request = uploadFileToStorage(fileNameWithPdf); } - ClassPathResource fileResource = new ClassPathResource(filename); - try (InputStream inputStream = fileResource.getInputStream()) { - Map> pdfImages = imageServiceResponseAdapter.convertImages(TEST_DOSSIER_ID, TEST_FILE_ID); - ClassificationDocument classifiedDoc = segmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, inputStream, pdfImages); - return DocumentGraphFactory.buildDocumentGraph(classifiedDoc); - } + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); + return DocumentGraphMapper.toDocumentGraph(redactionStorageService.getDocumentData(request.getDossierId(), request.getFileId())); } @SneakyThrows protected Document buildGraphNoImages(String filename) { + String fileNameWithPdf = filename; if (!filename.endsWith(".pdf")) { - filename = filename + ".pdf"; + fileNameWithPdf = filename + ".pdf"; } - uploadFileToStorage(filename); - - ClassPathResource fileResource = new ClassPathResource(filename); - - try (InputStream inputStream = fileResource.getInputStream()) { - Map> pdfImages = new HashMap<>(); - ClassificationDocument classifiedDoc = segmentationService.parseDocument(TEST_DOSSIER_ID, TEST_FILE_ID, inputStream, pdfImages); - return DocumentGraphFactory.buildDocumentGraph(classifiedDoc); - } + var request = uploadFileToStorage(fileNameWithPdf); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); + return DocumentGraphMapper.toDocumentGraph(redactionStorageService.getDocumentData(request.getDossierId(), request.getFileId())); } } diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentMappingIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentMappingIntegrationTest.java deleted file mode 100644 index eef48563..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentMappingIntegrationTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.iqser.red.service.redaction.v1.server.document.graph; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.wildfly.common.Assert.assertTrue; - -import org.junit.jupiter.api.Test; - -import com.iqser.red.service.redaction.v1.server.document.data.AtomicPositionBlockData; -import com.iqser.red.service.redaction.v1.server.document.data.AtomicTextBlockData; -import com.iqser.red.service.redaction.v1.server.document.data.DocumentData; -import com.iqser.red.service.redaction.v1.server.document.data.DocumentTreeData; -import com.iqser.red.service.redaction.v1.server.document.data.PageData; -import com.iqser.red.service.redaction.v1.server.document.data.mapper.DocumentGraphMapper; -import com.iqser.red.service.redaction.v1.server.document.data.mapper.PropertiesMapper; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.NodeType; -import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; -import com.knecon.fforesight.tenantcommons.TenantContext; - -import lombok.SneakyThrows; - -public class DocumentMappingIntegrationTest extends BuildDocumentIntegrationTest { - - @Test - @SneakyThrows - public void testGraphMapping() { - - String filename = "files/new/crafted document"; - - Document document = buildGraph(filename); - DocumentData documentData = DocumentData.fromDocument(document); - - storageService.storeJSONObject(TenantContext.getTenantId(), filename + "_PAGES" + ".json", documentData.getPages()); - storageService.storeJSONObject(TenantContext.getTenantId(), filename + "_TEXT" + ".json", documentData.getAtomicTextBlocks()); - storageService.storeJSONObject(TenantContext.getTenantId(), filename + "_POSITIONS" + ".json", documentData.getAtomicPositionBlocks()); - storageService.storeJSONObject(TenantContext.getTenantId(), filename + "_STRUCTURE" + ".json", documentData.getDocumentTreeData()); - - PageData[] pageData = storageService.readJSONObject(TenantContext.getTenantId(), filename + "_PAGES" + ".json", PageData[].class); - AtomicTextBlockData[] atomicTextBlockData = storageService.readJSONObject(TenantContext.getTenantId(), filename + "_TEXT" + ".json", AtomicTextBlockData[].class); - AtomicPositionBlockData[] atomicPositionBlockData = storageService.readJSONObject(TenantContext.getTenantId(), - filename + "_POSITIONS" + ".json", - AtomicPositionBlockData[].class); - DocumentTreeData documentTreeData = storageService.readJSONObject(TenantContext.getTenantId(), filename + "_STRUCTURE" + ".json", DocumentTreeData.class); - - DocumentData documentData2 = DocumentData.builder() - .pages(pageData) - .documentTreeData(documentTreeData) - .atomicTextBlocks(atomicTextBlockData) - .atomicPositionBlocks(atomicPositionBlockData) - .build(); - Document newDocument = DocumentGraphMapper.toDocumentGraph(documentData2); - - assertTrue(allTablesHavePositiveNumberOfRowsAndColumns(document)); - assertTrue(allTablesHavePositiveNumberOfRowsAndColumns(documentData)); - assertTrue(allTablesHavePositiveNumberOfRowsAndColumns(documentData2)); - assertTrue(allTablesHavePositiveNumberOfRowsAndColumns(newDocument)); - - assertEquals(document.toString(), newDocument.toString()); - assertEquals(document.getDocumentTree().toString(), newDocument.getDocumentTree().toString()); - } - - - private static boolean allTablesHavePositiveNumberOfRowsAndColumns(Document document) { - - return document.streamAllSubNodes() - .filter(semanticNode -> semanticNode instanceof Table) - .map(semanticNode -> (Table) semanticNode) - .allMatch(tableNode -> tableNode.getNumberOfCols() > 0 && tableNode.getNumberOfRows() > 0); - } - - - private static boolean allTablesHavePositiveNumberOfRowsAndColumns(DocumentData documentData) { - - return documentData.getDocumentTreeData() - .streamAllEntries() - .filter(entryData -> entryData.getType().equals(NodeType.TABLE)) - .map(DocumentTreeData.EntryData::getProperties) - .map(properties -> { - var builder = Table.builder(); - PropertiesMapper.parseTableProperties(properties, builder); - return builder.build(); - }) - .allMatch(tableNode -> tableNode.getNumberOfCols() > 0 && tableNode.getNumberOfRows() > 0); - } - -} diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentPerformanceIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentPerformanceIntegrationTest.java index b15636d6..9b44657b 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentPerformanceIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentPerformanceIntegrationTest.java @@ -11,6 +11,7 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -40,7 +41,7 @@ import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNo import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.document.services.EntityEnrichmentService; -import com.iqser.red.service.redaction.v1.server.document.utils.PdfVisualisationUtility; +import com.iqser.red.service.redaction.v1.server.utils.PdfVisualisationUtility; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; @@ -250,7 +251,7 @@ public class DocumentPerformanceIntegrationTest extends BuildDocumentIntegration var tmpFileName = "/tmp/" + filename.split("/")[2] + "_ENTITY_BBOX.pdf"; var fileResource = new ClassPathResource(filename + ".pdf"); - try (var fileStream = fileResource.getInputStream(); PDDocument pdDocument = PDDocument.load(fileStream)) { + try (var fileStream = fileResource.getInputStream(); PDDocument pdDocument = Loader.loadPDF(fileStream)) { for (Page page : document.getPages()) { List entityPositionsOnPage = page.getEntities() diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentVisualizationIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentVisualizationIntegrationTest.java index f2e4580a..84e870cb 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentVisualizationIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/DocumentVisualizationIntegrationTest.java @@ -2,8 +2,8 @@ package com.iqser.red.service.redaction.v1.server.document.graph; import java.awt.Color; import java.io.File; -import java.io.IOException; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -11,7 +11,7 @@ import org.springframework.core.io.ClassPathResource; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; import com.iqser.red.service.redaction.v1.server.document.graph.textblock.TextBlock; -import com.iqser.red.service.redaction.v1.server.document.utils.PdfVisualisationUtility; +import com.iqser.red.service.redaction.v1.server.utils.PdfVisualisationUtility; import lombok.SneakyThrows; @@ -73,12 +73,13 @@ public class DocumentVisualizationIntegrationTest extends BuildDocumentIntegrati } - private static void visualizeSemanticNodes(String filename, Document document, TextBlock textBlock) throws IOException { + @SneakyThrows + private static void visualizeSemanticNodes(String filename, Document document, TextBlock textBlock) { var tmpFileName = "/tmp/" + filename.split("/")[2] + "_SEMANTIC_NODES_BBOX.pdf"; var fileResource = new ClassPathResource(filename + ".pdf"); - try (var fileStream = fileResource.getInputStream(); PDDocument pdDocument = PDDocument.load(fileStream)) { + try (var fileStream = fileResource.getInputStream(); PDDocument pdDocument = Loader.loadPDF(fileStream)) { PdfVisualisationUtility.drawDocumentGraph(pdDocument, document); PdfVisualisationUtility.drawTextBlock(pdDocument, diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/MigrationPocTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/MigrationPocTest.java index f1beec2b..dac48779 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/MigrationPocTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/document/graph/MigrationPocTest.java @@ -23,12 +23,11 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSON import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.RedactionLogEntry; -import com.iqser.red.service.redaction.v1.model.StructureAnalyzeRequest; -import com.iqser.red.service.redaction.v1.server.redaction.adapter.CustomEntityCreationAdapter; -import com.iqser.red.service.redaction.v1.server.document.data.DocumentData; import com.iqser.red.service.redaction.v1.server.document.data.mapper.DocumentGraphMapper; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.redaction.adapter.CustomEntityCreationAdapter; import com.iqser.red.service.redaction.v1.server.redaction.service.RedactionLogCreatorService; +import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType; import com.knecon.fforesight.tenantcommons.TenantContext; import lombok.SneakyThrows; @@ -78,14 +77,14 @@ public class MigrationPocTest extends BuildDocumentIntegrationTest { public void testMigration() { AnalyzeRequest request = uploadFileToStorage("files/new/crafted document.pdf"); - analyzeService.analyzeDocumentStructure(new StructureAnalyzeRequest(request.getDossierId(), request.getFileId())); + analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request); AnalyzeResult result = analyzeService.analyze(request); var newRedactionLog = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID); var originalRedactionLog = getOriginalRedactionLog(); // IMPORTANT: always use the graph which is mapped from the DocumentData, since rounding errors occur during storage. - Document document = DocumentGraphMapper.toDocumentGraph(DocumentData.fromDocument(buildGraph("files/new/crafted document.pdf"))); + Document document = DocumentGraphMapper.toDocumentGraph(redactionStorageService.getDocumentData(request.getDossierId(), request.getFileId())); redactionLogAdapter.toRedactionEntity(originalRedactionLog, document); var migratedRedactionLogEntries = redactionLogCreatorService.createRedactionLog(document, TEST_DOSSIER_TEMPLATE_ID); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/LiveDataIntegrationTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/LiveDataIntegrationTest.java index 92b965b9..2b29489a 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/LiveDataIntegrationTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/realdata/LiveDataIntegrationTest.java @@ -8,13 +8,13 @@ import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.when; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.amqp.rabbit.core.RabbitTemplate; @@ -47,7 +47,6 @@ import com.iqser.red.service.redaction.v1.server.client.DictionaryClient; import com.iqser.red.service.redaction.v1.server.client.FileStatusProcessingUpdateClient; import com.iqser.red.service.redaction.v1.server.client.LegalBasisClient; import com.iqser.red.service.redaction.v1.server.client.RulesClient; -import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.adapter.TableServiceResponseAdapter; import com.iqser.red.service.redaction.v1.server.queue.RedactionMessageReceiver; import com.iqser.red.service.redaction.v1.server.redaction.service.DictionaryService; import com.iqser.red.service.redaction.v1.server.settings.RedactionServiceSettings; @@ -85,9 +84,6 @@ public class LiveDataIntegrationTest { @MockBean private LegalBasisClient legalBasisClient; - @MockBean - private TableServiceResponseAdapter tableServiceResponseAdapter; - @Autowired private ResourcePatternResolver resourcePatternResolver; @@ -133,7 +129,7 @@ public class LiveDataIntegrationTest { @BeforeEach public void prepareTest() { - when(tableServiceResponseAdapter.convertTables(anyString(), anyString())).thenReturn(new HashMap<>()); + //when(tableServiceResponseAdapter.convertTables(anyString(), anyString())).thenReturn(new HashMap<>()); TenantContext.setTenantId("redaction"); when(dictionaryClient.getVersion(anyString())).thenReturn(1L); @@ -206,6 +202,7 @@ public class LiveDataIntegrationTest { @Test + @Disabled public void testUpdateDictionary() { dictionaryService.updateDictionary("dossierTemplateId", "dossierId"); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapterTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapterTest.java index b2026b25..12f2d2c2 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapterTest.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/redaction/adapter/NerEntitiesAdapterTest.java @@ -12,6 +12,7 @@ import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -28,7 +29,7 @@ import com.iqser.red.service.redaction.v1.server.document.graph.entity.Redaction import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.document.services.EntityEnrichmentService; -import com.iqser.red.service.redaction.v1.server.document.utils.PdfVisualisationUtility; +import com.iqser.red.service.redaction.v1.server.utils.PdfVisualisationUtility; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -68,7 +69,7 @@ class NerEntitiesAdapterTest extends BuildDocumentIntegrationTest { assertTrue(entityRecognitionEntities.stream().allMatch(entity -> entity.boundary().start() < entity.boundary().end())); ClassPathResource resource = new ClassPathResource(filePath); - try (PDDocument pdDocument = PDDocument.load(resource.getInputStream())) { + try (PDDocument pdDocument = Loader.loadPDF(resource.getInputStream())) { Stream unchangedAddressParts = NerEntitiesAdapter.toNerEntities(parseNerEntities(nerEntitiesFilePath), document) .getNerEntityList() @@ -117,7 +118,7 @@ class NerEntitiesAdapterTest extends BuildDocumentIntegrationTest { assertTrue(cbiAddressEntities.stream().allMatch(entity -> entity.getBoundary().start() < entity.getBoundary().end())); ClassPathResource resource = new ClassPathResource(filePath); - try (PDDocument pdDocument = PDDocument.load(resource.getInputStream())) { + try (PDDocument pdDocument = Loader.loadPDF(resource.getInputStream())) { List validatedEntities = NerEntitiesAdapter.toNerEntities(parseNerEntities(nerEntitiesFilePath), document) .getNerEntityList() diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/PdfVisualisationUtility.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/utils/PdfVisualisationUtility.java similarity index 96% rename from redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/PdfVisualisationUtility.java rename to redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/utils/PdfVisualisationUtility.java index da2e3595..45f4686f 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/document/utils/PdfVisualisationUtility.java +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/utils/PdfVisualisationUtility.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.redaction.v1.server.document.utils; +package com.iqser.red.service.redaction.v1.server.utils; import java.awt.Color; import java.awt.geom.Point2D; @@ -11,6 +11,7 @@ import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDType1Font; +import org.apache.pdfbox.pdmodel.font.Standard14Fonts; import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Page; import com.iqser.red.service.redaction.v1.server.document.graph.DocumentTree; @@ -70,7 +71,7 @@ public class PdfVisualisationUtility { contentStream.beginText(); contentStream.newLineAtOffset((float) location.getX(), (float) location.getY()); - contentStream.setFont(PDType1Font.HELVETICA_OBLIQUE, 10); + contentStream.setFont(new PDType1Font(Standard14Fonts.FontName.HELVETICA_OBLIQUE), 10); contentStream.showText(string); contentStream.endText(); contentStream.close(); diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl index 74dcf67d..940df8b6 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/acceptance_rules.drl @@ -1,8 +1,8 @@ package drools import static java.lang.String.format; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.anyMatch; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.exactMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.anyMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.exactMatch; import java.util.List; import java.util.LinkedList; @@ -12,21 +12,21 @@ import java.util.Collection; import java.util.stream.Stream; import java.util.Optional; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.graph.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.*; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.*; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; @@ -34,16 +34,17 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; import com.iqser.red.service.redaction.v1.server.client.model.EntityRecognitionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRule import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; global Document document diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_rules.drl index 4e93f9da..5976c581 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/all_rules.drl @@ -1,8 +1,8 @@ package drools import static java.lang.String.format; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.anyMatch; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.exactMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.anyMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.exactMatch; import java.util.List; import java.util.LinkedList; @@ -12,21 +12,21 @@ import java.util.Collection; import java.util.stream.Stream; import java.util.Optional; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.graph.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.*; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.*; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; @@ -34,13 +34,13 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; import com.iqser.red.service.redaction.v1.server.client.model.EntityRecognitionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRule import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora.drl index 90859c3b..f6e82a60 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/documine_flora.drl @@ -1,8 +1,8 @@ package drools import static java.lang.String.format; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.anyMatch; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.exactMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.anyMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.exactMatch; import java.util.List; import java.util.LinkedList; @@ -12,20 +12,21 @@ import java.util.Collection; import java.util.stream.Stream; import java.util.Optional; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SectionIdentifier; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Headline; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.graph.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.*; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.*; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; @@ -33,18 +34,18 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; import com.iqser.red.service.redaction.v1.server.client.model.EntityRecognitionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntitiesAdapter; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRule import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; global Document document global EntityCreationService entityCreationService diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/manual_redaction_rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/manual_redaction_rules.drl index e2b6c72b..51b5b098 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/manual_redaction_rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/manual_redaction_rules.drl @@ -1,25 +1,32 @@ package drools import static java.lang.String.format; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.anyMatch; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.exactMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.anyMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.exactMatch; import java.util.List; import java.util.LinkedList; -import java.util.Set +import java.util.Set; import java.util.stream.Collectors; import java.util.Collection; import java.util.stream.Stream; +import java.util.Optional; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.graph.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.*; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.*; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; @@ -27,17 +34,18 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; import com.iqser.red.service.redaction.v1.server.client.model.EntityRecognitionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntitiesAdapter; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRule -import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; global Document document global EntityCreationService entityCreationService diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl index 7d792328..5f5e5da0 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules.drl @@ -1,8 +1,8 @@ package drools import static java.lang.String.format; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.anyMatch; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.exactMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.anyMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.exactMatch; import java.util.List; import java.util.LinkedList; @@ -12,21 +12,21 @@ import java.util.Collection; import java.util.stream.Stream; import java.util.Optional; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.graph.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.*; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.*; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; @@ -34,13 +34,13 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; import com.iqser.red.service.redaction.v1.server.client.model.EntityRecognitionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRule import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules_v2.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules_v2.drl index b5efa933..62f1085b 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules_v2.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/drools/rules_v2.drl @@ -1,23 +1,32 @@ package drools import static java.lang.String.format; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.anyMatch; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.exactMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.anyMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.exactMatch; import java.util.List; import java.util.LinkedList; -import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.Collection; +import java.util.stream.Stream; +import java.util.Optional; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.graph.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.*; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.*; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; -import java.util.Set import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; @@ -25,27 +34,23 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; import com.iqser.red.service.redaction.v1.server.client.model.EntityRecognitionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntitiesAdapter; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; -import java.util.stream.Collectors; -import java.util.Collection; -import java.util.stream.Stream; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType import com.iqser.red.service.redaction.v1.server.document.graph.entity.MatchedRule import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType -import com.iqser.red.service.redaction.v1.server.document.graph.Boundary +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; global Document document global EntityCreationService entityCreationService global ManualRedactionApplicationService manualRedactionApplicationService global Dictionary dictionary - // --------------------------------------- queries ------------------------------------------------------------------- query "getFileAttributes" diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/01 - CGA100251 - Acute Oral Toxicity (Up and Down Procedure) - Rat (1)_REDACTION_LOG.json b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/01 - CGA100251 - Acute Oral Toxicity (Up and Down Procedure) - Rat (1)_REDACTION_LOG.json deleted file mode 100644 index 7f82f26e..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/01 - CGA100251 - Acute Oral Toxicity (Up and Down Procedure) - Rat (1)_REDACTION_LOG.json +++ /dev/null @@ -1,4831 +0,0 @@ -{ - "analysisVersion": 1, - "analysisNumber": 1, - "redactionLogEntry": [ - { - "id": "b41f9cb564c758dcd82fa6cb6436bed8", - "type": "logo", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 356, - "y": 727 - }, - "width": 184, - "height": 43, - "page": 1 - } - ], - "sectionNumber": 3, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588212862Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6bacd8c9c26bac79261221521fc45331", - "type": "headline", - "value": "STATEMENT OF DATA CONFIDENTIALITY CLAIMS", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "STATEMENT OF DATA CONFIDENTIALITY CLAIMS", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 139.44, - "y": 764.80005 - }, - "width": 350.93954, - "height": -12.959999, - "page": 2 - } - ], - "sectionNumber": 4, - "textBefore": null, - "textAfter": " This page", - "comments": null, - "startOffset": 0, - "endOffset": 40, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588215772Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "de79ff6137b5bfc901bb23dde1bbcdd9", - "type": "headline", - "value": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 107, - "y": 764.3295 - }, - "width": 413, - "height": -15.329552, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": " Covance CRS", - "comments": null, - "startOffset": 0, - "endOffset": 45, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588216152Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e1531539aa49cd25140690f462b1a852", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 475, - "y": 30 - }, - "width": 60, - "height": 11, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588216522Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "12471d29b12c9a00c46c64a073169b63", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 81, - "y": 269 - }, - "width": 254, - "height": 29, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588216742Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4229496a76bef98d1413d1b9d97001e1", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 88, - "y": 488 - }, - "width": 424, - "height": 54, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588217022Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e9b83535fccc4e59b8ae86a2934b7b52", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 179, - "y": 285 - }, - "width": 33, - "height": 17, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588217252Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "301a85104e17aea75116d602b302e876", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": -2, - "y": 0 - }, - "width": 599, - "height": 842, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588217462Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "66c776f42b7a7cbe9035bffcdd4ca5d6", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 232, - "y": 210 - }, - "width": 220, - "height": 41, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588217682Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a96676325bb74f6aab97a79c1963ce3f", - "type": "signature", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 87, - "y": 327 - }, - "width": 447, - "height": 146, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588217892Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e76b0888f8b4390571662e452c85152b", - "type": "logo", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 90, - "y": 669 - }, - "width": 72, - "height": 26, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588218112Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "30a1a147beb3830efaebd2857ee5b346", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 359, - "y": 281 - }, - "width": 23, - "height": 9, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588218442Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0911e80fd3aadafcd7480e86c4b69d1f", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 89, - "y": 559 - }, - "width": 433, - "height": 80, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588218672Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ea73c2f11bbc89e7217bac27f3e9ee3b", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 90, - "y": 713 - }, - "width": 449, - "height": 50, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588218962Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f15a5bcac8f5dd6af4d63e0cd11450d7", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 195, - "y": 654 - }, - "width": 325, - "height": 39, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588219182Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "225c6156e8b975b5a6d7123065d6efed", - "type": "logo", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 87, - "y": 240 - }, - "width": 109, - "height": 13, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588219412Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "58d1e587411e3190165d4c0f007ddbdc", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "GOOD LABORATORY PRACTICE COMPLIANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 85, - "y": 36 - }, - "width": 125, - "height": 11, - "page": 3 - } - ], - "sectionNumber": 5, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588219622Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a92657500d845e6f4d1ad11584654c1a", - "type": "headline", - "value": "FLAGGING STATEMENT", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "FLAGGING STATEMENT", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 231.12003, - "y": 764.80005 - }, - "width": 167.67566, - "height": -12.959999, - "page": 4 - } - ], - "sectionNumber": 6, - "textBefore": null, - "textAfter": " This page", - "comments": null, - "startOffset": 0, - "endOffset": 18, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588219832Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "60ea0a98c2c648982c56bc22a52d3c04", - "type": "headline", - "value": "QUALITY ASSURANCE STATEMENT", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "QUALITY ASSURANCE STATEMENT", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 192, - "y": 764.80005 - }, - "width": 245.67554, - "height": -12.959999, - "page": 5 - } - ], - "sectionNumber": 7, - "textBefore": null, - "textAfter": " Covance Study", - "comments": null, - "startOffset": 0, - "endOffset": 27, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588220042Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a79928778379fe4a4fd9aa24da8a3297", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "QUALITY ASSURANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 84, - "y": 745 - }, - "width": 442, - "height": 27, - "page": 6 - } - ], - "sectionNumber": 7, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588220252Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3754b10373f78fe6b59f8665e77f0e2e", - "type": "signature", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "QUALITY ASSURANCE STATEMENT", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 84, - "y": 651 - }, - "width": 161, - "height": 51, - "page": 6 - } - ], - "sectionNumber": 7, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588220552Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fe57ae475a1ac0355eb66a4b65794c69", - "type": "signature", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "QUALITY ASSURANCE STATEMENT", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 356, - "y": 691 - }, - "width": 167, - "height": 24, - "page": 6 - } - ], - "sectionNumber": 7, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588220772Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0d11640e9705da841a7b898b8f71c088", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "QUALITY ASSURANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 84, - "y": 40 - }, - "width": 125, - "height": 12, - "page": 6 - } - ], - "sectionNumber": 7, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588220982Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "32f6a05ab0ae5597bd45df1b5b694456", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "QUALITY ASSURANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": -2, - "y": 0 - }, - "width": 599, - "height": 842, - "page": 6 - } - ], - "sectionNumber": 7, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588221202Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f92d1a93688ff712a34f6e260d8e720d", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "QUALITY ASSURANCE STATEMENT", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 474, - "y": 37 - }, - "width": 59, - "height": 11, - "page": 6 - } - ], - "sectionNumber": 7, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588221412Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "170a06cee938d216502769dc65192b07", - "type": "headline", - "value": "GENERAL INFORMATION", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "GENERAL INFORMATION", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 226.32, - "y": 764.80005 - }, - "width": 177.06888, - "height": -12.959999, - "page": 7 - } - ], - "sectionNumber": 8, - "textBefore": null, - "textAfter": " Contributors The", - "comments": null, - "startOffset": 0, - "endOffset": 19, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588221632Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "630e327a3a1c27ecd6c8fdc2cefcf965", - "type": "headline", - "value": "TABLE OF CONTENTS", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "TABLE OF CONTENTS", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 239.28003, - "y": 764.80005 - }, - "width": 151.00159, - "height": -12.959999, - "page": 9 - } - ], - "sectionNumber": 9, - "textBefore": null, - "textAfter": " STATEMENT OF", - "comments": null, - "startOffset": 0, - "endOffset": 17, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588221842Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "33f83ddf95eaf11320f4b8520de08f82", - "type": "headline", - "value": "TABLE OF CONTENTS", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "TABLE OF CONTENTS", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 638.56006 - }, - "width": 129.07193, - "height": -12, - "page": 9 - } - ], - "sectionNumber": 9, - "textBefore": "GENERAL INFORMATION 7 ", - "textAfter": " 9 1.0", - "comments": null, - "startOffset": 182, - "endOffset": 199, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588222062Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:39:50.258167Z", - "requestedDate": "2022-10-10T11:39:50.243395Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b4f651ea14f5f8991cd85748027fae64", - "type": "headline", - "value": "3.6 Post Mortem", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "3.6 Post Mortem", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 268.24023 - }, - "width": 15.119995, - "height": -12, - "page": 9 - }, - { - "topLeft": { - "x": 176.16, - "y": 268.24023 - }, - "width": 62.197998, - "height": -12, - "page": 9 - } - ], - "sectionNumber": 10, - "textBefore": null, - "textAfter": " Investigations......................................................................17 3.6.1", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588222282Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:40:04.910167Z", - "requestedDate": "2022-10-10T11:40:04.896231Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "68f21034845f37ff48f422ecc315dce9", - "type": "headline", - "value": "1.2 Results", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2 Results", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75998, - "y": 357.27997 - }, - "width": 16.320007, - "height": -12.480011, - "page": 11 - }, - { - "topLeft": { - "x": 135.11998, - "y": 357.27997 - }, - "width": 40.318558, - "height": -12.480011, - "page": 11 - } - ], - "sectionNumber": 24, - "textBefore": null, - "textAfter": " One female", - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588222512Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3a0b510c4c2144ac6a3e5c9291c215ff", - "type": "headline", - "value": "1.0 EXECUTIVE SUMMARY", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.0 EXECUTIVE SUMMARY", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 764.80005 - }, - "width": 17.519997, - "height": -12.959999, - "page": 11 - }, - { - "topLeft": { - "x": 135.12001, - "y": 764.80005 - }, - "width": 161.46382, - "height": -12.959999, - "page": 11 - } - ], - "sectionNumber": 11, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 21, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588222802Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "dbc0bc0749a348954ed1516fdd677066", - "type": "headline", - "value": "1.1 Study Design", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1 Study Design", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 736.96 - }, - "width": 16.320007, - "height": -12.479996, - "page": 11 - }, - { - "topLeft": { - "x": 135.12001, - "y": 736.96 - }, - "width": 73.20433, - "height": -12.479996, - "page": 11 - } - ], - "sectionNumber": 23, - "textBefore": null, - "textAfter": " The study", - "comments": null, - "startOffset": 0, - "endOffset": 16, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588223112Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "530cbe7174d462525c1eda04a3761cc2", - "type": "headline", - "value": "1.3 Conclusion", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3 Conclusion", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75999, - "y": 641.2001 - }, - "width": 16.320007, - "height": -12.479996, - "page": 12 - }, - { - "topLeft": { - "x": 135.12, - "y": 641.2001 - }, - "width": 62.16086, - "height": -12.479996, - "page": 12 - } - ], - "sectionNumber": 25, - "textBefore": null, - "textAfter": " The acute", - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588223332Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3db193391bafd61be054a85d1391bf7e", - "type": "headline", - "value": "2.2 Test System", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2 Test System", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75998, - "y": 599.9201 - }, - "width": 16.320007, - "height": -12.480011, - "page": 13 - }, - { - "topLeft": { - "x": 135.11998, - "y": 599.9201 - }, - "width": 66.94849, - "height": -12.480011, - "page": 13 - } - ], - "sectionNumber": 28, - "textBefore": null, - "textAfter": " The rat", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588223552Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3d7397cae3d1bafa3881e1d367f962f3", - "type": "headline", - "value": "2.1 Purpose", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.1 Purpose", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 740.08 - }, - "width": 16.320007, - "height": -12.479996, - "page": 13 - }, - { - "topLeft": { - "x": 135.12001, - "y": 740.08 - }, - "width": 45.35399, - "height": -12.479996, - "page": 13 - } - ], - "sectionNumber": 27, - "textBefore": null, - "textAfter": " The purpose", - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588223782Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "32f2057ed69a4c083e0907dac58c2ddb", - "type": "headline", - "value": "2.3 Route of Administration", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3 Route of Administration", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 514.72015 - }, - "width": 16.320007, - "height": -12.480011, - "page": 13 - }, - { - "topLeft": { - "x": 135.12001, - "y": 514.72015 - }, - "width": 135.59624, - "height": -12.480011, - "page": 13 - } - ], - "sectionNumber": 29, - "textBefore": null, - "textAfter": " The rats", - "comments": null, - "startOffset": 0, - "endOffset": 27, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588224002Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f017b0b68061767b4b44e6f1afde074b", - "type": "headline", - "value": "2.0 INTRODUCTION", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.0 INTRODUCTION", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 767.68005 - }, - "width": 17.519997, - "height": -12.959999, - "page": 13 - }, - { - "topLeft": { - "x": 135.12001, - "y": 767.68005 - }, - "width": 111.788956, - "height": -12.959999, - "page": 13 - } - ], - "sectionNumber": 26, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 16, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588224302Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5f0873b8101e449d4b24a233175c3e82", - "type": "headline", - "value": "3.2 Vehicle", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.2 Vehicle", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75998, - "y": 364.23993 - }, - "width": 16.320007, - "height": -12.480011, - "page": 14 - }, - { - "topLeft": { - "x": 135.11998, - "y": 364.23993 - }, - "width": 40.80336, - "height": -12.480011, - "page": 14 - } - ], - "sectionNumber": 32, - "textBefore": null, - "textAfter": " The vehicle", - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588224522Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "290b33d5b801f87db64af0660055197f", - "type": "headline", - "value": "3.1 Test Item", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1 Test Item", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.760025, - "y": 740.08 - }, - "width": 16.320007, - "height": -12.479996, - "page": 14 - }, - { - "topLeft": { - "x": 135.12003, - "y": 740.08 - }, - "width": 53.27304, - "height": -12.479996, - "page": 14 - } - ], - "sectionNumber": 31, - "textBefore": null, - "textAfter": " Information supplied", - "comments": null, - "startOffset": 0, - "endOffset": 13, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588224752Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0533288005e6abb2949d53794d9e8ea6", - "type": "headline", - "value": "3.3 Formulation", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.3 Formulation", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75999, - "y": 306.87994 - }, - "width": 16.320007, - "height": -12.47998, - "page": 14 - }, - { - "topLeft": { - "x": 135.12, - "y": 306.87994 - }, - "width": 70.08145, - "height": -12.47998, - "page": 14 - } - ], - "sectionNumber": 33, - "textBefore": null, - "textAfter": " The test", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588224972Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3173f503abcec6ffad03779c42d0cc69", - "type": "headline", - "value": "3.0 MATERIALS AND METHODS", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.0 MATERIALS AND METHODS", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 767.68005 - }, - "width": 17.519997, - "height": -12.959999, - "page": 14 - }, - { - "topLeft": { - "x": 135.12001, - "y": 767.68005 - }, - "width": 193.73906, - "height": -12.959999, - "page": 14 - } - ], - "sectionNumber": 30, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588225202Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "14996c5dcc5b8d4734298e087b6b2d20", - "type": "headline", - "value": "3.4 Experimental Design", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.4 Experimental Design", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 710.08 - }, - "width": 16.320007, - "height": -12.479996, - "page": 15 - }, - { - "topLeft": { - "x": 135.12001, - "y": 710.08 - }, - "width": 116.64143, - "height": -12.479996, - "page": 15 - } - ], - "sectionNumber": 34, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588225412Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3e0900b0d71aba1617fbafeae5ca5492", - "type": "headline", - "value": "3.4.1 Animals information", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.4.1 Animals information", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76002, - "y": 683.44006 - }, - "width": 152.12204, - "height": -12, - "page": 15 - } - ], - "sectionNumber": 35, - "textBefore": null, - "textAfter": " Healthy nulliparous", - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588225622Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6870ade35ed5129a98d1f4a4d776e7f3", - "type": "headline", - "value": "3.4.2 Animal care and husbandry", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.4.2 Animal care and husbandry", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 461.68018 - }, - "width": 188.874, - "height": -12, - "page": 15 - } - ], - "sectionNumber": 36, - "textBefore": null, - "textAfter": " Animals were", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588225832Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "02c472e422fdd8839ad3f2086b07f819", - "type": "headline", - "value": "3.5 Serial Observations", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.5 Serial Observations", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.760124, - "y": 267.28015 - }, - "width": 16.320007, - "height": -12.47998, - "page": 16 - }, - { - "topLeft": { - "x": 135.12012, - "y": 267.28015 - }, - "width": 109.19232, - "height": -12.47998, - "page": 16 - } - ], - "sectionNumber": 38, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588226052Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "20228b458298dc509ebfd71894ecf3f5", - "type": "headline", - "value": "3.4.3 Dose administration", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.4.3 Dose administration", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76007, - "y": 420.8802 - }, - "width": 148.99199, - "height": -12, - "page": 16 - } - ], - "sectionNumber": 37, - "textBefore": null, - "textAfter": " The appropriate", - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588226342Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "844844d3d3bc2b748b4fc74f29dfe901", - "type": "headline", - "value": "3.5.1 Mortality", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.5.1 Mortality", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76012, - "y": 240.64014 - }, - "width": 94.56798, - "height": -12, - "page": 16 - } - ], - "sectionNumber": 39, - "textBefore": null, - "textAfter": " Cages of", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588226572Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "537acdd95eaaefaec2d68105130dc2ea", - "type": "headline", - "value": "3.8 Quality Assurance Procedures", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.8 Quality Assurance Procedures", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76, - "y": 307.12 - }, - "width": 16.320007, - "height": -12.47998, - "page": 17 - }, - { - "topLeft": { - "x": 135.12, - "y": 307.12 - }, - "width": 168.71005, - "height": -12.47998, - "page": 17 - } - ], - "sectionNumber": 48, - "textBefore": null, - "textAfter": " Details of", - "comments": null, - "startOffset": 0, - "endOffset": 32, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588226792Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4202563183bd96b05bd59cc4c8fb3b9d", - "type": "headline", - "value": "3.5.2 Clinical observations", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.5.2 Clinical observations", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 765.76 - }, - "width": 152.988, - "height": -12, - "page": 17 - } - ], - "sectionNumber": 40, - "textBefore": null, - "textAfter": " Animals were", - "comments": null, - "startOffset": 0, - "endOffset": 27, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588227012Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "63ffd0eb3b020cfbd398d267f18c0ad3", - "type": "headline", - "value": "3.7 Computer Systems", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.7 Computer Systems", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75998, - "y": 414.39996 - }, - "width": 16.320007, - "height": -12.480011, - "page": 17 - }, - { - "topLeft": { - "x": 135.11998, - "y": 414.39996 - }, - "width": 104.86275, - "height": -12.480011, - "page": 17 - } - ], - "sectionNumber": 47, - "textBefore": null, - "textAfter": " The computer", - "comments": null, - "startOffset": 0, - "endOffset": 20, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588227582Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a220a7ed3d694580fc5856bb58a52ae3", - "type": "headline", - "value": "3.6.1 Macroscopic pathology", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.6.1 Macroscopic pathology", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75998, - "y": 498.87997 - }, - "width": 164.15994, - "height": -12, - "page": 17 - } - ], - "sectionNumber": 43, - "textBefore": null, - "textAfter": " All animals", - "comments": null, - "startOffset": 0, - "endOffset": 27, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588227792Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "29c33460d5fa7a8d04055fd1896e6f08", - "type": "headline", - "value": "3.5.3 Body weight", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.5.3 Body weight", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.75998, - "y": 626.5601 - }, - "width": 109.12001, - "height": -12, - "page": 17 - } - ], - "sectionNumber": 41, - "textBefore": null, - "textAfter": " The weight", - "comments": null, - "startOffset": 0, - "endOffset": 17, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588228012Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bf45f01a69c3a583c07f6001575f7234", - "type": "headline", - "value": "4.3 Body Weight", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "4.3 Body Weight", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76002, - "y": 390.39996 - }, - "width": 16.320007, - "height": -12.480011, - "page": 18 - }, - { - "topLeft": { - "x": 135.12003, - "y": 390.39996 - }, - "width": 72.23863, - "height": -12.480011, - "page": 18 - } - ], - "sectionNumber": 52, - "textBefore": null, - "textAfter": " Appendix 2,", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588228222Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7cc8a3ac3ae7386f74898ed47126fc1c", - "type": "headline", - "value": "4.1 Mortality", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "4.1 Mortality", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 740.08 - }, - "width": 16.320007, - "height": -12.479996, - "page": 18 - }, - { - "topLeft": { - "x": 135.12001, - "y": 740.08 - }, - "width": 53.281555, - "height": -12.479996, - "page": 18 - } - ], - "sectionNumber": 50, - "textBefore": null, - "textAfter": " Table 1", - "comments": null, - "startOffset": 0, - "endOffset": 13, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588228442Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3239729d4947ef8750fa21b7ee59193d", - "type": "headline", - "value": "4.4 Macroscopic Examination", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "4.4 Macroscopic Examination", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76003, - "y": 291.51996 - }, - "width": 16.320007, - "height": -12.47998, - "page": 18 - }, - { - "topLeft": { - "x": 135.12003, - "y": 291.51996 - }, - "width": 145.44818, - "height": -12.47998, - "page": 18 - } - ], - "sectionNumber": 53, - "textBefore": null, - "textAfter": " Appendix 4", - "comments": null, - "startOffset": 0, - "endOffset": 27, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588228672Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "959a69a9befa0b6c0fa47c19e632f6a7", - "type": "headline", - "value": "4.0 RESULTS", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "4.0 RESULTS", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 767.68005 - }, - "width": 17.519997, - "height": -12.959999, - "page": 18 - }, - { - "topLeft": { - "x": 135.12001, - "y": 767.68005 - }, - "width": 63.649445, - "height": -12.959999, - "page": 18 - } - ], - "sectionNumber": 49, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588228892Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4d009a492e65ae6070df83a714ffbf8b", - "type": "headline", - "value": "4.2 Clinical Signs", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "4.2 Clinical Signs", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76004, - "y": 572.32007 - }, - "width": 16.320007, - "height": -12.480011, - "page": 18 - }, - { - "topLeft": { - "x": 135.12004, - "y": 572.32007 - }, - "width": 76.075455, - "height": -12.480011, - "page": 18 - } - ], - "sectionNumber": 51, - "textBefore": null, - "textAfter": " Appendix 1", - "comments": null, - "startOffset": 0, - "endOffset": 18, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588229172Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0a7abab489ed001e564599df339b9d4a", - "type": "headline", - "value": "5.0 CONCLUSION", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "5.0 CONCLUSION", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 764.80005 - }, - "width": 17.519997, - "height": -12.959999, - "page": 19 - }, - { - "topLeft": { - "x": 135.12001, - "y": 764.80005 - }, - "width": 94.511765, - "height": -12.959999, - "page": 19 - } - ], - "sectionNumber": 54, - "textBefore": null, - "textAfter": " The acute", - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588229402Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8968e500a8b3664d3ab87ef445bd9cf6", - "type": "headline", - "value": "6.0 REFERENCES", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "6.0 REFERENCES", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 764.80005 - }, - "width": 17.519997, - "height": -12.959999, - "page": 20 - }, - { - "topLeft": { - "x": 135.12001, - "y": 764.80005 - }, - "width": 94.12416, - "height": -12.959999, - "page": 20 - } - ], - "sectionNumber": 55, - "textBefore": null, - "textAfter": " OECD Guideline", - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588229622Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ef8d4bd4b2e8c8478482350bd25cb3d7", - "type": "headline", - "value": "TABLES SECTION", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "TABLES SECTION", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 253.92001, - "y": 764.80005 - }, - "width": 121.63989, - "height": -12.959999, - "page": 21 - } - ], - "sectionNumber": 56, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588229852Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "37cee5f3ba927d0b126c957b25549179", - "type": "headline", - "value": "TABLE 1 Mortality Data", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "TABLE 1 Mortality Data", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 121.68, - "y": 503.91998 - }, - "width": 53.759987, - "height": -12.479996, - "page": 22 - }, - { - "topLeft": { - "x": 215.28, - "y": 503.91998 - }, - "width": 83.27768, - "height": -12.479996, - "page": 22 - } - ], - "sectionNumber": 70, - "textBefore": null, - "textAfter": " * The", - "comments": null, - "startOffset": 0, - "endOffset": 22, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588230072Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c5182532407db5a98e3680cf665f03a8", - "type": "headline", - "value": "APPENDICES SECTION", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDICES SECTION", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 236.88, - "y": 764.80005 - }, - "width": 155.9599, - "height": -12.959999, - "page": 23 - } - ], - "sectionNumber": 71, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 18, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588230292Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9adc14260604fa79a8cbe70d62ef9cb6", - "type": "headline", - "value": "APPENDIX 1 Signs Associated with Dosing", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDIX 1 Signs Associated with Dosing", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 121.68, - "y": 503.91998 - }, - "width": 254.87512, - "height": -12.479996, - "page": 24 - } - ], - "sectionNumber": 81, - "textBefore": null, - "textAfter": " Only animals", - "comments": null, - "startOffset": 0, - "endOffset": 39, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588230512Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "dfdefbed33bdad22404dc28af422be8a", - "type": "headline", - "value": "APPENDIX 1 Signs Associated with Dosing (cont)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDIX 1 Signs Associated with Dosing (cont)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 121.68, - "y": 503.91998 - }, - "width": 76.78837, - "height": -12.479996, - "page": 25 - }, - { - "topLeft": { - "x": 229.68, - "y": 503.91998 - }, - "width": 196.79706, - "height": -12.479996, - "page": 25 - } - ], - "sectionNumber": 91, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 46, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588230722Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "80048119dde8be5018f89c2f486daafd", - "type": "headline", - "value": "APPENDIX 2 Individual Body Weight (g)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDIX 2 Individual Body Weight (g)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 121.68, - "y": 501.03998 - }, - "width": 245.51334, - "height": -12.479996, - "page": 26 - } - ], - "sectionNumber": 104, - "textBefore": null, - "textAfter": " * Prior", - "comments": null, - "startOffset": 0, - "endOffset": 37, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588230942Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "19cd1b5c99036c6f6cc203bd1a500380", - "type": "headline", - "value": "APPENDIX 3 Individual Body Weight Change (g)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDIX 3 Individual Body Weight Change (g)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 121.68, - "y": 501.03998 - }, - "width": 291.35333, - "height": -12.479996, - "page": 27 - } - ], - "sectionNumber": 117, - "textBefore": null, - "textAfter": " - Not", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588231172Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1ce7a3f5c1117b3b88cd8ac9499ef606", - "type": "headline", - "value": "APPENDIX 4 Macroscopic Findings", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDIX 4 Macroscopic Findings", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 121.68, - "y": 503.91998 - }, - "width": 215.7691, - "height": -12.479996, - "page": 28 - } - ], - "sectionNumber": 139, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588231382Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "645c0b100059bd8d692f37eacf14f720", - "type": "headline", - "value": "APPENDIX 5 Certificate of Analysis", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDIX 5 Certificate of Analysis", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 765.27997 - }, - "width": 216.7236, - "height": -12.479996, - "page": 29 - } - ], - "sectionNumber": 140, - "textBefore": null, - "textAfter": " syngenta GLP", - "comments": null, - "startOffset": 0, - "endOffset": 34, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588231592Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3b0c9aff63ecb4c945a55c66075859f6", - "type": "headline", - "value": "CGA 100251", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "CGA 100251", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 288, - "y": 534.82745 - }, - "width": 40.049927, - "height": -10.827423, - "page": 30 - } - ], - "sectionNumber": 141, - "textBefore": "100251 MES 630/1 ", - "textAfter": " CGA 26423", - "comments": null, - "startOffset": 21, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588231802Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:41:01.642701Z", - "requestedDate": "2022-10-10T11:41:01.631112Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6f4474461e96a27847aa79e21ea7dc93", - "type": "headline", - "value": "CGA 100251", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "CGA 100251", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 291, - "y": 667.97406 - }, - "width": 21.856628, - "height": -12.97406, - "page": 30 - }, - { - "topLeft": { - "x": 316, - "y": 668.3759 - }, - "width": 30, - "height": -12.3759, - "page": 30 - } - ], - "sectionNumber": 141, - "textBefore": null, - "textAfter": " MES 630/1", - "comments": null, - "startOffset": 0, - "endOffset": 10, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588232012Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:43:23.82223Z", - "requestedDate": "2022-10-10T11:43:23.811375Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "289629484146fb54f2c09d6cb3a4a2d5", - "type": "headline", - "value": "CGA 100251", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "CGA 100251", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 207, - "y": 410.8824 - }, - "width": 40.049927, - "height": -10.882385, - "page": 30 - } - ], - "sectionNumber": 141, - "textBefore": "— Content of ", - "textAfter": " * -", - "comments": null, - "startOffset": 399, - "endOffset": 409, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588232232Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:41:07.50703Z", - "requestedDate": "2022-10-10T11:41:07.489352Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bffc092877c659395a7999826c4f1cdd", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "APPENDIX 5 Certificate of Analysis", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 90, - "y": 134 - }, - "width": 450, - "height": 636, - "page": 30 - } - ], - "sectionNumber": 140, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588232442Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b0f4f19635bbec4b8161c140cd2f2d3c", - "type": "headline", - "value": "APPENDIX 6 GLP Compliance Statement", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDIX 6 GLP Compliance Statement", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76001, - "y": 765.27997 - }, - "width": 249.35074, - "height": -12.479996, - "page": 31 - } - ], - "sectionNumber": 142, - "textBefore": null, - "textAfter": " ae Department", - "comments": null, - "startOffset": 0, - "endOffset": 35, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588232662Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a325178e3b1188d616467cbe88e454be", - "type": "headline", - "value": "GOOD LABORATORY PRACTICE", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "GOOD LABORATORY PRACTICE", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 234, - "y": 636.96014 - }, - "width": 157.05005, - "height": -12.960144, - "page": 32 - } - ], - "sectionNumber": 144, - "textBefore": null, - "textAfter": " STATEMENT OF", - "comments": null, - "startOffset": 0, - "endOffset": 24, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588232932Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "44cb66d8c6436da850c2c9996b23d591", - "type": "headline", - "value": "THE DEPARTMENT OF HEALTH OF THE GOVERNMENT OF THE UNITED KINGDOM", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "THE DEPARTMENT OF HEALTH OF THE GOVERNMENT\nOF THE UNITED KINGDOM", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 180, - "y": 672.61774 - }, - "width": 266.125, - "height": -12.617752, - "page": 32 - }, - { - "topLeft": { - "x": 249, - "y": 660.996 - }, - "width": 128.775, - "height": -12.995956, - "page": 32 - } - ], - "sectionNumber": 143, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 64, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588233152Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bfe4921e930b74d8ebfb2f3f457f71fc", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "APPENDIX 6 GLP Compliance Statement", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 90, - "y": 117 - }, - "width": 450, - "height": 653, - "page": 32 - } - ], - "sectionNumber": 142, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588233352Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ef18362ea58a3235ab96bbd46321fb31", - "type": "headline", - "value": "3.6 Post Mortem Investigations", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.6 Post Mortem", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 89.76, - "y": 542.8395 - }, - "width": 16.32, - "height": 11.572875, - "page": 17 - }, - { - "topLeft": { - "x": 135.12, - "y": 542.8395 - }, - "width": 149.2872, - "height": 11.572875, - "page": 17 - } - ], - "sectionNumber": 42, - "textBefore": null, - "textAfter": " All surviving", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:38:23.588227232Z" - }, - { - "analysisNumber": 3, - "type": "CHANGED", - "dateTime": "2022-10-10T11:42:52.061730355Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:42:51.681Z", - "requestedDate": "2022-10-10T11:42:51.681232Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "3.6 Post Mortem Investigations" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cdfc26a047ad2c161db0c817dbdb223c", - "type": "manual", - "value": "Certificate of Analysis", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 260, - "y": 674.20294 - }, - "width": 116.07498, - "height": 15.263537, - "page": 30 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:41:35.114Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:41:35.114Z", - "requestedDate": "2022-10-10T11:41:35.114Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - } - ], - "legalBasis": [ - { - "name": "n-a.", - "description": "n-a.", - "reason": "n-a." - } - ], - "dictionaryVersion": 12, - "dossierDictionaryVersion": 1, - "rulesVersion": 3, - "legalBasisVersion": 2 -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23_REDACTION_LOG.json b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23_REDACTION_LOG.json deleted file mode 100644 index d7e56dfd..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23_REDACTION_LOG.json +++ /dev/null @@ -1,13485 +0,0 @@ -{ - "analysisVersion": 1, - "analysisNumber": 1, - "redactionLogEntry": [ - { - "id": "838781874e966a1798c89b17b39ce659", - "type": "headline", - "value": "1.1 Context in which the renewal assessment report was prepared", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1 Context in which the renewal assessment report was prepared", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 668.1894 - }, - "width": 322.98685, - "height": -10.929367, - "page": 8 - } - ], - "sectionNumber": 9, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 63, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283232962Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e55e7d1fc5fded34996c61a48d13a740", - "type": "headline", - "value": "1.1.2 Arrangements between rapporteur Member State and co-rapporteur Member State", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.2 Arrangements between rapporteur Member State and co-rapporteur Member State", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 319.65942 - }, - "width": 425.50845, - "height": -10.929382, - "page": 8 - } - ], - "sectionNumber": 11, - "textBefore": null, - "textAfter": " Latvia, acting", - "comments": null, - "startOffset": 0, - "endOffset": 81, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283235652Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1fd3b727ecba39c98e038b7d5f836c6d", - "type": "headline", - "value": "1.1.3 EU Regulatory history for use in Plant Protection Products", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.3 EU Regulatory history for use in Plant Protection Products", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 266.22937 - }, - "width": 309.31674, - "height": -10.929382, - "page": 8 - } - ], - "sectionNumber": 12, - "textBefore": null, - "textAfter": " Trinexapac was", - "comments": null, - "startOffset": 0, - "endOffset": 64, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283235802Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ab0a095403ba7eb9acad7c748aa7ad64", - "type": "headline", - "value": "1.1.1 Purpose for which the renewal assessment report was prepared", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.1 Purpose for which the renewal assessment report was prepared", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 649.2294 - }, - "width": 329.00748, - "height": -10.929367, - "page": 8 - } - ], - "sectionNumber": 10, - "textBefore": null, - "textAfter": " Trinexapac is", - "comments": null, - "startOffset": 0, - "endOffset": 66, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283236192Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b0a95fd421d8a0f51b77330e76d3f01d", - "type": "headline", - "value": "1.1.4 Evaluations carried out under other regulatory contexts", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.4 Evaluations carried out under other regulatory contexts", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 642.2694 - }, - "width": 294.81012, - "height": -10.929367, - "page": 9 - } - ], - "sectionNumber": 13, - "textBefore": null, - "textAfter": " The RMS", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283236422Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "eabdb204ae02a2ae1d3ffaeb7f14bb7e", - "type": "headline", - "value": "1.2.2 Producer or producers of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2.2 Producer or producers of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 202.6294 - }, - "width": 247.68033, - "height": -10.929382, - "page": 10 - } - ], - "sectionNumber": 18, - "textBefore": null, - "textAfter": " See 1.2.1", - "comments": null, - "startOffset": 0, - "endOffset": 51, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283236572Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8e44c366d663333d792828d35f110d6b", - "type": "headline", - "value": "1.2.1 Name and address of applicant(s) for approval of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2.1 Name and address of applicant(s) for approval of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 711.7494 - }, - "width": 358.9747, - "height": -10.929367, - "page": 10 - } - ], - "sectionNumber": 17, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 75, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283236732Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ffb4e91b4199eff833ec2fcaad2838e2", - "type": "headline", - "value": "1.2 Applicant(s) information", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2 Applicant(s) information", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 754.7094 - }, - "width": 149.16586, - "height": -10.929359, - "page": 10 - } - ], - "sectionNumber": 14, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 28, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283236882Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "319477cab9ac18c5532dd0a7bc8b59d7", - "type": "headline", - "value": "1.3.2 Chemical name (IUPAC and CA nomenclature)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.2 Chemical name (IUPAC and CA nomenclature)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 582.2394 - }, - "width": 256.5234, - "height": -10.929352, - "page": 11 - } - ], - "sectionNumber": 25, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 47, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283237032Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b18e8a619602cb07bf7e55d1e60e157b", - "type": "headline", - "value": "1.3.4 CAS, EC and CIPAC numbers", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.4 CAS, EC and CIPAC numbers", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 350.01938 - }, - "width": 177.16785, - "height": -10.929352, - "page": 11 - } - ], - "sectionNumber": 27, - "textBefore": null, - "textAfter": " CAS: 95266-40-3", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283237182Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "03cd9a9d6fc540d0ff8cf3030a09ee51", - "type": "headline", - "value": "1.3 Identity of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3 Identity of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 697.46936 - }, - "width": 177.5101, - "height": -10.929367, - "page": 11 - } - ], - "sectionNumber": 20, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283237352Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c4b16f91e4568a26e0c22c8b9ee26346", - "type": "headline", - "value": "1.3.3 Producer's development code numbers", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.3 Producer's development code numbers", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 448.53937 - }, - "width": 214.44998, - "height": -10.929352, - "page": 11 - } - ], - "sectionNumber": 26, - "textBefore": null, - "textAfter": " CGA 163935", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283237502Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6108674c4bb7019889f4d15e121d7dc8", - "type": "headline", - "value": "1.3.1 Common name proposed or ISO-accepted and synonyms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.1 Common name proposed or ISO-accepted and synonyms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 654.5094 - }, - "width": 299.23163, - "height": -10.929367, - "page": 11 - } - ], - "sectionNumber": 21, - "textBefore": null, - "textAfter": " Trinexapac-ethyl", - "comments": null, - "startOffset": 0, - "endOffset": 55, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283237652Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e6ade5bdcde5fba6d3d1d34abc111de5", - "type": "headline", - "value": "1.3.5 Molecular and structural formulae, molecular mass", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.5 Molecular and structural formulae, molecular mass", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 225.30939 - }, - "width": 274.7156, - "height": -10.929382, - "page": 11 - } - ], - "sectionNumber": 33, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 55, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283237792Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "503db568638d82005e165d730dddfb3f", - "type": "headline", - "value": "1.2.3 Information relating to the collective provision of dossiers", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2.3 Information relating to the collective provision of dossiers", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 303.06802, - "height": -10.929359, - "page": 11 - } - ], - "sectionNumber": 19, - "textBefore": null, - "textAfter": " See 1.2.1", - "comments": null, - "startOffset": 0, - "endOffset": 66, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283237942Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "877b0ed9c3c4509f049d168da63c779d", - "type": "headline", - "value": "1.3.8 Identity and content of additives (such as stabilisers) and impurities", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8 Identity and content of additives (such as stabilisers) and impurities", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 454.67938 - }, - "width": 349.52438, - "height": -10.929352, - "page": 12 - } - ], - "sectionNumber": 36, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 76, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283238092Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4a27965ac4bc070c9466fe9090b64887", - "type": "headline", - "value": "1.3.9 Analytical profile of batches", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.9 Analytical profile of batches", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 177.78937 - }, - "width": 164.31729, - "height": -10.929382, - "page": 12 - } - ], - "sectionNumber": 40, - "textBefore": null, - "textAfter": " CONFIDENTIAL information", - "comments": null, - "startOffset": 0, - "endOffset": 35, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283238252Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cd0e72f39d6f1aff32c7b10ab3857c6a", - "type": "headline", - "value": "1.3.8.2 Significant impurities", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8.2 Significant impurities", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 339.45938 - }, - "width": 141.74483, - "height": -10.929352, - "page": 12 - } - ], - "sectionNumber": 38, - "textBefore": null, - "textAfter": " CONFIDENTIAL information", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283238392Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "aa08466137f3730973847f684ea2f263", - "type": "headline", - "value": "1.3.6 Method of manufacture (synthesis pathway) of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.6 Method of manufacture (synthesis pathway) of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 599.15936 - }, - "width": 347.31644, - "height": -10.929352, - "page": 12 - } - ], - "sectionNumber": 34, - "textBefore": null, - "textAfter": " CONFIDENTIAL information", - "comments": null, - "startOffset": 0, - "endOffset": 71, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283238542Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1188cbd3fcb36cff0a22413d041f4aa9", - "type": "headline", - "value": "1.3.7 Specification of purity of the active substance in g/kg", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.7 Specification of purity of the active substance in g/kg", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 526.9194 - }, - "width": 279.57703, - "height": -10.929352, - "page": 12 - } - ], - "sectionNumber": 35, - "textBefore": null, - "textAfter": " 950 g/kg", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283238682Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cc44d534126212540a636625fd4085d8", - "type": "headline", - "value": "1.3.8.3 Relevant impurities", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8.3 Relevant impurities", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 267.3094 - }, - "width": 132.55664, - "height": -10.929382, - "page": 12 - } - ], - "sectionNumber": 39, - "textBefore": null, - "textAfter": " For the", - "comments": null, - "startOffset": 0, - "endOffset": 27, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283238822Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "73bda4264dae9b5f56bb35137e130021", - "type": "headline", - "value": "1.3.8.1 Additives", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8.1 Additives", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 411.69937 - }, - "width": 84.65697, - "height": -10.929352, - "page": 12 - } - ], - "sectionNumber": 37, - "textBefore": null, - "textAfter": " CONFIDENTIAL information", - "comments": null, - "startOffset": 0, - "endOffset": 17, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283238962Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0596812460ae817606f287e1bd5224aa", - "type": "headline", - "value": "1.4.1 Applicant", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.1 Applicant", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 726.7494 - }, - "width": 78.54704, - "height": -10.929367, - "page": 13 - } - ], - "sectionNumber": 42, - "textBefore": null, - "textAfter": " Name: Syngenta", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283239262Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "891a37512f629020893f9a0307eb095b", - "type": "headline", - "value": "1.4 Information on the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4 Information on the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 239.49973, - "height": -10.929359, - "page": 13 - } - ], - "sectionNumber": 41, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 47, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283239412Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fa22339d01398dbf1ac65d9d922da9b1", - "type": "headline", - "value": "1.4.2 Producer of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.2 Producer of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 486.23715 - }, - "width": 223.55795, - "height": -10.447144, - "page": 13 - } - ], - "sectionNumber": 43, - "textBefore": null, - "textAfter": " Name: Syngenta", - "comments": null, - "startOffset": 0, - "endOffset": 46, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283239732Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "dff75113696feb739118e3c4ab628d5e", - "type": "headline", - "value": "1.4.4.2 Information on the active substances", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4.2 Information on the active substances", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 635.06714 - }, - "width": 212.2904, - "height": -10.447144, - "page": 14 - } - ], - "sectionNumber": 54, - "textBefore": null, - "textAfter": " The active", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283240032Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2e3660d4884600cd2f21a2d6cb18336a", - "type": "headline", - "value": "1.4.4.3 Information on safeners, synergists and co-formulants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4.3 Information on safeners, synergists and co-formulants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 209.58716 - }, - "width": 294.214, - "height": -10.447144, - "page": 14 - } - ], - "sectionNumber": 55, - "textBefore": null, - "textAfter": " CONFIDENTIAL information", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283240172Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2bce5a2a47a517a46431330a9048a086", - "type": "headline", - "value": "1.4.4.1 Composition of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4.1 Composition of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 707.78937 - }, - "width": 247.40869, - "height": -10.929367, - "page": 14 - } - ], - "sectionNumber": 46, - "textBefore": null, - "textAfter": " Confidential information", - "comments": null, - "startOffset": 0, - "endOffset": 51, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283240322Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "987acde824537306bfb45ca83acd86cf", - "type": "headline", - "value": "1.4.6 Function", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.6 Function", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 696.9871 - }, - "width": 74.2861, - "height": -10.447144, - "page": 15 - } - ], - "sectionNumber": 57, - "textBefore": null, - "textAfter": " Plant growth", - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283240472Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d5eacac5f1442e228f3446587a08af45", - "type": "headline", - "value": "1.4.8 Effects on harmful organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.8 Effects on harmful organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 448.7794 - }, - "width": 171.14001, - "height": -10.929352, - "page": 15 - } - ], - "sectionNumber": 59, - "textBefore": null, - "textAfter": " Trinexapac-ethyl, present", - "comments": null, - "startOffset": 0, - "endOffset": 34, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283240622Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e47b8ceb9348a22c39f5e2fbff83f863", - "type": "headline", - "value": "1.4.7 Field of use envisaged", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.7 Field of use envisaged", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 581.7594 - }, - "width": 134.45407, - "height": -10.929352, - "page": 15 - } - ], - "sectionNumber": 58, - "textBefore": null, - "textAfter": " Agriculture. A8587F", - "comments": null, - "startOffset": 0, - "endOffset": 28, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283240762Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "657ca15f20378916d184de4fc1155f15", - "type": "headline", - "value": "1.5 Detailed uses of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5 Detailed uses of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 298.53937 - }, - "width": 241.05637, - "height": -10.929382, - "page": 15 - } - ], - "sectionNumber": 60, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 49, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283240902Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "89baac9241232271dccba2d5144aef6c", - "type": "headline", - "value": "1.4.5 Type and code of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.5 Type and code of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.2272 - }, - "width": 248.03363, - "height": -10.447144, - "page": 15 - } - ], - "sectionNumber": 56, - "textBefore": null, - "textAfter": " Micro-emulsion (ME)", - "comments": null, - "startOffset": 0, - "endOffset": 51, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283241052Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "706f1f89975b8303c80d84e213669d45", - "type": "headline", - "value": "1.5.1 Details of representative uses", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.1 Details of representative uses", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 508.10938 - }, - "width": 168.63585, - "height": -10.929359, - "page": 16 - } - ], - "sectionNumber": 67, - "textBefore": null, - "textAfter": " Remarks: (a)", - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283241192Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ff50c0d405f58b7a7e813cd3dc4981a2", - "type": "headline", - "value": "1.5.4 Overview on authorisations in EU Member States", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.4 Overview on authorisations in EU Member States", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 619.46936 - }, - "width": 265.41058, - "height": -10.929367, - "page": 17 - } - ], - "sectionNumber": 70, - "textBefore": null, - "textAfter": " Trinexapac-ethyl containing", - "comments": null, - "startOffset": 0, - "endOffset": 52, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283241492Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "05d216eb9d707a2d771ca13714ad8d0b", - "type": "headline", - "value": "1.5.2 Further information on representative uses", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.2 Further information on representative uses", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 753.6294 - }, - "width": 234.91212, - "height": -10.929359, - "page": 17 - } - ], - "sectionNumber": 68, - "textBefore": null, - "textAfter": " Please refer", - "comments": null, - "startOffset": 0, - "endOffset": 48, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283241642Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4d39b51743e0813dfc959129c212ef9e", - "type": "headline", - "value": "2 Summary of active substance hazard and of product risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2 Summary of active substance hazard and of product risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 703.2294 - }, - "width": 346.53125, - "height": -10.929367, - "page": 18 - } - ], - "sectionNumber": 71, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 67, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283241802Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2e6dd0ca4cb4f6699ea81535cc6c440a", - "type": "headline", - "value": "2.1.1 Summary of identity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.1.1 Summary of identity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 617.3094 - }, - "width": 129.2984, - "height": -10.929367, - "page": 18 - } - ], - "sectionNumber": 73, - "textBefore": null, - "textAfter": " Trinexapac-ethyl is", - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283241942Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "98dd5fa288e1d181a41af0c28026e3eb", - "type": "headline", - "value": "2.1 Identity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.1 Identity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 660.2694 - }, - "width": 69.46161, - "height": -10.929367, - "page": 18 - } - ], - "sectionNumber": 72, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 12, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283242182Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9ab9cef438726776888c16d3ec4f965a", - "type": "headline", - "value": "2.2 Physical and chemical properties", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2 Physical and chemical properties", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 186.98244, - "height": -10.929359, - "page": 19 - } - ], - "sectionNumber": 74, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283242352Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9cb730129ae62cdbc3b094f045ae1bed", - "type": "headline", - "value": "2.2.1 Summary of physical and chemical properties of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2.1 Summary of physical and chemical properties of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 725.6694 - }, - "width": 355.6372, - "height": -10.929367, - "page": 19 - } - ], - "sectionNumber": 75, - "textBefore": null, - "textAfter": " Summary and", - "comments": null, - "startOffset": 0, - "endOffset": 73, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283242502Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "39d8470e1bb3c9c841f018d162ed049a", - "type": "headline", - "value": "2.3.1 Summary of effectiveness", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.1 Summary of effectiveness", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 238.6294 - }, - "width": 151.81999, - "height": -10.929382, - "page": 20 - } - ], - "sectionNumber": 78, - "textBefore": null, - "textAfter": " Trinexapac-ethyl acts", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283242652Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c63ae51dad547c274c1af33693df91e4", - "type": "headline", - "value": "2.3 Data on application and efficacy", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3 Data on application and efficacy", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 281.58936 - }, - "width": 183.65938, - "height": -10.929382, - "page": 20 - } - ], - "sectionNumber": 77, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283242812Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "09503494afdf315008b83a2e74a7a392", - "type": "headline", - "value": "2.2.2 Summary of physical and chemical properties of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2.2 Summary of physical and chemical properties of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 394.95398, - "height": -10.929359, - "page": 20 - } - ], - "sectionNumber": 76, - "textBefore": null, - "textAfter": " Physical, chemical", - "comments": null, - "startOffset": 0, - "endOffset": 81, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283242962Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "159adbfd75bc15c1224a0f569f621816", - "type": "headline", - "value": "2.4.1 Summary of methods and precautions concerning handling, storage, transport or fire", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4.1 Summary of methods and precautions concerning handling, storage, transport or fire", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 275.70935 - }, - "width": 432.3023, - "height": -10.929382, - "page": 21 - } - ], - "sectionNumber": 83, - "textBefore": null, - "textAfter": " Sufficient information", - "comments": null, - "startOffset": 0, - "endOffset": 88, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283243112Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e83062929224448eb0ce0c0a8629a44d", - "type": "headline", - "value": "2.3.2 Summary of information on the development of resistance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.2 Summary of information on the development of resistance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 304.88965, - "height": -10.929359, - "page": 21 - } - ], - "sectionNumber": 79, - "textBefore": null, - "textAfter": " The development", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283243252Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9ea2b4588666ebb4f76b5aa4b2323348", - "type": "headline", - "value": "2.3.3 Summary of adverse effects on treated crops", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.3 Summary of adverse effects on treated crops", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 627.3894 - }, - "width": 241.06743, - "height": -10.929367, - "page": 21 - } - ], - "sectionNumber": 80, - "textBefore": null, - "textAfter": " Trinexapac-ethyl containing", - "comments": null, - "startOffset": 0, - "endOffset": 49, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283243392Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "63065558d36b28ddfa1fecb1c70a1517", - "type": "headline", - "value": "2.3.4 Summary of observations on other undesirable or unintended side-effects", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.4 Summary of observations on other undesirable or unintended side-effects", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 537.9594 - }, - "width": 376.2165, - "height": -10.929352, - "page": 21 - } - ], - "sectionNumber": 81, - "textBefore": null, - "textAfter": " Minimum waiting", - "comments": null, - "startOffset": 0, - "endOffset": 77, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283243622Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e4016a029cd20284f63e2f2398b87f75", - "type": "headline", - "value": "2.4 Further information", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4 Further information", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 318.69934 - }, - "width": 128.36, - "height": -10.929382, - "page": 21 - } - ], - "sectionNumber": 82, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283243832Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7392d5ababe4e7e91bb9d5c61dd6adb2", - "type": "headline", - "value": "10.6 Hydrogen cianide gas may develop in the headspace of containers at normal storage.", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "10.6 Hydrogen cianide gas may develop in the headspace of containers at normal storage.", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 191.57, - "y": 178.67822 - }, - "width": 290.0026, - "height": -9.658203, - "page": 24 - } - ], - "sectionNumber": 84, - "textBefore": null, - "textAfter": " Wear full", - "comments": null, - "startOffset": 0, - "endOffset": 87, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283243972Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:46:52.889075Z", - "requestedDate": "2022-10-10T11:46:52.872981Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7699793041ba25b6c6765721299ea55d", - "type": "headline", - "value": "2.4.2 Summary of procedures for destruction or decontamination", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4.2 Summary of procedures for destruction or decontamination", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 313.09235, - "height": -10.929359, - "page": 26 - } - ], - "sectionNumber": 85, - "textBefore": null, - "textAfter": " Active substance", - "comments": null, - "startOffset": 0, - "endOffset": 62, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283244112Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c432182af58ae882185ca408b7d6c752", - "type": "headline", - "value": "2.4.3 Summary of emergency measures in case of an accident", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4.3 Summary of emergency measures in case of an accident", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 675.6294 - }, - "width": 292.9886, - "height": -10.929367, - "page": 27 - } - ], - "sectionNumber": 86, - "textBefore": null, - "textAfter": " Active substance", - "comments": null, - "startOffset": 0, - "endOffset": 58, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283244252Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "415b0058277b80fe8902279a9027cf90", - "type": "paragraph-headline", - "value": "neutralisation procedure", - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.4.3 Summary of emergency measures in case of an accident", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 769.1071 - }, - "width": 107.289154, - "height": -10.447144, - "page": 28 - } - ], - "sectionNumber": 86, - "textBefore": "A 8587 F ", - "textAfter": " Neutralisation is", - "comments": null, - "startOffset": 1892, - "endOffset": 1916, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283244392Z" - }, - { - "analysisNumber": 7, - "type": "REMOVED", - "dateTime": "2022-10-10T11:48:01.352193501Z" - } - ], - "manualChanges": [], - "engines": [ - "DICTIONARY" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": true, - "dossierDictionaryEntry": false - }, - { - "id": "c67bb9e21a30eb210810324c7777bb77", - "type": "headline", - "value": "2.5 Methods of analysis", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5 Methods of analysis", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 687.14935 - }, - "width": 124.97073, - "height": -10.929367, - "page": 28 - } - ], - "sectionNumber": 87, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283244542Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "51aa6ab9ef52ee65a8673ecae0de177a", - "type": "headline", - "value": "2.5.1 Methods used for the generation of pre-authorisation data", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.1 Methods used for the generation of pre-authorisation data", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 644.1894 - }, - "width": 305.0423, - "height": -10.929367, - "page": 28 - } - ], - "sectionNumber": 105, - "textBefore": null, - "textAfter": " A validated", - "comments": null, - "startOffset": 0, - "endOffset": 63, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283244692Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b0c6277d4d1eba4fc571bb8d89a0aa5e", - "type": "headline", - "value": "2.5.2 Methods for post control and monitoring purposes", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2 Methods for post control and monitoring purposes", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 269.10895, - "height": -10.929359, - "page": 31 - } - ], - "sectionNumber": 106, - "textBefore": null, - "textAfter": " The criteria", - "comments": null, - "startOffset": 0, - "endOffset": 54, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283244832Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "712711e1578e851c0510d21311be90e8", - "type": "headline", - "value": "2.5.2.1 Methods for residue determination in food/feed of plant origin", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2.1 Methods for residue determination in food/feed of plant origin", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 677.4271 - }, - "width": 295.48206, - "height": -10.447144, - "page": 31 - } - ], - "sectionNumber": 114, - "textBefore": null, - "textAfter": " For residue", - "comments": null, - "startOffset": 0, - "endOffset": 70, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283244972Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6960c378c69c348c2dd7ee265d3d113f", - "type": "headline", - "value": "2.5.2.3 Methods for the determination of the active substance and/or metabolites in soil", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2.3 Methods for the determination of the active substance and/or metabolites in soil", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 315.69714 - }, - "width": 375.21375, - "height": -10.447144, - "page": 32 - } - ], - "sectionNumber": 122, - "textBefore": null, - "textAfter": " For the", - "comments": null, - "startOffset": 0, - "endOffset": 88, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283245112Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "917e863e1650399d3640a97ef656b642", - "type": "headline", - "value": "2.5.2.4 Metods for the determination of the active substance and/or metabolites in water", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2.4 Metods for the determination of the active substance and/or metabolites in water", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 472.19714 - }, - "width": 379.7057, - "height": -10.447144, - "page": 33 - } - ], - "sectionNumber": 129, - "textBefore": null, - "textAfter": " For the", - "comments": null, - "startOffset": 0, - "endOffset": 88, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283245572Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "76d1adcc5418fef1624fc77c299e429c", - "type": "headline", - "value": "5.2.5 Methods for the determination of the active substance and/or metabolites in air", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "5.2.5 Methods for the determination of the active substance and/or metabolites in air", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 641.90717 - }, - "width": 373.02252, - "height": -10.447144, - "page": 34 - } - ], - "sectionNumber": 133, - "textBefore": null, - "textAfter": " The proposed", - "comments": null, - "startOffset": 0, - "endOffset": 85, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283245792Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "af695849fc41ee3bc71593ef8a0a2f78", - "type": "headline", - "value": "2.5.2.6 Analytical methods (residue) for body fluids and tissues (Annex IIA 4.2.5; Annex IIIA 5.2)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2.6 Analytical methods (residue) for body fluids and tissues (Annex IIA 4.2.5; Annex IIIA 5.2)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 372.21713 - }, - "width": 27.489601, - "height": -10.447144, - "page": 34 - }, - { - "topLeft": { - "x": 128.66, - "y": 372.21713 - }, - "width": 383.51993, - "height": -10.447144, - "page": 34 - } - ], - "sectionNumber": 137, - "textBefore": null, - "textAfter": " In comparison", - "comments": null, - "startOffset": 0, - "endOffset": 98, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283245932Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ddc4fe79b2fd6a74ba58564700bffc46", - "type": "headline", - "value": "2.6 Effects on human and animal health", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6 Effects on human and animal health", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 202.37218, - "height": -10.929359, - "page": 36 - } - ], - "sectionNumber": 138, - "textBefore": null, - "textAfter": " The toxicological", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283246072Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7a82746290e51f8361209983dc4b9454", - "type": "headline", - "value": "2.6.1 Summary of absorption, distribution, metabolism and excretion in mammals", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.1 Summary of absorption, distribution, metabolism and excretion in mammals", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 532.1994 - }, - "width": 391.97314, - "height": -10.929352, - "page": 36 - } - ], - "sectionNumber": 139, - "textBefore": null, - "textAfter": " No new", - "comments": null, - "startOffset": 0, - "endOffset": 78, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283246212Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7abffea271de1fb03734a3f8aed94f1a", - "type": "headline", - "value": "D., 2017).", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "D., 2017).", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 116.967964, - "y": 458.1218 - }, - "width": 40.702034, - "height": -10.531799, - "page": 38 - } - ], - "sectionNumber": 140, - "textBefore": null, - "textAfter": " The purpose", - "comments": null, - "startOffset": 0, - "endOffset": 10, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283246362Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:48:33.343887Z", - "requestedDate": "2022-10-10T11:48:33.326505Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6de538e45189570cc61de3759dd64b63", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.6.1 Summary of absorption, distribution, metabolism and excretion in mammals", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 72, - "y": 629 - }, - "width": 142, - "height": 115, - "page": 38 - } - ], - "sectionNumber": 139, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283246502Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b895021acd73e41a498919782ec7f8b1", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.6.1 Summary of absorption, distribution, metabolism and excretion in mammals", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 330, - "y": 628 - }, - "width": 149, - "height": 109, - "page": 38 - } - ], - "sectionNumber": 139, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283246652Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "599596be5505ce7e7dc6932f7ee7585c", - "type": "headline", - "value": "C., 2006),", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "C., 2006),", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 292.35468, - "y": 591.4418 - }, - "width": 41.52533, - "height": -10.531799, - "page": 39 - } - ], - "sectionNumber": 142, - "textBefore": null, - "textAfter": " however, not", - "comments": null, - "startOffset": 0, - "endOffset": 10, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283246882Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:48:41.477503Z", - "requestedDate": "2022-10-10T11:48:41.45952Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "81d4d471023c34a6609a6f1ce942b260", - "type": "headline", - "value": "2.6.2 Summary of acute toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.2 Summary of acute toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 155.69504, - "height": -10.929359, - "page": 39 - } - ], - "sectionNumber": 141, - "textBefore": null, - "textAfter": " Trinexapac-ethyl was", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283247032Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "03fa37c652a54f2c9bf1a0f7937101d0", - "type": "headline", - "value": "J., 2017)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "J., 2017)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 175.04875, - "y": 557.0018 - }, - "width": 36.997925, - "height": -10.531799, - "page": 39 - } - ], - "sectionNumber": 156, - "textBefore": null, - "textAfter": " trinexapac-ethyl tech.", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283247182Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:48:45.334254Z", - "requestedDate": "2022-10-10T11:48:45.317318Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "10a8ffca889633e43d50440360a9a71d", - "type": "headline", - "value": "2.6.3 Summary of short term toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.3 Summary of short term toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 180.50194, - "height": -10.929359, - "page": 41 - } - ], - "sectionNumber": 167, - "textBefore": null, - "textAfter": " All studies", - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283247322Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "106c0ce1b8f000a8d4704ae2ca200e0a", - "type": "headline", - "value": "A., 1999),", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "A., 1999),", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 578.9618 - }, - "width": 41.126, - "height": -10.531799, - "page": 44 - } - ], - "sectionNumber": 168, - "textBefore": null, - "textAfter": " the reduction", - "comments": null, - "startOffset": 0, - "endOffset": 10, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283247472Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:48:57.271834Z", - "requestedDate": "2022-10-10T11:48:57.25642Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f8a1a5280b059efdcee1ec7f2f4e16ae", - "type": "headline", - "value": "A., 1988)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "A., 1988)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 159.48392, - "y": 289.95178 - }, - "width": 38.162766, - "height": -10.531799, - "page": 45 - } - ], - "sectionNumber": 171, - "textBefore": null, - "textAfter": " and one", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283247632Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:12.376643Z", - "requestedDate": "2022-10-10T11:49:12.362627Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "eef2528cd67e06595c00325b3b40a27f", - "type": "headline", - "value": "C., 1989)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "C., 1989)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 328.72195, - "y": 289.95178 - }, - "width": 38.624725, - "height": -10.531799, - "page": 45 - } - ], - "sectionNumber": 172, - "textBefore": null, - "textAfter": " were considered", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283247782Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:09.088555Z", - "requestedDate": "2022-10-10T11:49:09.072705Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1dbe3f091ea7025791a5982ed92a986e", - "type": "headline", - "value": "F., 1989)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "F., 1989)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 305.83, - "y": 341.7018 - }, - "width": 39.07669, - "height": -10.53183, - "page": 45 - } - ], - "sectionNumber": 170, - "textBefore": null, - "textAfter": " was rejected", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283247932Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:05.163578Z", - "requestedDate": "2022-10-10T11:49:05.144218Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d78c3013bd8eabc14da8430050633d12", - "type": "headline", - "value": "2.6.4 Summary of genotoxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.4 Summary of genotoxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 432.57938 - }, - "width": 150.05362, - "height": -10.929352, - "page": 45 - } - ], - "sectionNumber": 169, - "textBefore": null, - "textAfter": " Trinexapac-ethyl (CGA", - "comments": null, - "startOffset": 0, - "endOffset": 29, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283248082Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "90080a4ef6f1449c4bbd0e0910623ecf", - "type": "headline", - "value": "M., 2010)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "M., 2010)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 205.81651, - "y": 431.9418 - }, - "width": 39.710175, - "height": -10.531799, - "page": 46 - } - ], - "sectionNumber": 176, - "textBefore": null, - "textAfter": " under metabolic-activation", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283248232Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:24.894817Z", - "requestedDate": "2022-10-10T11:49:24.874883Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c31ffec51f19d98564b691f9ce975c0f", - "type": "headline", - "value": "2009).", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "2009).", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 449.1018 - }, - "width": 25.889977, - "height": -10.531799, - "page": 46 - } - ], - "sectionNumber": 175, - "textBefore": null, - "textAfter": " Trinexapac-ethyl tech.", - "comments": null, - "startOffset": 0, - "endOffset": 6, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283248392Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:28.31954Z", - "requestedDate": "2022-10-10T11:49:28.305156Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8d012ea7bc824f8929948facb857400d", - "type": "headline", - "value": "I., 2017", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "I., 2017", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 250.92778, - "y": 708.7118 - }, - "width": 31.672867, - "height": -10.531799, - "page": 46 - } - ], - "sectionNumber": 173, - "textBefore": null, - "textAfter": " and Gilby", - "comments": null, - "startOffset": 0, - "endOffset": 8, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283248542Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:19.014273Z", - "requestedDate": "2022-10-10T11:49:19.002429Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "31be28ba0f1ae2aec12c9b14379ce323", - "type": "headline", - "value": "G., 2015)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "G., 2015)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 258.25986, - "y": 613.4318 - }, - "width": 39.966827, - "height": -10.531799, - "page": 46 - } - ], - "sectionNumber": 174, - "textBefore": null, - "textAfter": " in order", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283248702Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:22.160165Z", - "requestedDate": "2022-10-10T11:49:22.144752Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "99acbecfe34b3a24c182bf75d82a9e4d", - "type": "headline", - "value": "J., 2010)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "J., 2010)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 163.54352, - "y": 414.6618 - }, - "width": 36.62317, - "height": -10.531799, - "page": 46 - } - ], - "sectionNumber": 212, - "textBefore": null, - "textAfter": " gave the", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283248852Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:31.508121Z", - "requestedDate": "2022-10-10T11:49:31.490012Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "73487c77e5072d31948e2836897c46a5", - "type": "headline", - "value": "2.6.5 Summary of long term toxicity and carcinogenicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.5 Summary of long term toxicity and carcinogenicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 178.02942 - }, - "width": 270.9416, - "height": -10.929382, - "page": 50 - } - ], - "sectionNumber": 217, - "textBefore": null, - "textAfter": " One 52/104-week", - "comments": null, - "startOffset": 0, - "endOffset": 55, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283248992Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "32df1d0209b2bc49deab382fb937a7c0", - "type": "headline", - "value": "2.6.6 Summary of reproductive toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.6 Summary of reproductive toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 389.13937 - }, - "width": 191.1776, - "height": -10.929352, - "page": 52 - } - ], - "sectionNumber": 227, - "textBefore": null, - "textAfter": " This section", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283249132Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d40c9709130b777b752fbf24b62113d5", - "type": "headline", - "value": "E, 1999", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "E, 1999", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 474.4038, - "y": 178.11182 - }, - "width": 31.573273, - "height": -10.531799, - "page": 54 - } - ], - "sectionNumber": 235, - "textBefore": null, - "textAfter": " and Krinke", - "comments": null, - "startOffset": 0, - "endOffset": 7, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283249282Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:49:54.148663Z", - "requestedDate": "2022-10-10T11:49:54.132255Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ee241a1f4f170ae1a744197454ed76de", - "type": "headline", - "value": "2.6.7 Summary of neurotoxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.7 Summary of neurotoxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 407.13937 - }, - "width": 155.53256, - "height": -10.929352, - "page": 54 - } - ], - "sectionNumber": 228, - "textBefore": null, - "textAfter": " Trinexapac-ethyl has", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283249422Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ab93313f27a4ab5ff1ddf6f91c58a0b4", - "type": "headline", - "value": "2.6.8 Summary of further toxicological studies on the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.8 Summary of further toxicological studies on the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 537.59937 - }, - "width": 334.4879, - "height": -10.929352, - "page": 56 - } - ], - "sectionNumber": 236, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 70, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283249702Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "71b2aab4475a42b5940dfc1a718da238", - "type": "headline", - "value": "2.6.8.2 Mechanistic data", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.8.2 Mechanistic data", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 303.8194 - }, - "width": 120.404495, - "height": -10.929382, - "page": 57 - } - ], - "sectionNumber": 242, - "textBefore": null, - "textAfter": " No data", - "comments": null, - "startOffset": 0, - "endOffset": 24, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283249842Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "62d60743caa4a691d3d45eb1c6a936ce", - "type": "headline", - "value": "2.6.8.3 Studies on endocrine disruption", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.8.3 Studies on endocrine disruption", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 231.54938 - }, - "width": 189.57011, - "height": -10.929382, - "page": 57 - } - ], - "sectionNumber": 243, - "textBefore": null, - "textAfter": " The notifier", - "comments": null, - "startOffset": 0, - "endOffset": 39, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283249992Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "955645b483b24349333ca9ba662d6ce4", - "type": "headline", - "value": "E., 1990)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "E., 1990)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 436.74283, - "y": 155.19177 - }, - "width": 38.273865, - "height": -10.531799, - "page": 59 - } - ], - "sectionNumber": 244, - "textBefore": null, - "textAfter": " (for details", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283250202Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:50:34.516037Z", - "requestedDate": "2022-10-10T11:50:34.502293Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "76f8140f56311dac425a925d6757522a", - "type": "headline", - "value": "2.6.9 Summary of toxicological data on impurities and metabolites", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.9 Summary of toxicological data on impurities and metabolites", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 768.6294 - }, - "width": 317.79895, - "height": -10.929359, - "page": 61 - } - ], - "sectionNumber": 245, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 65, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283250342Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1497155eea3d9d33ef9f7356e30907b9", - "type": "headline", - "value": "2.6.9.1 Metabolites", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.9.1 Metabolites", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 725.6694 - }, - "width": 94.96834, - "height": -10.929367, - "page": 61 - } - ], - "sectionNumber": 301, - "textBefore": null, - "textAfter": " The ADME", - "comments": null, - "startOffset": 0, - "endOffset": 19, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283250482Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3d92cdb47e7ca4342828320cb8b2d555", - "type": "headline", - "value": "2.6.9.2 Impurities", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.9.2 Impurities", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 408.2194 - }, - "width": 89.56975, - "height": -10.929352, - "page": 76 - } - ], - "sectionNumber": 303, - "textBefore": null, - "textAfter": " The issue", - "comments": null, - "startOffset": 0, - "endOffset": 18, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283250632Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f1b0e3583c4a511962a5519931c33618", - "type": "headline", - "value": "C., 2012)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "C., 2012)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 275.29916, - "y": 467.4818 - }, - "width": 37.92752, - "height": -10.531799, - "page": 76 - } - ], - "sectionNumber": 302, - "textBefore": "(JMPR, 2014: Carpenter ", - "textAfter": " which was", - "comments": null, - "startOffset": 1104, - "endOffset": 1113, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283250772Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:51:00.723226Z", - "requestedDate": "2022-10-10T11:51:00.708599Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4e5ad9ea9491bdefdefafd29bec09e17", - "type": "headline", - "value": "2.6.10 Summary of medical data and information", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.10 Summary of medical data and information", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 335.97937 - }, - "width": 232.8536, - "height": -10.929382, - "page": 76 - } - ], - "sectionNumber": 304, - "textBefore": null, - "textAfter": " The Occupational", - "comments": null, - "startOffset": 0, - "endOffset": 46, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283250912Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fff8ab1aa12a73869092b3f2fc11b42e", - "type": "headline", - "value": "C., 2012)", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "C., 2012)", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 308.17947, - "y": 675.2318 - }, - "width": 38.887207, - "height": -10.531799, - "page": 76 - } - ], - "sectionNumber": 302, - "textBefore": null, - "textAfter": " is referred", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283251052Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:50:56.829827Z", - "requestedDate": "2022-10-10T11:50:56.811744Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "93bc22bd2a2c1e315679f88f8304a039", - "type": "headline", - "value": "2.6.11 Toxicological end point for assessment of risk following long-term dietary exposure – ADI", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.11 Toxicological end point for assessment of risk following long-term dietary exposure – ADI", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 541.6794 - }, - "width": 453.31052, - "height": -10.929352, - "page": 77 - } - ], - "sectionNumber": 317, - "textBefore": null, - "textAfter": " For Annex", - "comments": null, - "startOffset": 0, - "endOffset": 96, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283251192Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8d6a0a6a40f37325a65d20516fa88337", - "type": "headline", - "value": "2.6.14 Summary of product exposure and risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.14 Summary of product exposure and risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 606.9594 - }, - "width": 270.95273, - "height": -10.929367, - "page": 80 - } - ], - "sectionNumber": 341, - "textBefore": null, - "textAfter": " Trinexapac-ethyl 250", - "comments": null, - "startOffset": 0, - "endOffset": 54, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283251632Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "30741ac54e682117c0f179d34c9b4aed", - "type": "headline", - "value": "2.7 Residues", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7 Residues", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 73.63472, - "height": -10.929359, - "page": 83 - } - ], - "sectionNumber": 342, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 12, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283251782Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0199748f1e38cf080d70e01ba98348a7", - "type": "headline", - "value": "2.7.1 Summary of storage stability of residues", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.1 Summary of storage stability of residues", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 727.2272 - }, - "width": 211.61658, - "height": -10.447144, - "page": 83 - } - ], - "sectionNumber": 363, - "textBefore": null, - "textAfter": " Studies investigating", - "comments": null, - "startOffset": 0, - "endOffset": 46, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283251922Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "342defe9ab1ffffdfb0214cf6bd66c65", - "type": "headline", - "value": "2.8 times", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "2.8 times", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 155.58412, - "y": 149.66681 - }, - "width": 37.39981, - "height": -10.526794, - "page": 84 - } - ], - "sectionNumber": 365, - "textBefore": null, - "textAfter": " higher than", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283252152Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:52:12.31332Z", - "requestedDate": "2022-10-10T11:52:12.296834Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d74b758ac0cd9b1cf610206ac5563d9c", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.8 times", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 71, - "y": 146 - }, - "width": 422, - "height": 625, - "page": 87 - } - ], - "sectionNumber": 365, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283252462Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6c5da8325bbd786b2437ba6bf7c73b41", - "type": "headline", - "value": "2.7.3 Definition of the residue", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.3 Definition of the residue", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 343.77713 - }, - "width": 142.80296, - "height": -10.447113, - "page": 91 - } - ], - "sectionNumber": 420, - "textBefore": null, - "textAfter": " In the", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283252612Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d2604c5b81a3b199286afce8def15e4f", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.3 Definition of the residue", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 499 - }, - "width": 126, - "height": 91, - "page": 92 - } - ], - "sectionNumber": 420, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283252752Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "14e4731ffa435ae695ca3d29a23230a3", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.3 Definition of the residue", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 644 - }, - "width": 79, - "height": 67, - "page": 93 - } - ], - "sectionNumber": 420, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283252902Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e058dac80f7a189b0f94287c0e4f2f1e", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.3 Definition of the residue", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 221 - }, - "width": 128, - "height": 53, - "page": 97 - } - ], - "sectionNumber": 420, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283253042Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ed18f20a6d276c58f9f0d641fa5312de", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.3 Definition of the residue", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 71, - "y": 358 - }, - "width": 280, - "height": 109, - "page": 99 - } - ], - "sectionNumber": 420, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283253452Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "60b9aa700609f5570e40a6cfb396e538", - "type": "headline", - "value": "CGA179500.", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 580.0418 - }, - "width": 52.578835, - "height": -10.531799, - "page": 100 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": " As the", - "comments": null, - "startOffset": 0, - "endOffset": 10, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283253592Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:52:42.374366Z", - "requestedDate": "2022-10-10T11:52:42.356591Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "53997037e819c35d1333fee9710f0cc9", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 278 - }, - "width": 106, - "height": 54, - "page": 101 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283253812Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "48c4cf2b74606e699cc839b94b3d4ebf", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 207, - "y": 555 - }, - "width": 130, - "height": 88, - "page": 101 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283253962Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a8cd4454c0d2d64c5e45af555f97b3f2", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 397 - }, - "width": 79, - "height": 64, - "page": 103 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283254112Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f5cd2462b75bf10ae6eab389f39de5c0", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 110 - }, - "width": 120, - "height": 49, - "page": 104 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283254262Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b8471a922965507e2305bd9ade84b076", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 547 - }, - "width": 102, - "height": 69, - "page": 104 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283254402Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8d397040eea0d22ef27e0e0d6d81ed81", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 395 - }, - "width": 118, - "height": 66, - "page": 105 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283254552Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "954d177f01d84a607d080f34bea7e688", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 204, - "y": 725 - }, - "width": 106, - "height": 43, - "page": 106 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283254702Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5d9ea0f17ddc0b2a2cc0df743d0aa227", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "CGA179500.", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 207, - "y": 336 - }, - "width": 109, - "height": 68, - "page": 106 - } - ], - "sectionNumber": 479, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": true, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283254852Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "075b64d779b4c1723b887092e79184aa", - "type": "headline", - "value": "2.2 for", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2 for", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 433.54, - "y": 585.3168 - }, - "width": 26.943481, - "height": -10.526825, - "page": 113 - } - ], - "sectionNumber": 480, - "textBefore": null, - "textAfter": " grain and", - "comments": null, - "startOffset": 0, - "endOffset": 7, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283254992Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fc84274f74d5132710778b98c2c90423", - "type": "headline", - "value": "2.2 for", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2 for", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 300.65625, - "y": 358.7368 - }, - "width": 27.021515, - "height": -10.526825, - "page": 113 - } - ], - "sectionNumber": 480, - "textBefore": "conversion factor is ", - "textAfter": " cereal grain", - "comments": null, - "startOffset": 939, - "endOffset": 946, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283255132Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b1c47b24d5a284fb5ba280fc89f22c93", - "type": "headline", - "value": "2.7.4 Summary of residue trials in plants and identification of critical GAP", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.4 Summary of residue trials in plants and identification of critical GAP", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 770.18713 - }, - "width": 335.4577, - "height": -10.447144, - "page": 115 - } - ], - "sectionNumber": 491, - "textBefore": null, - "textAfter": " Representative use", - "comments": null, - "startOffset": 0, - "endOffset": 76, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283255272Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7d7a47d6a1141073033dd8ba388e992a", - "type": "headline", - "value": "2.7.5 Summary of feeding studies in poultry, ruminants, pigs and fish", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.5 Summary of feeding studies in poultry, ruminants, pigs and fish", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 453.83716 - }, - "width": 311.65924, - "height": -10.447144, - "page": 117 - } - ], - "sectionNumber": 556, - "textBefore": null, - "textAfter": " Dietary burden", - "comments": null, - "startOffset": 0, - "endOffset": 69, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283255422Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "963587a5784b46753078a1f3bbbc1e43", - "type": "headline", - "value": "2.7.6 Summary of effects of processing", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.6 Summary of effects of processing", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 607.43713 - }, - "width": 180.95636, - "height": -10.447144, - "page": 122 - } - ], - "sectionNumber": 557, - "textBefore": null, - "textAfter": " The effect", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283255562Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e22c65a45f137417e13c67c600d5b5fd", - "type": "headline", - "value": "2.7.7 Summary of residues in rotational crops", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.7 Summary of residues in rotational crops", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 599.15717 - }, - "width": 211.79587, - "height": -10.447144, - "page": 124 - } - ], - "sectionNumber": 558, - "textBefore": null, - "textAfter": " The metabolism", - "comments": null, - "startOffset": 0, - "endOffset": 45, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283255702Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a92f9bc869013955eaf946a851cba49e", - "type": "headline", - "value": "2.7.8 Summary of other studies", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.8 Summary of other studies", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 711.74713 - }, - "width": 150.02396, - "height": -10.447144, - "page": 125 - } - ], - "sectionNumber": 559, - "textBefore": null, - "textAfter": " No studies", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283255852Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4e970526ed5e042d9980095f64602135", - "type": "headline", - "value": "2.7.9 Estimation of the potential and actual exposure through diet and other sources", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.9 Estimation of the potential and actual exposure through diet and other sources", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 225.66718 - }, - "width": 374.77136, - "height": -10.447144, - "page": 125 - } - ], - "sectionNumber": 654, - "textBefore": null, - "textAfter": " The definition", - "comments": null, - "startOffset": 0, - "endOffset": 84, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283258471Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "52699efb17d259ef4706847e118cf6c0", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.9 Estimation of the potential and actual exposure through diet and other sources", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 417, - "y": 711 - }, - "width": 141, - "height": 17, - "page": 127 - } - ], - "sectionNumber": 654, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283258631Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "077767f2138c980e4ebbec1a6ca64e48", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.9 Estimation of the potential and actual exposure through diet and other sources", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 417, - "y": 736 - }, - "width": 141, - "height": 35, - "page": 127 - } - ], - "sectionNumber": 654, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283258851Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fd4fc482393f8c030d7fca5f2b08b6e9", - "type": "headline", - "value": "2.7.10 Proposed MRLs and compliance with existing MRLs", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.10 Proposed MRLs and compliance with existing MRLs", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 378.69714 - }, - "width": 265.40073, - "height": -10.447144, - "page": 136 - } - ], - "sectionNumber": 668, - "textBefore": null, - "textAfter": " EU MRLs", - "comments": null, - "startOffset": 0, - "endOffset": 54, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283259001Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "145d39037b8cbba79c704242871ae7a5", - "type": "headline", - "value": "2.7.11 Proposed import tolerances and compliance with existing import tolerances", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.11 Proposed import tolerances and compliance with existing import tolerances", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 563.75714 - }, - "width": 361.4566, - "height": -10.447144, - "page": 137 - } - ], - "sectionNumber": 669, - "textBefore": null, - "textAfter": " No import", - "comments": null, - "startOffset": 0, - "endOffset": 80, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283259131Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "37850594fc13f524e53f98e7c8ebf4bc", - "type": "headline", - "value": "2.8 Fate and behaviour in the environment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8 Fate and behaviour in the environment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 215.7858, - "height": -10.929359, - "page": 138 - } - ], - "sectionNumber": 670, - "textBefore": null, - "textAfter": " Majority experimental", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283259281Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5ca1508bcd74a4c3444922ff7855d36c", - "type": "headline", - "value": "2.8.1 Summary of fate and behaviour in soil", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.1 Summary of fate and behaviour in soil", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 623.7872 - }, - "width": 203.7948, - "height": -10.447144, - "page": 138 - } - ], - "sectionNumber": 671, - "textBefore": null, - "textAfter": " The degradation", - "comments": null, - "startOffset": 0, - "endOffset": 43, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283259431Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d1c162d31fbb25463983de8d2cf3ad39", - "type": "headline", - "value": "0.21 days.", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "0.21 days.", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 562.7568 - }, - "width": 40.647247, - "height": -10.526825, - "page": 140 - } - ], - "sectionNumber": 673, - "textBefore": null, - "textAfter": " Under anaerobic", - "comments": null, - "startOffset": 0, - "endOffset": 10, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283259581Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:53:42.027327Z", - "requestedDate": "2022-10-10T11:53:42.016138Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f30fa8528caf95f03bd215763d0a4c60", - "type": "headline", - "value": "0.72 days. For modelling purpose, first-order normalised DT50 values ranged from 0.045 to 0.72 days, with a", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "0.72 days. For modelling purpose, first-order normalised DT50 values ranged from 0.045 to 0.72 days, with a", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 753.2268 - }, - "width": 260.44598, - "height": -12.086815, - "page": 140 - }, - { - "topLeft": { - "x": 335.47, - "y": 753.2268 - }, - "width": 195.23611, - "height": -10.526817, - "page": 140 - } - ], - "sectionNumber": 672, - "textBefore": null, - "textAfter": " geometric mean", - "comments": null, - "startOffset": 0, - "endOffset": 107, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283259731Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:53:37.920729Z", - "requestedDate": "2022-10-10T11:53:37.899067Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ff5ae2632a649103560d152929f5c6ff", - "type": "headline", - "value": "2.8.2 Summary of fate and behaviour in water and sediment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.2 Summary of fate and behaviour in water and sediment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 204.66718 - }, - "width": 272.9592, - "height": -10.447144, - "page": 141 - } - ], - "sectionNumber": 674, - "textBefore": null, - "textAfter": " Hydrolysis New", - "comments": null, - "startOffset": 0, - "endOffset": 57, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283259951Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cf235ff41fcef22669f83f0d22619295", - "type": "headline", - "value": "CGA300405", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "CGA300405", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 94.05397, - "y": 357.46213 - }, - "width": 44.556595, - "height": -10.697571, - "page": 143 - } - ], - "sectionNumber": 675, - "textBefore": null, - "textAfter": " Citric acid", - "comments": null, - "startOffset": 0, - "endOffset": 9, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283260091Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:53:53.227035Z", - "requestedDate": "2022-10-10T11:53:53.211846Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cb4b1a700be93c6474eced1d110d99db", - "type": "headline", - "value": "2.8.3 Summary of fate and behaviour in air", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.3 Summary of fate and behaviour in air", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 770.18713 - }, - "width": 201.3877, - "height": -10.447144, - "page": 145 - } - ], - "sectionNumber": 676, - "textBefore": null, - "textAfter": " Trinexapac-ethyl has", - "comments": null, - "startOffset": 0, - "endOffset": 42, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283260301Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "27f79d15c9b90f5216b0d9a43dd0f7ed", - "type": "headline", - "value": "2.8.5 Definition of the residues in the environment requiring further assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.5 Definition of the residues in the environment requiring further assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 573.71716 - }, - "width": 355.8275, - "height": -10.447144, - "page": 145 - } - ], - "sectionNumber": 695, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 80, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283260581Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c65a0398a13aece118f679d64e457410", - "type": "headline", - "value": "2.8.6 Summary of exposure calculations and product assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.6 Summary of exposure calculations and product assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 308.3893, - "height": -10.929359, - "page": 146 - } - ], - "sectionNumber": 696, - "textBefore": null, - "textAfter": " PECsoil Acceptable", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283260731Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7d976780efd1661d191514cadffc7003", - "type": "headline", - "value": "1.2 day", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "1.2 day", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 275.05292, - "y": 572.2368 - }, - "width": 30.477661, - "height": -10.526825, - "page": 146 - } - ], - "sectionNumber": 697, - "textBefore": null, - "textAfter": " was selected", - "comments": null, - "startOffset": 0, - "endOffset": 7, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283260871Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T11:54:18.318037Z", - "requestedDate": "2022-10-10T11:54:18.297731Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e0e0c3bcf6d1d0055fc935a6d464df6f", - "type": "headline", - "value": "2.9 Effects on non-target species", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9 Effects on non-target species", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 166.28503, - "height": -10.929359, - "page": 148 - } - ], - "sectionNumber": 698, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 33, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283261011Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "55c549edfa85c8f00ba288b58634169a", - "type": "headline", - "value": "2.9.1 Summary of effects on birds and other terrestrial vertebrates", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.1 Summary of effects on birds and other terrestrial vertebrates", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 726.7494 - }, - "width": 319.05402, - "height": -10.929367, - "page": 148 - } - ], - "sectionNumber": 699, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 67, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283261151Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7be7a4cc5006754201282ffa7aa4bf92", - "type": "headline", - "value": "2.9.1.2 Potential for endocrine disruption properties in birds and mammals", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.1.2 Potential for endocrine disruption properties in birds and mammals", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 249.78717 - }, - "width": 325.59305, - "height": -10.447144, - "page": 148 - } - ], - "sectionNumber": 712, - "textBefore": null, - "textAfter": " A review", - "comments": null, - "startOffset": 0, - "endOffset": 74, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283261671Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a39b84ba1bdc3791794e8a8db70be172", - "type": "headline", - "value": "2.9.1.1. Birds", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.1.1. Birds", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 695.78937 - }, - "width": 61.525925, - "height": -10.929367, - "page": 148 - } - ], - "sectionNumber": 711, - "textBefore": null, - "textAfter": " Avian acute", - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283261811Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "903033c5c2328e43ee6252e24a273731", - "type": "headline", - "value": "2.9.2 Summary of effects on aquatic organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.2 Summary of effects on aquatic organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 418.6594 - }, - "width": 230.04605, - "height": -10.929352, - "page": 149 - } - ], - "sectionNumber": 737, - "textBefore": null, - "textAfter": " The toxicity", - "comments": null, - "startOffset": 0, - "endOffset": 45, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283261961Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bc6dba7a3368ffe0f269e153b12a5c0d", - "type": "headline", - "value": "2.9.2.2 Assessment of toxicity (T)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.2.2 Assessment of toxicity (T)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 657.7494 - }, - "width": 156.68529, - "height": -10.929367, - "page": 151 - } - ], - "sectionNumber": 739, - "textBefore": null, - "textAfter": " An active", - "comments": null, - "startOffset": 0, - "endOffset": 34, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283262111Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4b55a0c82c183bb21dcafc5640e49a44", - "type": "headline", - "value": "2.9.2.3 Potential for endocrine disruption properties in aquatic organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.2.3 Potential for endocrine disruption properties in aquatic organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 548.7594 - }, - "width": 347.40738, - "height": -10.929352, - "page": 151 - } - ], - "sectionNumber": 740, - "textBefore": null, - "textAfter": " Population relevant", - "comments": null, - "startOffset": 0, - "endOffset": 74, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283262241Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b98b46e99d49bffd3d24cf1ececbccbe", - "type": "headline", - "value": "2.9.3 Summary of effects on arthropods", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.3 Summary of effects on arthropods", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 327.33936 - }, - "width": 196.71634, - "height": -10.929382, - "page": 151 - } - ], - "sectionNumber": 741, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283262471Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "dc519519416a59f30ea5b47fdc2678a2", - "type": "headline", - "value": "2.9.2.1 Assessment of bioaccumulation (B)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.2.1 Assessment of bioaccumulation (B)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 199.99527, - "height": -10.929359, - "page": 151 - } - ], - "sectionNumber": 738, - "textBefore": null, - "textAfter": " Since trinexapac-ethyl", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283262611Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3d02554f2d588a4f5f0cf12542788474", - "type": "headline", - "value": "2.9.3.1 Summary of effects on bees", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.3.1 Summary of effects on bees", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 296.2594 - }, - "width": 168.26288, - "height": -10.929382, - "page": 151 - } - ], - "sectionNumber": 749, - "textBefore": null, - "textAfter": " The toxicity", - "comments": null, - "startOffset": 0, - "endOffset": 34, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283262751Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a9ea9dcf7594430e65c5f930f830f188", - "type": "headline", - "value": "2.9.3.2 Summary of effects on arthropods other than bees", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.3.2 Summary of effects on arthropods other than bees", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 469.3194 - }, - "width": 271.55655, - "height": -10.929352, - "page": 152 - } - ], - "sectionNumber": 761, - "textBefore": null, - "textAfter": " The toxicity", - "comments": null, - "startOffset": 0, - "endOffset": 56, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283262971Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e6367da030041101cfc5c895f722b451", - "type": "headline", - "value": "2.9.4.1 Summary of effects on earthworms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.4.1 Summary of effects on earthworms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 593.39935 - }, - "width": 204.95984, - "height": -10.929352, - "page": 153 - } - ], - "sectionNumber": 776, - "textBefore": null, - "textAfter": " Data on", - "comments": null, - "startOffset": 0, - "endOffset": 40, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283263181Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d2369ec197ecbb94fd3b9007b91eff66", - "type": "headline", - "value": "2.9.4 Summary of effects on non-target soil meso- and macrofauna", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.4 Summary of effects on non-target soil meso- and macrofauna", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 636.3894 - }, - "width": 318.742, - "height": -10.929367, - "page": 153 - } - ], - "sectionNumber": 762, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 64, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283263321Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c726b247c7817e863b0763e981f23812", - "type": "headline", - "value": "2.9.4.2 Summary of effects on other soil macro-organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.4.2 Summary of effects on other soil macro-organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 591.9594 - }, - "width": 276.59702, - "height": -10.929352, - "page": 154 - } - ], - "sectionNumber": 787, - "textBefore": null, - "textAfter": " New studies", - "comments": null, - "startOffset": 0, - "endOffset": 56, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283263461Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0503e5a0d3f95f9662f99cdf3978ab76", - "type": "headline", - "value": "2.9.6 Summary of effects on terrestrial non-target higher plants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.6 Summary of effects on terrestrial non-target higher plants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 183.90936 - }, - "width": 304.88828, - "height": -10.929382, - "page": 155 - } - ], - "sectionNumber": 809, - "textBefore": null, - "textAfter": " In the", - "comments": null, - "startOffset": 0, - "endOffset": 64, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283263601Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "25e0dba3010785ad3f8a435fa1e69b47", - "type": "headline", - "value": "2.9.5 Summary of effects on soil nitrogen transformation", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.5 Summary of effects on soil nitrogen transformation", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 735.3894 - }, - "width": 276.7563, - "height": -10.929359, - "page": 155 - } - ], - "sectionNumber": 798, - "textBefore": null, - "textAfter": " In the", - "comments": null, - "startOffset": 0, - "endOffset": 56, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283263751Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9489bb25edd80ee82115f7680ff06cfb", - "type": "headline", - "value": "2.9.8 Summary of effects on biological methods for sewage treatment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.8 Summary of effects on biological methods for sewage treatment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 300.33936 - }, - "width": 329.66418, - "height": -10.929382, - "page": 156 - } - ], - "sectionNumber": 815, - "textBefore": null, - "textAfter": " In the", - "comments": null, - "startOffset": 0, - "endOffset": 67, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283263901Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e7beb9703a61010280b080bfa056b356", - "type": "headline", - "value": "2.9.7 Summary of effects on other terrestrial organisms (flora and fauna)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.7 Summary of effects on other terrestrial organisms (flora and fauna)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 407.01938 - }, - "width": 349.3698, - "height": -10.929352, - "page": 156 - } - ], - "sectionNumber": 810, - "textBefore": null, - "textAfter": " No data", - "comments": null, - "startOffset": 0, - "endOffset": 73, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283264051Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b7817cf0477d78421d8bb6a97af8840f", - "type": "headline", - "value": "2.9.9 Summary of product exposure and risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9 Summary of product exposure and risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 697.7094 - }, - "width": 270.95273, - "height": -10.929367, - "page": 157 - } - ], - "sectionNumber": 824, - "textBefore": null, - "textAfter": " The formulation", - "comments": null, - "startOffset": 0, - "endOffset": 53, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283264201Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a9927f574c2d6dc04a36883c8185764c", - "type": "headline", - "value": "2.9.9.2 Summary of product exposure and risk assessment for aquatic organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.2 Summary of product exposure and risk assessment for aquatic organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 386.85938 - }, - "width": 380.4969, - "height": -10.929352, - "page": 162 - } - ], - "sectionNumber": 947, - "textBefore": null, - "textAfter": " The risk", - "comments": null, - "startOffset": 0, - "endOffset": 77, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283264501Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0f0c2d4bb45c51efaf86d1cb88568226", - "type": "headline", - "value": "2.9.9.3 Summary of product exposure and risk assessment for arthropods", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.3 Summary of product exposure and risk assessment for arthropods", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 667.7094 - }, - "width": 347.0371, - "height": -10.929367, - "page": 167 - } - ], - "sectionNumber": 948, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 70, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283264641Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "078b4b6916bdb3b8e71b2e079ac3b20a", - "type": "headline", - "value": "2.9.9.3.1 Summary of product exposure and risk assessment for bees", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.3.1 Summary of product exposure and risk assessment for bees", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 624.7494 - }, - "width": 321.36572, - "height": -10.929367, - "page": 167 - } - ], - "sectionNumber": 975, - "textBefore": null, - "textAfter": " Acute risk", - "comments": null, - "startOffset": 0, - "endOffset": 66, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283265101Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bee5aa26d3f74b22ff507959093984aa", - "type": "headline", - "value": "2.9.9.3.2 Summary of product exposure and risk assessment for arthropods other than bees", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.3.2 Summary of product exposure and risk assessment for arthropods other than bees", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 711.2694 - }, - "width": 428.67288, - "height": -10.929367, - "page": 171 - } - ], - "sectionNumber": 1004, - "textBefore": null, - "textAfter": " The risk", - "comments": null, - "startOffset": 0, - "endOffset": 88, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283265241Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "aa2f84e5bc20b7ac5462372497053499", - "type": "headline", - "value": "2.9.9.5 Summary of product exposure and risk assessment for soil nitrogen transformation", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.5 Summary of product exposure and risk assessment for soil nitrogen transformation", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 455.2794 - }, - "width": 425.89914, - "height": -10.929352, - "page": 174 - } - ], - "sectionNumber": 1030, - "textBefore": null, - "textAfter": " The risk", - "comments": null, - "startOffset": 0, - "endOffset": 88, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283265601Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b9e1ac39dc04c3682dabdeac3ebba499", - "type": "headline", - "value": "2.9.9.6 Summary of product exposure and risk assessment for terrestrial non-target higher plants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.6 Summary of product exposure and risk assessment for terrestrial non-target higher plants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 295.41937 - }, - "width": 458.03836, - "height": -10.929382, - "page": 175 - } - ], - "sectionNumber": 1031, - "textBefore": null, - "textAfter": " The risk", - "comments": null, - "startOffset": 0, - "endOffset": 96, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283265751Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c39e9603615e75177cfe8cb447e854cd", - "type": "headline", - "value": "2.10 Classification and labelling", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.10 Classification and labelling", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 552.83936 - }, - "width": 159.16164, - "height": -10.929352, - "page": 176 - } - ], - "sectionNumber": 1087, - "textBefore": null, - "textAfter": " Table 2.10-1:", - "comments": null, - "startOffset": 0, - "endOffset": 33, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283266031Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6a98158b459ad05b7e74e0909919e2e0", - "type": "headline", - "value": "2.11.3.2 STEP 3, Stage 2: screening for genotoxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.2 STEP 3, Stage 2: screening for genotoxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 411.7768 - }, - "width": 211.72574, - "height": -10.526825, - "page": 180 - } - ], - "sectionNumber": 1090, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 52, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283266321Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "48bcbba8ac0ba463a9e8174ede3cc9a2", - "type": "headline", - "value": "2.11 Relevance of metabolites in groundwater", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11 Relevance of metabolites in groundwater", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 684.9894 - }, - "width": 224.0166, - "height": -10.929367, - "page": 180 - } - ], - "sectionNumber": 1088, - "textBefore": null, - "textAfter": " 2.11.1. STEP", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283266461Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "954d8558441d59aa80e40e9174d189b2", - "type": "headline", - "value": "2.11.3.3 STEP 3, Stage 3: screening for toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.3 STEP 3, Stage 3: screening for toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 385.4968 - }, - "width": 192.24847, - "height": -10.526825, - "page": 180 - } - ], - "sectionNumber": 1091, - "textBefore": null, - "textAfter": " 2.11.4. STEP", - "comments": null, - "startOffset": 0, - "endOffset": 48, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283266601Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "43c9291ca6dc57a00b22c4a1f99883f6", - "type": "headline", - "value": "2.12 Consideration of isomeric composition in the risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12 Consideration of isomeric composition in the risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 219.66937 - }, - "width": 316.96738, - "height": -10.929382, - "page": 180 - } - ], - "sectionNumber": 1092, - "textBefore": null, - "textAfter": " Not relevant.", - "comments": null, - "startOffset": 0, - "endOffset": 65, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283266741Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0ac81d4f6cf26a796feaa3188753bfc9", - "type": "headline", - "value": "2.11.3.1 STEP 3, Stage 1: screening for biological activity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.1 STEP 3, Stage 1: screening for biological activity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 438.0568 - }, - "width": 234.28693, - "height": -10.526825, - "page": 180 - } - ], - "sectionNumber": 1089, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 59, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283266881Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "71dac49d92b472df21ade3403c7e2df6", - "type": "headline", - "value": "2.12.4 Operator, Worker, Bystander and Resident exposure", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.4 Operator, Worker, Bystander and Resident exposure", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 646.46716 - }, - "width": 266.6357, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1096, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 56, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283267101Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9ef15de83c70ce84f66dc14296fe20c1", - "type": "headline", - "value": "2.12.2 Methods of analysis", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.2 Methods of analysis", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 728.90717 - }, - "width": 124.50366, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1094, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 26, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283267231Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d096ee670fb324ba64feb5aa933a7223", - "type": "headline", - "value": "2.13 Residue definition", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.13 Residue definition", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 480.95938 - }, - "width": 117.44147, - "height": -10.929352, - "page": 181 - } - ], - "sectionNumber": 1100, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283267381Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ca8aa2fbd0c43f119ade268ab7cac58d", - "type": "headline", - "value": "2.13.1 Definition of residues for exposure/risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.13.1 Definition of residues for exposure/risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 438.45715 - }, - "width": 255.70883, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1101, - "textBefore": null, - "textAfter": " Food of", - "comments": null, - "startOffset": 0, - "endOffset": 58, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283267521Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "806d34ca303fd01d602b700e61056dd7", - "type": "headline", - "value": "2.12.3 Mammalian toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.3 Mammalian toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 687.74713 - }, - "width": 126.10004, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1095, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283267671Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e1c4792da6837ef16911833f134147c0", - "type": "headline", - "value": "2.12.6 Environmental fate", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.6 Environmental fate", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 563.87714 - }, - "width": 123.01245, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1098, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283267821Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "136ed95c32e9e97ba44ce65eea6b9765", - "type": "headline", - "value": "2.12.5 Residues and Consumer risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.5 Residues and Consumer risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 605.15717 - }, - "width": 211.39755, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1097, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283267961Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fff513d74be9ed51a21ab439ca3a09a1", - "type": "headline", - "value": "2.12.7 Ecotoxciology", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.7 Ecotoxciology", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 522.71716 - }, - "width": 99.35741, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1099, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 20, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283268171Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "842f1188b01f93a89c75a5d2bc75313d", - "type": "headline", - "value": "2.12.1 Identity and physical chemical properties", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.1 Identity and physical chemical properties", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 770.18713 - }, - "width": 216.48709, - "height": -10.447144, - "page": 181 - } - ], - "sectionNumber": 1093, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 48, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283268311Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3ebc21c88827078833625ef99b335718", - "type": "headline", - "value": "2.14 Effect of water treatment processes on the nature of residues present in surface water", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.14 Effect of water treatment processes on the nature of residues present in surface water", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 330.21936 - }, - "width": 432.2804, - "height": -10.929382, - "page": 182 - } - ], - "sectionNumber": 1103, - "textBefore": null, - "textAfter": " Level 3", - "comments": null, - "startOffset": 0, - "endOffset": 91, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283268451Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b40a3c1c8a6611462cc733b613c4e918", - "type": "headline", - "value": "2.13.2 Definition of residues for monitoring", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.13.2 Definition of residues for monitoring", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 677.18713 - }, - "width": 196.38779, - "height": -10.447144, - "page": 182 - } - ], - "sectionNumber": 1102, - "textBefore": null, - "textAfter": " Food of", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283268591Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "da387294f60cb387e54040c5dc40e35a", - "type": "headline", - "value": "3.1 Background to the proposed decision", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1 Background to the proposed decision", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 416.87714 - }, - "width": 190.22484, - "height": -10.447144, - "page": 183 - } - ], - "sectionNumber": 1170, - "textBefore": null, - "textAfter": " 3.1.1 Proposal", - "comments": null, - "startOffset": 0, - "endOffset": 39, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283268721Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7a886a0fd034991c11c9b561517bdc7a", - "type": "headline", - "value": "3.1.2 Proposal – Candidate for substitution", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.2 Proposal – Candidate for substitution", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 523.58716 - }, - "width": 192.52785, - "height": -10.447144, - "page": 190 - } - ], - "sectionNumber": 1174, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 43, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283268941Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "efb86003314a44bfef623ac3d42d40b2", - "type": "headline", - "value": "3.1.3 Proposal – Low risk active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.3 Proposal – Low risk active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 523.58716 - }, - "width": 189.39046, - "height": -10.447144, - "page": 191 - } - ], - "sectionNumber": 1178, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 42, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283269101Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6a70847a6291059e561c459276ebe624", - "type": "headline", - "value": "3.1.4 List of studies to be generated, still ongoing or available but not evaluated", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.4 List of studies to be generated, still ongoing or available but not evaluated", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 523.58716 - }, - "width": 345.96942, - "height": -10.447144, - "page": 192 - } - ], - "sectionNumber": 1229, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 83, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283269241Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0c70b3980e624366f18c8a49f004bf00", - "type": "headline", - "value": "3.1.6 Critical areas of concern", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.6 Critical areas of concern", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 234.30713 - }, - "width": 137.1937, - "height": -10.447144, - "page": 196 - } - ], - "sectionNumber": 1249, - "textBefore": null, - "textAfter": " 1) An", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283269481Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5200c2e0708bce8296ecf2969d620702", - "type": "headline", - "value": "3.1.5 Issues that could not be finalised", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.5 Issues that could not be finalised", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 755.18713 - }, - "width": 170.43198, - "height": -10.447144, - "page": 196 - } - ], - "sectionNumber": 1240, - "textBefore": null, - "textAfter": " 1) An", - "comments": null, - "startOffset": 0, - "endOffset": 40, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283269641Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "75d788450d09512093733984dde231de", - "type": "headline", - "value": "3.1.7 Overview table of the concerns identified for each representative use considered", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.7 Overview table of the concerns identified for each representative use considered", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 386.73715 - }, - "width": 372.2236, - "height": -10.447144, - "page": 197 - } - ], - "sectionNumber": 1274, - "textBefore": null, - "textAfter": " (If a", - "comments": null, - "startOffset": 0, - "endOffset": 86, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283269881Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bcaaebe8802bdd9a02018e6e19ee605a", - "type": "headline", - "value": "3.1.8 Area(s) where expert consultation is considered necessary", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.8 Area(s) where expert consultation is considered necessary", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 549.2371 - }, - "width": 277.9086, - "height": -10.447144, - "page": 198 - } - ], - "sectionNumber": 1280, - "textBefore": null, - "textAfter": " It is", - "comments": null, - "startOffset": 0, - "endOffset": 63, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283270031Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "943f49091dec2a28ada263a29e01e2d2", - "type": "headline", - "value": "3.1.9 Critical issues on which the Co-RMS did not agree with the assessment by the RMS", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.9 Critical issues on which the Co-RMS did not agree with the assessment by the RMS", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 241.86713 - }, - "width": 387.43008, - "height": -10.447144, - "page": 198 - } - ], - "sectionNumber": 1287, - "textBefore": null, - "textAfter": " Points on", - "comments": null, - "startOffset": 0, - "endOffset": 86, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283270271Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ca9466806615981d4c1c87b6ab5ce5b3", - "type": "headline", - "value": "3.2 Proposed decision", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.2 Proposed decision", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 770.18713 - }, - "width": 108.80769, - "height": -10.447144, - "page": 199 - } - ], - "sectionNumber": 1288, - "textBefore": null, - "textAfter": " It is", - "comments": null, - "startOffset": 0, - "endOffset": 21, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283270411Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "423496c3bd0f51d45003d94c4928e26d", - "type": "headline", - "value": "3.3.1 Particular conditions proposed to be taken into account to manage the risks identified", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.3.1 Particular conditions proposed to be taken into account to manage the risks identified", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 318.45715 - }, - "width": 397.64487, - "height": -10.447144, - "page": 199 - } - ], - "sectionNumber": 1296, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 92, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283270701Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2296c8ac59190e804bd82d7fdba4e891", - "type": "headline", - "value": "APPENDICES", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDICES", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.7094 - }, - "width": 70.31377, - "height": -10.929359, - "page": 200 - } - ], - "sectionNumber": 1297, - "textBefore": null, - "textAfter": " Appendix 1", - "comments": null, - "startOffset": 0, - "endOffset": 10, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283270841Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a6f745eb3bca178245145848013d7e2c", - "type": "headline", - "value": "1 Statement of subject matter and purpose for which this report has been prepared and background information on the application", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1 Statement of subject matter and purpose for which this report has been prepared and", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 706.87537 - }, - "width": 5.52, - "height": 9.85872, - "page": 8 - }, - { - "topLeft": { - "x": 96.984, - "y": 706.87537 - }, - "width": 427.23697, - "height": 9.85872, - "page": 8 - }, - { - "topLeft": { - "x": 97.104, - "y": 687.91534 - }, - "width": 203.01456, - "height": 9.85872, - "page": 8 - } - ], - "sectionNumber": 8, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 127, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283236042Z" - }, - { - "analysisNumber": 3, - "type": "CHANGED", - "dateTime": "2022-10-10T11:44:45.955046089Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:44:44.37Z", - "requestedDate": "2022-10-10T11:44:44.370012Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "1 Statement of subject matter and purpose for which this report has been prepared and background information on the application" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b22e85eab47259518edbf245c83c9bcf", - "type": "headline", - "value": "1.4.3 Trade name or proposed trade name and producer's development code number of the plant protection product", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.3 Trade name or proposed trade name and producer's development code number of the", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 276.47537 - }, - "width": 453.30032, - "height": 9.85872, - "page": 13 - }, - { - "topLeft": { - "x": 102.98, - "y": 257.51535 - }, - "width": 115.5888, - "height": 9.85872, - "page": 13 - } - ], - "sectionNumber": 44, - "textBefore": null, - "textAfter": " Producer’s development", - "comments": null, - "startOffset": 0, - "endOffset": 110, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283239112Z" - }, - { - "analysisNumber": 4, - "type": "CHANGED", - "dateTime": "2022-10-10T11:45:32.635877455Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:45:31.655Z", - "requestedDate": "2022-10-10T11:45:31.655832Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "1.4.3 Trade name or proposed trade name and producer's development code number of the plant protection product" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "091e3ae3da3e6e028f8faaf3b2a1781d", - "type": "headline", - "value": "1.4.4 Detailed quantitative and qualitative information on the composition of the plant protection product", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4 Detailed quantitative and qualitative information on the composition of the plant", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 758.47534 - }, - "width": 453.44345, - "height": 9.85872, - "page": 14 - }, - { - "topLeft": { - "x": 102.98, - "y": 739.5154 - }, - "width": 88.36416, - "height": 9.85872, - "page": 14 - } - ], - "sectionNumber": 45, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 106, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283239882Z" - }, - { - "analysisNumber": 5, - "type": "CHANGED", - "dateTime": "2022-10-10T11:45:55.739619022Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:45:54.71Z", - "requestedDate": "2022-10-10T11:45:54.710595Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "1.4.4 Detailed quantitative and qualitative information on the composition of the plant protection product" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b420306d4d52021d2a67acb7a99e3738", - "type": "headline", - "value": "1.5.3 Details of other uses applied for to support the setting of MRLs for uses beyond the representative uses", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.3 Details of other uses applied for to support the setting of MRLs for uses beyond the", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 670.15533 - }, - "width": 451.1144, - "height": 9.85872, - "page": 17 - }, - { - "topLeft": { - "x": 104.06, - "y": 651.1954 - }, - "width": 89.55648, - "height": 9.85872, - "page": 17 - } - ], - "sectionNumber": 69, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 110, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283241342Z" - }, - { - "analysisNumber": 6, - "type": "CHANGED", - "dateTime": "2022-10-10T11:46:14.231296042Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:46:13.24Z", - "requestedDate": "2022-10-10T11:46:13.240474Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "1.5.3 Details of other uses applied for to support the setting of MRLs for uses beyond the representative uses" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e22537b634eaca81cc25fbf8dbf67c36", - "type": "headline", - "value": "2.6.8.1 28-Day immunotoxicity feeding study in mice and a review concerning immunotoxicity potential", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.8.1 28-Day immunotoxicity feeding study in mice and a review concerning immunotoxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 72.024, - "y": 483.40536 - }, - "width": 451.43872, - "height": 9.85872, - "page": 56 - }, - { - "topLeft": { - "x": 111.98, - "y": 464.44537 - }, - "width": 41.5656, - "height": 9.85872, - "page": 56 - } - ], - "sectionNumber": 241, - "textBefore": null, - "textAfter": " An immunotoxicity", - "comments": null, - "startOffset": 0, - "endOffset": 100, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283249562Z" - }, - { - "analysisNumber": 8, - "type": "CHANGED", - "dateTime": "2022-10-10T11:50:21.750748669Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:50:20.652Z", - "requestedDate": "2022-10-10T11:50:20.652812Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.6.8.1 28-Day immunotoxicity feeding study in mice and a review concerning immunotoxicity potential" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "66a596fccc7955d32a3c3a772db9c651", - "type": "headline", - "value": "2.6.13 Toxicological end point for assessment of occupational, bystander and residents risks – AOEL", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.13 Toxicological end point for assessment of occupational, bystander and residents risks –", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 570.28534 - }, - "width": 460.38226, - "height": 9.85872, - "page": 79 - }, - { - "topLeft": { - "x": 102.98, - "y": 551.2054 - }, - "width": 31.23216, - "height": 9.85872, - "page": 79 - } - ], - "sectionNumber": 332, - "textBefore": null, - "textAfter": " For Annex", - "comments": null, - "startOffset": 0, - "endOffset": 99, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283251482Z" - }, - { - "analysisNumber": 9, - "type": "CHANGED", - "dateTime": "2022-10-10T11:51:42.085772767Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:51:40.981Z", - "requestedDate": "2022-10-10T11:51:40.981956Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.6.13 Toxicological end point for assessment of occupational, bystander and residents risks – AOEL" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ea06a4aa1289f2851f52e5c90cb70e01", - "type": "headline", - "value": "2.7.2 Summary of metabolism, distribution and expression of residues in plants, poultry, lactating ruminants, pigs and fish", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants, poultry, lactating", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 367.57864 - }, - "width": 20.05944, - "height": 8.89428, - "page": 84 - }, - { - "topLeft": { - "x": 110.9, - "y": 367.57864 - }, - "width": 419.72437, - "height": 8.89428, - "page": 84 - }, - { - "topLeft": { - "x": 110.9, - "y": 350.41864 - }, - "width": 103.11588, - "height": 8.89428, - "page": 84 - } - ], - "sectionNumber": 364, - "textBefore": null, - "textAfter": " Metabolism in", - "comments": null, - "startOffset": 0, - "endOffset": 123, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283252302Z" - }, - { - "analysisNumber": 10, - "type": "CHANGED", - "dateTime": "2022-10-10T11:52:06.434979313Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:52:05.401Z", - "requestedDate": "2022-10-10T11:52:05.401639Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.7.2 Summary of metabolism, distribution and expression of residues in plants, poultry, lactating ruminants, pigs and fish" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8bf26f9e815d9acbe8f648e2b309f033", - "type": "headline", - "value": "2.8.4 Summary of monitoring data concerning fate and behaviour of the active substance, metabolites, degradation and reaction products", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.4 Summary of monitoring data concerning fate and behaviour of the active substance, metabolites,", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 626.94867 - }, - "width": 20.05944, - "height": 8.89428, - "page": 145 - }, - { - "topLeft": { - "x": 110.9, - "y": 626.94867 - }, - "width": 419.98364, - "height": 8.89428, - "page": 145 - }, - { - "topLeft": { - "x": 110.9, - "y": 609.66864 - }, - "width": 147.84624, - "height": 8.89428, - "page": 145 - } - ], - "sectionNumber": 677, - "textBefore": null, - "textAfter": " No monitoring", - "comments": null, - "startOffset": 0, - "endOffset": 134, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283260441Z" - }, - { - "analysisNumber": 11, - "type": "CHANGED", - "dateTime": "2022-10-10T11:54:09.753884333Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:54:08.69Z", - "requestedDate": "2022-10-10T11:54:08.690012Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.8.4 Summary of monitoring data concerning fate and behaviour of the active substance, metabolites, degradation and reaction products" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "da4bff661ea26dc30ec4e5a63bb9defe", - "type": "headline", - "value": "2.9.9.1 Summary of product exposure and risk assessment for birds and other terrestrial vertebrates", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.1 Summary of product exposure and risk assessment for birds and other terrestrial", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 350.90536 - }, - "width": 459.8547, - "height": 9.85872, - "page": 157 - }, - { - "topLeft": { - "x": 102.98, - "y": 331.94537 - }, - "width": 53.2128, - "height": 9.85872, - "page": 157 - } - ], - "sectionNumber": 865, - "textBefore": null, - "textAfter": " Birds Risk", - "comments": null, - "startOffset": 0, - "endOffset": 99, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283264351Z" - }, - { - "analysisNumber": 12, - "type": "CHANGED", - "dateTime": "2022-10-10T11:55:18.042546739Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:55:16.902Z", - "requestedDate": "2022-10-10T11:55:16.902037Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.9.9.1 Summary of product exposure and risk assessment for birds and other terrestrial vertebrates" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "30f45cdc3591253f2ca9fcc482002493", - "type": "headline", - "value": "2.9.9.4 Summary of product exposure and risk assessment for non-target soil meso- and macrofauna", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.4 Summary of product exposure and risk assessment for non-target soil meso- and", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 682.7554 - }, - "width": 460.30896, - "height": 9.85872, - "page": 173 - }, - { - "topLeft": { - "x": 102.98, - "y": 663.79535 - }, - "width": 56.97744, - "height": 9.85872, - "page": 173 - } - ], - "sectionNumber": 1020, - "textBefore": null, - "textAfter": " Earthworms The", - "comments": null, - "startOffset": 0, - "endOffset": 96, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283265391Z" - }, - { - "analysisNumber": 13, - "type": "CHANGED", - "dateTime": "2022-10-10T11:55:50.961671035Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:55:50.009Z", - "requestedDate": "2022-10-10T11:55:50.009172Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.9.9.4 Summary of product exposure and risk assessment for non-target soil meso- and macrofauna" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "55920aa120430516ffc4fca499d2523d", - "type": "headline", - "value": "2.9.9.7 Summary of product exposure and risk assessment for other terrestrial organisms (flora and fauna)", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.7 Summary of product exposure and risk assessment for other terrestrial organisms (flora", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 758.47534 - }, - "width": 459.86526, - "height": 9.85872, - "page": 176 - }, - { - "topLeft": { - "x": 102.98, - "y": 739.5154 - }, - "width": 51.07104, - "height": 9.85872, - "page": 176 - } - ], - "sectionNumber": 1032, - "textBefore": null, - "textAfter": " No data", - "comments": null, - "startOffset": 0, - "endOffset": 105, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283266181Z" - }, - { - "analysisNumber": 14, - "type": "CHANGED", - "dateTime": "2022-10-10T11:56:23.821744708Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:56:22.664Z", - "requestedDate": "2022-10-10T11:56:22.664265Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.9.9.7 Summary of product exposure and risk assessment for other terrestrial organisms (flora and fauna)" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "54c4b871f93316993721dfe963d7b0e3", - "type": "headline", - "value": "2.9.9.8 Summary of product exposure and risk assessment for biological methods for sewage treatment", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9.8 Summary of product exposure and risk assessment for biological methods for sewage", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 667.2753 - }, - "width": 459.932, - "height": 9.85872, - "page": 176 - }, - { - "topLeft": { - "x": 102.98, - "y": 648.31537 - }, - "width": 46.4784, - "height": 9.85872, - "page": 176 - } - ], - "sectionNumber": 1033, - "textBefore": null, - "textAfter": " The risk", - "comments": null, - "startOffset": 0, - "endOffset": 99, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283265881Z" - }, - { - "analysisNumber": 15, - "type": "CHANGED", - "dateTime": "2022-10-10T11:56:43.650278321Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T11:56:42.58Z", - "requestedDate": "2022-10-10T11:56:42.580349Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.9.9.8 Summary of product exposure and risk assessment for biological methods for sewage treatment" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "25ccf150d659f969e7cc9858626b03ee", - "type": "headline", - "value": "2.6.12 Toxicological end point for assessment of risk following acute dietary exposure - ARfD (acute reference dose)", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.12 Toxicological end point for assessment of risk following acute dietary exposure - ARfD", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 455.80536 - }, - "width": 460.33728, - "height": 9.85872, - "page": 78 - }, - { - "topLeft": { - "x": 102.98, - "y": 436.82535 - }, - "width": 102.62784, - "height": 9.85872, - "page": 78 - } - ], - "sectionNumber": 318, - "textBefore": null, - "textAfter": " For Annex", - "comments": null, - "startOffset": 0, - "endOffset": 116, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283251332Z" - }, - { - "analysisNumber": 16, - "type": "CHANGED", - "dateTime": "2022-10-10T12:00:49.806894383Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T12:00:48.753Z", - "requestedDate": "2022-10-10T12:00:48.753418Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "2.6.12 Toxicological end point for assessment of risk following acute dietary exposure - ARfD (acute reference dose)" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "79e7a6972364b84ae7431da9db159043", - "type": "headline", - "value": "3.3 Rational for the conditions and restrictions to be associated with any approval or authorisation(s), as appropriate", - "reason": "Headline found, resized by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.3 Rational for the conditions and restrictions to be associated with any approval or authorisation(s),", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 366.37863 - }, - "width": 12.51972, - "height": 8.89428, - "page": 199 - }, - { - "topLeft": { - "x": 102.98, - "y": 366.37863 - }, - "width": 427.533, - "height": 8.89428, - "page": 199 - }, - { - "topLeft": { - "x": 102.98, - "y": 349.21863 - }, - "width": 62.43924, - "height": 8.89428, - "page": 199 - } - ], - "sectionNumber": 1289, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 119, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:44.283270551Z" - }, - { - "analysisNumber": 17, - "type": "CHANGED", - "dateTime": "2022-10-10T12:02:55.169392095Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "RESIZE", - "processedDate": "2022-10-10T12:02:54.047Z", - "requestedDate": "2022-10-10T12:02:54.04704Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": { - "value": "3.3 Rational for the conditions and restrictions to be associated with any approval or authorisation(s), as appropriate" - }, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "11cd9fccc57f877dc59afceb2cce7d9e", - "type": "manual", - "value": "Appendix 2 Reference list", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDICES", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 142.94, - "y": 291.50537 - }, - "width": 63.85536, - "height": 9.85872, - "page": 201 - }, - { - "topLeft": { - "x": 70.944, - "y": 291.50537 - }, - "width": 54.11808, - "height": 9.85872, - "page": 201 - } - ], - "sectionNumber": 1297, - "textBefore": "", - "textAfter": "", - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:59:02.34Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:59:02.34Z", - "requestedDate": "2022-10-10T11:59:02.34Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "70b3756da45b028b88cf08a89edb89a4", - "type": "manual", - "value": "2.11.4. STEP 4: Exposure assessment – threshold of concern approach", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.3 STEP 3, Stage 3: screening for toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 333.37863 - }, - "width": 298.84113, - "height": 8.89428, - "page": 180 - } - ], - "sectionNumber": 1091, - "textBefore": "", - "textAfter": "", - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:57:29.379Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:57:29.38Z", - "requestedDate": "2022-10-10T11:57:29.379Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0742909e25ae0e770aa5bb4107f58a7b", - "type": "manual", - "value": "2.9.1.2. Mammals", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.1.1. Birds", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 499.23865 - }, - "width": 75.05856, - "height": 8.89428, - "page": 148 - } - ], - "sectionNumber": 711, - "textBefore": "", - "textAfter": "", - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:54:43.663Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:54:43.663Z", - "requestedDate": "2022-10-10T11:54:43.663Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "517c4a1b70cd63b41616a6173082335f", - "type": "manual", - "value": "2.11.2. STEP 2: Quantification of potential groundwater contamination", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11 Relevance of metabolites in groundwater", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 561.3986 - }, - "width": 303.47125, - "height": 8.89428, - "page": 180 - } - ], - "sectionNumber": 1088, - "textBefore": "", - "textAfter": "", - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:57:15.453Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:57:15.453Z", - "requestedDate": "2022-10-10T11:57:15.453Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4af04a9e03b1c1257a39ef3a0ba9958a", - "type": "manual", - "value": "3.1.1 Proposal on acceptability against the approval criteria – Article 4 and Annex II of Regulation (EC) No 1107/2009", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 364.79865 - }, - "width": 512.7403, - "height": 8.89428, - "page": 183 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:58:15.62Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:58:15.62Z", - "requestedDate": "2022-10-10T11:58:15.62Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3f0d0f57a0509c8df1a26b038f996aea", - "type": "manual", - "value": "Table of contents", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 759.66864 - }, - "width": 73.26576, - "height": 8.89428, - "page": 5 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:59:34.487Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:59:34.487Z", - "requestedDate": "2022-10-10T11:59:34.487Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "af5e90b324c13c890e6cceb7cad62fd8", - "type": "manual", - "value": "Level 2", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 260.69, - "y": 742.476 - }, - "width": 73.992, - "height": 21.432, - "page": 18 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:46:30.859Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:46:30.859Z", - "requestedDate": "2022-10-10T11:46:30.859Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "103b89d98783d3bd5671cc66d6cb3b96", - "type": "manual", - "value": "2.11.5. STEP 5: Refined risk assessment", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.3 STEP 3, Stage 3: screening for toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 292.21863 - }, - "width": 169.83992, - "height": 8.89428, - "page": 180 - } - ], - "sectionNumber": 1091, - "textBefore": "", - "textAfter": "", - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:57:35.968Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:57:35.968Z", - "requestedDate": "2022-10-10T11:57:35.968Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5c9f40261b4536fea1b03302894601c2", - "type": "manual", - "value": "Version History", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 263.69, - "y": 742.1486 - }, - "width": 67.90728, - "height": 8.89428, - "page": 4 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:44:21.243Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:44:21.243Z", - "requestedDate": "2022-10-10T11:44:21.243Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bd4b6f925db3260a2b96fc8916cc2233", - "type": "manual", - "value": "2.11.6. Overall conclusion", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 250.90865 - }, - "width": 109.56996, - "height": 8.89428, - "page": 180 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:57:42.328Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:57:42.328Z", - "requestedDate": "2022-10-10T11:57:42.328Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a7c1c8066bb1b67132a438d5c39ec420", - "type": "manual", - "value": "Appendix 1 Guidance documents used in this assessment", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "APPENDICES", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 142.94, - "y": 727.5154 - }, - "width": 208.8216, - "height": 9.85872, - "page": 200 - }, - { - "topLeft": { - "x": 70.944, - "y": 727.5154 - }, - "width": 54.11808, - "height": 9.85872, - "page": 200 - } - ], - "sectionNumber": 1297, - "textBefore": "", - "textAfter": "", - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:58:49.956Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:58:49.956Z", - "requestedDate": "2022-10-10T11:58:49.956Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8ccd6331be9e11aed7319ba9d22d7516", - "type": "manual", - "value": "2.11.3. STEP 3: Hazard assessment – identification of relevant metabolites", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 456.39865 - }, - "width": 316.027, - "height": 8.89428, - "page": 180 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:57:22.517Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:57:22.517Z", - "requestedDate": "2022-10-10T11:57:22.517Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c973b959735bbaea10a06969bcd3c807", - "type": "manual", - "value": "3\nProposed decision with respect to the application", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 96.984, - "y": 447.26865 - }, - "width": 208.19469, - "height": 8.89428, - "page": 183 - }, - { - "topLeft": { - "x": 70.92, - "y": 447.26865 - }, - "width": 4.98, - "height": 8.89428, - "page": 183 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:58:08.341Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:58:08.341Z", - "requestedDate": "2022-10-10T11:58:08.341Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "783f4ab287973fff7a4a1f387719a837", - "type": "manual", - "value": "2.11.1. STEP 1: Exclusion of degradation products of no concern", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11 Relevance of metabolites in groundwater", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 631.98865 - }, - "width": 275.21472, - "height": 8.89428, - "page": 180 - } - ], - "sectionNumber": 1088, - "textBefore": "", - "textAfter": "", - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:57:08.578Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:57:08.578Z", - "requestedDate": "2022-10-10T11:57:08.578Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "89be91f00dfccc932110d786308c550c", - "type": "manual", - "value": "Level 3", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 383.93, - "y": 496.556 - }, - "width": 73.992, - "height": 21.432, - "page": 183 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T11:58:00.473Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T11:58:00.473Z", - "requestedDate": "2022-10-10T11:58:00.473Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - } - ], - "legalBasis": [ - { - "name": "n-a.", - "description": "n-a.", - "reason": "n-a." - } - ], - "dictionaryVersion": 13, - "dossierDictionaryVersion": 1, - "rulesVersion": 3, - "legalBasisVersion": 2 -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/S-Metolachlor_RAR_01_Volume_1_2018-09-06_REDACTION_LOG.json b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/S-Metolachlor_RAR_01_Volume_1_2018-09-06_REDACTION_LOG.json deleted file mode 100644 index 78424e0a..00000000 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Headlines/S-Metolachlor_RAR_01_Volume_1_2018-09-06_REDACTION_LOG.json +++ /dev/null @@ -1,13720 +0,0 @@ -{ - "analysisVersion": 1, - "analysisNumber": 1, - "redactionLogEntry": [ - { - "id": "b32da2b5707223fb95a0f93034f04274", - "type": "headline", - "value": "1 Statement of subject matter and purpose for which this report has been prepared and background information on the application ............ 9", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "1 Statement of subject matter and purpose for which this report has\nbeen prepared and background information on the application ............ 9", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 732.938 - }, - "width": 6, - "height": -11.358002, - "page": 3 - }, - { - "topLeft": { - "x": 156.02, - "y": 732.938 - }, - "width": 339.72003, - "height": -11.358002, - "page": 3 - }, - { - "topLeft": { - "x": 156.02, - "y": 719.138 - }, - "width": 368.62, - "height": -11.358002, - "page": 3 - } - ], - "sectionNumber": 12, - "textBefore": null, - "textAfter": " 1.1 1.1.1", - "comments": null, - "startOffset": 0, - "endOffset": 142, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563140354Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:03:45.201299Z", - "requestedDate": "2022-10-10T12:03:45.177937Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "93c3b1510b4e7eaa8ac1e1c6ba8988b2", - "type": "headline", - "value": "1.1.3 1.1.4", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "1.1.3\n1.1.4", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 644.474 - }, - "width": 24, - "height": -11.453995, - "page": 3 - }, - { - "topLeft": { - "x": 70.944, - "y": 630.67395 - }, - "width": 24, - "height": -11.453995, - "page": 3 - } - ], - "sectionNumber": 13, - "textBefore": null, - "textAfter": " 1.2 1.2.1", - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563143694Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:03:49.144718Z", - "requestedDate": "2022-10-10T12:03:49.129366Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "76fd7d61b70a6c12efb797db19a31e47", - "type": "headline", - "value": "2.6.12", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "2.6.12", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 262.82397 - }, - "width": 30, - "height": -11.4539795, - "page": 4 - } - ], - "sectionNumber": 15, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 6, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563144054Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:10.788579Z", - "requestedDate": "2022-10-10T12:04:10.775355Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bae1cafb4cebf89a3e996064617e6d90", - "type": "headline", - "value": "2.4.2 2.4.3", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "2.4.2\n2.4.3", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 556.604 - }, - "width": 24, - "height": -11.45401, - "page": 4 - }, - { - "topLeft": { - "x": 70.944, - "y": 542.80396 - }, - "width": 24, - "height": -11.45401, - "page": 4 - } - ], - "sectionNumber": 14, - "textBefore": null, - "textAfter": " 2.5 2.5.1", - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563144404Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:06.789248Z", - "requestedDate": "2022-10-10T12:04:06.772008Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "107d6ca868c16954c6f0015b15f4f3dc", - "type": "headline", - "value": "2.6.14", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "2.6.14", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 207.594 - }, - "width": 30, - "height": -11.4539795, - "page": 4 - } - ], - "sectionNumber": 17, - "textBefore": null, - "textAfter": " 2.7 2.7.1", - "comments": null, - "startOffset": 0, - "endOffset": 6, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563144784Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:17.716935Z", - "requestedDate": "2022-10-10T12:04:17.701587Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "330db75fc6aabf74f96ca439ecfba3b8", - "type": "headline", - "value": "2.6.13", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "2.6.13", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 235.224 - }, - "width": 30, - "height": -11.4539795, - "page": 4 - } - ], - "sectionNumber": 16, - "textBefore": null, - "textAfter": " 2.6 2.6.1", - "comments": null, - "startOffset": 0, - "endOffset": 6, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563145134Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:14.205524Z", - "requestedDate": "2022-10-10T12:04:14.190398Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1954e1f2e5c010882d1daa020140b253", - "type": "headline", - "value": "2.7.10 2.7.11", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "2.7.10\n2.7.11", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 521.204 - }, - "width": 30, - "height": -11.45401, - "page": 5 - }, - { - "topLeft": { - "x": 70.944, - "y": 507.404 - }, - "width": 30, - "height": -11.45401, - "page": 5 - } - ], - "sectionNumber": 18, - "textBefore": null, - "textAfter": " 2.7.3 2.7.3.1", - "comments": null, - "startOffset": 0, - "endOffset": 13, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563145534Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:23.192755Z", - "requestedDate": "2022-10-10T12:04:23.178086Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2878630c9a2df7da3558bd887e5336ee", - "type": "headline", - "value": "3.1.4.1 3.1.4.2", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "3.1.4.1\n3.1.4.2", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 219.23395 - }, - "width": 33, - "height": -11.4539795, - "page": 6 - }, - { - "topLeft": { - "x": 70.944, - "y": 205.43396 - }, - "width": 33, - "height": -11.4539795, - "page": 6 - } - ], - "sectionNumber": 20, - "textBefore": null, - "textAfter": " 3.1 3.1.1", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563145944Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:31.840329Z", - "requestedDate": "2022-10-10T12:04:31.814032Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a5d93f248d9f29be8f069526e2fa9492", - "type": "headline", - "value": "3 Proposed decision with respect to the application ................................ 189", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "3 Proposed decision with respect to the application ................................ 189", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 390.52798 - }, - "width": 6, - "height": -11.358002, - "page": 6 - }, - { - "topLeft": { - "x": 156.02, - "y": 390.52798 - }, - "width": 368.62, - "height": -11.358002, - "page": 6 - } - ], - "sectionNumber": 19, - "textBefore": null, - "textAfter": " 3.1.1.1 3.1.1.2", - "comments": null, - "startOffset": 0, - "endOffset": 88, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563146274Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:28.102711Z", - "requestedDate": "2022-10-10T12:04:28.087793Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "285c20ca1e1ef41ed172885188c14121", - "type": "headline", - "value": "3.1.8 3.1.9", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "3.1.8\n3.1.9", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 728.234 - }, - "width": 24, - "height": -11.453995, - "page": 7 - }, - { - "topLeft": { - "x": 70.944, - "y": 714.43396 - }, - "width": 24, - "height": -11.453995, - "page": 7 - } - ], - "sectionNumber": 23, - "textBefore": null, - "textAfter": " 3.1.6 3.1.7", - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563146604Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:04:37.96519Z", - "requestedDate": "2022-10-10T12:04:37.945221Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fc84cf6217f5650d56b0f7a7ff5502af", - "type": "headline", - "value": "1.1.3 EU Regulatory history for use in plant protection products", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.3 EU Regulatory history for use in plant protection products", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 407.94797 - }, - "width": 24, - "height": -11.358002, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 407.94797 - }, - "width": 300.2, - "height": -11.358002, - "page": 9 - } - ], - "sectionNumber": 28, - "textBefore": null, - "textAfter": " S-Metolachlor was", - "comments": null, - "startOffset": 0, - "endOffset": 64, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563147234Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "652bb188641b5a9868cd50bc05614e8e", - "type": "headline", - "value": "1.1.1 Purpose for which the renewal assessment report was prepared", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.1 Purpose for which the renewal assessment report was prepared", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 635.258 - }, - "width": 24, - "height": -11.358002, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 635.258 - }, - "width": 322.80804, - "height": -11.358002, - "page": 9 - } - ], - "sectionNumber": 26, - "textBefore": null, - "textAfter": " This renewal", - "comments": null, - "startOffset": 0, - "endOffset": 66, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563147554Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "313f979b56ac38fba97621d8d6c3cf2a", - "type": "headline", - "value": "1.1.2 Arrangements between rapporteur Member State and co-rapporteur Member State", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.2 Arrangements between rapporteur Member State and co-rapporteur\nMember State", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 534.78796 - }, - "width": 24, - "height": -11.358002, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 534.78796 - }, - "width": 382.89203, - "height": -11.358002, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 520.988 - }, - "width": 72.198, - "height": -11.358002, - "page": 9 - } - ], - "sectionNumber": 27, - "textBefore": null, - "textAfter": " According to", - "comments": null, - "startOffset": 0, - "endOffset": 81, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563147884Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "940e9ebdaf90bcf2d4db077f595baec5", - "type": "headline", - "value": "1 Statement of subject matter and purpose for which this report has been prepared and background information on the application", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1 Statement of subject matter and purpose for which this report\nhas been prepared and background information on the application", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 744.2889 - }, - "width": 7.0199966, - "height": -12.26886, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 744.2889 - }, - "width": 382.8028, - "height": -12.26886, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 728.20886 - }, - "width": 382.77533, - "height": -12.26886, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 712.12885 - }, - "width": 23.39064, - "height": -12.26886, - "page": 9 - } - ], - "sectionNumber": 24, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 127, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563148214Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5d1090dd81d53bc3a5241bbc72b14ef8", - "type": "headline", - "value": "1.1 Context in which the renewal assessment report was prepared", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1 Context in which the renewal assessment report was prepared", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 673.058 - }, - "width": 15, - "height": -11.358002, - "page": 9 - }, - { - "topLeft": { - "x": 141.74, - "y": 673.058 - }, - "width": 317.28802, - "height": -11.358002, - "page": 9 - } - ], - "sectionNumber": 25, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 63, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563148564Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e96c5f0d1d5d86c63db8afe1ab25d753", - "type": "headline", - "value": "1.2.3 Information relating to the collective provision of dossiers", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2.3 Information relating to the collective provision of dossiers", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 99.50195 - }, - "width": 24, - "height": -11.357971, - "page": 10 - }, - { - "topLeft": { - "x": 141.74, - "y": 99.50195 - }, - "width": 295.15204, - "height": -11.357971, - "page": 10 - } - ], - "sectionNumber": 33, - "textBefore": null, - "textAfter": " Syngenta Limited", - "comments": null, - "startOffset": 0, - "endOffset": 66, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563148994Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a14b3cf14950818cca7e372ca9045984", - "type": "headline", - "value": "1.1.4 Evaluations carried out under other regulatory contexts", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.1.4 Evaluations carried out under other regulatory contexts", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 732.698 - }, - "width": 24, - "height": -11.358002, - "page": 10 - }, - { - "topLeft": { - "x": 141.74, - "y": 732.698 - }, - "width": 286.03998, - "height": -11.358002, - "page": 10 - } - ], - "sectionNumber": 29, - "textBefore": null, - "textAfter": " The following", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563149414Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "76fe901bc4233393ad1a1a0462a71f09", - "type": "headline", - "value": "1.2.1 Name and address of applicant(s) for approval of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2.1 Name and address of applicant(s) for approval of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 338.328 - }, - "width": 24, - "height": -11.357971, - "page": 10 - }, - { - "topLeft": { - "x": 141.74, - "y": 338.328 - }, - "width": 355.92004, - "height": -11.357971, - "page": 10 - } - ], - "sectionNumber": 31, - "textBefore": null, - "textAfter": " Name: Syngenta", - "comments": null, - "startOffset": 0, - "endOffset": 75, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563149794Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a0dea7c2f6af748bfcfd1c0178903477", - "type": "headline", - "value": "1.2.2 Producer or producers of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2.2 Producer or producers of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 162.01794 - }, - "width": 24, - "height": -11.357971, - "page": 10 - }, - { - "topLeft": { - "x": 141.74, - "y": 162.01794 - }, - "width": 234.312, - "height": -11.357971, - "page": 10 - } - ], - "sectionNumber": 32, - "textBefore": null, - "textAfter": " Confidential information,", - "comments": null, - "startOffset": 0, - "endOffset": 51, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563150104Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6450c63ad328473acb8fb434dbeb45bc", - "type": "headline", - "value": "1.2 Applicant(s) information", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.2 Applicant(s) information", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 376.12796 - }, - "width": 15, - "height": -11.358002, - "page": 10 - }, - { - "topLeft": { - "x": 141.74, - "y": 376.12796 - }, - "width": 127.673996, - "height": -11.358002, - "page": 10 - } - ], - "sectionNumber": 30, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 28, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563150444Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0e7e4c506937abbadfc561abf4de4997", - "type": "headline", - "value": "1.3 Identity of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3 Identity of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 15, - "height": -11.358002, - "page": 11 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 158.70601, - "height": -11.358002, - "page": 11 - } - ], - "sectionNumber": 34, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563150754Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b6d79e7f74298faed8b2d7fc96fe39d5", - "type": "headline", - "value": "1.3.3 Producer’s development code numbers", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.3 Producer’s development code numbers", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 508.26797 - }, - "width": 24, - "height": -11.358002, - "page": 11 - }, - { - "topLeft": { - "x": 141.74, - "y": 508.26797 - }, - "width": 199.23799, - "height": -11.358002, - "page": 11 - } - ], - "sectionNumber": 37, - "textBefore": null, - "textAfter": " CGA 77102", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563151074Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "aa7f8e35440b181a037650e7a5e599ea", - "type": "headline", - "value": "1.3.4 CAS, EC and CIPAC numbers", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.4 CAS, EC and CIPAC numbers", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 445.748 - }, - "width": 24, - "height": -11.358002, - "page": 11 - }, - { - "topLeft": { - "x": 141.74, - "y": 445.748 - }, - "width": 157.29002, - "height": -11.358002, - "page": 11 - } - ], - "sectionNumber": 38, - "textBefore": null, - "textAfter": " CAS: 87392-12-9", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563151394Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d6252bc7df7126aab3e7a26814a17c75", - "type": "headline", - "value": "1.3.1 Common name proposed or ISO-accepted and synonyms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.1 Common name proposed or ISO-accepted and synonyms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 731.498 - }, - "width": 24, - "height": -11.358002, - "page": 11 - }, - { - "topLeft": { - "x": 141.74, - "y": 731.498 - }, - "width": 290.846, - "height": -11.358002, - "page": 11 - } - ], - "sectionNumber": 35, - "textBefore": null, - "textAfter": " S-Metolachlor", - "comments": null, - "startOffset": 0, - "endOffset": 55, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563151704Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1b967a0a6743e32ba5e5a4f7d88022b5", - "type": "headline", - "value": "1.3.2 Chemical name (IUPAC and CA nomenclature)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.2 Chemical name (IUPAC and CA nomenclature)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 669.09796 - }, - "width": 24, - "height": -11.358002, - "page": 11 - }, - { - "topLeft": { - "x": 141.74, - "y": 669.09796 - }, - "width": 243.05998, - "height": -11.358002, - "page": 11 - } - ], - "sectionNumber": 36, - "textBefore": null, - "textAfter": " IUPAC: Mixture", - "comments": null, - "startOffset": 0, - "endOffset": 47, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563152044Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a0879a5393cfa0d1fc9f07cf0f354053", - "type": "headline", - "value": "1.3.5 Molecular and structural formulae, molecular mass", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.5 Molecular and structural formulae, molecular mass", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 331.36798 - }, - "width": 24, - "height": -11.357971, - "page": 11 - }, - { - "topLeft": { - "x": 141.74, - "y": 331.36798 - }, - "width": 264.068, - "height": -11.357971, - "page": 11 - } - ], - "sectionNumber": 43, - "textBefore": null, - "textAfter": " Molecular formular:", - "comments": null, - "startOffset": 0, - "endOffset": 55, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563152414Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2a3a1df41d2ec151093765a692b9f466", - "type": "headline", - "value": "1.3.8.3 Relevant impurities", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8.3 Relevant impurities", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 138.13794 - }, - "width": 33, - "height": -11.357971, - "page": 12 - }, - { - "topLeft": { - "x": 141.74, - "y": 138.13794 - }, - "width": 100.87198, - "height": -11.357971, - "page": 12 - } - ], - "sectionNumber": 49, - "textBefore": null, - "textAfter": " There are", - "comments": null, - "startOffset": 0, - "endOffset": 27, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563152734Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "716b7f7e4a3597bdea9e2624c1663ec8", - "type": "headline", - "value": "1.3.6 Method of manufacture (synthesis pathway) of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.6 Method of manufacture (synthesis pathway) of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 489.06796 - }, - "width": 24, - "height": -11.358002, - "page": 12 - }, - { - "topLeft": { - "x": 141.74, - "y": 489.06796 - }, - "width": 343.596, - "height": -11.358002, - "page": 12 - } - ], - "sectionNumber": 44, - "textBefore": null, - "textAfter": " Confidential information,", - "comments": null, - "startOffset": 0, - "endOffset": 71, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563153074Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cf2d18a705eb9c9f7b8a62d081e61362", - "type": "headline", - "value": "1.3.8 Identity and content of additives (such as stabilisers) and impurities", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8 Identity and content of additives (such as stabilisers) and impurities", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 300.88794 - }, - "width": 24, - "height": -11.357971, - "page": 12 - }, - { - "topLeft": { - "x": 141.74, - "y": 300.88794 - }, - "width": 346.37598, - "height": -11.357971, - "page": 12 - } - ], - "sectionNumber": 46, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 76, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563153414Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7da68e6296bae7fe33a1ec1849b079db", - "type": "headline", - "value": "1.3.8.1 Additives", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8.1 Additives", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 263.08795 - }, - "width": 33, - "height": -11.357971, - "page": 12 - }, - { - "topLeft": { - "x": 141.74, - "y": 263.08795 - }, - "width": 48.696, - "height": -11.357971, - "page": 12 - } - ], - "sectionNumber": 47, - "textBefore": null, - "textAfter": " Confidential information,", - "comments": null, - "startOffset": 0, - "endOffset": 17, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563153754Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "05b1d765a3578027e6b80afaaea598d9", - "type": "headline", - "value": "1.3.8.2 Significant impurities", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.8.2 Significant impurities", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 200.65796 - }, - "width": 33, - "height": -11.357971, - "page": 12 - }, - { - "topLeft": { - "x": 141.74, - "y": 200.65796 - }, - "width": 110.92799, - "height": -11.357971, - "page": 12 - } - ], - "sectionNumber": 48, - "textBefore": null, - "textAfter": " Confidential information,", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563154084Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "30de0562606defd44969dd242a9f1273", - "type": "headline", - "value": "1.3.7 Specification of purity of the active substance in g/kg", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.7 Specification of purity of the active substance in g/kg", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 426.54797 - }, - "width": 24, - "height": -11.358002, - "page": 12 - }, - { - "topLeft": { - "x": 141.74, - "y": 426.54797 - }, - "width": 269.97595, - "height": -11.358002, - "page": 12 - } - ], - "sectionNumber": 45, - "textBefore": null, - "textAfter": " Minimum purity", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563154404Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "06381fe5ed627e9f2aa386a45e18bd80", - "type": "headline", - "value": "1.4.4 Detailed quantitative and qualitative information on the composition of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4 Detailed quantitative and qualitative information on the composition of\nthe plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 189.61798 - }, - "width": 24, - "height": -11.357971, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 189.61798 - }, - "width": 382.63397, - "height": -11.357971, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 175.818 - }, - "width": 144.55202, - "height": -11.357971, - "page": 13 - } - ], - "sectionNumber": 55, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 106, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563154714Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "967dd9171cab5200c91452e69e47fc6e", - "type": "headline", - "value": "1.4.3 Trade name or proposed trade name and producer's development code number of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.3 Trade name or proposed trade name and producer's development code\nnumber of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 291.16797 - }, - "width": 24, - "height": -11.357971, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 291.16797 - }, - "width": 382.40405, - "height": -11.357971, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 277.36798 - }, - "width": 200.79597, - "height": -11.357971, - "page": 13 - } - ], - "sectionNumber": 54, - "textBefore": null, - "textAfter": " Trade name:", - "comments": null, - "startOffset": 0, - "endOffset": 110, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563155054Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "15698f457c1e4ff4a4fc53eeb544b7e3", - "type": "headline", - "value": "1.4.2 Producer of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.2 Producer of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 492.78796 - }, - "width": 24, - "height": -11.358002, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 492.78796 - }, - "width": 207.99602, - "height": -11.358002, - "page": 13 - } - ], - "sectionNumber": 53, - "textBefore": null, - "textAfter": " Name: Syngenta", - "comments": null, - "startOffset": 0, - "endOffset": 46, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563155444Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "632724281d3bce7364b930c401430264", - "type": "headline", - "value": "1.4.4.1 Composition of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4.1 Composition of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 138.01794 - }, - "width": 33, - "height": -11.357971, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 138.01794 - }, - "width": 226.23601, - "height": -11.357971, - "page": 13 - } - ], - "sectionNumber": 56, - "textBefore": null, - "textAfter": " Content of", - "comments": null, - "startOffset": 0, - "endOffset": 51, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563155764Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "15c4b5c138888ba72eb01d4f26a414e8", - "type": "headline", - "value": "1.4 Information on the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4 Information on the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 706.89795 - }, - "width": 15, - "height": -11.358002, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 706.89795 - }, - "width": 226.23601, - "height": -11.358002, - "page": 13 - } - ], - "sectionNumber": 51, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 47, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563156094Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cc75355ea9073a4f8cce4550ed8ed25d", - "type": "headline", - "value": "1.4.1 Applicant", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.1 Applicant", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 669.09796 - }, - "width": 24, - "height": -11.358002, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 669.09796 - }, - "width": 50.75998, - "height": -11.358002, - "page": 13 - } - ], - "sectionNumber": 52, - "textBefore": null, - "textAfter": " Name: Syngenta", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563162254Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "483be1fe606562a9c34e7034c14c44e6", - "type": "headline", - "value": "1.3.9 Analytical profile of batches", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.3.9 Analytical profile of batches", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 13 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 144.024, - "height": -11.358002, - "page": 13 - } - ], - "sectionNumber": 50, - "textBefore": null, - "textAfter": " Confidential information,", - "comments": null, - "startOffset": 0, - "endOffset": 35, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563162674Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "add8a2ba54d26f65204e0413ad24597a", - "type": "headline", - "value": "1.4.8 Effects on harmful organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.8 Effects on harmful organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 375.76797 - }, - "width": 24, - "height": -11.358002, - "page": 14 - }, - { - "topLeft": { - "x": 141.74, - "y": 375.76797 - }, - "width": 151.52998, - "height": -11.358002, - "page": 14 - } - ], - "sectionNumber": 62, - "textBefore": null, - "textAfter": " Sensitive weeds", - "comments": null, - "startOffset": 0, - "endOffset": 34, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563163014Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bfffcca5e74fb62aac6b61b4db177de6", - "type": "headline", - "value": "1.4.6 Function", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.6 Function", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 500.70798 - }, - "width": 24, - "height": -11.358002, - "page": 14 - }, - { - "topLeft": { - "x": 141.74, - "y": 500.70798 - }, - "width": 45.89998, - "height": -11.358002, - "page": 14 - } - ], - "sectionNumber": 60, - "textBefore": null, - "textAfter": " Herbicide in", - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563163354Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "75b8b0496f826a6d6d092cd839901905", - "type": "headline", - "value": "1.4.4.2 Information on the active substances", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4.2 Information on the active substances", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 33, - "height": -11.358002, - "page": 14 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 187.94402, - "height": -11.358002, - "page": 14 - } - ], - "sectionNumber": 57, - "textBefore": null, - "textAfter": " ISO common", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563163674Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "185046e9ee00222903aa4f37a79185c8", - "type": "headline", - "value": "1.4.5 Type and code of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.5 Type and code of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 575.82794 - }, - "width": 24, - "height": -11.358002, - "page": 14 - }, - { - "topLeft": { - "x": 141.74, - "y": 575.82794 - }, - "width": 234.30598, - "height": -11.358002, - "page": 14 - } - ], - "sectionNumber": 59, - "textBefore": null, - "textAfter": " A9396G (synonym:", - "comments": null, - "startOffset": 0, - "endOffset": 51, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563164004Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6b7a558cefa311dd541116f8ee655498", - "type": "headline", - "value": "1.4.7 Field of use envisaged", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.7 Field of use envisaged", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 438.30798 - }, - "width": 24, - "height": -11.358002, - "page": 14 - }, - { - "topLeft": { - "x": 141.74, - "y": 438.30798 - }, - "width": 111.611984, - "height": -11.358002, - "page": 14 - } - ], - "sectionNumber": 61, - "textBefore": null, - "textAfter": " Herbicide in", - "comments": null, - "startOffset": 0, - "endOffset": 28, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563164334Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bca25b4734ab9231809ba2c77a3920dc", - "type": "headline", - "value": "1.4.4.3 Information on safeners, synergists and co-formulants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.4.4.3 Information on safeners, synergists and co-formulants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 638.258 - }, - "width": 33, - "height": -11.358002, - "page": 14 - }, - { - "topLeft": { - "x": 141.74, - "y": 638.258 - }, - "width": 277.35797, - "height": -11.358002, - "page": 14 - } - ], - "sectionNumber": 58, - "textBefore": null, - "textAfter": " Confidential information,", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563164664Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "eca147304f579f50210cdd6f7382696e", - "type": "headline", - "value": "1.5.1 Details of representative uses", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.1 Details of representative uses", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 460.89798 - }, - "width": 24, - "height": -11.358002, - "page": 15 - }, - { - "topLeft": { - "x": 141.74, - "y": 460.89798 - }, - "width": 148.47597, - "height": -11.358002, - "page": 15 - } - ], - "sectionNumber": 78, - "textBefore": null, - "textAfter": " Table 1.5-1:", - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563165004Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8abdd460681dadd15233c61eeed67450", - "type": "headline", - "value": "1.5 Detailed uses of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5 Detailed uses of the plant protection product", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 498.69797 - }, - "width": 15, - "height": -11.358002, - "page": 15 - }, - { - "topLeft": { - "x": 141.74, - "y": 498.69797 - }, - "width": 227.808, - "height": -11.358002, - "page": 15 - } - ], - "sectionNumber": 63, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 49, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563165334Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7c4d5e8eadb5c00f794020cf546f9104", - "type": "headline", - "value": "1.5.3 Details of other uses applied for to support the setting of MRLs for uses beyond the representative uses", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.3 Details of other uses applied for to support the setting of MRLs for uses\nbeyond the representative uses", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 581.70795 - }, - "width": 24, - "height": -11.358002, - "page": 17 - }, - { - "topLeft": { - "x": 141.74, - "y": 581.70795 - }, - "width": 382.5, - "height": -11.358002, - "page": 17 - }, - { - "topLeft": { - "x": 141.74, - "y": 567.90796 - }, - "width": 153.45598, - "height": -11.358002, - "page": 17 - } - ], - "sectionNumber": 80, - "textBefore": null, - "textAfter": " No information.", - "comments": null, - "startOffset": 0, - "endOffset": 110, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563165674Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "64eb31f62c59b280dda39ae2aefb0d49", - "type": "headline", - "value": "1.5.2 Further information on representative uses", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.2 Further information on representative uses", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 745.298 - }, - "width": 24, - "height": -11.358002, - "page": 17 - }, - { - "topLeft": { - "x": 141.74, - "y": 745.298 - }, - "width": 216.44405, - "height": -11.358002, - "page": 17 - } - ], - "sectionNumber": 79, - "textBefore": null, - "textAfter": " For details", - "comments": null, - "startOffset": 0, - "endOffset": 48, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563166014Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "802e6739bdfe5107215d920d48fff6a8", - "type": "headline", - "value": "1.5.4 Overview on authorisations in EU Member States", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "1.5.4 Overview on authorisations in EU Member States", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 505.38797 - }, - "width": 24, - "height": -11.358002, - "page": 17 - }, - { - "topLeft": { - "x": 141.74, - "y": 505.38797 - }, - "width": 249.22801, - "height": -11.358002, - "page": 17 - } - ], - "sectionNumber": 83, - "textBefore": null, - "textAfter": " Different s-metolachlor", - "comments": null, - "startOffset": 0, - "endOffset": 52, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563166344Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "dee411cc4fa679181ae9dbf8a035cca1", - "type": "headline", - "value": "2.1.1 Summary of identity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.1.1 Summary of identity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 663.33795 - }, - "width": 24, - "height": -11.358002, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 663.33795 - }, - "width": 105.89998, - "height": -11.358002, - "page": 19 - } - ], - "sectionNumber": 86, - "textBefore": null, - "textAfter": " Active substance", - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563166654Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a6d098fab579563e5dfc529eea97317c", - "type": "headline", - "value": "2 Summary of active substance hazard and of product risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2 Summary of active substance hazard and of product risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 756.2889 - }, - "width": 7.0199966, - "height": -12.26886, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 756.2889 - }, - "width": 382.89526, - "height": -12.26886, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 740.20886 - }, - "width": 52.888687, - "height": -12.26886, - "page": 19 - } - ], - "sectionNumber": 84, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 67, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563166974Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "065e6695e1f33cb809db37828cdb6137", - "type": "headline", - "value": "2.2.1 Summary of physical and chemical properties of the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2.1 Summary of physical and chemical properties of the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 411.30798 - }, - "width": 24, - "height": -11.358002, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 411.30798 - }, - "width": 352.69202, - "height": -11.358002, - "page": 19 - } - ], - "sectionNumber": 88, - "textBefore": null, - "textAfter": " S-metolachlor is", - "comments": null, - "startOffset": 0, - "endOffset": 73, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563167274Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5c93b5128de3514972c9752535842512", - "type": "headline", - "value": "2.2 Physical and chemical properties", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2 Physical and chemical properties", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 449.10797 - }, - "width": 15, - "height": -11.358002, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 449.10797 - }, - "width": 168.85197, - "height": -11.358002, - "page": 19 - } - ], - "sectionNumber": 87, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563167594Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "98a07648283fa70f4ce7f78ba77c4d44", - "type": "headline", - "value": "2.1 Identity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.1 Identity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 701.138 - }, - "width": 15, - "height": -11.358002, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 701.138 - }, - "width": 40.65599, - "height": -11.358002, - "page": 19 - } - ], - "sectionNumber": 85, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 12, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563167894Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "69fffdfa5cf94435b0d4489400b316ea", - "type": "headline", - "value": "2.2.2 Summary of physical and chemical properties of the plant protection product", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.2.2 Summary of physical and chemical properties of the plant protection\nproduct", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 260.208 - }, - "width": 24, - "height": -11.357971, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 260.208 - }, - "width": 382.78406, - "height": -11.357971, - "page": 19 - }, - { - "topLeft": { - "x": 141.74, - "y": 246.40796 - }, - "width": 40.439987, - "height": -11.357971, - "page": 19 - } - ], - "sectionNumber": 89, - "textBefore": null, - "textAfter": " The product", - "comments": null, - "startOffset": 0, - "endOffset": 81, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563168224Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b7e7b6e4877e5df67a2378000ec58d7b", - "type": "headline", - "value": "2.3.1 Summary of effectiveness", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.1 Summary of effectiveness", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 731.498 - }, - "width": 24, - "height": -11.358002, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 731.498 - }, - "width": 130.57204, - "height": -11.358002, - "page": 20 - } - ], - "sectionNumber": 91, - "textBefore": null, - "textAfter": " Major annual", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563168534Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "760fcfce8bc83a01e313c0a5bf4b4c30", - "type": "headline", - "value": "2.3.4 Summary of observations on other undesirable or unintended side-effects", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.4 Summary of observations on other undesirable or unintended side-effects", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 354.40796 - }, - "width": 24, - "height": -11.358002, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 354.40796 - }, - "width": 374.97998, - "height": -11.358002, - "page": 20 - } - ], - "sectionNumber": 94, - "textBefore": null, - "textAfter": " A9396G can", - "comments": null, - "startOffset": 0, - "endOffset": 77, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563168914Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "df69307ca0b04c72b593a5d9a1cecc2c", - "type": "headline", - "value": "2.4.1 Summary of methods and precautions concerning handling, storage, transport or fire", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4.1 Summary of methods and precautions concerning handling, storage,\ntransport or fire", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 228.88794 - }, - "width": 24, - "height": -11.357971, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 228.88794 - }, - "width": 382.4281, - "height": -11.357971, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 215.05798 - }, - "width": 83.412, - "height": -11.357971, - "page": 20 - } - ], - "sectionNumber": 96, - "textBefore": null, - "textAfter": " Acceptable information", - "comments": null, - "startOffset": 0, - "endOffset": 88, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563169284Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3d77b88341aa143c1c280f010da8ee19", - "type": "headline", - "value": "2.3.3 Summary of adverse effects on treated crops", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.3 Summary of adverse effects on treated crops", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 442.14798 - }, - "width": 24, - "height": -11.358002, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 442.14798 - }, - "width": 227.26799, - "height": -11.358002, - "page": 20 - } - ], - "sectionNumber": 93, - "textBefore": null, - "textAfter": " A9396G is", - "comments": null, - "startOffset": 0, - "endOffset": 49, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563169614Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0bb2bcf0fefcf94536b2c50ee206489f", - "type": "headline", - "value": "2.4 Further information", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4 Further information", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 266.688 - }, - "width": 15, - "height": -11.357971, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 266.688 - }, - "width": 104.90399, - "height": -11.357971, - "page": 20 - } - ], - "sectionNumber": 95, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563169934Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "90680a5f65ce46aae53ae6923e3e0837", - "type": "headline", - "value": "2.3 Data on application and efficacy", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3 Data on application and efficacy", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 15, - "height": -11.358002, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 165.27599, - "height": -11.358002, - "page": 20 - } - ], - "sectionNumber": 90, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563170254Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "65bcee9a0a84d1067fd44ee075345601", - "type": "headline", - "value": "2.4.2 Summary of procedures for destruction or decontamination", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4.2 Summary of procedures for destruction or decontamination", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 139.93799 - }, - "width": 24, - "height": -11.357971, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 139.93799 - }, - "width": 305.53204, - "height": -11.357971, - "page": 20 - } - ], - "sectionNumber": 97, - "textBefore": null, - "textAfter": " Acceptable information", - "comments": null, - "startOffset": 0, - "endOffset": 62, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563170634Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c7aa452eee949564f7cc8223bb58710e", - "type": "headline", - "value": "2.3.2 Summary of information on the development of resistance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.3.2 Summary of information on the development of resistance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 618.45795 - }, - "width": 24, - "height": -11.358002, - "page": 20 - }, - { - "topLeft": { - "x": 141.74, - "y": 618.45795 - }, - "width": 297.18005, - "height": -11.358002, - "page": 20 - } - ], - "sectionNumber": 92, - "textBefore": null, - "textAfter": " The evaluation", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563170944Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8190e7384ea95c27b4d4c178f40f99d4", - "type": "headline", - "value": "2.5 Methods of analysis", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5 Methods of analysis", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 694.178 - }, - "width": 15, - "height": -11.358002, - "page": 21 - }, - { - "topLeft": { - "x": 141.74, - "y": 694.178 - }, - "width": 101.45999, - "height": -11.358002, - "page": 21 - } - ], - "sectionNumber": 99, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563171254Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "74721e29149004deecc085bae3062452", - "type": "headline", - "value": "2.4.3 Summary of emergency measures in case of an accident", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.4.3 Summary of emergency measures in case of an accident", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 21 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 284.17194, - "height": -11.358002, - "page": 21 - } - ], - "sectionNumber": 98, - "textBefore": null, - "textAfter": " Acceptable information", - "comments": null, - "startOffset": 0, - "endOffset": 58, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563171574Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b417835d9bc2aab3fb45ca634fc57fa9", - "type": "headline", - "value": "2.5.1 Methods used for the generation of pre-authorisation data", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.1 Methods used for the generation of pre-authorisation data", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 656.378 - }, - "width": 24, - "height": -11.358002, - "page": 21 - }, - { - "topLeft": { - "x": 141.74, - "y": 656.378 - }, - "width": 291.53003, - "height": -11.358002, - "page": 21 - } - ], - "sectionNumber": 174, - "textBefore": null, - "textAfter": " Active Substance", - "comments": null, - "startOffset": 0, - "endOffset": 63, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563171934Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "50024eb749eda0694ed9a1b2b89f2e9e", - "type": "headline", - "value": "2.5.2 Methods for post control and monitoring purposes", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2 Methods for post control and monitoring purposes", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 27 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 258.10797, - "height": -11.358002, - "page": 27 - } - ], - "sectionNumber": 175, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 54, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563172254Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e1d1feda961b7e6b6c6070ba4b71bc01", - "type": "headline", - "value": "2.5.2.1 Formulation analysis", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2.1 Formulation analysis", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 731.498 - }, - "width": 33, - "height": -11.358002, - "page": 27 - }, - { - "topLeft": { - "x": 141.74, - "y": 731.498 - }, - "width": 108.39598, - "height": -11.358002, - "page": 27 - } - ], - "sectionNumber": 176, - "textBefore": null, - "textAfter": " Analytical methods", - "comments": null, - "startOffset": 0, - "endOffset": 28, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563172564Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7d144b5adfe7d74e3fe630f1f5e46917", - "type": "headline", - "value": "2.5.2.2 Residue analysis", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.5.2.2 Residue analysis", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 669.09796 - }, - "width": 33, - "height": -11.358002, - "page": 27 - }, - { - "topLeft": { - "x": 141.74, - "y": 669.09796 - }, - "width": 84.47398, - "height": -11.358002, - "page": 27 - } - ], - "sectionNumber": 232, - "textBefore": null, - "textAfter": " Relevant residue", - "comments": null, - "startOffset": 0, - "endOffset": 24, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563172874Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "55abb9527e6f6c366a26b989cd4fe254", - "type": "headline", - "value": "2.6 Effects on human and animal health", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6 Effects on human and animal health", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 209.17798 - }, - "width": 15, - "height": -11.357971, - "page": 31 - }, - { - "topLeft": { - "x": 141.74, - "y": 209.17798 - }, - "width": 185.49596, - "height": -11.357971, - "page": 31 - } - ], - "sectionNumber": 244, - "textBefore": null, - "textAfter": " The toxicological", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563173194Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f44c47f295c0c61286d265c6966ddec3", - "type": "headline", - "value": "2.6.1 Summary of absorption, distribution, metabolism and excretion in mammals", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.1 Summary of absorption, distribution, metabolism and excretion in\nmammals", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 617.378 - }, - "width": 24, - "height": -11.358002, - "page": 33 - }, - { - "topLeft": { - "x": 141.74, - "y": 617.378 - }, - "width": 382.85608, - "height": -11.358002, - "page": 33 - }, - { - "topLeft": { - "x": 141.74, - "y": 603.57794 - }, - "width": 49.87201, - "height": -11.358002, - "page": 33 - } - ], - "sectionNumber": 245, - "textBefore": null, - "textAfter": " The oral", - "comments": null, - "startOffset": 0, - "endOffset": 78, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563173504Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "77dca93a44907099c3973703bb2e8017", - "type": "headline", - "value": "2.6.2 Summary of acute toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.2 Summary of acute toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 34 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 135.03001, - "height": -11.358002, - "page": 34 - } - ], - "sectionNumber": 275, - "textBefore": null, - "textAfter": " Results of", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563173824Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "162fcce7d4d6c20f3c9313979ea2d8d5", - "type": "headline", - "value": "2.6.3 Summary of short-term toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.3 Summary of short-term toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 276.04797 - }, - "width": 24, - "height": -11.357971, - "page": 36 - }, - { - "topLeft": { - "x": 141.74, - "y": 276.04797 - }, - "width": 162.85799, - "height": -11.357971, - "page": 36 - } - ], - "sectionNumber": 286, - "textBefore": null, - "textAfter": " Results of", - "comments": null, - "startOffset": 0, - "endOffset": 36, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563174144Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "aea0504a0bd8f64743f2df380be03c91", - "type": "headline", - "value": "2.6.4 Summary of genotoxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.4 Summary of genotoxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 618.818 - }, - "width": 24, - "height": -11.358002, - "page": 38 - }, - { - "topLeft": { - "x": 141.74, - "y": 618.818 - }, - "width": 128.64598, - "height": -11.358002, - "page": 38 - } - ], - "sectionNumber": 304, - "textBefore": null, - "textAfter": " Results of", - "comments": null, - "startOffset": 0, - "endOffset": 29, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563174483Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4f1e20e7df0401a1fd67a15a2b29f71b", - "type": "headline", - "value": "2.6.5 Summary of long-term toxicity and carcinogenicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.5 Summary of long-term toxicity and carcinogenicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 441.30798 - }, - "width": 24, - "height": -11.358002, - "page": 39 - }, - { - "topLeft": { - "x": 141.74, - "y": 441.30798 - }, - "width": 261.354, - "height": -11.358002, - "page": 39 - } - ], - "sectionNumber": 309, - "textBefore": null, - "textAfter": " Results of", - "comments": null, - "startOffset": 0, - "endOffset": 55, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563174823Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "32794d7be49a30122212a0def9fe30fa", - "type": "headline", - "value": "2.6.6 Summary of reproductive toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.6 Summary of reproductive toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 593.498 - }, - "width": 24, - "height": -11.358002, - "page": 40 - }, - { - "topLeft": { - "x": 141.74, - "y": 593.498 - }, - "width": 172.98, - "height": -11.358002, - "page": 40 - } - ], - "sectionNumber": 317, - "textBefore": null, - "textAfter": " Results of", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563175143Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "44ce29862628f5afff31dd729ffcca5c", - "type": "headline", - "value": "2.6.7 Summary of neurotoxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.7 Summary of neurotoxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 277.248 - }, - "width": 24, - "height": -11.357971, - "page": 41 - }, - { - "topLeft": { - "x": 141.74, - "y": 277.248 - }, - "width": 134.34001, - "height": -11.357971, - "page": 41 - } - ], - "sectionNumber": 318, - "textBefore": null, - "textAfter": " No specific", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563175473Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "40c5d11ad9063c594e54c4c1a9d2cd5d", - "type": "headline", - "value": "2.6.8 Summary of further toxicological studies on the active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.8 Summary of further toxicological studies on the active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 151.578 - }, - "width": 24, - "height": -11.357971, - "page": 41 - }, - { - "topLeft": { - "x": 141.74, - "y": 151.578 - }, - "width": 329.59204, - "height": -11.357971, - "page": 41 - } - ], - "sectionNumber": 319, - "textBefore": null, - "textAfter": " Further mechanistic", - "comments": null, - "startOffset": 0, - "endOffset": 70, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563175803Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "be45ce618e305ca42a3539030a9b4cc5", - "type": "headline", - "value": "2.6.9 Summary of toxicological data on impurities and metabolites", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.9 Summary of toxicological data on impurities and metabolites", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 251.92798 - }, - "width": 24, - "height": -11.357971, - "page": 42 - }, - { - "topLeft": { - "x": 141.74, - "y": 251.92798 - }, - "width": 311.47205, - "height": -11.357971, - "page": 42 - } - ], - "sectionNumber": 354, - "textBefore": null, - "textAfter": " Summary of", - "comments": null, - "startOffset": 0, - "endOffset": 65, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563176113Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "40f1ec932a7004600631ddf5cf74624c", - "type": "headline", - "value": "2.6.11 Toxicological end point for assessment of risk following long-term dietary exposure - ADI", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.11 Toxicological end point for assessment of risk following long-term dietary\nexposure - ADI", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 467.82797 - }, - "width": 30, - "height": -11.358002, - "page": 46 - }, - { - "topLeft": { - "x": 141.74, - "y": 467.82797 - }, - "width": 382.83203, - "height": -11.358002, - "page": 46 - }, - { - "topLeft": { - "x": 141.74, - "y": 454.02798 - }, - "width": 77.058, - "height": -11.358002, - "page": 46 - } - ], - "sectionNumber": 356, - "textBefore": null, - "textAfter": " Original DAR", - "comments": null, - "startOffset": 0, - "endOffset": 96, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563176433Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ed3be3511c690dbdfac3fef0b8fd37c4", - "type": "headline", - "value": "2.6.10 Summary of medical data and information", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.10 Summary of medical data and information", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 669.45795 - }, - "width": 30, - "height": -11.358002, - "page": 46 - }, - { - "topLeft": { - "x": 141.74, - "y": 669.45795 - }, - "width": 218.73598, - "height": -11.358002, - "page": 46 - } - ], - "sectionNumber": 355, - "textBefore": null, - "textAfter": " According to", - "comments": null, - "startOffset": 0, - "endOffset": 46, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563176743Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "debcea539a3cc78c168d88cdd3e3d591", - "type": "headline", - "value": "2.6.13 Toxicological end point for assessment of occupational, bystander and residents risks – AOEL", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.13 Toxicological end point for assessment of occupational, bystander and\nresidents risks – AOEL", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 367.36798 - }, - "width": 30, - "height": -11.358002, - "page": 47 - }, - { - "topLeft": { - "x": 141.74, - "y": 367.36798 - }, - "width": 382.85602, - "height": -11.358002, - "page": 47 - }, - { - "topLeft": { - "x": 141.74, - "y": 353.56796 - }, - "width": 118.782, - "height": -11.358002, - "page": 47 - } - ], - "sectionNumber": 358, - "textBefore": null, - "textAfter": " Original DAR", - "comments": null, - "startOffset": 0, - "endOffset": 99, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563177053Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7d9ca9d22dbd67d2df797cdeccdc020a", - "type": "headline", - "value": "2.6.12 Toxicological end point for assessment of risk following acute dietary exposure - ARfD (acute reference dose)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.12 Toxicological end point for assessment of risk following acute dietary\nexposure - ARfD (acute reference dose)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 669.45795 - }, - "width": 30, - "height": -11.358002, - "page": 47 - }, - { - "topLeft": { - "x": 141.74, - "y": 669.45795 - }, - "width": 382.88806, - "height": -11.358002, - "page": 47 - }, - { - "topLeft": { - "x": 141.74, - "y": 655.65796 - }, - "width": 199.434, - "height": -11.358002, - "page": 47 - } - ], - "sectionNumber": 357, - "textBefore": null, - "textAfter": " Original DAR", - "comments": null, - "startOffset": 0, - "endOffset": 116, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563177373Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9a68943d96e5d303985a5f7bbfac95fc", - "type": "headline", - "value": "2.6.14 Summary of product exposure and risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.6.14 Summary of product exposure and risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 353.20798 - }, - "width": 30, - "height": -11.358002, - "page": 48 - }, - { - "topLeft": { - "x": 141.74, - "y": 353.20798 - }, - "width": 260.03998, - "height": -11.358002, - "page": 48 - } - ], - "sectionNumber": 359, - "textBefore": null, - "textAfter": " A9396G containing", - "comments": null, - "startOffset": 0, - "endOffset": 54, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563177683Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3cadc5a228f73701b1796fe667893e8f", - "type": "headline", - "value": "2.7.1 Summary of storage stability of residues", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.1 Summary of storage stability of residues", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 151.698 - }, - "width": 24, - "height": -11.357971, - "page": 48 - }, - { - "topLeft": { - "x": 141.74, - "y": 151.698 - }, - "width": 202.06801, - "height": -11.357971, - "page": 48 - } - ], - "sectionNumber": 361, - "textBefore": null, - "textAfter": " The storage", - "comments": null, - "startOffset": 0, - "endOffset": 46, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563178003Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cf283e8ddd27945ee8ae3bafd7a0f698", - "type": "headline", - "value": "2.7 Residues", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7 Residues", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 189.49799 - }, - "width": 15, - "height": -11.357971, - "page": 48 - }, - { - "topLeft": { - "x": 141.74, - "y": 189.49799 - }, - "width": 45.37799, - "height": -11.357971, - "page": 48 - } - ], - "sectionNumber": 360, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 12, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563178333Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a30e75a63ff8ca7565e9d625104915a1", - "type": "headline", - "value": "2.7.2 Summary of metabolism, distribution and expression of residues in plants, poultry, lactating ruminants, pigs and fish", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 315.16797 - }, - "width": 24, - "height": -11.357971, - "page": 49 - }, - { - "topLeft": { - "x": 141.74, - "y": 315.16797 - }, - "width": 382.6681, - "height": -11.357971, - "page": 49 - }, - { - "topLeft": { - "x": 141.74, - "y": 301.36798 - }, - "width": 210.76808, - "height": -11.357971, - "page": 49 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": " The metabolism", - "comments": null, - "startOffset": 0, - "endOffset": 123, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563178653Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "070803014a9d0185e15ab72e0b5ba639", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 372 - }, - "width": 110, - "height": 93, - "page": 54 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563178963Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fd2c296a6e7ab65a6a812fc597f78ee7", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 274 - }, - "width": 113, - "height": 92, - "page": 54 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563179283Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "34c48aab77378b6c8d5b6afaf6a7725a", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 558 - }, - "width": 111, - "height": 75, - "page": 54 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563179603Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "54dbb789265108d00e10890877e46560", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 111 - }, - "width": 190, - "height": 66, - "page": 54 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563179923Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c2054808db8bfef960745183d572952f", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 476 - }, - "width": 111, - "height": 76, - "page": 54 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563180233Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e1721fb804bd084a9f5f3e68bcf5d60e", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 183 - }, - "width": 113, - "height": 85, - "page": 54 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563180553Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0e905ca043281182557a4078ddbda209", - "type": "headline", - "value": "2.7.2.1 Metabolism in plants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.2.1 Metabolism in plants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 435.42798 - }, - "width": 33, - "height": -11.358002, - "page": 55 - }, - { - "topLeft": { - "x": 141.74, - "y": 435.42798 - }, - "width": 108.08397, - "height": -11.358002, - "page": 55 - } - ], - "sectionNumber": 411, - "textBefore": null, - "textAfter": " The metabolism", - "comments": null, - "startOffset": 0, - "endOffset": 28, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563180873Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7f373a9c131dbe4c73b7840f20e6e65a", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 628 - }, - "width": 181, - "height": 93, - "page": 55 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563181183Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cab046a2c7bae57aac53f429b97d8300", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 464 - }, - "width": 113, - "height": 74, - "page": 55 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563181513Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "24f08626a1830efaa31e7ff732c71c53", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.2 Summary of metabolism, distribution and expression of residues in plants,\npoultry, lactating ruminants, pigs and fish", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 259, - "y": 544 - }, - "width": 181, - "height": 78, - "page": 55 - } - ], - "sectionNumber": 410, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563181823Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "af1ac233706dcf1a8dd669645b1f8c7e", - "type": "headline", - "value": "2.7.2.3 Metabolism in lactating ruminants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.2.3 Metabolism in lactating ruminants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 378.64798 - }, - "width": 33, - "height": -11.358002, - "page": 59 - }, - { - "topLeft": { - "x": 141.74, - "y": 378.64798 - }, - "width": 177.54, - "height": -11.358002, - "page": 59 - } - ], - "sectionNumber": 413, - "textBefore": null, - "textAfter": " Although the", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563182133Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3c6e9419b9d26bdcd5ce724522de5105", - "type": "headline", - "value": "2.7.2.2 Metabolism in poultry", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.2.2 Metabolism in poultry", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 757.298 - }, - "width": 33, - "height": -11.358002, - "page": 59 - }, - { - "topLeft": { - "x": 141.74, - "y": 757.298 - }, - "width": 114.67796, - "height": -11.358002, - "page": 59 - } - ], - "sectionNumber": 412, - "textBefore": null, - "textAfter": " Although the", - "comments": null, - "startOffset": 0, - "endOffset": 29, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563182443Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4fb843859d387894a8df5e54b5856e76", - "type": "headline", - "value": "2.7.2.5 Metabolism in fish", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.2.5 Metabolism in fish", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 556.388 - }, - "width": 33, - "height": -11.358002, - "page": 60 - }, - { - "topLeft": { - "x": 141.74, - "y": 556.388 - }, - "width": 95.387985, - "height": -11.358002, - "page": 60 - } - ], - "sectionNumber": 417, - "textBefore": null, - "textAfter": " No fish", - "comments": null, - "startOffset": 0, - "endOffset": 26, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563182753Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "44633db381bbc29dcf0a24d095f149e3", - "type": "headline", - "value": "2.7.2.4 Metabolism in pigs", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.2.4 Metabolism in pigs", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 669.45795 - }, - "width": 33, - "height": -11.358002, - "page": 60 - }, - { - "topLeft": { - "x": 141.74, - "y": 669.45795 - }, - "width": 97.35597, - "height": -11.358002, - "page": 60 - } - ], - "sectionNumber": 414, - "textBefore": null, - "textAfter": " No metabolism", - "comments": null, - "startOffset": 0, - "endOffset": 26, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563183063Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "212b0f3a054935951f1bacff068d0129", - "type": "headline", - "value": "2.7.3.1 Definition of the residue in plants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.3.1 Definition of the residue in plants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 731.498 - }, - "width": 33, - "height": -11.358002, - "page": 63 - }, - { - "topLeft": { - "x": 141.74, - "y": 731.498 - }, - "width": 171.04802, - "height": -11.358002, - "page": 63 - } - ], - "sectionNumber": 419, - "textBefore": null, - "textAfter": " Metabolism studies", - "comments": null, - "startOffset": 0, - "endOffset": 43, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563183473Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c62070b3a9c56b922be646dd5efa8ba2", - "type": "headline", - "value": "2.7.3 Definition of the residue", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.3 Definition of the residue", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 63 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 121.03801, - "height": -11.358002, - "page": 63 - } - ], - "sectionNumber": 418, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563183783Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "19822b8cb1f24e7257588dc48747a32f", - "type": "headline", - "value": "2.7.3.2 Definition of the residue in animals", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.3.2 Definition of the residue in animals", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 176.05798 - }, - "width": 33, - "height": -11.357971, - "page": 65 - }, - { - "topLeft": { - "x": 141.74, - "y": 176.05798 - }, - "width": 179.58601, - "height": -11.357971, - "page": 65 - } - ], - "sectionNumber": 420, - "textBefore": null, - "textAfter": " The metabolism", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563184183Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9c12c120b864929cf2c00f416e538712", - "type": "headline", - "value": "2.7.4 Summary of residue trials in plants and identification of critical GAP", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.4 Summary of residue trials in plants and identification of critical GAP", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 67 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 347.67603, - "height": -11.358002, - "page": 67 - } - ], - "sectionNumber": 421, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 76, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563184493Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f6e737a97fcbd5c91b899055f9f7787c", - "type": "headline", - "value": "2.7.4.1 Sunflower seeds", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.4.1 Sunflower seeds", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 731.498 - }, - "width": 33, - "height": -11.358002, - "page": 67 - }, - { - "topLeft": { - "x": 141.74, - "y": 731.498 - }, - "width": 82.247986, - "height": -11.358002, - "page": 67 - } - ], - "sectionNumber": 434, - "textBefore": null, - "textAfter": " The representative", - "comments": null, - "startOffset": 0, - "endOffset": 23, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563184803Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5b555228eae937601ef09625d077a2b7", - "type": "headline", - "value": "2.7.4.2 Maize", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.4.2 Maize", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 719.97797 - }, - "width": 33, - "height": -11.358002, - "page": 68 - }, - { - "topLeft": { - "x": 141.74, - "y": 719.97797 - }, - "width": 31.272003, - "height": -11.358002, - "page": 68 - } - ], - "sectionNumber": 475, - "textBefore": null, - "textAfter": " The representative", - "comments": null, - "startOffset": 0, - "endOffset": 13, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563185113Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8baf7a9ee4b4c1e06e5ce83ecf4ea493", - "type": "headline", - "value": "2.7.5 Summary of feeding studies in poultry, ruminants, pigs and fish", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.5 Summary of feeding studies in poultry, ruminants, pigs and fish", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 419.70798 - }, - "width": 24, - "height": -11.358002, - "page": 69 - }, - { - "topLeft": { - "x": 141.74, - "y": 419.70798 - }, - "width": 319.47607, - "height": -11.358002, - "page": 69 - } - ], - "sectionNumber": 508, - "textBefore": null, - "textAfter": " S-metolachlor is", - "comments": null, - "startOffset": 0, - "endOffset": 69, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563185423Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b3930205158eb8399f03b1a96f280500", - "type": "headline", - "value": "2.7.5.2 Ruminant", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.5.2 Ruminant", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 129.85797 - }, - "width": 33, - "height": -11.357971, - "page": 70 - }, - { - "topLeft": { - "x": 141.74, - "y": 129.85797 - }, - "width": 51.971985, - "height": -11.357971, - "page": 70 - } - ], - "sectionNumber": 510, - "textBefore": null, - "textAfter": " Based on", - "comments": null, - "startOffset": 0, - "endOffset": 16, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563185743Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0a04c4f33404a3d3e3aea58f12fe11c4", - "type": "headline", - "value": "2.7.5.1 Poultry", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.5.1 Poultry", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 192.25793 - }, - "width": 33, - "height": -11.357971, - "page": 70 - }, - { - "topLeft": { - "x": 141.74, - "y": 192.25793 - }, - "width": 38.507996, - "height": -11.357971, - "page": 70 - } - ], - "sectionNumber": 509, - "textBefore": null, - "textAfter": " No feeding", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563186063Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f185a6d20cbd590d248e784c13253212", - "type": "headline", - "value": "2.7.7 Summary of residues in rotational crops", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.7 Summary of residues in rotational crops", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 418.748 - }, - "width": 24, - "height": -11.358002, - "page": 71 - }, - { - "topLeft": { - "x": 141.74, - "y": 418.748 - }, - "width": 201.82805, - "height": -11.358002, - "page": 71 - } - ], - "sectionNumber": 514, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 45, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563186383Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "800e53a56bdcf2b2a4624f30cfd1cff7", - "type": "headline", - "value": "2.7.5.3 Pig", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.5.3 Pig", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 656.738 - }, - "width": 33, - "height": -11.358002, - "page": 71 - }, - { - "topLeft": { - "x": 141.74, - "y": 656.738 - }, - "width": 16.535995, - "height": -11.358002, - "page": 71 - } - ], - "sectionNumber": 511, - "textBefore": null, - "textAfter": " No feeding", - "comments": null, - "startOffset": 0, - "endOffset": 11, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563186753Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4f796debfa6e233c561eb7718eb73d8c", - "type": "headline", - "value": "2.7.6 Summary of effects of processing", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.6 Summary of effects of processing", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 531.90796 - }, - "width": 24, - "height": -11.358002, - "page": 71 - }, - { - "topLeft": { - "x": 141.74, - "y": 531.90796 - }, - "width": 165.84004, - "height": -11.358002, - "page": 71 - } - ], - "sectionNumber": 513, - "textBefore": null, - "textAfter": " No processing", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563187073Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7c806e1c91083cdf339611eb62cc5984", - "type": "headline", - "value": "2.7.7.1 Metabolism in rotational crops", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.7.1 Metabolism in rotational crops", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 380.92798 - }, - "width": 33, - "height": -11.358002, - "page": 71 - }, - { - "topLeft": { - "x": 141.74, - "y": 380.92798 - }, - "width": 158.208, - "height": -11.358002, - "page": 71 - } - ], - "sectionNumber": 515, - "textBefore": null, - "textAfter": " The uptake", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563187373Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "731b76e4d508a72fe54b07c6599bc622", - "type": "headline", - "value": "2.7.5.4 Fish", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.5.4 Fish", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 594.33795 - }, - "width": 33, - "height": -11.358002, - "page": 71 - }, - { - "topLeft": { - "x": 141.74, - "y": 594.33795 - }, - "width": 21.875992, - "height": -11.358002, - "page": 71 - } - ], - "sectionNumber": 512, - "textBefore": null, - "textAfter": " No feeding", - "comments": null, - "startOffset": 0, - "endOffset": 12, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563187693Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "89bcfdd4caa67f8d3200a183e17f84c2", - "type": "headline", - "value": "2.7.9 Estimation of the potential and actual exposure through diet and other sources", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.9 Estimation of the potential and actual exposure through diet and other\nsources", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 353.44797 - }, - "width": 24, - "height": -11.358002, - "page": 72 - }, - { - "topLeft": { - "x": 141.74, - "y": 353.44797 - }, - "width": 383.07812, - "height": -11.358002, - "page": 72 - }, - { - "topLeft": { - "x": 141.74, - "y": 339.64798 - }, - "width": 37.067993, - "height": -11.358002, - "page": 72 - } - ], - "sectionNumber": 551, - "textBefore": null, - "textAfter": " The toxicological", - "comments": null, - "startOffset": 0, - "endOffset": 84, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563188013Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fe7ef8b87492606faa15212c094fe9c1", - "type": "headline", - "value": "2.7.8 Summary of other studies", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.8 Summary of other studies", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 466.50797 - }, - "width": 24, - "height": -11.358002, - "page": 72 - }, - { - "topLeft": { - "x": 141.74, - "y": 466.50797 - }, - "width": 129.708, - "height": -11.358002, - "page": 72 - } - ], - "sectionNumber": 517, - "textBefore": null, - "textAfter": " No other", - "comments": null, - "startOffset": 0, - "endOffset": 30, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563188323Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1e847c9adcc74832c364552583051669", - "type": "headline", - "value": "2.7.7.2 Magnitude of residues in rotational crops", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.7.2 Magnitude of residues in rotational crops", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 33, - "height": -11.358002, - "page": 72 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 211.56001, - "height": -11.358002, - "page": 72 - } - ], - "sectionNumber": 516, - "textBefore": null, - "textAfter": " Two new", - "comments": null, - "startOffset": 0, - "endOffset": 49, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563188633Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "612cd83a0489b3e92208bed484bf0a7c", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.9 Estimation of the potential and actual exposure through diet and other\nsources", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 537, - "y": 437 - }, - "width": 170, - "height": 16, - "page": 74 - } - ], - "sectionNumber": 551, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563188943Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "54fdb0d777186666added246e0df2c40", - "type": "ocr", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.7.9 Estimation of the potential and actual exposure through diet and other\nsources", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 537, - "y": 462 - }, - "width": 170, - "height": 49, - "page": 74 - } - ], - "sectionNumber": 551, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563189263Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6ed8f74d1c7df9cf6f1ef5405aba07c6", - "type": "headline", - "value": "2.7.10 Proposed MRLs and compliance with existing MRLs", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.10 Proposed MRLs and compliance with existing MRLs", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 745.298 - }, - "width": 30, - "height": -11.358002, - "page": 76 - }, - { - "topLeft": { - "x": 141.74, - "y": 745.298 - }, - "width": 265.656, - "height": -11.358002, - "page": 76 - } - ], - "sectionNumber": 557, - "textBefore": null, - "textAfter": " EU MRLs", - "comments": null, - "startOffset": 0, - "endOffset": 54, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563189583Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5434eddd6385d5bc91dc86cfd53f821f", - "type": "headline", - "value": "2.8 Fate and behaviour in the environment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8 Fate and behaviour in the environment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 304.48798 - }, - "width": 15, - "height": -11.357971, - "page": 76 - }, - { - "topLeft": { - "x": 141.74, - "y": 304.48798 - }, - "width": 200.196, - "height": -11.357971, - "page": 76 - } - ], - "sectionNumber": 617, - "textBefore": null, - "textAfter": " Under environmental", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563189903Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "32e50c8bab81d92226c0ffa9cce24101", - "type": "headline", - "value": "2.7.11 Proposed import tolerances and compliance with existing import tolerances", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.7.11 Proposed import tolerances and compliance with existing import tolerances", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 366.88797 - }, - "width": 30, - "height": -11.358002, - "page": 76 - }, - { - "topLeft": { - "x": 141.74, - "y": 366.88797 - }, - "width": 378.45605, - "height": -11.358002, - "page": 76 - } - ], - "sectionNumber": 558, - "textBefore": null, - "textAfter": " Not applicable.", - "comments": null, - "startOffset": 0, - "endOffset": 80, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563190233Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8b3487b08688941a85085fff2209e592", - "type": "headline", - "value": "2.8.1 Summary of fate and behaviour in soil", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.1 Summary of fate and behaviour in soil", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 372.88797 - }, - "width": 24, - "height": -11.358002, - "page": 87 - }, - { - "topLeft": { - "x": 141.74, - "y": 372.88797 - }, - "width": 196.416, - "height": -11.358002, - "page": 87 - } - ], - "sectionNumber": 869, - "textBefore": null, - "textAfter": " Appendix 1", - "comments": null, - "startOffset": 0, - "endOffset": 43, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563190553Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7c115101880924cabe5e83d0b7b48956", - "type": "headline", - "value": "2.8.1.1 Adsorption and desorption in soil", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.1.1 Adsorption and desorption in soil", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 381.76797 - }, - "width": 33, - "height": -11.358002, - "page": 102 - }, - { - "topLeft": { - "x": 141.74, - "y": 381.76797 - }, - "width": 171.34795, - "height": -11.358002, - "page": 102 - } - ], - "sectionNumber": 981, - "textBefore": null, - "textAfter": " Already during", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563190893Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "bacecef5b3b4cfe05cc485fee56c2961", - "type": "headline", - "value": "2.8.1.2 Mobility in soil", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.1.2 Mobility in soil", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 659.378 - }, - "width": 33, - "height": -11.358002, - "page": 106 - }, - { - "topLeft": { - "x": 141.74, - "y": 659.378 - }, - "width": 77.44798, - "height": -11.358002, - "page": 106 - } - ], - "sectionNumber": 1044, - "textBefore": null, - "textAfter": " Column leaching", - "comments": null, - "startOffset": 0, - "endOffset": 24, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563191243Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9a400fc875e5ef5c37cd2d8f28cfbad4", - "type": "headline", - "value": "2.8.2 Summary of fate and behaviour in water and sediment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.2 Summary of fate and behaviour in water and sediment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 404.44797 - }, - "width": 24, - "height": -11.358002, - "page": 114 - }, - { - "topLeft": { - "x": 141.74, - "y": 404.44797 - }, - "width": 274.47607, - "height": -11.358002, - "page": 114 - } - ], - "sectionNumber": 1065, - "textBefore": null, - "textAfter": " Route and", - "comments": null, - "startOffset": 0, - "endOffset": 57, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563191573Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "94be1bcdfbfed7fb943549db5d1f57b2", - "type": "headline", - "value": "2.8.3 Summary of fate and behaviour in air", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.3 Summary of fate and behaviour in air", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 291.64795 - }, - "width": 24, - "height": -11.357971, - "page": 116 - }, - { - "topLeft": { - "x": 141.74, - "y": 291.64795 - }, - "width": 190.22404, - "height": -11.357971, - "page": 116 - } - ], - "sectionNumber": 1066, - "textBefore": null, - "textAfter": " S-metolachlor has", - "comments": null, - "startOffset": 0, - "endOffset": 42, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563191913Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1384ffc50f68c59a7577882d8eb711b3", - "type": "headline", - "value": "2.8.4 Summary of monitoring data concerning fate and behaviour of the active substance, metabolites, degradation and reaction products", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.4 Summary of monitoring data concerning fate and behaviour of the active\nsubstance, metabolites, degradation and reaction products", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 694.77795 - }, - "width": 24, - "height": -11.358002, - "page": 117 - }, - { - "topLeft": { - "x": 141.74, - "y": 694.77795 - }, - "width": 382.5722, - "height": -11.358002, - "page": 117 - }, - { - "topLeft": { - "x": 141.74, - "y": 680.97797 - }, - "width": 292.1881, - "height": -11.358002, - "page": 117 - } - ], - "sectionNumber": 1067, - "textBefore": null, - "textAfter": " As highest", - "comments": null, - "startOffset": 0, - "endOffset": 134, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563192223Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "677e2ef415b66fb9c7b128a61b72bebc", - "type": "headline", - "value": "2.8.5 Definition of the residues in the environment requiring further assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.5 Definition of the residues in the environment requiring further assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 359.80798 - }, - "width": 24, - "height": -11.358002, - "page": 118 - }, - { - "topLeft": { - "x": 141.74, - "y": 359.80798 - }, - "width": 371.52008, - "height": -11.358002, - "page": 118 - } - ], - "sectionNumber": 1068, - "textBefore": null, - "textAfter": " Soil: CGA40172,", - "comments": null, - "startOffset": 0, - "endOffset": 80, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563192543Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0deab01d4f6c0fc33537f618b806d619", - "type": "headline", - "value": "2.8.6 Summary of exposure calculations and product assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.6 Summary of exposure calculations and product assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 119 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 295.45203, - "height": -11.358002, - "page": 119 - } - ], - "sectionNumber": 1069, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563192973Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "51970df3b3ead9780d8c185e2f8f20a9", - "type": "headline", - "value": "2.8.6.1 PECsoil", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.6.1 PECsoil", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 731.498 - }, - "width": 33, - "height": -11.358002, - "page": 119 - }, - { - "topLeft": { - "x": 141.74, - "y": 731.498 - }, - "width": 35.61624, - "height": -11.838043, - "page": 119 - } - ], - "sectionNumber": 1123, - "textBefore": null, - "textAfter": " The PECsoil", - "comments": null, - "startOffset": 0, - "endOffset": 15, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563193403Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8b2c39d740ebf0430f8099469959e69d", - "type": "headline", - "value": "2.8.6.2 PECgroundwater", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.6.2 PECgroundwater", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 228.40796 - }, - "width": 33, - "height": -11.357971, - "page": 121 - }, - { - "topLeft": { - "x": 141.74, - "y": 228.40796 - }, - "width": 68.46768, - "height": -11.837952, - "page": 121 - } - ], - "sectionNumber": 1258, - "textBefore": null, - "textAfter": " The notifier", - "comments": null, - "startOffset": 0, - "endOffset": 22, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563193823Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9e61158743d7b50e62f502e874680482", - "type": "headline", - "value": "2.8.6.3 PECsurface water and PECsediment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.6.3 PECsurface water and PECsediment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 536.948 - }, - "width": 33, - "height": -11.358002, - "page": 126 - }, - { - "topLeft": { - "x": 141.74, - "y": 536.948 - }, - "width": 70.493774, - "height": -11.838043, - "page": 126 - }, - { - "topLeft": { - "x": 215.33, - "y": 536.948 - }, - "width": 76.824356, - "height": -11.838043, - "page": 126 - } - ], - "sectionNumber": 1285, - "textBefore": null, - "textAfter": " Predicted environmental", - "comments": null, - "startOffset": 0, - "endOffset": 40, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563194143Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6626c0eeb86da67ec686f059f1943cdb", - "type": "headline", - "value": "2.8.6.5 PEC from other routes of exposure", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.6.5 PEC from other routes of exposure", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 477.54797 - }, - "width": 33, - "height": -11.358002, - "page": 127 - }, - { - "topLeft": { - "x": 141.74, - "y": 477.54797 - }, - "width": 179.58, - "height": -11.358002, - "page": 127 - } - ], - "sectionNumber": 1287, - "textBefore": null, - "textAfter": " No other", - "comments": null, - "startOffset": 0, - "endOffset": 41, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563194473Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "253c1a7156f14a9ee1b27066dd57444c", - "type": "headline", - "value": "2.8.6.4 PECair", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.8.6.4 PECair", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 590.618 - }, - "width": 33, - "height": -11.358002, - "page": 127 - }, - { - "topLeft": { - "x": 141.74, - "y": 590.618 - }, - "width": 33.82332, - "height": -11.837982, - "page": 127 - } - ], - "sectionNumber": 1286, - "textBefore": null, - "textAfter": " S-metolachlor is", - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563194813Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "21fab5640f3c4adc60a9cd36418257e5", - "type": "headline", - "value": "2.9.1 Summary of effects on birds and other terrestrial vertebrates", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.1 Summary of effects on birds and other terrestrial vertebrates", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 364.60797 - }, - "width": 24, - "height": -11.358002, - "page": 127 - }, - { - "topLeft": { - "x": 141.74, - "y": 364.60797 - }, - "width": 312.552, - "height": -11.358002, - "page": 127 - } - ], - "sectionNumber": 1310, - "textBefore": null, - "textAfter": " Two new", - "comments": null, - "startOffset": 0, - "endOffset": 67, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563195203Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "ad2d9af3225d1db7d2b3d3d2b7a6d423", - "type": "headline", - "value": "2.9 Effects on non-target species", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9 Effects on non-target species", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 402.40796 - }, - "width": 15, - "height": -11.358002, - "page": 127 - }, - { - "topLeft": { - "x": 141.74, - "y": 402.40796 - }, - "width": 146.20201, - "height": -11.358002, - "page": 127 - } - ], - "sectionNumber": 1288, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 33, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563195523Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "362c096c2284c31a52f965d9906f96a1", - "type": "headline", - "value": "2.9.2 Summary of effects on aquatic organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.2 Summary of effects on aquatic organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 593.498 - }, - "width": 24, - "height": -11.358002, - "page": 130 - }, - { - "topLeft": { - "x": 141.74, - "y": 593.498 - }, - "width": 211.45204, - "height": -11.358002, - "page": 130 - } - ], - "sectionNumber": 1363, - "textBefore": null, - "textAfter": " Based on", - "comments": null, - "startOffset": 0, - "endOffset": 45, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563195863Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "e90e3bce3c0c6b0d4a90758cb27338c0", - "type": "headline", - "value": "2.9.3 Summary of effects on arthropods", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.3 Summary of effects on arthropods", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 322.00793 - }, - "width": 24, - "height": -11.357971, - "page": 133 - }, - { - "topLeft": { - "x": 141.74, - "y": 322.00793 - }, - "width": 175.06203, - "height": -11.357971, - "page": 133 - } - ], - "sectionNumber": 1382, - "textBefore": null, - "textAfter": " Honey bees", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563196173Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "981012c7d164f63b78ea78729212bb6d", - "type": "headline", - "value": "2.9.4 Summary of effects on non-target soil meso- and macrofauna", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.4 Summary of effects on non-target soil meso- and macrofauna", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 526.02795 - }, - "width": 24, - "height": -11.358002, - "page": 135 - }, - { - "topLeft": { - "x": 141.74, - "y": 526.02795 - }, - "width": 312.44604, - "height": -11.358002, - "page": 135 - } - ], - "sectionNumber": 1383, - "textBefore": null, - "textAfter": " Studies regarding", - "comments": null, - "startOffset": 0, - "endOffset": 64, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563196483Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "aaec0717bb4315d7c337579b020359d9", - "type": "headline", - "value": "2.9.5 Summary of effects on earthworms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.5 Summary of effects on earthworms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 362.44797 - }, - "width": 24, - "height": -11.358002, - "page": 135 - }, - { - "topLeft": { - "x": 141.74, - "y": 362.44797 - }, - "width": 179.78404, - "height": -11.358002, - "page": 135 - } - ], - "sectionNumber": 1400, - "textBefore": null, - "textAfter": " The applicant", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563196803Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6167e6efcfd104aec24d70373f529d7f", - "type": "headline", - "value": "2.9.6 Summary of effects on other non-target soil meso- and macrofauna", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.6 Summary of effects on other non-target soil meso- and macrofauna", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 674.858 - }, - "width": 24, - "height": -11.358002, - "page": 137 - }, - { - "topLeft": { - "x": 141.74, - "y": 674.858 - }, - "width": 342.60803, - "height": -11.358002, - "page": 137 - } - ], - "sectionNumber": 1422, - "textBefore": null, - "textAfter": " Table 2.9-7:", - "comments": null, - "startOffset": 0, - "endOffset": 70, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563197103Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "34270d0c3376f1ad531923b9a10216e6", - "type": "headline", - "value": "2.9.7 Summary of effects on soil nitrogen transformation", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.7 Summary of effects on soil nitrogen transformation", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 488.82797 - }, - "width": 24, - "height": -11.358002, - "page": 138 - }, - { - "topLeft": { - "x": 141.74, - "y": 488.82797 - }, - "width": 262.26007, - "height": -11.358002, - "page": 138 - } - ], - "sectionNumber": 1435, - "textBefore": null, - "textAfter": " Table 2.9-8:", - "comments": null, - "startOffset": 0, - "endOffset": 56, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563197423Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "611dc04d3f650c26b0a14db9f98e629d", - "type": "headline", - "value": "2.9.8 Summary of effects on terrestrial non-target higher plants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.8 Summary of effects on terrestrial non-target higher plants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 24, - "height": -11.358002, - "page": 139 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 297.13397, - "height": -11.358002, - "page": 139 - } - ], - "sectionNumber": 1446, - "textBefore": null, - "textAfter": " Table 2.9-9:", - "comments": null, - "startOffset": 0, - "endOffset": 64, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563197733Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d63e1461e774e394747033fbd61ce65b", - "type": "headline", - "value": "2.9.10 Summary of effects on biological methods for sewage treatment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.10 Summary of effects on biological methods for sewage treatment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 108.62195 - }, - "width": 30, - "height": -11.357971, - "page": 140 - }, - { - "topLeft": { - "x": 141.74, - "y": 108.62195 - }, - "width": 323.88007, - "height": -11.357971, - "page": 140 - } - ], - "sectionNumber": 1448, - "textBefore": null, - "textAfter": " No new", - "comments": null, - "startOffset": 0, - "endOffset": 68, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563198053Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "65576f4b63e78b6f968bb289cc3e78d9", - "type": "headline", - "value": "2.9.9 Summary of effects on other terrestrial organisms (flora and fauna)", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.9 Summary of effects on other terrestrial organisms (flora and fauna)", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 171.13794 - }, - "width": 24, - "height": -11.357971, - "page": 140 - }, - { - "topLeft": { - "x": 141.74, - "y": 171.13794 - }, - "width": 345.80408, - "height": -11.357971, - "page": 140 - } - ], - "sectionNumber": 1447, - "textBefore": null, - "textAfter": " Not relevant.", - "comments": null, - "startOffset": 0, - "endOffset": 73, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563198363Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3fbab2e5f5d973ed05ff9e7cda200c75", - "type": "headline", - "value": "2.9.11 Summary of product exposure and risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.11 Summary of product exposure and risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 656.738 - }, - "width": 30, - "height": -11.358002, - "page": 141 - }, - { - "topLeft": { - "x": 141.74, - "y": 656.738 - }, - "width": 260.03998, - "height": -11.358002, - "page": 141 - } - ], - "sectionNumber": 1530, - "textBefore": null, - "textAfter": " Birds Table", - "comments": null, - "startOffset": 0, - "endOffset": 54, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563198683Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5ba17fea08c6c097858ac35b2214dc70", - "type": "headline", - "value": "2.9.11.1 Summary of the risk assessment for aquatic organisms", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.11.1 Summary of the risk assessment for aquatic organisms", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 39, - "height": -11.358002, - "page": 148 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 279.71002, - "height": -11.358002, - "page": 148 - } - ], - "sectionNumber": 1650, - "textBefore": null, - "textAfter": " Risk assessment", - "comments": null, - "startOffset": 0, - "endOffset": 61, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563198993Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4f3563bd975361b1c6150cdde53fc5c5", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.9.11.1 Summary of the risk assessment for aquatic organisms", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 442, - "y": 308 - }, - "width": 57, - "height": 43, - "page": 154 - } - ], - "sectionNumber": 1650, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563199303Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f7453422046b8fbe49e0c566e3a04aba", - "type": "headline", - "value": "2.9.11.2 Summary of the risk assessment for non-target arthropods", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.11.2 Summary of the risk assessment for non-target arthropods", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 39, - "height": -11.358002, - "page": 155 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 300.404, - "height": -11.358002, - "page": 155 - } - ], - "sectionNumber": 1675, - "textBefore": null, - "textAfter": " Procedures for", - "comments": null, - "startOffset": 0, - "endOffset": 65, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563199803Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "b1523cf0176042207b2b9a8bdddc6dee", - "type": "headline", - "value": "2.9.11.3 Summary of the risk assessment for non-target soil meso- and macrofauna", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.11.3 Summary of the risk assessment for non-target soil meso- and macrofauna", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 615.33795 - }, - "width": 39, - "height": -11.358002, - "page": 157 - }, - { - "topLeft": { - "x": 141.74, - "y": 615.33795 - }, - "width": 380.75604, - "height": -11.358002, - "page": 157 - } - ], - "sectionNumber": 1800, - "textBefore": null, - "textAfter": " Summary of", - "comments": null, - "startOffset": 0, - "endOffset": 80, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563200123Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "83c54c76fae2e0cf4b184f667b94e02d", - "type": "headline", - "value": "2.9.11.4 Summary of the risk assessment for soil nitrogen transformation", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.11.4 Summary of the risk assessment for soil nitrogen transformation", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 234.76794 - }, - "width": 39, - "height": -11.357971, - "page": 161 - }, - { - "topLeft": { - "x": 141.74, - "y": 234.76794 - }, - "width": 330.528, - "height": -11.357971, - "page": 161 - } - ], - "sectionNumber": 1815, - "textBefore": null, - "textAfter": " Table 2.9-27:", - "comments": null, - "startOffset": 0, - "endOffset": 72, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563200423Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d34a7a742be7146773d5644c0a77c236", - "type": "headline", - "value": "2.9.11.5 Summary of the risk assessment for non-target terrestrial plants", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.9.11.5 Summary of the risk assessment for non-target terrestrial plants", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 465.42798 - }, - "width": 39, - "height": -11.358002, - "page": 162 - }, - { - "topLeft": { - "x": 141.74, - "y": 465.42798 - }, - "width": 329.294, - "height": -11.358002, - "page": 162 - } - ], - "sectionNumber": 1903, - "textBefore": null, - "textAfter": " Seedling emergence", - "comments": null, - "startOffset": 0, - "endOffset": 73, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563200753Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2e84740933ae6d5156dc5145c5a0d142", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.9.11.5 Summary of the risk assessment for non-target terrestrial plants", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 71, - "y": 318 - }, - "width": 453, - "height": 453, - "page": 165 - } - ], - "sectionNumber": 1903, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563201073Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5d8ad2646713f6c4f497a7a6a4189a66", - "type": "headline", - "value": "2.10 Classification and labelling", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.10 Classification and labelling", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 21, - "height": -11.358002, - "page": 167 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 138.63597, - "height": -11.358002, - "page": 167 - } - ], - "sectionNumber": 1939, - "textBefore": null, - "textAfter": " Table 2.10-1:", - "comments": null, - "startOffset": 0, - "endOffset": 33, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563201383Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "3ec099478e08c1a3d39d913ee3fe760a", - "type": "headline", - "value": "A9396G", - "reason": "Headline found, removed by manual override", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": false, - "section": "A9396G", - "color": [ - 0.6666667, - 0.6666667, - 0.6666667 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 204.04321 - }, - "width": 36.796303, - "height": -11.023193, - "page": 168 - } - ], - "sectionNumber": 1958, - "textBefore": null, - "textAfter": " According to", - "comments": null, - "startOffset": 0, - "endOffset": 6, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563201713Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "REMOVE_LOCALLY", - "processedDate": "2022-10-10T12:08:24.320061Z", - "requestedDate": "2022-10-10T12:08:24.297899Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": true, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d41985615b698122933103b7b735ed83", - "type": "headline", - "value": "2.11.1 STEP 1: Exclusion of degradation products of no concern", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.1 STEP 1: Exclusion of degradation products of no concern", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 731.498 - }, - "width": 30, - "height": -11.358002, - "page": 170 - }, - { - "topLeft": { - "x": 141.74, - "y": 731.498 - }, - "width": 293.54407, - "height": -11.358002, - "page": 170 - } - ], - "sectionNumber": 1986, - "textBefore": null, - "textAfter": " Residues of", - "comments": null, - "startOffset": 0, - "endOffset": 62, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563202103Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "fdd9814b878f3709c03c9c1722ad5a50", - "type": "headline", - "value": "2.11 Relevance of metabolites in groundwater", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11 Relevance of metabolites in groundwater", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 21, - "height": -11.358002, - "page": 170 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 209.21999, - "height": -11.358002, - "page": 170 - } - ], - "sectionNumber": 1959, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563202413Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "39e58b3f566bace9e3fc750ae39466c8", - "type": "headline", - "value": "2.11.2 STEP 2: Quantification of potential groundwater contamination", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.2 STEP 2: Quantification of potential groundwater contamination", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 519.068 - }, - "width": 30, - "height": -11.358002, - "page": 173 - }, - { - "topLeft": { - "x": 141.74, - "y": 519.068 - }, - "width": 327.26404, - "height": -11.358002, - "page": 173 - } - ], - "sectionNumber": 2014, - "textBefore": null, - "textAfter": " The results", - "comments": null, - "startOffset": 0, - "endOffset": 68, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563202723Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "a7df378f69a2149383cb7ce42fb68321", - "type": "headline", - "value": "2.11.3 STEP 3: Hazard assessment - identification of relevant metabolites", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3 STEP 3: Hazard assessment - identification of relevant metabolites", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 30, - "height": -11.358002, - "page": 175 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 340.274, - "height": -11.358002, - "page": 175 - } - ], - "sectionNumber": 2040, - "textBefore": null, - "textAfter": " In accordance", - "comments": null, - "startOffset": 0, - "endOffset": 73, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563203033Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0041c21c1f9c572d6d7a11ade94c8801", - "type": "headline", - "value": "2.11.3.1 STEP 3, Stage 1: Screening for biological activity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.1 STEP 3, Stage 1: Screening for biological activity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 552.78796 - }, - "width": 39, - "height": -11.358002, - "page": 176 - }, - { - "topLeft": { - "x": 141.74, - "y": 552.78796 - }, - "width": 251.23802, - "height": -11.358002, - "page": 176 - } - ], - "sectionNumber": 2062, - "textBefore": null, - "textAfter": " For the", - "comments": null, - "startOffset": 0, - "endOffset": 59, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563203343Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "7f0d27dfaaef865f0297f70dfa183142", - "type": "headline", - "value": "2.11.3.2 STEP 3, Stage 2: Screening for genotoxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.2 STEP 3, Stage 2: Screening for genotoxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 180.61798 - }, - "width": 39, - "height": -11.357971, - "page": 178 - }, - { - "topLeft": { - "x": 141.74, - "y": 180.61798 - }, - "width": 222.93001, - "height": -11.357971, - "page": 178 - } - ], - "sectionNumber": 2063, - "textBefore": null, - "textAfter": " According to", - "comments": null, - "startOffset": 0, - "endOffset": 52, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563203643Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "81f22a6369b5521c0a07ab3fc5cae27a", - "type": "headline", - "value": "2.11.3.3 STEP 3, Stage 3: Screening for toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.3.3 STEP 3, Stage 3: Screening for toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 492.30798 - }, - "width": 39, - "height": -11.358002, - "page": 179 - }, - { - "topLeft": { - "x": 141.74, - "y": 492.30798 - }, - "width": 198.942, - "height": -11.358002, - "page": 179 - } - ], - "sectionNumber": 2064, - "textBefore": null, - "textAfter": " Currently, the", - "comments": null, - "startOffset": 0, - "endOffset": 48, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563203963Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f1b4bf1444120abf7654065d0b0a9308", - "type": "headline", - "value": "2.11.4 STEP 4: Exposure assessment – threshold of concern approach", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.4 STEP 4: Exposure assessment – threshold of concern approach", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 252.76794 - }, - "width": 30, - "height": -11.357971, - "page": 179 - }, - { - "topLeft": { - "x": 141.74, - "y": 252.76794 - }, - "width": 321.278, - "height": -11.357971, - "page": 179 - } - ], - "sectionNumber": 2065, - "textBefore": null, - "textAfter": " Based on", - "comments": null, - "startOffset": 0, - "endOffset": 66, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563204263Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "97031e10e22462a22fc8b582f18be066", - "type": "headline", - "value": "2.11.5 STEP 5: Refined risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.5 STEP 5: Refined risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 30, - "height": -11.358002, - "page": 180 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 167.286, - "height": -11.358002, - "page": 180 - } - ], - "sectionNumber": 2142, - "textBefore": null, - "textAfter": " In case", - "comments": null, - "startOffset": 0, - "endOffset": 38, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563204573Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "80ba317ee483de5fb4b2fdd43f4e37f0", - "type": "headline", - "value": "2.12.1 Identity and physical chemical properties", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.1 Identity and physical chemical properties", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 305.568 - }, - "width": 30, - "height": -11.357971, - "page": 183 - }, - { - "topLeft": { - "x": 141.74, - "y": 305.568 - }, - "width": 211.65001, - "height": -11.357971, - "page": 183 - } - ], - "sectionNumber": 2149, - "textBefore": null, - "textAfter": " S-Metolachlor is", - "comments": null, - "startOffset": 0, - "endOffset": 48, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563204883Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "cb02f4183de3509e6d173f3c5b52824a", - "type": "headline", - "value": "2.11.6 Overall conclusion", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.11.6 Overall conclusion", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 672.33795 - }, - "width": 30, - "height": -11.358002, - "page": 183 - }, - { - "topLeft": { - "x": 141.74, - "y": 672.33795 - }, - "width": 95.693985, - "height": -11.358002, - "page": 183 - } - ], - "sectionNumber": 2143, - "textBefore": null, - "textAfter": " Currently, the", - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563205223Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8f166ece9ca6fef64e03eca64f9f4d87", - "type": "headline", - "value": "2.12 Consideration of isomeric composition in the risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12 Consideration of isomeric composition in the risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 343.36798 - }, - "width": 21, - "height": -11.357971, - "page": 183 - }, - { - "topLeft": { - "x": 141.74, - "y": 343.36798 - }, - "width": 310.716, - "height": -11.357971, - "page": 183 - } - ], - "sectionNumber": 2144, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 65, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563205553Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0a41f8e9ba051aef7391ec7800efb868", - "type": "headline", - "value": "2.12.3 Mammalian toxicity", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.3 Mammalian toxicity", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 371.92798 - }, - "width": 30, - "height": -11.358002, - "page": 184 - }, - { - "topLeft": { - "x": 141.74, - "y": 371.92798 - }, - "width": 103.535995, - "height": -11.358002, - "page": 184 - } - ], - "sectionNumber": 2151, - "textBefore": null, - "textAfter": " Applicant’s statement", - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563205873Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "1f235fcc7a3955ce00e6b896d1f6b744", - "type": "headline", - "value": "2.12.2 Methods of analysis", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.2 Methods of analysis", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 447.06796 - }, - "width": 30, - "height": -11.358002, - "page": 184 - }, - { - "topLeft": { - "x": 141.74, - "y": 447.06796 - }, - "width": 101.45999, - "height": -11.358002, - "page": 184 - } - ], - "sectionNumber": 2150, - "textBefore": null, - "textAfter": " Validated chiral", - "comments": null, - "startOffset": 0, - "endOffset": 26, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563206183Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "5981c92025cede48ffe581be65a22509", - "type": "headline", - "value": "2.12.5 Residues and consumer risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.5 Residues and consumer risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 173.29797 - }, - "width": 30, - "height": -11.357971, - "page": 185 - }, - { - "topLeft": { - "x": 141.74, - "y": 173.29797 - }, - "width": 202.33797, - "height": -11.357971, - "page": 185 - } - ], - "sectionNumber": 2153, - "textBefore": null, - "textAfter": " S-metolachlor is", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563206543Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c227eb9f2550c26ddb8c4f2aea05771a", - "type": "headline", - "value": "2.12.4 Operator, worker, bystander and resident exposure", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.4 Operator, worker, bystander and resident exposure", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 273.76794 - }, - "width": 30, - "height": -11.357971, - "page": 185 - }, - { - "topLeft": { - "x": 141.74, - "y": 273.76794 - }, - "width": 261.40997, - "height": -11.357971, - "page": 185 - } - ], - "sectionNumber": 2152, - "textBefore": null, - "textAfter": " Metolachlor and", - "comments": null, - "startOffset": 0, - "endOffset": 56, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563206863Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9fa6920641a0ec9db3370ec5d9f4bae8", - "type": "image", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.12.3 Mammalian toxicity", - "color": [ - 0.7411765, - 0.8392157, - 1 - ], - "positions": [ - { - "topLeft": { - "x": 93, - "y": 374 - }, - "width": 409, - "height": 121, - "page": 185 - } - ], - "sectionNumber": 2151, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563207183Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "d5131736c77fde500c224107d0eb7390", - "type": "formula", - "value": null, - "reason": null, - "matchedRule": 0, - "rectangle": false, - "legalBasis": null, - "imported": false, - "redacted": false, - "section": "2.12.3 Mammalian toxicity", - "color": [ - 0.011764706, - 0.43529412, - 0.9882353 - ], - "positions": [ - { - "topLeft": { - "x": 158, - "y": 538 - }, - "width": 279, - "height": 233, - "page": 185 - } - ], - "sectionNumber": 2151, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563207493Z" - } - ], - "manualChanges": [], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": true, - "recommendation": false, - "falsePositive": false, - "image": true, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9a29eb1aedb61420dbb835defc5e5407", - "type": "headline", - "value": "2.13.1 Definition of residues for exposure/risk assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.13.1 Definition of residues for exposure/risk assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 380.20798 - }, - "width": 30, - "height": -11.358002, - "page": 186 - }, - { - "topLeft": { - "x": 141.74, - "y": 380.20798 - }, - "width": 258.25208, - "height": -11.358002, - "page": 186 - } - ], - "sectionNumber": 2157, - "textBefore": null, - "textAfter": " Food of", - "comments": null, - "startOffset": 0, - "endOffset": 58, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563207813Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2f0c2eab1eea7384ef857e5a5160a370", - "type": "headline", - "value": "2.12.7 Ecotoxicology", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.7 Ecotoxicology", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 568.988 - }, - "width": 30, - "height": -11.358002, - "page": 186 - }, - { - "topLeft": { - "x": 141.74, - "y": 568.988 - }, - "width": 71.244, - "height": -11.358002, - "page": 186 - } - ], - "sectionNumber": 2155, - "textBefore": null, - "textAfter": " Metolachlor is", - "comments": null, - "startOffset": 0, - "endOffset": 20, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563208123Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "15c18f41673efe1eec3a2a19c9662cfc", - "type": "headline", - "value": "2.13 Residue definitions", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.13 Residue definitions", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 418.02798 - }, - "width": 21, - "height": -11.358002, - "page": 186 - }, - { - "topLeft": { - "x": 141.74, - "y": 418.02798 - }, - "width": 97.72798, - "height": -11.358002, - "page": 186 - } - ], - "sectionNumber": 2156, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 24, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563208443Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4b5c453f832ab04e4b22d7ff693475bc", - "type": "headline", - "value": "2.12.6 Environmental fate", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.12.6 Environmental fate", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 682.058 - }, - "width": 30, - "height": -11.358002, - "page": 186 - }, - { - "topLeft": { - "x": 141.74, - "y": 682.058 - }, - "width": 99.38397, - "height": -11.358002, - "page": 186 - } - ], - "sectionNumber": 2154, - "textBefore": null, - "textAfter": " For the", - "comments": null, - "startOffset": 0, - "endOffset": 25, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563208753Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "0295c503e3334dac2cde73fe9a842444", - "type": "headline", - "value": "2.13.2 Definition of residues for monitoring", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "2.13.2 Definition of residues for monitoring", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 30, - "height": -11.358002, - "page": 187 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 187.44005, - "height": -11.358002, - "page": 187 - } - ], - "sectionNumber": 2160, - "textBefore": null, - "textAfter": " Food of", - "comments": null, - "startOffset": 0, - "endOffset": 44, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563209063Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "265eb3cd7850b4c2d3e8b449b11aec6e", - "type": "headline", - "value": "3.1.1 Proposal on acceptability against the decision making criteria – Article 4 and annex II of regulation (EC) No 1107/2009", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.1 Proposal on acceptability against the decision making criteria – Article 4 and annex II of regulation (EC) No 1107/2009", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 420.78796 - }, - "width": 24, - "height": -11.358002, - "page": 189 - }, - { - "topLeft": { - "x": 141.74, - "y": 420.78796 - }, - "width": 606.29004, - "height": -11.358002, - "page": 189 - } - ], - "sectionNumber": 2266, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 125, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563209403Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "841a620ba203b976d682c63176cb53ef", - "type": "headline", - "value": "3 Proposed decision with respect to the application", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3 Proposed decision with respect to the application", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 497.68887 - }, - "width": 7.0199966, - "height": -12.26886, - "page": 189 - }, - { - "topLeft": { - "x": 141.74, - "y": 497.68887 - }, - "width": 291.61176, - "height": -12.26886, - "page": 189 - } - ], - "sectionNumber": 2161, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 51, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563209713Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "11f1d2c57cfde5b61c5886179c5e225a", - "type": "headline", - "value": "3.1 Background to the proposed decision", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1 Background to the proposed decision", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 458.61798 - }, - "width": 15, - "height": -11.358002, - "page": 189 - }, - { - "topLeft": { - "x": 141.74, - "y": 458.61798 - }, - "width": 190.01997, - "height": -11.358002, - "page": 189 - } - ], - "sectionNumber": 2162, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 39, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563210063Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "20275ba329daea4fb4f90174119ef462", - "type": "headline", - "value": "3.1.2 Proposal – Candidate for substitution", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.2 Proposal – Candidate for substitution", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 522.698 - }, - "width": 24, - "height": -11.358002, - "page": 205 - }, - { - "topLeft": { - "x": 141.74, - "y": 522.698 - }, - "width": 192.26399, - "height": -11.358002, - "page": 205 - } - ], - "sectionNumber": 2271, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 43, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563210373Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c09611174f28ad5adfc3f0d1fe47a48e", - "type": "headline", - "value": "3.1.3 Proposal – Low risk active substance", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.3 Proposal – Low risk active substance", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 241.84796 - }, - "width": 24, - "height": -11.358002, - "page": 205 - }, - { - "topLeft": { - "x": 141.74, - "y": 241.84796 - }, - "width": 188.78398, - "height": -11.358002, - "page": 205 - } - ], - "sectionNumber": 2278, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 42, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563210683Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "087222e0c5ecb423bae2cf61256d02e8", - "type": "headline", - "value": "3.1.4 List of studies to be generated, still ongoing or available but not peer reviewed", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.4 List of studies to be generated, still ongoing or available but not peer reviewed", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.92, - "y": 383.82797 - }, - "width": 24, - "height": -11.358002, - "page": 206 - }, - { - "topLeft": { - "x": 141.74, - "y": 383.82797 - }, - "width": 398.4721, - "height": -11.358002, - "page": 206 - } - ], - "sectionNumber": 2328, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 87, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563211003Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "c2501e9fbf417b1910d981cad29d66ec", - "type": "headline", - "value": "3.1.5 Issues that could not be finalised", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.5 Issues that could not be finalised", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 745.298 - }, - "width": 24, - "height": -11.358002, - "page": 212 - }, - { - "topLeft": { - "x": 141.74, - "y": 745.298 - }, - "width": 166.442, - "height": -11.358002, - "page": 212 - } - ], - "sectionNumber": 2336, - "textBefore": null, - "textAfter": " An issue", - "comments": null, - "startOffset": 0, - "endOffset": 40, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563211323Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "9653cefd45fd33427d690962157f1132", - "type": "headline", - "value": "3.1.6 Critical areas of concern", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.6 Critical areas of concern", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 306.16797 - }, - "width": 24, - "height": -11.357971, - "page": 212 - }, - { - "topLeft": { - "x": 141.74, - "y": 306.16797 - }, - "width": 126.07799, - "height": -11.357971, - "page": 212 - } - ], - "sectionNumber": 2345, - "textBefore": null, - "textAfter": " An issue", - "comments": null, - "startOffset": 0, - "endOffset": 31, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563211633Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "4bded3cb277df8f0caa656bc304c950b", - "type": "headline", - "value": "3.1.7 Overview table of the concerns identified for each representative use considered", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.7 Overview table of the concerns identified for each representative use\nconsidered", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 210.61798 - }, - "width": 24, - "height": -11.357971, - "page": 213 - }, - { - "topLeft": { - "x": 141.74, - "y": 210.61798 - }, - "width": 382.80408, - "height": -11.357971, - "page": 213 - }, - { - "topLeft": { - "x": 141.74, - "y": 196.818 - }, - "width": 55.007996, - "height": -11.357971, - "page": 213 - } - ], - "sectionNumber": 2369, - "textBefore": null, - "textAfter": " (If a", - "comments": null, - "startOffset": 0, - "endOffset": 86, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563211963Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6043426e215a7cd9736b120d134c0203", - "type": "headline", - "value": "3.1.8 Area(s) where expert consultation is considered necessary", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.8 Area(s) where expert consultation is considered necessary", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 134.29797 - }, - "width": 24, - "height": -11.357971, - "page": 214 - }, - { - "topLeft": { - "x": 141.74, - "y": 134.29797 - }, - "width": 294.36, - "height": -11.357971, - "page": 214 - } - ], - "sectionNumber": 2376, - "textBefore": null, - "textAfter": " It is", - "comments": null, - "startOffset": 0, - "endOffset": 63, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563212273Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "726f56586e4b1a40f1abd5f5eec467b1", - "type": "headline", - "value": "3.1.9 Critical issues on which the Co RMS did not agree with the assessment by the RMS", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.1.9 Critical issues on which the Co RMS did not agree with the assessment by\nthe RMS", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 324.28796 - }, - "width": 24, - "height": -11.357971, - "page": 215 - }, - { - "topLeft": { - "x": 141.74, - "y": 324.28796 - }, - "width": 382.42194, - "height": -11.357971, - "page": 215 - }, - { - "topLeft": { - "x": 141.74, - "y": 310.48798 - }, - "width": 45.552002, - "height": -11.357971, - "page": 215 - } - ], - "sectionNumber": 2381, - "textBefore": null, - "textAfter": " Points on", - "comments": null, - "startOffset": 0, - "endOffset": 86, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563212603Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "86c01122d9f68c9038f90842729c5fcc", - "type": "headline", - "value": "3.2 Proposed decision", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.2 Proposed decision", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 15, - "height": -11.358002, - "page": 216 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 92.183975, - "height": -11.358002, - "page": 216 - } - ], - "sectionNumber": 2382, - "textBefore": null, - "textAfter": " It is", - "comments": null, - "startOffset": 0, - "endOffset": 21, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563212993Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "868ff7723d3760b43b074132bf6f68b0", - "type": "headline", - "value": "3.3.1 Particular conditions proposed to be taken into account to manage the risk identified", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.3.1 Particular conditions proposed to be taken into account to manage the risk\nidentified", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 717.698 - }, - "width": 24, - "height": -11.358002, - "page": 217 - }, - { - "topLeft": { - "x": 141.74, - "y": 717.698 - }, - "width": 382.53802, - "height": -11.358002, - "page": 217 - }, - { - "topLeft": { - "x": 141.74, - "y": 703.89795 - }, - "width": 48.779984, - "height": -11.358002, - "page": 217 - } - ], - "sectionNumber": 2387, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 91, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563213332Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "75687a1e1cca8a300401ca932f27a3ce", - "type": "headline", - "value": "3.3 Rational for the conditions and restrictions to be associated with the approval or authorisation(s), as appropriate", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.3 Rational for the conditions and restrictions to be associated with the approval or authorisation(s), as appropriate", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 769.318 - }, - "width": 15, - "height": -11.358002, - "page": 217 - }, - { - "topLeft": { - "x": 141.74, - "y": 769.318 - }, - "width": 382.81598, - "height": -11.358002, - "page": 217 - }, - { - "topLeft": { - "x": 141.74, - "y": 755.498 - }, - "width": 213.00002, - "height": -11.358002, - "page": 217 - } - ], - "sectionNumber": 2383, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 119, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563213652Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "38ffc7f82578eac69f3be152de2e7976", - "type": "headline", - "value": "3.4 Appendices", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.4 Appendices", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 745.298 - }, - "width": 15, - "height": -11.358002, - "page": 218 - }, - { - "topLeft": { - "x": 141.74, - "y": 745.298 - }, - "width": 59.351974, - "height": -11.358002, - "page": 218 - } - ], - "sectionNumber": 2388, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 14, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563213982Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f63c688eaec21258ee12af7bc9d74eb3", - "type": "headline", - "value": "3.4.1 Guidance documents used in this assessment", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.4.1 Guidance documents used in this assessment", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 70.944, - "y": 707.498 - }, - "width": 24, - "height": -11.358002, - "page": 218 - }, - { - "topLeft": { - "x": 141.74, - "y": 707.498 - }, - "width": 227.54396, - "height": -11.358002, - "page": 218 - } - ], - "sectionNumber": 2389, - "textBefore": null, - "textAfter": " [List of", - "comments": null, - "startOffset": 0, - "endOffset": 48, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563214282Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "f07933aff85a833efe551b8982b6c68d", - "type": "headline", - "value": "3.4.2 Reference list", - "reason": "Headline found", - "matchedRule": 1, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": "3.4.2 Reference list", - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 56.64, - "y": 498.69797 - }, - "width": 24, - "height": -11.358002, - "page": 221 - }, - { - "topLeft": { - "x": 127.46, - "y": 498.69797 - }, - "width": 69.33599, - "height": -11.358002, - "page": 221 - } - ], - "sectionNumber": 2396, - "textBefore": null, - "textAfter": " List [in", - "comments": null, - "startOffset": 0, - "endOffset": 20, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 1, - "type": "ADDED", - "dateTime": "2022-10-10T11:39:29.563214622Z" - } - ], - "manualChanges": [], - "engines": [ - "RULE" - ], - "reference": [], - "importedRedactionIntersections": [], - "localManualRedaction": false, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "22f1459e4accc52632b539aee0ec4ee1", - "type": "manual", - "value": "Version history", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 244.97, - "y": 746.73865 - }, - "width": 105.19412, - "height": 14.251781, - "page": 2 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T12:03:35.346Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T12:03:35.346Z", - "requestedDate": "2022-10-10T12:03:35.346Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "8966dc2ae00a975a1063dbfb901589be", - "type": "manual", - "value": "Level 2", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 242.21, - "y": 477.0675 - }, - "width": 110.88, - "height": 32.146873, - "page": 18 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T12:05:17.621Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T12:05:17.621Z", - "requestedDate": "2022-10-10T12:05:17.621Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "6c7dbb0c7a67731f44083144cfb6dac5", - "type": "manual", - "value": "Table of contents", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 238.97, - "y": 746.73865 - }, - "width": 117.20228, - "height": 14.251781, - "page": 3 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T12:03:56.399Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T12:03:56.399Z", - "requestedDate": "2022-10-10T12:03:56.399Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "67e62b590ec8974153609cfe4ca023bf", - "type": "manual", - "value": "Level 3", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 242.21, - "y": 477.0675 - }, - "width": 110.88, - "height": 32.146873, - "page": 188 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T12:08:58.144Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T12:08:58.144Z", - "requestedDate": "2022-10-10T12:08:58.144Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - }, - { - "id": "2adea2c13458b3de03a5122918ff7c7c", - "type": "manual", - "value": "Level 1", - "reason": "n-a.", - "matchedRule": 0, - "rectangle": false, - "legalBasis": "n-a.", - "imported": false, - "redacted": true, - "section": null, - "color": [ - 0.9764706, - 0.02745098, - 0.02745098 - ], - "positions": [ - { - "topLeft": { - "x": 242.21, - "y": 477.0675 - }, - "width": 110.88, - "height": 32.146873, - "page": 8 - } - ], - "sectionNumber": -1, - "textBefore": null, - "textAfter": null, - "comments": null, - "startOffset": 0, - "endOffset": 0, - "imageHasTransparency": false, - "excluded": false, - "sourceId": null, - "changes": [ - { - "analysisNumber": 2, - "type": "ADDED", - "dateTime": "2022-10-10T12:04:49.47Z" - } - ], - "manualChanges": [ - { - "annotationStatus": "APPROVED", - "manualRedactionType": "ADD_LOCALLY", - "processedDate": "2022-10-10T12:04:49.47Z", - "requestedDate": "2022-10-10T12:04:49.47Z", - "userId": "023ecc8b-856f-4dfb-b32c-1afdc701a783", - "propertyChanges": {}, - "processed": true - } - ], - "engines": null, - "reference": null, - "importedRedactionIntersections": [], - "localManualRedaction": true, - "manuallyRemoved": false, - "hint": false, - "recommendation": false, - "falsePositive": false, - "image": false, - "dictionaryEntry": false, - "dossierDictionaryEntry": false - } - ], - "legalBasis": [ - { - "name": "n-a.", - "description": "n-a.", - "reason": "n-a." - } - ], - "dictionaryVersion": 13, - "dossierDictionaryVersion": 1, - "rulesVersion": 3, - "legalBasisVersion": 2 -} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Trinexapac/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Trinexapac/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23.pdf deleted file mode 100644 index 6373e776..00000000 Binary files a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/Trinexapac/91 Trinexapac-ethyl_RAR_01_Volume_1_2018-02-23.pdf and /dev/null differ diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/dictionaries/EFSA_sanitisation_GFL_v1/rules.drl b/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/dictionaries/EFSA_sanitisation_GFL_v1/rules.drl index dea5c674..58c30a48 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/dictionaries/EFSA_sanitisation_GFL_v1/rules.drl +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/performance/dictionaries/EFSA_sanitisation_GFL_v1/rules.drl @@ -1,8 +1,8 @@ package drools import static java.lang.String.format; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.anyMatch; -import static com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility.exactMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.anyMatch; +import static com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility.exactMatch; import java.util.List; import java.util.LinkedList; @@ -12,21 +12,21 @@ import java.util.Collection; import java.util.stream.Stream; import java.util.Optional; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Section; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Table; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.SemanticNode; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Document; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Paragraph; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.Image; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.textblock.*; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.EntityType; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.nodes.ImageType; +import com.iqser.red.service.redaction.v1.server.document.graph.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.*; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Section; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Table; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.SemanticNode; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Document; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Paragraph; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.Image; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.*; +import com.iqser.red.service.redaction.v1.server.document.graph.textblock.*; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType; +import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.redactionlog.Engine; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.EntityCreationService; +import com.iqser.red.service.redaction.v1.server.document.services.EntityCreationService; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.Dictionary; import com.iqser.red.service.redaction.v1.server.redaction.model.dictionary.DictionaryModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; @@ -34,14 +34,14 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualImageRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.services.ManualRedactionApplicationService; +import com.iqser.red.service.redaction.v1.server.document.services.ManualRedactionApplicationService; import com.iqser.red.service.redaction.v1.server.client.model.EntityRecognitionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.entity.RedactionEntity; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; +import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity; +import com.iqser.red.service.redaction.v1.server.document.graph.Boundary; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntitiesAdapter; import com.iqser.red.service.redaction.v1.server.redaction.adapter.NerEntities; -import com.iqser.red.service.redaction.v1.server.layoutparsing.document.utils.RedactionSearchUtility +import com.iqser.red.service.redaction.v1.server.document.utils.RedactionSearchUtility import com.iqser.red.service.redaction.v1.server.document.graph.nodes.ImageType import com.iqser.red.service.redaction.v1.server.document.graph.entity.EntityType import com.iqser.red.service.redaction.v1.server.document.graph.entity.RedactionEntity;