Esempio n. 1
0
        public override void EventOccurred(IEventData data, EventType type)
        {
            if (!type.Equals(EventType.RENDER_TEXT))
            {
                return;
            }

            TextRenderInfo renderInfo = (TextRenderInfo)data;

            string curFont     = renderInfo.GetFont().GetFontProgram().ToString();
            float  curFontSize = renderInfo.GetFontSize();

            IList <TextRenderInfo> text = renderInfo.GetCharacterRenderInfos();

            foreach (TextRenderInfo t in text)
            {
                string letter  = t.GetText();
                Vector l_start = t.GetBaseline().GetStartPoint(),
                       l_end   = t.GetAscentLine().GetEndPoint();

                Rectangle l_rect = new Rectangle(l_start.Get(0), l_start.Get(1),
                                                 l_end.Get(0) - l_start.Get(0), l_end.Get(1) - l_start.Get(1));

                if (letter != " " && !letter.Contains(' '))
                {
                    TextResult.Add(new TextChunk()
                    {
                        Text       = letter,
                        Rect       = l_rect,
                        FontFamily = curFont,
                        FontSize   = curFontSize,
                    });
                }
            }
        }
Esempio n. 2
0
            public override void EventOccurred(IEventData data, EventType type)
            {
                base.EventOccurred(data, type);

                TextRenderInfo tri = data as TextRenderInfo;

                //if (type != EventType.RENDER_TEXT)
                if (tri == null)
                {
                    return;
                }

                PdfFont font     = tri.GetFont();//it has been checked that it returns the same font object.
                float   fontSize = Math.Abs/*sometimes it is negative in iText7*/ (tri.GetFontSize());
                //if (font.GetAscent("I", fontSize) == 0)
                //    fontSize = 0;

                List <CharBox>         cbs  = new List <CharBox>();
                IList <TextRenderInfo> cris = tri.GetCharacterRenderInfos();

                foreach (TextRenderInfo cri in cris)
                {
                    Vector baseLeft = cri.GetBaseline().GetStartPoint();
                    Vector topRight = cri.GetAscentLine().GetEndPoint();
                    //float rise = cri.GetRise();
                    //if (rise != 0)
                    //    rise = rise;
                    float fontHeightFromBaseLine = topRight.Get(Vector.I2) - baseLeft.Get(Vector.I2);
                    //if (fontSize > 0)
                    //{
                    //    float fontHeightFromBaseLine2 = fontSize * 0.75f/*(?)convertion from PX to PT*/;//!!!this calculation is heuristic and coincides with cri.GetAscentLine().GetEndPoint().Get(Vector.I2) - bottomLeft.Get(Vector.I2) in iText5
                    //    if (fontHeightFromBaseLine > fontHeightFromBaseLine2)
                    //        fontHeightFromBaseLine = fontHeightFromBaseLine2;
                    //}
                    float x = baseLeft.Get(Vector.I1);
                    //float y = topRight.Get(Vector.I2);
                    CharBox cb = new CharBox
                    {
                        Char = cri.GetText(),
                        R    = new System.Drawing.RectangleF
                        {
                            X     = x - pageSize.X,
                            Y     = pageSize.Height + pageSize.Y - baseLeft.Get(Vector.I2) - fontHeightFromBaseLine,//(!)basic positioning point is char's baseLine, not ascentLine
                            Width = topRight.Get(Vector.I1) - x,
                            //Height = y - bottomLeft.Get(Vector.I2)// + d,
                            Height = fontHeightFromBaseLine
                        },
                        Font     = font,
                        FontSize = fontSize
                    };
                    cbs.Add(cb);
                }
                CharBoxs.AddRange(cbs);
            }
Esempio n. 3
0
        public override void EventOccurred(IEventData data, EventType type)
        {
            if (!type.Equals(EventType.RENDER_TEXT))
            {
                return;
            }

            TextRenderInfo renderInfo = (TextRenderInfo)data;

            string curFont = renderInfo.GetFont().GetFontProgram().ToString();

            float curFontSize = renderInfo.GetFontSize();

            IList <TextRenderInfo> text = renderInfo.GetCharacterRenderInfos();

            foreach (TextRenderInfo t in text)
            {
                string letter = t.GetText();

                Vector letterStart = t.GetDescentLine().GetStartPoint();
                Vector letterEnd   = t.GetAscentLine().GetEndPoint();

                if (letter != " " && !letter.Contains(" "))
                {
                    TextChar c = new TextChar();
                    chars.Add(c);

                    c.text = letter;
                    c.x1   = letterStart.Get(0);
                    c.x2   = letterEnd.Get(0);

                    c.y1 = letterStart.Get(1);
                    c.y2 = letterEnd.Get(1);

                    if (c.y1 > c.y2)
                    {
                        c.y1 = letterEnd.Get(1);
                        c.y2 = letterStart.Get(1);
                    }

                    c.fontFamily = curFont;
                    c.fontSize   = curFontSize;
                }
            }
        }
        /// <summary>Filter a TextRenderInfo object</summary>
        /// <param name="text">the TextRenderInfo to be filtered</param>
        public virtual PdfCleanUpFilter.FilterResult <PdfArray> FilterText(TextRenderInfo text)
        {
            PdfTextArray textArray = new PdfTextArray();

            if (IsTextNotToBeCleaned(text))
            {
                return(new PdfCleanUpFilter.FilterResult <PdfArray>(false, new PdfArray(text.GetPdfString())));
            }
            foreach (TextRenderInfo ri in text.GetCharacterRenderInfos())
            {
                if (IsTextNotToBeCleaned(ri))
                {
                    textArray.Add(ri.GetPdfString());
                }
                else
                {
                    textArray.Add(new PdfNumber(-ri.GetUnscaledWidth() * 1000f / (text.GetFontSize() * text.GetHorizontalScaling
                                                                                      () / 100)));
                }
            }
            return(new PdfCleanUpFilter.FilterResult <PdfArray>(true, textArray));
        }
