/** * 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) { } } }
/** * 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; } }
/** * 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) { } } }