Beispiel #1
0
        /// <summary>Output Text at a certain x and y coordinate.</summary>
        /// <remarks>Output Text at a certain x and y coordinate. Clipped or opaque text isn't supported as of yet.</remarks>
        /// <param name="x">x-coordinate</param>
        /// <param name="y">y-coordinate</param>
        /// <param name="flag">flag indicating clipped or opaque</param>
        /// <param name="x1">x1-coordinate of the rectangle if clipped or opaque</param>
        /// <param name="y1">y1-coordinate of the rectangle if clipped or opaque</param>
        /// <param name="x2">x2-coordinate of the rectangle if clipped or opaque</param>
        /// <param name="y2">y1-coordinate of the rectangle if clipped or opaque</param>
        /// <param name="text">text to output</param>
        /// <exception cref="System.IO.IOException"/>
        public virtual void OutputText(int x, int y, int flag, int x1, int y1, int x2, int y2, String text)
        {
            MetaFont    font     = state.GetCurrentFont();
            float       refX     = state.TransformX(x);
            float       refY     = state.TransformY(y);
            float       angle    = state.TransformAngle(font.GetAngle());
            float       sin      = (float)Math.Sin(angle);
            float       cos      = (float)Math.Cos(angle);
            float       fontSize = font.GetFontSize(state);
            FontProgram fp       = font.GetFont();
            int         align    = state.GetTextAlign();
            // NOTE, MetaFont always creates with CP1252 encoding.
            int normalizedWidth = 0;

            byte[] bytes = font.encoding.ConvertToBytes(text);
            foreach (byte b in bytes)
            {
                normalizedWidth += fp.GetWidth(0xff & b);
            }
            float textWidth = fontSize / FontProgram.UNITS_NORMALIZATION * normalizedWidth;
            float tx        = 0;
            float ty        = 0;
            float descender = fp.GetFontMetrics().GetTypoDescender();
            float ury       = fp.GetFontMetrics().GetBbox()[3];

            cb.SaveState();
            cb.ConcatMatrix(cos, sin, -sin, cos, refX, refY);
            if ((align & MetaState.TA_CENTER) == MetaState.TA_CENTER)
            {
                tx = -textWidth / 2;
            }
            else
            {
                if ((align & MetaState.TA_RIGHT) == MetaState.TA_RIGHT)
                {
                    tx = -textWidth;
                }
            }
            if ((align & MetaState.TA_BASELINE) == MetaState.TA_BASELINE)
            {
                ty = 0;
            }
            else
            {
                if ((align & MetaState.TA_BOTTOM) == MetaState.TA_BOTTOM)
                {
                    ty = -descender;
                }
                else
                {
                    ty = -ury;
                }
            }
            Color textColor;

            if (state.GetBackgroundMode() == MetaState.OPAQUE)
            {
                textColor = state.GetCurrentBackgroundColor();
                cb.SetFillColor(textColor);
                cb.Rectangle(tx, ty + descender, textWidth, ury - descender);
                cb.Fill();
            }
            textColor = state.GetCurrentTextColor();
            cb.SetFillColor(textColor);
            cb.BeginText();
            cb.SetFontAndSize(PdfFontFactory.CreateFont(state.GetCurrentFont().GetFont(), PdfEncodings.CP1252, true),
                              fontSize);
            cb.SetTextMatrix(tx, ty);
            cb.ShowText(text);
            cb.EndText();
            if (font.IsUnderline())
            {
                cb.Rectangle(tx, ty - fontSize / 4, textWidth, fontSize / 15);
                cb.Fill();
            }
            if (font.IsStrikeout())
            {
                cb.Rectangle(tx, ty + fontSize / 3, textWidth, fontSize / 15);
                cb.Fill();
            }
            cb.RestoreState();
        }