diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalService.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalService.java index 9f32d3c..e82d8f0 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalService.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalService.java @@ -15,6 +15,7 @@ import com.pdftron.common.Matrix2D; import com.pdftron.common.PDFNetException; import com.pdftron.pdf.Element; import com.pdftron.pdf.ElementReader; +import com.pdftron.pdf.Image; import com.pdftron.pdf.PDFDoc; import com.pdftron.pdf.Page; import com.pdftron.pdf.Rect; @@ -27,6 +28,9 @@ public class ImagePositionRetrievalService { private static final double TOLERANCE = 1e-1; + // any image with smaller height and width than this gets thrown out, see everyPointInDashedLineIsImage.pdf + private static final int PIXEL_THRESHOLD = 10; + /** * Iterates over all elements in a PDF Document and retrieves the bounding box for each image, @@ -63,7 +67,13 @@ public class ImagePositionRetrievalService { Element element; while ((element = reader.next()) != null) { switch (element.getType()) { - case Element.e_image, Element.e_inline_image -> imagePositions.addRect(toRotationAdjustedRect(element.getBBox(), currentPage, mirrorY)); + case Element.e_image, Element.e_inline_image -> { + Image image = new Image(element.getXObject()); + // see everyPointInDashedLineIsImage.pdf TestFile + if (image.getImageHeight() > PIXEL_THRESHOLD || image.getImageWidth() > PIXEL_THRESHOLD) { + imagePositions.addRect(toRotationAdjustedRect(element.getBBox(), currentPage, mirrorY)); + } + } case Element.e_form -> { reader.formBegin(); findImagePositionsOnPage(reader, imagePositions, currentPage, mirrorY); @@ -77,7 +87,7 @@ public class ImagePositionRetrievalService { @SneakyThrows public RectCollection mergeOverlappingRects(RectCollection imagePositions) { - if (imagePositions.getNumRects() == 1) { + if (imagePositions.getNumRects() < 2) { return imagePositions; } diff --git a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java index a0005ae..c747a9d 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java +++ b/ocr-service-v1/ocr-service-server-v1/src/main/java/com/iqser/red/service/ocr/v1/server/service/InvisibleElementRemovalService.java @@ -76,6 +76,8 @@ public class InvisibleElementRemovalService { Page page = iterator.next(); visitedXObjIds.add(page.getSDFObj().getObjNum()); + + InvisibleElementRemovalContext context = InvisibleElementRemovalContext.builder() .reader(reader) .clippingPathStack(new ClippingPathStack(page.getMediaBox())) @@ -221,8 +223,14 @@ public class InvisibleElementRemovalService { private void processPath(Element pathElement, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException { + PathData pathData = pathElement.getPathData(); - GeneralPath linePath = convertToGeneralPath(pathElement.getPathData()); + if (pathData.getOperators().length == 0 && pathData.getPoints().length == 0) { + writer.writeGStateChanges(pathElement); + return; + } + + GeneralPath linePath = convertToGeneralPath(pathData); //transform path to initial user space var ctm = pathElement.getCTM(); diff --git a/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalServiceTest.java b/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalServiceTest.java index 9783979..d4eb08e 100644 --- a/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalServiceTest.java +++ b/ocr-service-v1/ocr-service-server-v1/src/test/java/com/iqser/red/service/ocr/v1/server/service/ImagePositionRetrievalServiceTest.java @@ -122,6 +122,14 @@ class ImagePositionRetrievalServiceTest { assertThat(allRectCoords.size()).isEqualTo(48); } + @Test + @SneakyThrows + public void testEveryPointInDashedLineIsImage() { + String fileName = "everyPointInDashedLineIsImage"; + List allRectCoords = testImagePositionDetection(fileName); + assertThat(allRectCoords.size()).isEqualTo(0); + } + private List testImagePositionDetection(String fileName) throws IOException, PDFNetException { diff --git a/ocr-service-v1/ocr-service-server-v1/src/test/resources/files/everyPointInDashedLineIsImage.pdf b/ocr-service-v1/ocr-service-server-v1/src/test/resources/files/everyPointInDashedLineIsImage.pdf new file mode 100644 index 0000000..8ee74c9 Binary files /dev/null and b/ocr-service-v1/ocr-service-server-v1/src/test/resources/files/everyPointInDashedLineIsImage.pdf differ