From 75bd94e538ccad39ad76316e594e4f6a6b8dfebf Mon Sep 17 00:00:00 2001 From: BobLd Date: Thu, 16 Jan 2020 15:43:01 +0000 Subject: [PATCH] Better handling of TextDirection.Unknown word bounding box --- src/UglyToad.PdfPig/Content/Word.cs | 61 +++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/src/UglyToad.PdfPig/Content/Word.cs b/src/UglyToad.PdfPig/Content/Word.cs index f162e0d8..0591f1c2 100644 --- a/src/UglyToad.PdfPig/Content/Word.cs +++ b/src/UglyToad.PdfPig/Content/Word.cs @@ -1,10 +1,10 @@ namespace UglyToad.PdfPig.Content { + using Core; using System; using System.Collections.Generic; using System.Linq; using System.Text; - using Core; /// /// A word. @@ -60,7 +60,7 @@ tempTextDirection = TextDirection.Unknown; } - (string, PdfRectangle) data; + Tuple data; switch (tempTextDirection) { @@ -82,7 +82,7 @@ case TextDirection.Unknown: default: - data = GetBoundingBoxH(letters); + data = GetBoundingBoxUnknown(letters); break; } @@ -94,7 +94,7 @@ } #region Bounding box - private (string, PdfRectangle) GetBoundingBoxH(IReadOnlyList letters) + private Tuple GetBoundingBoxH(IReadOnlyList letters) { var builder = new StringBuilder(); @@ -130,10 +130,10 @@ } } - return (builder.ToString(), new PdfRectangle(minX, minY, maxX, maxY)); + return new Tuple(builder.ToString(), new PdfRectangle(minX, minY, maxX, maxY)); } - private (string, PdfRectangle) GetBoundingBox180(IReadOnlyList letters) + private Tuple GetBoundingBox180(IReadOnlyList letters) { var builder = new StringBuilder(); @@ -169,10 +169,10 @@ } } - return (builder.ToString(), new PdfRectangle(maxX, maxY, minX, minY)); + return new Tuple(builder.ToString(), new PdfRectangle(maxX, maxY, minX, minY)); } - private (string, PdfRectangle) GetBoundingBox90(IReadOnlyList letters) + private Tuple GetBoundingBox90(IReadOnlyList letters) { var builder = new StringBuilder(); @@ -208,13 +208,13 @@ } } - return (builder.ToString(), new PdfRectangle(new PdfPoint(maxX, maxY), + return new Tuple(builder.ToString(), new PdfRectangle(new PdfPoint(maxX, maxY), new PdfPoint(maxX, minY), new PdfPoint(minX, maxY), new PdfPoint(minX, minY))); } - private (string, PdfRectangle) GetBoundingBox270(IReadOnlyList letters) + private Tuple GetBoundingBox270(IReadOnlyList letters) { var builder = new StringBuilder(); @@ -250,11 +250,50 @@ } } - return (builder.ToString(), new PdfRectangle(new PdfPoint(minX, minY), + return new Tuple(builder.ToString(), new PdfRectangle(new PdfPoint(minX, minY), new PdfPoint(minX, maxY), new PdfPoint(maxX, minY), new PdfPoint(maxX, maxY))); } + + private Tuple GetBoundingBoxUnknown(IReadOnlyList letters) + { + var builder = new StringBuilder(); + for (var i = 0; i < letters.Count; i++) + { + builder.Append(letters[i].Value); + } + + var minX = letters.Min(l => Min(l.GlyphRectangle.BottomLeft.X, + l.GlyphRectangle.BottomRight.X, + l.GlyphRectangle.TopLeft.X, + l.GlyphRectangle.TopRight.X)); + var maxX = letters.Max(l => Max(l.GlyphRectangle.BottomLeft.X, + l.GlyphRectangle.BottomRight.X, + l.GlyphRectangle.TopLeft.X, + l.GlyphRectangle.TopRight.X)); + + var minY = letters.Min(l => Min(l.GlyphRectangle.BottomLeft.Y, + l.GlyphRectangle.BottomRight.Y, + l.GlyphRectangle.TopLeft.Y, + l.GlyphRectangle.TopRight.Y)); + var maxY = letters.Max(l => Max(l.GlyphRectangle.BottomLeft.Y, + l.GlyphRectangle.BottomRight.Y, + l.GlyphRectangle.TopLeft.Y, + l.GlyphRectangle.TopRight.Y)); + + return new Tuple(builder.ToString(), new PdfRectangle(minX, minY, maxX, maxY)); + } + + private double Min(double d1, double d2, double d3, double d4) + { + return Math.Min(d1, Math.Min(d2, Math.Min(d3, d4))); + } + + private double Max(double d1, double d2, double d3, double d4) + { + return Math.Max(d1, Math.Max(d2, Math.Max(d3, d4))); + } #endregion ///