예제 #1
0
        /**
         * Constructs a new RtfPhrase for the RtfDocument with the given Phrase
         *
         * @param doc The RtfDocument this RtfPhrase belongs to
         * @param phrase The Phrase this RtfPhrase is based on
         */
        public RtfPhrase(RtfDocument doc, Phrase phrase) : base(doc)
        {
            if (phrase == null)
            {
                return;
            }

            if (phrase.HasLeading())
            {
                this.lineLeading = (int)(phrase.Leading * TWIPS_FACTOR);
            }
            else
            {
                this.lineLeading = 0;
            }

            ST.RtfFont phraseFont = new ST.RtfFont(null, phrase.Font);
            for (int i = 0; i < phrase.Count; i++)
            {
                IElement chunk = (IElement)phrase[i];
                if (chunk is Chunk)
                {
                    ((Chunk)chunk).Font = phraseFont.Difference(((Chunk)chunk).Font);
                }
                try {
                    IRtfBasicElement[] rtfElements = doc.GetMapper().MapElement(chunk);
                    for (int j = 0; j < rtfElements.Length; j++)
                    {
                        chunks.Add(rtfElements[j]);
                    }
                } catch (DocumentException) {
                }
            }
        }
예제 #2
0
        /**
         * Writes the HTML representation of an element.
         *
         * @param   element     the element
         * @param   indent      the indentation
         */

        protected void Write(IElement element, int indent)
        {
            Properties styleAttributes = null;

            switch (element.Type)
            {
            case Element.MARKED: {
                try {
                    Add(element);
                } catch (DocumentException) {
                }
                return;
            }

            case Element.CHUNK: {
                Chunk chunk = (Chunk)element;
                // if the chunk contains an image, return the image representation
                Image image = chunk.GetImage();
                if (image != null)
                {
                    Write(image, indent);
                    return;
                }

                if (chunk.IsEmpty())
                {
                    return;
                }
                Hashtable attributes = chunk.Attributes;
                if (attributes != null && attributes[Chunk.NEWPAGE] != null)
                {
                    return;
                }
                bool tag = IsOtherFont(chunk.Font) || markup.Count > 0;
                if (tag)
                {
                    // start span tag
                    AddTabs(indent);
                    WriteStart(HtmlTags.SPAN);
                    if (IsOtherFont(chunk.Font))
                    {
                        Write(chunk.Font, null);
                    }
                    WriteMarkupAttributes(markup);
                    os.WriteByte(GT);
                }
                if (attributes != null && attributes[Chunk.SUBSUPSCRIPT] != null)
                {
                    // start sup or sub tag
                    if ((float)attributes[Chunk.SUBSUPSCRIPT] > 0)
                    {
                        WriteStart(HtmlTags.SUP);
                    }
                    else
                    {
                        WriteStart(HtmlTags.SUB);
                    }
                    os.WriteByte(GT);
                }
                // contents
                Write(HtmlEncoder.Encode(chunk.Content));
                if (attributes != null && attributes[Chunk.SUBSUPSCRIPT] != null)
                {
                    // end sup or sub tag
                    os.WriteByte(LT);
                    os.WriteByte(FORWARD);
                    if ((float)attributes[Chunk.SUBSUPSCRIPT] > 0)
                    {
                        Write(HtmlTags.SUP);
                    }
                    else
                    {
                        Write(HtmlTags.SUB);
                    }
                    os.WriteByte(GT);
                }
                if (tag)
                {
                    // end tag
                    WriteEnd(Markup.HTML_TAG_SPAN);
                }
                return;
            }

            case Element.PHRASE: {
                Phrase phrase = (Phrase)element;
                styleAttributes = new Properties();
                if (phrase.HasLeading())
                {
                    styleAttributes[Markup.CSS_KEY_LINEHEIGHT] = phrase.Leading.ToString() + "pt";
                }

                // start tag
                AddTabs(indent);
                WriteStart(Markup.HTML_TAG_SPAN);
                WriteMarkupAttributes(markup);
                Write(phrase.Font, styleAttributes);
                os.WriteByte(GT);
                currentfont.Push(phrase.Font);
                // contents
                foreach (IElement i in phrase)
                {
                    Write(i, indent + 1);
                }
                // end tag
                AddTabs(indent);
                WriteEnd(Markup.HTML_TAG_SPAN);
                currentfont.Pop();
                return;
            }

            case Element.ANCHOR: {
                Anchor anchor = (Anchor)element;
                styleAttributes = new Properties();
                if (anchor.HasLeading())
                {
                    styleAttributes[Markup.CSS_KEY_LINEHEIGHT] = anchor.Leading.ToString() + "pt";
                }

                // start tag
                AddTabs(indent);
                WriteStart(HtmlTags.ANCHOR);
                if (anchor.Name != null)
                {
                    Write(HtmlTags.NAME, anchor.Name);
                }
                if (anchor.Reference != null)
                {
                    Write(HtmlTags.REFERENCE, anchor.Reference);
                }
                WriteMarkupAttributes(markup);
                Write(anchor.Font, styleAttributes);
                os.WriteByte(GT);
                currentfont.Push(anchor.Font);
                // contents
                foreach (IElement i in anchor)
                {
                    Write(i, indent + 1);
                }
                // end tag
                AddTabs(indent);
                WriteEnd(HtmlTags.ANCHOR);
                currentfont.Pop();
                return;
            }

            case Element.PARAGRAPH: {
                Paragraph paragraph = (Paragraph)element;
                styleAttributes = new Properties();
                if (paragraph.HasLeading())
                {
                    styleAttributes[Markup.CSS_KEY_LINEHEIGHT] = paragraph.TotalLeading.ToString() + "pt";
                }

                // start tag
                AddTabs(indent);
                WriteStart(HtmlTags.DIV);
                WriteMarkupAttributes(markup);
                String alignment = HtmlEncoder.GetAlignment(paragraph.Alignment);
                if (!"".Equals(alignment))
                {
                    Write(HtmlTags.ALIGN, alignment);
                }
                Write(paragraph.Font, styleAttributes);
                os.WriteByte(GT);
                currentfont.Push(paragraph.Font);
                // contents
                foreach (IElement i in paragraph)
                {
                    Write(i, indent + 1);
                }
                // end tag
                AddTabs(indent);
                WriteEnd(HtmlTags.DIV);
                currentfont.Pop();
                return;
            }

            case Element.SECTION:
            case Element.CHAPTER: {
                // part of the start tag + contents
                WriteSection((Section)element, indent);
                return;
            }

            case Element.LIST: {
                List list = (List)element;
                // start tag
                AddTabs(indent);
                if (list.Numbered)
                {
                    WriteStart(HtmlTags.ORDEREDLIST);
                }
                else
                {
                    WriteStart(HtmlTags.UNORDEREDLIST);
                }
                WriteMarkupAttributes(markup);
                os.WriteByte(GT);
                // contents
                foreach (IElement i in list.Items)
                {
                    Write(i, indent + 1);
                }
                // end tag
                AddTabs(indent);
                if (list.Numbered)
                {
                    WriteEnd(HtmlTags.ORDEREDLIST);
                }
                else
                {
                    WriteEnd(HtmlTags.UNORDEREDLIST);
                }
                return;
            }

            case Element.LISTITEM: {
                ListItem listItem = (ListItem)element;
                styleAttributes = new Properties();
                if (listItem.HasLeading())
                {
                    styleAttributes[Markup.CSS_KEY_LINEHEIGHT] = listItem.TotalLeading.ToString() + "pt";
                }

                // start tag
                AddTabs(indent);
                WriteStart(HtmlTags.LISTITEM);
                WriteMarkupAttributes(markup);
                Write(listItem.Font, styleAttributes);
                os.WriteByte(GT);
                currentfont.Push(listItem.Font);
                // contents
                foreach (IElement i in listItem)
                {
                    Write(i, indent + 1);
                }
                // end tag
                AddTabs(indent);
                WriteEnd(HtmlTags.LISTITEM);
                currentfont.Pop();
                return;
            }

            case Element.CELL: {
                Cell cell = (Cell)element;

                // start tag
                AddTabs(indent);
                if (cell.Header)
                {
                    WriteStart(HtmlTags.HEADERCELL);
                }
                else
                {
                    WriteStart(HtmlTags.CELL);
                }
                WriteMarkupAttributes(markup);
                if (cell.BorderWidth != Rectangle.UNDEFINED)
                {
                    Write(HtmlTags.BORDERWIDTH, cell.BorderWidth.ToString());
                }
                if (cell.BorderColor != null)
                {
                    Write(HtmlTags.BORDERCOLOR, HtmlEncoder.Encode(cell.BorderColor));
                }
                if (cell.BackgroundColor != null)
                {
                    Write(HtmlTags.BACKGROUNDCOLOR, HtmlEncoder.Encode(cell.BackgroundColor));
                }
                String alignment = HtmlEncoder.GetAlignment(cell.HorizontalAlignment);
                if (!"".Equals(alignment))
                {
                    Write(HtmlTags.HORIZONTALALIGN, alignment);
                }
                alignment = HtmlEncoder.GetAlignment(cell.VerticalAlignment);
                if (!"".Equals(alignment))
                {
                    Write(HtmlTags.VERTICALALIGN, alignment);
                }
                if (cell.GetWidthAsString() != null)
                {
                    Write(HtmlTags.WIDTH, cell.GetWidthAsString());
                }
                if (cell.Colspan != 1)
                {
                    Write(HtmlTags.COLSPAN, cell.Colspan.ToString());
                }
                if (cell.Rowspan != 1)
                {
                    Write(HtmlTags.ROWSPAN, cell.Rowspan.ToString());
                }
                if (cell.MaxLines == 1)
                {
                    Write(HtmlTags.STYLE, "white-space: nowrap;");
                }
                os.WriteByte(GT);
                // contents
                if (cell.IsEmpty())
                {
                    Write(NBSP);
                }
                else
                {
                    foreach (IElement i in cell.Elements)
                    {
                        Write(i, indent + 1);
                    }
                }
                // end tag
                AddTabs(indent);
                if (cell.Header)
                {
                    WriteEnd(HtmlTags.HEADERCELL);
                }
                else
                {
                    WriteEnd(HtmlTags.CELL);
                }
                return;
            }

            case Element.ROW: {
                Row row = (Row)element;

                // start tag
                AddTabs(indent);
                WriteStart(HtmlTags.ROW);
                WriteMarkupAttributes(markup);
                os.WriteByte(GT);
                // contents
                IElement cell;
                for (int i = 0; i < row.Columns; i++)
                {
                    if ((cell = (IElement)row.GetCell(i)) != null)
                    {
                        Write(cell, indent + 1);
                    }
                }
                // end tag
                AddTabs(indent);
                WriteEnd(HtmlTags.ROW);
                return;
            }

            case Element.TABLE: {
                Table table;
                try {
                    table = (Table)element;
                }
                catch (InvalidCastException) {
                    table = ((SimpleTable)element).CreateTable();
                }
                table.Complete();
                // start tag
                AddTabs(indent);
                WriteStart(HtmlTags.TABLE);
                WriteMarkupAttributes(markup);
                os.WriteByte(SPACE);
                Write(HtmlTags.WIDTH);
                os.WriteByte(EQUALS);
                os.WriteByte(QUOTE);
                Write(table.Width.ToString(System.Globalization.CultureInfo.InvariantCulture));
                if (!table.Locked)
                {
                    Write("%");
                }
                os.WriteByte(QUOTE);
                String alignment = HtmlEncoder.GetAlignment(table.Alignment);
                if (!"".Equals(alignment))
                {
                    Write(HtmlTags.ALIGN, alignment);
                }
                Write(HtmlTags.CELLPADDING, table.Cellpadding.ToString(System.Globalization.CultureInfo.InvariantCulture));
                Write(HtmlTags.CELLSPACING, table.Cellspacing.ToString(System.Globalization.CultureInfo.InvariantCulture));
                if (table.BorderWidth != Rectangle.UNDEFINED)
                {
                    Write(HtmlTags.BORDERWIDTH, table.BorderWidth.ToString(System.Globalization.CultureInfo.InvariantCulture));
                }
                if (table.BorderColor != null)
                {
                    Write(HtmlTags.BORDERCOLOR, HtmlEncoder.Encode(table.BorderColor));
                }
                if (table.BackgroundColor != null)
                {
                    Write(HtmlTags.BACKGROUNDCOLOR, HtmlEncoder.Encode(table.BackgroundColor));
                }
                os.WriteByte(GT);
                // contents
                foreach (Row row in table)
                {
                    Write(row, indent + 1);
                }
                // end tag
                AddTabs(indent);
                WriteEnd(HtmlTags.TABLE);
                return;
            }

            case Element.ANNOTATION: {
                Annotation annotation = (Annotation)element;
                WriteComment(annotation.Title + ": " + annotation.Content);
                return;
            }

            case Element.IMGRAW:
            case Element.JPEG:
            case Element.JPEG2000:
            case Element.IMGTEMPLATE: {
                Image image = (Image)element;
                if (image.Url == null)
                {
                    return;
                }

                // start tag
                AddTabs(indent);
                WriteStart(HtmlTags.IMAGE);
                String path = image.Url.ToString();
                if (imagepath != null)
                {
                    if (path.IndexOf('/') > 0)
                    {
                        path = imagepath + path.Substring(path.LastIndexOf('/') + 1);
                    }
                    else
                    {
                        path = imagepath + path;
                    }
                }
                Write(HtmlTags.URL, path);
                if ((image.Alignment & Image.RIGHT_ALIGN) > 0)
                {
                    Write(HtmlTags.ALIGN, HtmlTags.ALIGN_RIGHT);
                }
                else if ((image.Alignment & Image.MIDDLE_ALIGN) > 0)
                {
                    Write(HtmlTags.ALIGN, HtmlTags.ALIGN_MIDDLE);
                }
                else
                {
                    Write(HtmlTags.ALIGN, HtmlTags.ALIGN_LEFT);
                }
                if (image.Alt != null)
                {
                    Write(HtmlTags.ALT, image.Alt);
                }
                Write(HtmlTags.PLAINWIDTH, image.ScaledWidth.ToString());
                Write(HtmlTags.PLAINHEIGHT, image.ScaledHeight.ToString());
                WriteMarkupAttributes(markup);
                WriteEnd();
                return;
            }

            default:
                return;
            }
        }
예제 #3
0
        /**
        * Constructs a new RtfPhrase for the RtfDocument with the given Phrase
        *
        * @param doc The RtfDocument this RtfPhrase belongs to
        * @param phrase The Phrase this RtfPhrase is based on
        */
        public RtfPhrase(RtfDocument doc, Phrase phrase)
            : base(doc)
        {
            if (phrase == null) {
                return;
            }

            if (phrase.HasLeading()) {
                this.lineLeading = (int) (phrase.Leading * TWIPS_FACTOR);
            } else {
                this.lineLeading = 0;
            }

            ST.RtfFont phraseFont = new ST.RtfFont(null, phrase.Font);
            for (int i = 0; i < phrase.Count; i++) {
                IElement chunk = (IElement) phrase[i];
                if (chunk is Chunk) {
                    ((Chunk) chunk).Font = phraseFont.Difference(((Chunk) chunk).Font);
                }
                try {
                    IRtfBasicElement[] rtfElements = doc.GetMapper().MapElement(chunk);
                    for (int j = 0; j < rtfElements.Length; j++) {
                        chunks.Add(rtfElements[j]);
                    }
                } catch (DocumentException) {
                }
            }
        }