diff --git a/src/main/java/com/iqser/red/pdftronlogic/commons/InvisibleElementRemovalService.java b/src/main/java/com/iqser/red/pdftronlogic/commons/InvisibleElementRemovalService.java index 1871838..e1f64ec 100644 --- a/src/main/java/com/iqser/red/pdftronlogic/commons/InvisibleElementRemovalService.java +++ b/src/main/java/com/iqser/red/pdftronlogic/commons/InvisibleElementRemovalService.java @@ -50,11 +50,11 @@ public class InvisibleElementRemovalService { * -Elements covered by widely stroked path * -Any Text set to clipping with its many interactions with other elements * - * @param pdfFile The PDF file to process + * @param pdfFile The PDF file to process * @param removePaths If this flag is set, invisible path elements will be removed - * @param delta If this flag is set only the removed Elements will be written to the output file. - * The Elements are red if they are removed by clipping path, blue for transparency, and a green bounding box for overlap. - * @param out OutputStream to write the resulting file to + * @param delta If this flag is set only the removed Elements will be written to the output file. + * The Elements are red if they are removed by clipping path, blue for transparency, and a green bounding box for overlap. + * @param out OutputStream to write the resulting file to **/ @SneakyThrows public void removeInvisibleElements(InputStream pdfFile, OutputStream out, boolean delta, boolean removePaths) { @@ -85,6 +85,7 @@ public class InvisibleElementRemovalService { } + /** * This method is similar to {@link #removeInvisibleElements(InputStream, OutputStream, boolean, boolean)}, just with a PDFDoc. */ @@ -94,6 +95,7 @@ public class InvisibleElementRemovalService { execute(pdfDoc, delta, removePaths); } + /** * This method is equal to {@link #removeInvisibleElements(PDFDoc, boolean, boolean)}, with removePaths == true. */ @@ -306,18 +308,12 @@ public class InvisibleElementRemovalService { if (inClippingPath) { if (isFilledAndNonTransparent(pathElement)) { - List currentOverlappedElements = context.visibleElements() - .stream() - .filter(features -> almostContains(linePath, features.getBoundingBox())) - .toList(); - context.overlappedElements().addAll(currentOverlappedElements); - context.visibleElements().removeAll(currentOverlappedElements); + calculateOverlapsForLinePath(context, linePath); } context.visibleElements().add(ElementFeatureFactory.extractFeatures(pathElement)); - if (!context.delta()) { - writer.writeElement(pathElement); - } - } else if (!context.delta() && !context.removePaths()) { + } + + if (!context.delta() && (inClippingPath || !context.removePaths())) { writer.writeElement(pathElement); } @@ -332,6 +328,17 @@ public class InvisibleElementRemovalService { } + private void calculateOverlapsForLinePath(InvisibleElementRemovalContext context, GeneralPath linePath) { + + List currentOverlappedElements = context.visibleElements() + .stream() + .filter(features -> almostContains(linePath, features.getBoundingBox())) + .toList(); + context.overlappedElements().addAll(currentOverlappedElements); + context.visibleElements().removeAll(currentOverlappedElements); + } + + private void removeOverlappedElements(Page page, ElementWriter writer, InvisibleElementRemovalContext context) throws PDFNetException { context.reader().begin(page);