Esempio n. 5
0
        public float GetFontSize(TextRenderInfo textRenderInfo, LineSegment baseline, LineSegment ascentLine)
        {
            var fontSize = textRenderInfo.GetFontSize();
            var height   = ascentLine.GetStartPoint().Get(1) - baseline.GetStartPoint().Get(1);

            if (fontSize > 0.99 && fontSize < 1.01)
            {
                LogWrongFontSize("no font size. take height of line:" + height);

                return(height * 1.05F);
            }

            var ctm        = textRenderInfo.GetGraphicsState().GetCtm();
            var heightFont = ctm.Get(Matrix.I22);

            if (heightFont > 0.99 && heightFont < 1.01)
            {
                if (fontSize > height * 1.3)
                {
                    LogWrongFontSize("big fontSize:" + fontSize + ". take height of line:" + height);
                    return(height * 1.3F);
                }
            }
            else
            {
                if (heightFont > 0)
                {
                    fontSize *= heightFont;
                    LogWrongFontSize("height font positive: " + heightFont);
                }
                else
                {
                    fontSize *= -heightFont;
                }
            }

            return(fontSize);
        }
Esempio n. 6
0
        public override void EventOccurred(IEventData data, EventType type)
        {
            if (!type.Equals(EventType.RENDER_TEXT))
            {
                return;
            }

            TextRenderInfo renderInfo = (TextRenderInfo)data;

            float counter = increaseCounter();

            var font             = renderInfo.GetFont().GetFontProgram();
            var originalFontName = font.ToString();
            var fontRegex        = Regex.Match(originalFontName, @"(?<=\+)[a-zA-Z\s]+");

            string fontName = fontRegex.Success ? fontRegex.Value : originalFontName;

            var fontStyle = font.GetFontNames().GetFontStyle();

            float curFontSize = renderInfo.GetFontSize();

            float key = counter;

            IList <TextRenderInfo> text = renderInfo.GetCharacterRenderInfos();

            foreach (TextRenderInfo character in text)
            {
                key += 0.001f;

                var textRenderMode = character.GetTextRenderMode();
                var opacity        = character.GetGraphicsState().GetFillOpacity();

                //if (textRenderMode != 0 || opacity != 1)
                //{

                //}

                string letter = character.GetText();

                Color color;

                var fillColor = character.GetFillColor();
                var colors    = fillColor.GetColorValue();
                if (colors.Length == 1)
                {
                    color = Color.FromArgb((int)(255 * (1 - colors[0])), Color.Black);
                }
                else if (colors.Length == 3)
                {
                    color = Color.FromArgb((int)(255 * colors[0]), (int)(255 * colors[1]), (int)(255 * colors[2]));
                }
                else if (colors.Length == 4)
                {
                    color = Color.FromArgb((int)(255 * colors[0]), (int)(255 * colors[1]), (int)(255 * colors[2]), (int)(255 * colors[3]));
                }
                else
                {
                    color = Color.Black;
                }

                //if(letter == "A")
                //{

                //}

                if (string.IsNullOrWhiteSpace(letter))
                {
                    continue;
                }

                //Get the bounding box for the chunk of text
                var bottomLeft = character.GetDescentLine().GetStartPoint();
                var topRight   = character.GetAscentLine().GetEndPoint();

                //Create a rectangle from it
                var rect = new Geom.Rectangle(
                    bottomLeft.Get(Vector.I1),
                    topRight.Get(Vector.I2),
                    topRight.Get(Vector.I1),
                    topRight.Get(Vector.I2)
                    );

                var currentChunk = new itext.pdfimage.Models.TextChunk()
                {
                    Text       = letter,
                    Rect       = rect,
                    FontFamily = fontName,
                    FontSize   = (int)curFontSize,
                    FontStyle  = fontStyle,
                    Color      = color,
                    SpaceWidth = character.GetSingleSpaceWidth() / 2f
                };

                chunkDictionairy.Add(key, currentChunk);
            }

            base.EventOccurred(data, type);
        }