Rotation fixed ?

This commit is contained in:
deiflaender 2022-10-07 13:12:04 +02:00
parent d7d2bfff6b
commit d669f92a7d
5 changed files with 40 additions and 28 deletions

View File

@ -10,6 +10,8 @@ import lombok.RequiredArgsConstructor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
@Data @Data
@RequiredArgsConstructor @RequiredArgsConstructor
public class Page { public class Page {
@ -32,6 +34,7 @@ public class Page {
private StringFrequencyCounter fontStyleCounter = new StringFrequencyCounter(); private StringFrequencyCounter fontStyleCounter = new StringFrequencyCounter();
private double cropBoxArea; private double cropBoxArea;
private PDRectangle cropbox;
public boolean isRotated() { public boolean isRotated() {

View File

@ -6,11 +6,15 @@ import com.iqser.red.service.redaction.v1.server.classification.model.Orientatio
import com.iqser.red.service.redaction.v1.server.classification.model.Page; import com.iqser.red.service.redaction.v1.server.classification.model.Page;
import com.iqser.red.service.redaction.v1.server.classification.model.TextBlock; import com.iqser.red.service.redaction.v1.server.classification.model.TextBlock;
import com.iqser.red.service.redaction.v1.server.classification.utils.PositionUtils; import com.iqser.red.service.redaction.v1.server.classification.utils.PositionUtils;
import com.iqser.red.service.redaction.v1.server.parsing.model.RedTextPosition;
import com.iqser.red.service.redaction.v1.server.parsing.model.TextDirection;
import com.iqser.red.service.redaction.v1.server.redaction.utils.Patterns; import com.iqser.red.service.redaction.v1.server.redaction.utils.Patterns;
import com.iqser.red.service.redaction.v1.server.tableextraction.model.AbstractTextContainer; import com.iqser.red.service.redaction.v1.server.tableextraction.model.AbstractTextContainer;
import com.iqser.red.service.redaction.v1.server.tableextraction.model.Rectangle; import com.iqser.red.service.redaction.v1.server.tableextraction.model.Rectangle;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.awt.geom.AffineTransform; import java.awt.geom.AffineTransform;
@ -41,10 +45,10 @@ public class ClassificationService {
Rectangle btf = page.isLandscape() ? landscapeBodyTextFrame : bodyTextFrame; Rectangle btf = page.isLandscape() ? landscapeBodyTextFrame : bodyTextFrame;
// if (page.getRotation() == 180 || page.getRotation() == 270){ // if (page.getRotation() == 180 || page.getRotation() == 270){
// var nBtf = getRectangle(btf.x, btf.y, btf.width, btf.height, page.getRotation(),((TextBlock) page.getTextBlocks().get(0)).getSequences().get(0).getPageWidth(),((TextBlock) page.getTextBlocks().get(0)).getSequences().get(0).getPageHeight()); System.out.println(btf);
// btf = new Rectangle(nBtf.getTopLeft().getX(), nBtf.getTopLeft().getY(), nBtf.getWidth(), nBtf.getHeight()); btf = getRectangle(btf, page.getRotation(), page.getCropbox());
// } // }
System.out.println("CropBoxArea" + page.getCropBoxArea());
page.setBodyTextFrame(btf); page.setBodyTextFrame(btf);
classifyPage(btf, page, document, headlineFontSizes); classifyPage(btf, page, document, headlineFontSizes);
} }
@ -52,32 +56,33 @@ public class ClassificationService {
public com.iqser.red.service.redaction.v1.model.Rectangle getRectangle(float x, float y, float width, float height, int rotation, float pageWidth, float pageHeight) { public Rectangle getRectangle(Rectangle rectangle, int rotation, PDRectangle cropbox) {
Point2D bottomLeft = new Point2D.Double(x, pageHeight - y); Point2D bottomLeft = new Point2D.Double(rectangle.getMinX(), rectangle.getMinY());
Point2D topRight = new Point2D.Double(x + width,pageHeight - y - height); Point2D topRight = new Point2D.Double(rectangle.getMaxX(), rectangle.getMaxY());
AffineTransform transform = new AffineTransform(); AffineTransform transform = new AffineTransform();
if (rotation == 0 || rotation == 180) {
transform.rotate(Math.toRadians(rotation), pageWidth / 2f, pageHeight / 2f); float ty = (cropbox.getLowerLeftY() + cropbox.getUpperRightY()) / 2;
transform.translate(0f, pageHeight);
transform.scale(1., -1.); transform.translate(ty, ty);
} else if (rotation == 90) { transform.rotate(Math.toRadians(180), 0, 0);
transform.rotate(Math.toRadians(rotation), pageWidth / 2f, pageWidth / 2f); transform.translate(-ty, -ty);
transform.translate(0f, pageWidth);
transform.scale(1., -1.);
} else {
transform.rotate(Math.toRadians(rotation), pageHeight / 2f, pageHeight / 2f);
transform.translate(0f, pageWidth);
transform.scale(1., -1.);
}
bottomLeft = transform.transform(bottomLeft, null); bottomLeft = transform.transform(bottomLeft, null);
topRight = transform.transform(topRight, null); topRight = transform.transform(topRight, null);
return new com.iqser.red.service.redaction.v1.model.Rectangle( // // var r = new Rectangle((float)bottomLeft.getX(),(float) rectangle.getX() + (float) rectangle.getWidth(), (float)topRight.getX()- (float)bottomLeft.getX(), (float)topRight.getY()-(float) bottomLeft.getY());
new Point((float) bottomLeft.getX(), (float) bottomLeft.getY()), (float) (topRight.getX() - bottomLeft.getX()), (float) (topRight.getY() - bottomLeft.getY()), 0);
var r = new Rectangle((float)bottomLeft.getX() - (float) rectangle.getHeight(),(float) rectangle.getX(), (float) rectangle.getWidth(), (float) rectangle.getHeight());
System.out.println(r);
return r;
} }

View File

@ -99,6 +99,8 @@ public class PdfSegmentationService {
System.out.println("PageNr: " + pageNumber + " rotation: "+rotation); System.out.println("PageNr: " + pageNumber + " rotation: "+rotation);
boolean isRotated = rotation != 0 && rotation != 360; boolean isRotated = rotation != 0 && rotation != 360;
@ -125,6 +127,7 @@ public class PdfSegmentationService {
PDRectangle cropbox = pdPage.getCropBox(); PDRectangle cropbox = pdPage.getCropBox();
float cropboxArea = cropbox.getHeight() * cropbox.getWidth(); float cropboxArea = cropbox.getHeight() * cropbox.getWidth();
page.setCropBoxArea(cropboxArea); page.setCropBoxArea(cropboxArea);
page.setCropbox(cropbox);
page.setRotation(rotation); page.setRotation(rotation);
page.setLandscape(isLandscape); page.setLandscape(isLandscape);

View File

@ -118,7 +118,7 @@ public class PdfVisualisationService {
contentStream.setNonStrokingColor(Color.BLUE); contentStream.setNonStrokingColor(Color.BLUE);
contentStream.setFont(PDType1Font.TIMES_ROMAN, 6f); contentStream.setFont(PDType1Font.TIMES_ROMAN, 6f);
contentStream.newLineAtOffset(rect.getTopLeft().getX(), rect.getTopLeft().getY()); contentStream.newLineAtOffset(rect.getTopLeft().getX(), rect.getTopLeft().getY() + rect.getHeight());
contentStream.showText(textBlock.getClassification() /*" textBlock.getOrientation() + "--> "*/ + number); contentStream.showText(textBlock.getClassification() /*" textBlock.getOrientation() + "--> "*/ + number);
@ -131,6 +131,11 @@ public class PdfVisualisationService {
public Rectangle getRectangle(float x, float y, float width, float height, int rotation, float pageWidth, float pageHeight) { public Rectangle getRectangle(float x, float y, float width, float height, int rotation, float pageWidth, float pageHeight) {
if(rotation == 90){
return new Rectangle( //
new Point(x, y), width, height, 0);
}
Point2D bottomLeft = new Point2D.Double(x, pageHeight - y); Point2D bottomLeft = new Point2D.Double(x, pageHeight - y);
Point2D topRight = new Point2D.Double(x + width,pageHeight - y - height); Point2D topRight = new Point2D.Double(x + width,pageHeight - y - height);
@ -139,10 +144,6 @@ public class PdfVisualisationService {
transform.rotate(Math.toRadians(rotation), pageWidth / 2f, pageHeight / 2f); transform.rotate(Math.toRadians(rotation), pageWidth / 2f, pageHeight / 2f);
transform.translate(0f, pageHeight); transform.translate(0f, pageHeight);
transform.scale(1., -1.); transform.scale(1., -1.);
} else if (rotation == 90) {
transform.rotate(Math.toRadians(rotation), pageWidth / 2f, pageWidth / 2f);
transform.translate(0f, pageWidth);
transform.scale(1., -1.);
} else { } else {
transform.rotate(Math.toRadians(rotation), pageHeight / 2f, pageHeight / 2f); transform.rotate(Math.toRadians(rotation), pageHeight / 2f, pageHeight / 2f);
transform.translate(0f, pageWidth); transform.translate(0f, pageWidth);