DM-326: extend removeInvisibleElements

This commit is contained in:
Kilian Schuettler 2023-07-14 11:13:41 +02:00
parent ab3d274c8f
commit e121ef52b9
3 changed files with 49 additions and 46 deletions

View File

@ -1,12 +1,14 @@
package com.iqser.red.pdftronlogic.commons; package com.iqser.red.pdftronlogic.commons;
import java.awt.Color; import java.awt.Color;
import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath; import java.awt.geom.GeneralPath;
import java.awt.geom.Rectangle2D; import java.awt.geom.Rectangle2D;
import java.util.Iterator; import java.util.Iterator;
import com.google.common.primitives.Bytes; import com.google.common.primitives.Bytes;
import com.google.common.primitives.Doubles; import com.google.common.primitives.Doubles;
import com.pdftron.common.Matrix2D;
import com.pdftron.common.PDFNetException; import com.pdftron.common.PDFNetException;
import com.pdftron.pdf.ColorPt; import com.pdftron.pdf.ColorPt;
import com.pdftron.pdf.ColorSpace; 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 @SneakyThrows
public static Color convertColor(ColorSpace colorSpace, ColorPt colorPt) { public static Color convertColor(ColorSpace colorSpace, ColorPt colorPt) {

View File

@ -25,6 +25,43 @@ public class ElementFeatures {
int elementType; int elementType;
Rectangle2D boundingBox; 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 { 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());
};
}
} }

View File

@ -2,7 +2,6 @@ package com.iqser.red.pdftronlogic.commons;
import java.awt.Color; import java.awt.Color;
import java.awt.Shape; import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath; import java.awt.geom.GeneralPath;
import java.awt.geom.Rectangle2D; import java.awt.geom.Rectangle2D;
import java.io.InputStream; import java.io.InputStream;
@ -12,7 +11,6 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
import com.pdftron.common.Matrix2D;
import com.pdftron.common.PDFNetException; import com.pdftron.common.PDFNetException;
import com.pdftron.pdf.ColorPt; import com.pdftron.pdf.ColorPt;
import com.pdftron.pdf.ColorSpace; import com.pdftron.pdf.ColorSpace;
@ -256,12 +254,7 @@ public class InvisibleElementRemovalService {
return; return;
} }
GeneralPath linePath = Converter.convertToGeneralPath(pathData); GeneralPath linePath = Converter.convertToGeneralPathAndTransformToInitialUserSpace(pathData, pathElement.getCTM());
//transform path to initial user space
var ctm = pathElement.getCTM();
var affineTransform = toAffineTransform(ctm);
linePath.transform(affineTransform);
var rect = linePath.getBounds2D(); 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 @Builder