diff --git a/src/main/java/com/iqser/red/pdftronlogic/commons/Converter.java b/src/main/java/com/iqser/red/pdftronlogic/commons/Converter.java index 9a5c5c1..a485152 100644 --- a/src/main/java/com/iqser/red/pdftronlogic/commons/Converter.java +++ b/src/main/java/com/iqser/red/pdftronlogic/commons/Converter.java @@ -1,12 +1,14 @@ package com.iqser.red.pdftronlogic.commons; import java.awt.Color; +import java.awt.geom.AffineTransform; import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; import java.util.Iterator; import com.google.common.primitives.Bytes; import com.google.common.primitives.Doubles; +import com.pdftron.common.Matrix2D; import com.pdftron.common.PDFNetException; import com.pdftron.pdf.ColorPt; import com.pdftron.pdf.ColorSpace; @@ -48,6 +50,15 @@ public class Converter { } + public GeneralPath convertToGeneralPathAndTransformToInitialUserSpace(PathData pathData, Matrix2D ctm) throws PDFNetException{ + GeneralPath linePath = Converter.convertToGeneralPath(pathData); + + //transform path to initial user space + var affineTransform = new AffineTransform(ctm.getA(), ctm.getB(), ctm.getC(), ctm.getD(), ctm.getH(), ctm.getV()); + linePath.transform(affineTransform); + return linePath; + } + @SneakyThrows public static Color convertColor(ColorSpace colorSpace, ColorPt colorPt) { diff --git a/src/main/java/com/iqser/red/pdftronlogic/commons/ElementFeatures.java b/src/main/java/com/iqser/red/pdftronlogic/commons/ElementFeatures.java index b4bef18..f031b7d 100644 --- a/src/main/java/com/iqser/red/pdftronlogic/commons/ElementFeatures.java +++ b/src/main/java/com/iqser/red/pdftronlogic/commons/ElementFeatures.java @@ -25,6 +25,43 @@ public class ElementFeatures { int elementType; Rectangle2D boundingBox; + public static ElementFeatures extractFeatures(Element element) throws PDFNetException { + + return switch (element.getType()) { + case Element.e_path -> Path.builder() + .elementType(element.getType()) + .boundingBox(Converter.toRectangle2D(element.getBBox())) + .isClippingPath(element.isClippingPath()) + .isClipWindingFill(element.isClipWindingFill()) + .isStroked(element.isStroked()) + .isFilled(element.isFilled()) + .isWindingFill(element.isWindingFill()) + .fillColor(Converter.convertColor(element.getGState().getFillColorSpace(), element.getGState().getFillColor())) + .strokeColor(Converter.convertColor(element.getGState().getStrokeColorSpace(), element.getGState().getStrokeColor())) + .linePath(Converter.convertToGeneralPathAndTransformToInitialUserSpace(element.getPathData(), element.getCTM())) + .build(); + case Element.e_text -> Text.builder() + .elementType(element.getType()) + .boundingBox(Converter.toRectangle2D(element.getBBox())) + .text(element.getTextString()) + .font(element.getGState().getFont().getType()) + .fontsize(element.getGState().getFontSize()) + .build(); + case Element.e_image, Element.e_inline_image -> Image.builder() + .elementType(element.getType()) + .boundingBox(Converter.toRectangle2D(element.getBBox())) + .dataSize(element.getImageDataSize()) + .height(element.getImageHeight()) + .width(element.getImageWidth()) + .renderingIntent(element.getImageRenderingIntent()) + .componentNum(element.getComponentNum()) + .bitsPerComponent(element.getBitsPerComponent()) + .build(); + // This technically should never happen, it's a safetynet + default -> throw new RuntimeException("Feature Extraction is not supported for PDFTron.Element with type: " + element.getType()); + }; + } + public boolean almostMatches(Element element) throws PDFNetException { @@ -160,41 +197,6 @@ public class ElementFeatures { } - public static ElementFeatures extractFeatures(Element element) throws PDFNetException { - return switch (element.getType()) { - case Element.e_path -> Path.builder() - .elementType(element.getType()) - .boundingBox(Converter.toRectangle2D(element.getBBox())) - .isClippingPath(element.isClippingPath()) - .isClipWindingFill(element.isClipWindingFill()) - .isStroked(element.isStroked()) - .isFilled(element.isFilled()) - .isWindingFill(element.isWindingFill()) - .fillColor(Converter.convertColor(element.getGState().getFillColorSpace(), element.getGState().getFillColor())) - .strokeColor(Converter.convertColor(element.getGState().getStrokeColorSpace(), element.getGState().getStrokeColor())) - .linePath(Converter.convertToGeneralPath(element.getPathData())) - .build(); - case Element.e_text -> Text.builder() - .elementType(element.getType()) - .boundingBox(Converter.toRectangle2D(element.getBBox())) - .text(element.getTextString()) - .font(element.getGState().getFont().getType()) - .fontsize(element.getGState().getFontSize()) - .build(); - case Element.e_image, Element.e_inline_image -> Image.builder() - .elementType(element.getType()) - .boundingBox(Converter.toRectangle2D(element.getBBox())) - .dataSize(element.getImageDataSize()) - .height(element.getImageHeight()) - .width(element.getImageWidth()) - .renderingIntent(element.getImageRenderingIntent()) - .componentNum(element.getComponentNum()) - .bitsPerComponent(element.getBitsPerComponent()) - .build(); - // This technically should never happen, it's a safetynet - default -> throw new RuntimeException("Feature Extraction is not supported for PDFTron.Element with type: " + element.getType()); - }; - } } 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 7153441..231be21 100644 --- a/src/main/java/com/iqser/red/pdftronlogic/commons/InvisibleElementRemovalService.java +++ b/src/main/java/com/iqser/red/pdftronlogic/commons/InvisibleElementRemovalService.java @@ -2,7 +2,6 @@ package com.iqser.red.pdftronlogic.commons; import java.awt.Color; import java.awt.Shape; -import java.awt.geom.AffineTransform; import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; import java.io.InputStream; @@ -12,7 +11,6 @@ import java.util.List; import java.util.Set; import java.util.TreeSet; -import com.pdftron.common.Matrix2D; import com.pdftron.common.PDFNetException; import com.pdftron.pdf.ColorPt; import com.pdftron.pdf.ColorSpace; @@ -256,12 +254,7 @@ public class InvisibleElementRemovalService { return; } - GeneralPath linePath = Converter.convertToGeneralPath(pathData); - - //transform path to initial user space - var ctm = pathElement.getCTM(); - var affineTransform = toAffineTransform(ctm); - linePath.transform(affineTransform); + GeneralPath linePath = Converter.convertToGeneralPathAndTransformToInitialUserSpace(pathData, pathElement.getCTM()); var rect = linePath.getBounds2D(); @@ -457,10 +450,7 @@ public class InvisibleElementRemovalService { } - private static AffineTransform toAffineTransform(Matrix2D ctm) throws PDFNetException { - return new AffineTransform(ctm.getA(), ctm.getB(), ctm.getC(), ctm.getD(), ctm.getH(), ctm.getV()); - } @Builder